{{ title }}
+ ++{{ summary }} ... +
+From ac45ac1b6c228e5123c688d80690c6b76c2430d8 Mon Sep 17 00:00:00 2001
From: Yax <1949284+kianby@users.noreply.github.com>
Date: Sat, 17 Aug 2019 16:48:52 +0200
Subject: [PATCH] init
---
.gitignore | 110 +----
LICENSE | 25 --
LICENSE.md | 22 +
Makefile | 75 ++++
README.md | 413 ++++++++++++++++++
content/_index.html | 28 ++
content/about.html | 23 +
.../blog/2009/2009-06-12-premier-billet.md | 10 +
...2009-07-12-mobilite-quand-tu-nous-tiens.md | 40 ++
content/blog/2009/2009-10-28-karmic-koala.md | 9 +
.../2009-11-02-karmic-est-dans-la-place.md | 23 +
.../2009/2009-11-04-ubuntu-9-10-kernel.md | 19 +
content/blog/2009/2009-11-24-mon-bureau.md | 9 +
...2009-12-02-sfr-3g-et-ubuntu-9-10-karmic.md | 42 ++
.../2009/2009-12-26-voix-sur-ip-avec-sip.md | 26 ++
...0-01-09-nouvelle-annee-nouvelle-distrib.md | 79 ++++
content/blog/2010/2010-01-10-tchao-mano.md | 8 +
...ts-en-commun-et-developpement-personnel.md | 47 ++
...5-grub-gfx-jaurais-aime-etre-un-artiste.md | 29 ++
.../2010-01-27-les-trajets-premier-bilan.md | 29 ++
...0-02-07-grosse-mise-a-jour-de-archlinux.md | 19 +
content/blog/2010/2010-02-20-clonage-ntfs.md | 29 ++
.../2010/2010-02-28-apple-store-london.md | 31 ++
...10-03-03-ubuntu-est-au-detour-du-chemin.md | 32 ++
...naissance-de-pc-et-switch-dutilisatrice.md | 62 +++
.../2010-04-14-renaissance-et-longevite.md | 25 ++
...-05-06-cygwin-et-console-un-duo-de-choc.md | 27 ++
.../blog/2010/2010-05-09-nouvel-hebergeur.md | 43 ++
.../blog/2010/2010-05-18-soutenir-firefox.md | 31 ++
...-02-le-logiciel-libre-comment-ca-marche.md | 15 +
.../blog/2010/2010-06-06-decouvrir-latex.md | 35 ++
.../blog/2010/2010-06-30-rythme-estival.md | 22 +
...10-07-30-auto-hebergement-le-grand-saut.md | 55 +++
...iwik-une-alternative-a-google-analytics.md | 37 ++
.../2010-08-05-un-peu-de-securite-apache.md | 68 +++
...09-installation-dun-serveur-de-courrier.md | 81 ++++
.../blog/2010/2010-10-01-hello-moto-droid.md | 20 +
...-du-firmware-original-du-routeur-d-link.md | 24 +
.../2010/2010-10-12-passage-a-slitaz-3-0.md | 19 +
.../2010/2010-10-30-applications-android.md | 35 ++
.../2010/2010-11-09-fais-roter-ton-droid.md | 27 ++
.../blog/2010/2010-12-07-envie-de-vitesse.md | 22 +
.../2010-12-12-video-pour-psp-avec-ffmpeg.md | 33 ++
...-12-25-probleme-de-resolution-avec-xorg.md | 30 ++
content/blog/2010/2010-12-25-tiny-tiny-rss.md | 24 +
content/blog/2010/2010-12-28-syncml.md | 37 ++
...20-nouvelle-annee-et-bonnes-resolutions.md | 19 +
.../2011-02-24-alternatives-a-phpmyadmin.md | 29 ++
.../2011/2011-03-01-sortie-de-chive-0-4-1.md | 21 +
.../2011-04-04-retour-en-auto-herbergement.md | 31 ++
...xml-le-moteur-de-blog-qui-carbure-a-xml.md | 39 ++
.../2011-06-01-gnome-3-une-belle-rupture.md | 46 ++
.../2011-06-04-personnalisation-de-gnome-3.md | 29 ++
.../2011/2011-06-04-sortie-de-chive-0-4-2.md | 12 +
...6-06-beau-cadeau-pour-la-fete-des-peres.md | 20 +
.../2011-06-11-support-des-souris-cyborg.md | 57 +++
content/blog/2011/2011-07-08-le-vertige.md | 18 +
content/blog/2011/2011-07-26-chive-0-5-1.md | 10 +
...-switcher-dans-le-monde-de-l-entreprise.md | 37 ++
.../2011/2011-09-17-bonne-rentree-a-tous.md | 16 +
.../2011/2011-09-26-surveiller-son-blog.md | 35 ++
...1-09-29-le-moteur-de-blog-pluxml-evolue.md | 17 +
...04-installation-de-gnome-3-2-au-secours.md | 38 ++
...0-09-bilan-de-6-mois-d-auto-hebergement.md | 44 ++
...-10-gnome-3-pour-un-usage-professionnel.md | 20 +
content/blog/2011/2011-12-11-chive-a-muri.md | 16 +
...-12-30-la-version-noel-de-tiny-tiny-rss.md | 21 +
.../2012-01-08-installation-de-jenkins-ci.md | 85 ++++
...le-distribution-gnome-2-choisir-en-2012.md | 83 ++++
...-03-surveiller-sa-ligne-adsl-avec-munin.md | 106 +++++
...projet-de-developpement-avec-jenkins-ci.md | 128 ++++++
...-04-15-mes-applications-pour-blackberry.md | 51 +++
.../2012-06-19-chive-passe-en-version-1-1.md | 26 ++
.../2012/2012-07-13-ranger-son-cartable.md | 35 ++
content/blog/2012/2012-09-23-bonne-rentree.md | 12 +
...25-compilation-de-tuxboot-sur-fedora-17.md | 37 ++
.../2012-09-29-eclipse-juno-sous-gnu-linux.md | 50 +++
...-12-04-installer-sabnzbd-derriere-nginx.md | 118 +++++
.../2012/2012-12-31-bilan-de-l-annee-2012.md | 28 ++
.../2013/2013-01-06-marre-des-aquariums.md | 81 ++++
...mise-a-jour-de-fedora-17-vers-fedora-18.md | 55 +++
...13-03-14-migration-du-blog-sous-pelican.md | 57 +++
...0-haute-dispo-corosync-pacemaker-debian.md | 260 +++++++++++
content/blog/2013/2013-06-16-le-silence.md | 99 +++++
content/blog/2013/2013-06-28-sysadmin-1.md | 74 ++++
content/blog/2013/2013-09-22-rentree-2013.md | 55 +++
content/blog/2013/2013-11-18-serveur-dedie.md | 47 ++
content/blog/2013/2013-12-02-sysadmin-2.md | 84 ++++
.../blog/2013/2013-12-23-bilan-hebergement.md | 39 ++
.../2013/2013-12-27-extensions-firefox.md | 50 +++
content/blog/2014/2014-01-02-horde-debian.md | 199 +++++++++
content/blog/2014/2014-01-22-qmail.md | 85 ++++
content/blog/2014/2014-04-15-redis-ha.md | 165 +++++++
.../2014/2014-04-28-gnome3-attendez-moi.md | 43 ++
content/blog/2014/2014-05-25-supervisor.md | 208 +++++++++
content/blog/2014/2014-08-05-vacances.md | 26 ++
content/blog/2014/2014-08-07-pecosys.md | 133 ++++++
content/blog/2014/2014-08-12-qemu-raspbian.md | 128 ++++++
.../blog/2014/2014-09-15-install-shinken.md | 149 +++++++
content/blog/2014/2014-10-23-pecosys-v2.md | 39 ++
content/blog/2014/2014-11-02-diaspora.md | 101 +++++
content/blog/2014/2014-11-14-my-phone.md | 83 ++++
content/blog/2014/2014-12-05-oracle-xe.md | 123 ++++++
.../blog/2014/2014-12-14-protectionnisme.md | 101 +++++
.../2014/2014-12-20-bilan-herbergement.md | 35 ++
.../blog/2015/2015-03-27-fin-hivernation.md | 61 +++
.../2015/2015-04-30-back-to-roots-bash.md | 219 ++++++++++
.../blog/2015/2015-06-01-blog-en-mouvance.md | 51 +++
content/blog/2015/2015-06-09-srmail.md | 59 +++
.../2015/2015-06-13-une-semaine-ordinaire.md | 68 +++
.../2015-06-21-deploiement-et-sauvegarde.md | 133 ++++++
.../2015/2015-08-10-fail2ban-configuration.md | 186 ++++++++
.../2015/2015-08-23-telephone-respectable.md | 69 +++
content/blog/2015/2015-08-29-rovio-va-mal.md | 97 ++++
.../blog/2015/2015-09-03-xfce-double-ecran.md | 92 ++++
.../blog/2015/2015-09-14-owncloud-reminder.md | 221 ++++++++++
.../2015/2015-09-23-obsolescence-repoussee.md | 53 +++
content/blog/2015/2015-11-15-massacre.md | 16 +
...15-12-12-retour-experience-ubuntu-touch.md | 192 ++++++++
.../2015/2015-12-21-advanced-virtualbox.md | 104 +++++
.../2016/2016-01-12-virtualization-tips.md | 93 ++++
content/blog/2016/2016-01-25-postfix-relay.md | 45 ++
content/blog/2016/2016-02-11-multiboot-usb.md | 114 +++++
.../blog/2016/2016-05-08-mon-informatique.md | 118 +++++
.../2016/2016-06-18-histoire-herbergement.md | 98 +++++
.../blog/2016/2016-08-06-un-pas-en-avant.md | 69 +++
content/blog/2016/2016-10-31-peu-de-neuf.md | 54 +++
.../blog/2016/2016-12-04-rationalisation.md | 48 ++
content/blog/2016/2016-12-30-bilan-2016.md | 87 ++++
.../2017/2017-01-29-ne-pas-couper-branche.md | 46 ++
.../2017/2017-02-02-extensions-firefox.md | 55 +++
content/blog/2017/2017-02-10-serveur-svn.md | 102 +++++
.../2017/2017-02-24-termux-pour-quoi-faire.md | 49 +++
.../2017-02-27-gnu-systemlinuxd-gnomeos.md | 104 +++++
.../2017/2017-06-05-lavie-lamour-lesvaches.md | 23 +
.../blog/2017/2017-06-18-sublime-vs-atom.md | 69 +++
.../2017/2017-06-21-openbsd-installation.md | 106 +++++
.../blog/2017/2017-07-12-migration-hugo.md | 71 +++
.../2017/2017-07-16-performance-python-web.md | 161 +++++++
.../2017-07-20-flux-rss-esprit-du-libre.md | 41 ++
.../2017/2017-07-24-golang-a-la-rescousse.md | 175 ++++++++
.../blog/2017/2017-08-09--email-important.md | 55 +++
.../2017/2017-09-04-nextcloud-securite.md | 166 +++++++
.../2017/2017-10-01-protegeons-vie-privee.md | 151 +++++++
.../2017/2017-10-14-attrapons-les-vilains.md | 101 +++++
.../2017/2017-11-17-un-blog-plus-statique.md | 124 ++++++
.../blog/2017/2017-12-14-kif-microservices.md | 86 ++++
.../2017-12-25-un-blog-plus-respectueux.md | 40 ++
.../blog/2018/2018-01-27-notes-rabbitmq.md | 182 ++++++++
.../2018/2018-02-07-quel-systeme-serveur.md | 125 ++++++
.../2018-02-16-surveiller-etat-serveur.md | 58 +++
.../2018-04-07-travailler-sous-windows.md | 61 +++
content/blog/2018/2018-04-15-bitwarden.md | 47 ++
.../2018-05-20-bilan-hebergement-container.md | 41 ++
.../blog/2018/2018-05-27-proxmox-reseau.md | 116 +++++
content/blog/2018/2018-08-15-blog-spam.md | 51 +++
content/blog/2018/2018-10-04-docker-server.md | 186 ++++++++
content/blog/2018/2018-10-07-gadgetbridge.md | 40 ++
.../blog/2018/2018-11-03-il-court-furet.md | 42 ++
.../2018-12-02-retour-migration-docker.md | 60 +++
content/blog/2019/2019-01-12-sarah-connor.md | 26 ++
.../blog/2019/2019-02-07-bilan-hebergement.md | 38 ++
content/blog/2019/2019-02-08-url-hugo.md | 36 ++
content/blog/2019/2019-03-02-tmux-msys2.md | 38 ++
.../2019-04-14-refonte-compl-te-du-blog.md | 34 ++
content/blog/2019/2019-05-12-antisocial.md | 33 ++
.../blog/2019/2019-05-18-souvenir-de-blog.md | 11 +
.../2019/2019-05-28-r-duire-la-voilure.md | 14 +
.../2019-06-29-markdown-interg-n-rationnel.md | 47 ++
.../2019-07-26-je-vous-l-avais-bien-dit.md | 20 +
content/contact.html | 21 +
content/news/2018-01-02-vivamus-purus.html | 30 ++
content/news/2018-01-04-mauris-tempor.html | 37 ++
layout/feed.xml | 12 +
layout/item.html | 10 +
layout/item.xml | 13 +
layout/list.html | 5 +
layout/page.html | 42 ++
layout/post.html | 5 +
makesite.py | 232 ++++++++++
static/css/style.css | 140 ++++++
test/__init__.py | 0
test/path.py | 16 +
test/test_content.py | 104 +++++
test/test_file_io.py | 39 ++
test/test_headers.py | 43 ++
test/test_list.py | 46 ++
test/test_main.py | 73 ++++
test/test_pages.py | 127 ++++++
test/test_path.py | 78 ++++
test/test_render.py | 25 ++
test/test_rfc_2822_date.py | 13 +
test/test_truncate.py | 9 +
193 files changed, 12172 insertions(+), 128 deletions(-)
delete mode 100644 LICENSE
create mode 100644 LICENSE.md
create mode 100644 Makefile
create mode 100755 README.md
create mode 100644 content/_index.html
create mode 100644 content/about.html
create mode 100755 content/blog/2009/2009-06-12-premier-billet.md
create mode 100755 content/blog/2009/2009-07-12-mobilite-quand-tu-nous-tiens.md
create mode 100755 content/blog/2009/2009-10-28-karmic-koala.md
create mode 100755 content/blog/2009/2009-11-02-karmic-est-dans-la-place.md
create mode 100755 content/blog/2009/2009-11-04-ubuntu-9-10-kernel.md
create mode 100755 content/blog/2009/2009-11-24-mon-bureau.md
create mode 100755 content/blog/2009/2009-12-02-sfr-3g-et-ubuntu-9-10-karmic.md
create mode 100755 content/blog/2009/2009-12-26-voix-sur-ip-avec-sip.md
create mode 100755 content/blog/2010/2010-01-09-nouvelle-annee-nouvelle-distrib.md
create mode 100755 content/blog/2010/2010-01-10-tchao-mano.md
create mode 100755 content/blog/2010/2010-01-12-transports-en-commun-et-developpement-personnel.md
create mode 100755 content/blog/2010/2010-01-15-grub-gfx-jaurais-aime-etre-un-artiste.md
create mode 100755 content/blog/2010/2010-01-27-les-trajets-premier-bilan.md
create mode 100755 content/blog/2010/2010-02-07-grosse-mise-a-jour-de-archlinux.md
create mode 100755 content/blog/2010/2010-02-20-clonage-ntfs.md
create mode 100755 content/blog/2010/2010-02-28-apple-store-london.md
create mode 100755 content/blog/2010/2010-03-03-ubuntu-est-au-detour-du-chemin.md
create mode 100755 content/blog/2010/2010-03-15-renaissance-de-pc-et-switch-dutilisatrice.md
create mode 100755 content/blog/2010/2010-04-14-renaissance-et-longevite.md
create mode 100755 content/blog/2010/2010-05-06-cygwin-et-console-un-duo-de-choc.md
create mode 100755 content/blog/2010/2010-05-09-nouvel-hebergeur.md
create mode 100755 content/blog/2010/2010-05-18-soutenir-firefox.md
create mode 100755 content/blog/2010/2010-06-02-le-logiciel-libre-comment-ca-marche.md
create mode 100755 content/blog/2010/2010-06-06-decouvrir-latex.md
create mode 100755 content/blog/2010/2010-06-30-rythme-estival.md
create mode 100755 content/blog/2010/2010-07-30-auto-hebergement-le-grand-saut.md
create mode 100755 content/blog/2010/2010-08-01-piwik-une-alternative-a-google-analytics.md
create mode 100755 content/blog/2010/2010-08-05-un-peu-de-securite-apache.md
create mode 100755 content/blog/2010/2010-08-09-installation-dun-serveur-de-courrier.md
create mode 100755 content/blog/2010/2010-10-01-hello-moto-droid.md
create mode 100755 content/blog/2010/2010-10-04-restauration-du-firmware-original-du-routeur-d-link.md
create mode 100755 content/blog/2010/2010-10-12-passage-a-slitaz-3-0.md
create mode 100755 content/blog/2010/2010-10-30-applications-android.md
create mode 100755 content/blog/2010/2010-11-09-fais-roter-ton-droid.md
create mode 100755 content/blog/2010/2010-12-07-envie-de-vitesse.md
create mode 100755 content/blog/2010/2010-12-12-video-pour-psp-avec-ffmpeg.md
create mode 100755 content/blog/2010/2010-12-25-probleme-de-resolution-avec-xorg.md
create mode 100755 content/blog/2010/2010-12-25-tiny-tiny-rss.md
create mode 100755 content/blog/2010/2010-12-28-syncml.md
create mode 100755 content/blog/2011/2011-01-20-nouvelle-annee-et-bonnes-resolutions.md
create mode 100755 content/blog/2011/2011-02-24-alternatives-a-phpmyadmin.md
create mode 100755 content/blog/2011/2011-03-01-sortie-de-chive-0-4-1.md
create mode 100755 content/blog/2011/2011-04-04-retour-en-auto-herbergement.md
create mode 100755 content/blog/2011/2011-04-25-pluxml-le-moteur-de-blog-qui-carbure-a-xml.md
create mode 100755 content/blog/2011/2011-06-01-gnome-3-une-belle-rupture.md
create mode 100755 content/blog/2011/2011-06-04-personnalisation-de-gnome-3.md
create mode 100755 content/blog/2011/2011-06-04-sortie-de-chive-0-4-2.md
create mode 100755 content/blog/2011/2011-06-06-beau-cadeau-pour-la-fete-des-peres.md
create mode 100755 content/blog/2011/2011-06-11-support-des-souris-cyborg.md
create mode 100755 content/blog/2011/2011-07-08-le-vertige.md
create mode 100755 content/blog/2011/2011-07-26-chive-0-5-1.md
create mode 100755 content/blog/2011/2011-07-26-switcher-dans-le-monde-de-l-entreprise.md
create mode 100755 content/blog/2011/2011-09-17-bonne-rentree-a-tous.md
create mode 100755 content/blog/2011/2011-09-26-surveiller-son-blog.md
create mode 100755 content/blog/2011/2011-09-29-le-moteur-de-blog-pluxml-evolue.md
create mode 100755 content/blog/2011/2011-10-04-installation-de-gnome-3-2-au-secours.md
create mode 100755 content/blog/2011/2011-10-09-bilan-de-6-mois-d-auto-hebergement.md
create mode 100755 content/blog/2011/2011-11-10-gnome-3-pour-un-usage-professionnel.md
create mode 100755 content/blog/2011/2011-12-11-chive-a-muri.md
create mode 100755 content/blog/2011/2011-12-30-la-version-noel-de-tiny-tiny-rss.md
create mode 100755 content/blog/2012/2012-01-08-installation-de-jenkins-ci.md
create mode 100755 content/blog/2012/2012-01-22-quelle-distribution-gnome-2-choisir-en-2012.md
create mode 100755 content/blog/2012/2012-03-03-surveiller-sa-ligne-adsl-avec-munin.md
create mode 100755 content/blog/2012/2012-03-25-gerer-un-projet-de-developpement-avec-jenkins-ci.md
create mode 100755 content/blog/2012/2012-04-15-mes-applications-pour-blackberry.md
create mode 100755 content/blog/2012/2012-06-19-chive-passe-en-version-1-1.md
create mode 100755 content/blog/2012/2012-07-13-ranger-son-cartable.md
create mode 100755 content/blog/2012/2012-09-23-bonne-rentree.md
create mode 100755 content/blog/2012/2012-09-25-compilation-de-tuxboot-sur-fedora-17.md
create mode 100755 content/blog/2012/2012-09-29-eclipse-juno-sous-gnu-linux.md
create mode 100755 content/blog/2012/2012-12-04-installer-sabnzbd-derriere-nginx.md
create mode 100755 content/blog/2012/2012-12-31-bilan-de-l-annee-2012.md
create mode 100755 content/blog/2013/2013-01-06-marre-des-aquariums.md
create mode 100755 content/blog/2013/2013-01-16-mise-a-jour-de-fedora-17-vers-fedora-18.md
create mode 100755 content/blog/2013/2013-03-14-migration-du-blog-sous-pelican.md
create mode 100755 content/blog/2013/2013-03-20-haute-dispo-corosync-pacemaker-debian.md
create mode 100755 content/blog/2013/2013-06-16-le-silence.md
create mode 100755 content/blog/2013/2013-06-28-sysadmin-1.md
create mode 100755 content/blog/2013/2013-09-22-rentree-2013.md
create mode 100755 content/blog/2013/2013-11-18-serveur-dedie.md
create mode 100755 content/blog/2013/2013-12-02-sysadmin-2.md
create mode 100755 content/blog/2013/2013-12-23-bilan-hebergement.md
create mode 100755 content/blog/2013/2013-12-27-extensions-firefox.md
create mode 100755 content/blog/2014/2014-01-02-horde-debian.md
create mode 100755 content/blog/2014/2014-01-22-qmail.md
create mode 100755 content/blog/2014/2014-04-15-redis-ha.md
create mode 100755 content/blog/2014/2014-04-28-gnome3-attendez-moi.md
create mode 100755 content/blog/2014/2014-05-25-supervisor.md
create mode 100755 content/blog/2014/2014-08-05-vacances.md
create mode 100755 content/blog/2014/2014-08-07-pecosys.md
create mode 100755 content/blog/2014/2014-08-12-qemu-raspbian.md
create mode 100755 content/blog/2014/2014-09-15-install-shinken.md
create mode 100755 content/blog/2014/2014-10-23-pecosys-v2.md
create mode 100755 content/blog/2014/2014-11-02-diaspora.md
create mode 100755 content/blog/2014/2014-11-14-my-phone.md
create mode 100755 content/blog/2014/2014-12-05-oracle-xe.md
create mode 100755 content/blog/2014/2014-12-14-protectionnisme.md
create mode 100755 content/blog/2014/2014-12-20-bilan-herbergement.md
create mode 100755 content/blog/2015/2015-03-27-fin-hivernation.md
create mode 100755 content/blog/2015/2015-04-30-back-to-roots-bash.md
create mode 100755 content/blog/2015/2015-06-01-blog-en-mouvance.md
create mode 100755 content/blog/2015/2015-06-09-srmail.md
create mode 100755 content/blog/2015/2015-06-13-une-semaine-ordinaire.md
create mode 100755 content/blog/2015/2015-06-21-deploiement-et-sauvegarde.md
create mode 100755 content/blog/2015/2015-08-10-fail2ban-configuration.md
create mode 100755 content/blog/2015/2015-08-23-telephone-respectable.md
create mode 100755 content/blog/2015/2015-08-29-rovio-va-mal.md
create mode 100755 content/blog/2015/2015-09-03-xfce-double-ecran.md
create mode 100755 content/blog/2015/2015-09-14-owncloud-reminder.md
create mode 100755 content/blog/2015/2015-09-23-obsolescence-repoussee.md
create mode 100755 content/blog/2015/2015-11-15-massacre.md
create mode 100755 content/blog/2015/2015-12-12-retour-experience-ubuntu-touch.md
create mode 100755 content/blog/2015/2015-12-21-advanced-virtualbox.md
create mode 100755 content/blog/2016/2016-01-12-virtualization-tips.md
create mode 100755 content/blog/2016/2016-01-25-postfix-relay.md
create mode 100755 content/blog/2016/2016-02-11-multiboot-usb.md
create mode 100755 content/blog/2016/2016-05-08-mon-informatique.md
create mode 100755 content/blog/2016/2016-06-18-histoire-herbergement.md
create mode 100755 content/blog/2016/2016-08-06-un-pas-en-avant.md
create mode 100755 content/blog/2016/2016-10-31-peu-de-neuf.md
create mode 100755 content/blog/2016/2016-12-04-rationalisation.md
create mode 100755 content/blog/2016/2016-12-30-bilan-2016.md
create mode 100755 content/blog/2017/2017-01-29-ne-pas-couper-branche.md
create mode 100755 content/blog/2017/2017-02-02-extensions-firefox.md
create mode 100755 content/blog/2017/2017-02-10-serveur-svn.md
create mode 100755 content/blog/2017/2017-02-24-termux-pour-quoi-faire.md
create mode 100755 content/blog/2017/2017-02-27-gnu-systemlinuxd-gnomeos.md
create mode 100755 content/blog/2017/2017-06-05-lavie-lamour-lesvaches.md
create mode 100755 content/blog/2017/2017-06-18-sublime-vs-atom.md
create mode 100755 content/blog/2017/2017-06-21-openbsd-installation.md
create mode 100755 content/blog/2017/2017-07-12-migration-hugo.md
create mode 100755 content/blog/2017/2017-07-16-performance-python-web.md
create mode 100755 content/blog/2017/2017-07-20-flux-rss-esprit-du-libre.md
create mode 100755 content/blog/2017/2017-07-24-golang-a-la-rescousse.md
create mode 100755 content/blog/2017/2017-08-09--email-important.md
create mode 100755 content/blog/2017/2017-09-04-nextcloud-securite.md
create mode 100755 content/blog/2017/2017-10-01-protegeons-vie-privee.md
create mode 100755 content/blog/2017/2017-10-14-attrapons-les-vilains.md
create mode 100755 content/blog/2017/2017-11-17-un-blog-plus-statique.md
create mode 100755 content/blog/2017/2017-12-14-kif-microservices.md
create mode 100755 content/blog/2017/2017-12-25-un-blog-plus-respectueux.md
create mode 100755 content/blog/2018/2018-01-27-notes-rabbitmq.md
create mode 100755 content/blog/2018/2018-02-07-quel-systeme-serveur.md
create mode 100755 content/blog/2018/2018-02-16-surveiller-etat-serveur.md
create mode 100755 content/blog/2018/2018-04-07-travailler-sous-windows.md
create mode 100755 content/blog/2018/2018-04-15-bitwarden.md
create mode 100755 content/blog/2018/2018-05-20-bilan-hebergement-container.md
create mode 100755 content/blog/2018/2018-05-27-proxmox-reseau.md
create mode 100755 content/blog/2018/2018-08-15-blog-spam.md
create mode 100755 content/blog/2018/2018-10-04-docker-server.md
create mode 100755 content/blog/2018/2018-10-07-gadgetbridge.md
create mode 100755 content/blog/2018/2018-11-03-il-court-furet.md
create mode 100755 content/blog/2018/2018-12-02-retour-migration-docker.md
create mode 100755 content/blog/2019/2019-01-12-sarah-connor.md
create mode 100755 content/blog/2019/2019-02-07-bilan-hebergement.md
create mode 100755 content/blog/2019/2019-02-08-url-hugo.md
create mode 100755 content/blog/2019/2019-03-02-tmux-msys2.md
create mode 100755 content/blog/2019/2019-04-14-refonte-compl-te-du-blog.md
create mode 100755 content/blog/2019/2019-05-12-antisocial.md
create mode 100755 content/blog/2019/2019-05-18-souvenir-de-blog.md
create mode 100755 content/blog/2019/2019-05-28-r-duire-la-voilure.md
create mode 100755 content/blog/2019/2019-06-29-markdown-interg-n-rationnel.md
create mode 100755 content/blog/2019/2019-07-26-je-vous-l-avais-bien-dit.md
create mode 100644 content/contact.html
create mode 100644 content/news/2018-01-02-vivamus-purus.html
create mode 100644 content/news/2018-01-04-mauris-tempor.html
create mode 100644 layout/feed.xml
create mode 100644 layout/item.html
create mode 100644 layout/item.xml
create mode 100644 layout/list.html
create mode 100644 layout/page.html
create mode 100644 layout/post.html
create mode 100755 makesite.py
create mode 100644 static/css/style.css
create mode 100644 test/__init__.py
create mode 100644 test/path.py
create mode 100644 test/test_content.py
create mode 100644 test/test_file_io.py
create mode 100644 test/test_headers.py
create mode 100644 test/test_list.py
create mode 100644 test/test_main.py
create mode 100644 test/test_pages.py
create mode 100644 test/test_path.py
create mode 100644 test/test_render.py
create mode 100644 test/test_rfc_2822_date.py
create mode 100644 test/test_truncate.py
diff --git a/.gitignore b/.gitignore
index 894a44c..77cf371 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,104 +1,8 @@
-# Byte-compiled / optimized / DLL files
-__pycache__/
-*.py[cod]
-*$py.class
-
-# C extensions
-*.so
-
-# Distribution / packaging
-.Python
-build/
-develop-eggs/
-dist/
-downloads/
-eggs/
-.eggs/
-lib/
-lib64/
-parts/
-sdist/
-var/
-wheels/
-*.egg-info/
-.installed.cfg
-*.egg
-MANIFEST
-
-# PyInstaller
-# Usually these files are written by a python script from a template
-# before PyInstaller builds the exe, so as to inject date/other infos into it.
-*.manifest
-*.spec
-
-# Installer logs
-pip-log.txt
-pip-delete-this-directory.txt
-
-# Unit test / coverage reports
-htmlcov/
-.tox/
+_site
+*.pyc
+__pycache__
.coverage
-.coverage.*
-.cache
-nosetests.xml
-coverage.xml
-*.cover
-.hypothesis/
-.pytest_cache/
-
-# Translations
-*.mo
-*.pot
-
-# Django stuff:
-*.log
-local_settings.py
-db.sqlite3
-
-# Flask stuff:
-instance/
-.webassets-cache
-
-# Scrapy stuff:
-.scrapy
-
-# Sphinx documentation
-docs/_build/
-
-# PyBuilder
-target/
-
-# Jupyter Notebook
-.ipynb_checkpoints
-
-# pyenv
-.python-version
-
-# celery beat schedule file
-celerybeat-schedule
-
-# SageMath parsed files
-*.sage.py
-
-# Environments
-.env
-.venv
-env/
-venv/
-ENV/
-env.bak/
-venv.bak/
-
-# Spyder project settings
-.spyderproject
-.spyproject
-
-# Rope project settings
-.ropeproject
-
-# mkdocs documentation
-/site
-
-# mypy
-.mypy_cache/
+htmlcov
+*.sw?
+.DS_Store
+venv
diff --git a/LICENSE b/LICENSE
deleted file mode 100644
index ed6a480..0000000
--- a/LICENSE
+++ /dev/null
@@ -1,25 +0,0 @@
-BSD 2-Clause License
-
-Copyright (c) 2019, Yax
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-1. Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
-
-2. Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimer in the documentation
- and/or other materials provided with the distribution.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/LICENSE.md b/LICENSE.md
new file mode 100644
index 0000000..3129e86
--- /dev/null
+++ b/LICENSE.md
@@ -0,0 +1,22 @@
+The MIT License (MIT)
+=====================
+Copyright (c) 2018 Sunaina Pai
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..b0ffe45
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,75 @@
+site:
+ ./makesite.py
+
+serve: site
+ cd _site && python -m SimpleHTTPServer 2> /dev/null || python3 -m http.server
+
+venv2:
+ virtualenv ~/.venv/makesite
+ echo . ~/.venv/makesite/bin/activate > venv
+ . ./venv && pip install commonmark coverage
+
+venv: FORCE
+ python3 -m venv ~/.venv/makesite
+ echo . ~/.venv/makesite/bin/activate > venv
+ . ./venv && pip install commonmark coverage
+
+test: FORCE
+ . ./venv && python -m unittest -bv
+
+coverage:
+ . ./venv && coverage run --branch --source=. -m unittest discover -bv; :
+ . ./venv && coverage report -m
+ . ./venv && coverage html
+
+clean:
+ find . -name "__pycache__" -exec rm -r {} +
+ find . -name "*.pyc" -exec rm {} +
+ rm -rf .coverage htmlcov
+
+REV = cat /tmp/rev.txt
+example:
+ #
+ # Remove existing output directories.
+ rm -rf _site /tmp/_site
+ #
+ # Create params.json for makesite-demo.
+ echo '{ "base_path": "/makesite-demo", "site_url":' \
+ '"https://tmug.github.io/makesite-demo" }' > params.json
+ #
+ # Generate the website.
+ . ./venv && ./makesite.py
+ rm params.json
+ #
+ # Get current commit ID.
+ git rev-parse --short HEAD > /tmp/rev.txt
+ #
+ # Write a README for makesite-demo repository.
+ echo makesite.py demo > _site/README.md
+ echo ================ >> _site/README.md
+ echo This is the HTML/CSS source of an example static >> _site/README.md
+ echo website auto-generated with [sunainapai/makesite][makesite] >> _site/README.md
+ echo "([$$($(REV))][commit])". >> _site/README.md
+ echo >> _site/README.md
+ echo Visit "
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc nibh
+tellus, vehicula ut maximus sed, fringilla a justo. Nunc vitae efficitur
+nisl. Ut sapien erat, pretium et commodo nec, rutrum bibendum magna. Sed
+ut massa massa. Etiam euismod neque lacus, id tincidunt risus iaculis a.
+Aliquam porta venenatis bibendum. Nam id varius nulla. Sed vitae purus
+ac odio ornare vestibulum vitae tempor arcu. Nunc non venenatis purus.
+Duis a augue at nulla congue egestas. Morbi mattis felis sit amet tortor
+euismod, fringilla viverra est elementum.
+
+Suspendisse vestibulum sed massa eu tincidunt. Pellentesque cursus, nisl
+at gravida suscipit, odio quam placerat mi, in iaculis nunc risus eu
+sapien. Suspendisse potenti. Nullam fermentum, tellus vel faucibus
+dictum, arcu ante rutrum nisi, ut iaculis eros felis a lectus. Etiam vel
+maximus nulla, sed mattis lectus. Aliquam commodo est massa, at
+vestibulum diam commodo vehicula. Nullam et tristique tortor. Praesent
+luctus, leo id mattis mattis, ex dui dapibus dolor, nec ultrices turpis
+nibh in sem. In efficitur, velit ut bibendum interdum, libero turpis
+mattis odio, non pharetra metus leo nec arcu. Maecenas auctor laoreet
+maximus. Donec metus massa, scelerisque a lacinia et, viverra eget
+metus. Aenean vitae tellus vehicula, mattis metus in, facilisis purus.
+In purus erat, fringilla ut diam et, convallis convallis nunc. Morbi
+sagittis interdum ipsum sit amet fringilla.
+
+Quisque quam nisl, egestas nec convallis vitae, fringilla nec mauris.
+Sed et cursus lacus, a pharetra ex. Pellentesque rhoncus malesuada elit
+at sodales. In ut elit lectus. Phasellus et hendrerit odio, ac hendrerit
+ante. Pellentesque habitant morbi tristique senectus et netus et
+malesuada fames ac turpis egestas. Quisque sem nibh, auctor vel dictum
+eu, pharetra sit amet nunc. Integer suscipit suscipit dapibus.
+Suspendisse vulputate sed mauris eget tempus. Etiam rhoncus, leo nec
+cursus elementum, massa lorem fermentum nisi, non convallis nisl dolor
+vel ipsum.
+
+Aliquam imperdiet vel purus sed facilisis. Mauris condimentum vel nulla
+ac tempor. In non venenatis arcu. Nam in sapien purus. Suspendisse
+faucibus, erat et fringilla vestibulum, ligula nisi porta odio, ut
+tristique dui ante eu nisi. Mauris vitae vulputate lorem. Proin tortor
+nisl, vehicula sed justo sed, volutpat bibendum purus. Phasellus luctus
+fringilla augue ac sodales. Aenean ac nisi sit amet neque pulvinar
+tincidunt ut nec ipsum. Aliquam purus tellus, dignissim a augue
+placerat, aliquet semper turpis. Fusce id lacinia quam, vel porta quam.
+
+ {{ .content | markdownify }}
+
+In hac habitasse platea dictumst. Suspendisse purus leo, laoreet ac
+scelerisque vitae, gravida vitae turpis. Etiam lacinia justo in pharetra
+tincidunt. Donec id mi in elit euismod feugiat. Fusce eget velit nec
+nunc fermentum ultrices ut auctor tellus. Suspendisse convallis lacus a
+mollis volutpat. Donec maximus eros lorem, non faucibus sapien tristique
+a. Proin ut magna eget nunc sagittis sodales ac suscipit dolor.
+Vestibulum sit amet velit nunc. Nam euismod fermentum neque ac
+facilisis. Phasellus imperdiet arcu a lorem pulvinar accumsan. Sed
+maximus neque tristique, sollicitudin risus sed, interdum enim.
+
+Curabitur vel augue mattis, blandit libero rhoncus, fringilla augue.
+Aenean condimentum ex justo. In hac habitasse platea dictumst. Etiam
+ullamcorper finibus enim, nec cursus dui tristique nec. Phasellus et
+tortor libero. Vivamus viverra euismod pulvinar. Fusce maximus, ante
+quis lobortis facilisis, lectus mi consequat purus, sed vestibulum ipsum
+mi sit amet dui.
+
+Vivamus purus tellus, facilisis in sapien quis, ullamcorper lacinia
+neque. Morbi tincidunt ac leo sit amet auctor. Donec dolor mauris,
+lobortis eget faucibus sit amet, egestas non ante. Sed quam erat,
+consectetur eget magna in, pretium aliquet ligula. Proin id nunc ex.
+Curabitur posuere lectus neque, ut blandit diam scelerisque sed. In
+semper lacinia ipsum a malesuada. Nam accumsan consequat sem, eu mollis
+diam iaculis commodo.
+
+Fusce arcu turpis, blandit lacinia augue et, dignissim imperdiet lorem.
+Donec fermentum dui eu fermentum accumsan. Nunc porta tellus sit amet
+nulla tempor varius. Ut id dolor velit. Aenean et dolor ac nisl mattis
+iaculis. Phasellus at convallis lectus. Curabitur volutpat purus sed
+purus feugiat, in elementum orci ullamcorper. Nam sollicitudin pretium
+lacus, quis convallis massa suscipit et. Fusce ac elit tristique,
+efficitur est at, pellentesque tellus.
+
+Suspendisse vel eleifend nunc. Vivamus ac sem luctus, luctus velit ac,
+pretium urna. Sed eu diam quis odio euismod sollicitudin. Ut faucibus
+pharetra sem, ut malesuada sapien maximus at. Quisque et eleifend augue.
+Sed dignissim urna ac justo venenatis vestibulum. Vivamus sodales, dui
+sed luctus porttitor, ante purus pretium velit, at dapibus enim felis a
+tortor. Fusce sit amet ipsum odio. Etiam eget felis sed risus efficitur
+rutrum at a libero. Praesent finibus pellentesque tellus sed maximus.
+Morbi sit amet turpis eros. Vivamus rhoncus libero ut lacinia luctus. Ut
+nec ex dui.
+
+Mauris tempor nulla odio, vel tempus metus bibendum sit amet. Vivamus
+consequat fringilla tristique. Nullam a congue ligula, eget rutrum
+lectus. In pulvinar at nunc ac finibus. Sed cursus consequat sem et
+egestas. Cras eu eros vel mi eleifend efficitur eu dapibus orci.
+Phasellus non bibendum purus. Nam facilisis laoreet massa tempus
+vehicula. Donec a hendrerit nisi.
+
+Vestibulum blandit dui a lorem pulvinar, et auctor eros elementum.
+Vestibulum tortor ex, pharetra id metus vel, tincidunt faucibus nisl.
+Suspendisse potenti. Nam maximus est mi, sit amet tristique nisi pretium
+sed. Maecenas in nulla at nibh volutpat lacinia. Aliquam erat volutpat.
+Donec odio magna, imperdiet quis risus at, ultricies faucibus lorem.
+Quisque tempus enim purus. Integer interdum mauris lorem, in accumsan
+lorem tempor quis. Praesent facilisis, velit vitae aliquam mattis,
+turpis justo malesuada odio, nec hendrerit tortor sapien sit amet diam.
+Praesent aliquam malesuada feugiat. Proin vitae efficitur massa.
+Vestibulum quam enim, finibus et magna ac, pellentesque aliquet leo.
+Nullam condimentum neque nec ex viverra, sit amet ullamcorper lectus
+sodales. Suspendisse non est et velit malesuada ullamcorper maximus
+porta quam.
+
+Cras ornare maximus augue nec varius. Aliquam tincidunt sodales ipsum.
+Sed viverra ut nibh sit amet porta. Cras sit amet condimentum est.
+Suspendisse quis tristique ipsum. Etiam vel lorem bibendum, laoreet dui
+vitae, rutrum leo. Nullam cursus dui a augue lobortis euismod.
+Suspendisse finibus id neque ut imperdiet. Pellentesque vel suscipit
+est, vel vulputate neque. Curabitur eu eros auctor, laoreet nunc quis,
+laoreet erat. Fusce rhoncus mattis lorem, et imperdiet nisi lacinia sit
+amet. Integer et cursus lacus. Nullam id arcu et libero condimentum
+tristique. Pellentesque arcu magna, aliquam sed lectus in, tempor mattis
+erat. Curabitur vel massa sit amet nunc suscipit pulvinar. In tincidunt
+diam metus, eu sollicitudin velit commodo a.
+
+{{ summary }} ...
+Lorem Ipsum
+About
+ ](/images/02x/piwik.jpg)
diff --git a/content/blog/2010/2010-08-05-un-peu-de-securite-apache.md b/content/blog/2010/2010-08-05-un-peu-de-securite-apache.md
new file mode 100755
index 0000000..b10e735
--- /dev/null
+++ b/content/blog/2010/2010-08-05-un-peu-de-securite-apache.md
@@ -0,0 +1,68 @@
+---
+layout: post
+title: Un peu de sécurité Apache
+category: Hébergement
+---
+
+Ce matin j'ai découvert une longue liste d'erreurs 404 dans les logs suggérant
+qu'on recherche activement une faille :
+
+ Requests with error response codes
+ 404 Not Found
+ //PMA/config/config.inc.php?p=phpinfo();: 1 Time(s)
+ //phpMyAdmin/config/config.inc.php?p=phpinfo();: 1 Time(s)
+ //phpmyadmin/config/config.inc.php?p=phpinfo();: 1 Time(s)
+ //pma/config/config.inc.php?p=phpinfo();: 1 Time(s)
+ /PMA2005/scripts/setup.php: 1 Time(s)
+ /admin/phpmyadmin/scripts/setup.php: 1 Time(s)
+ /admin/pma/scripts/setup.php: 1 Time(s)
+ /admin/scripts/setup.php: 1 Time(s)
+ /db/scripts/setup.php: 1 Time(s)
+ /dbadmin/scripts/setup.php: 1 Time(s)
+ /myadmin/scripts/setup.php: 1 Time(s)
+ /mysql-admin/scripts/setup.php: 1 Time(s)
+ /mysql/scripts/setup.php: 1 Time(s)
+ /mysqladmin/scripts/setup.php: 2 Time(s)
+ /mysqlmanager/scripts/setup.php: 1 Time(s)
+ /p/m/a/scripts/setup.php: 1 Time(s)
+ /php-my-admin/scripts/setup.php: 2 Time(s)
+ /php-myadmin/scripts/setup.php: 1 Time(s)
+ /phpMyAdmin-2.2.3/scripts/setup.php: 1 Time(s)
+ /phpMyAdmin-2.2.6/scripts/setup.php: 1 Time(s)
+ /phpMyAdmin-2.5.1/scripts/setup.php: 1 Time(s)
+ /phpMyAdmin-2.5.4/scripts/setup.php: 1 Time(s)
+ /phpMyAdmin-2.5.5-pl1/scripts/setup.php: 1 Time(s)
+ ...
+ /pma/scripts/setup.php: 1 Time(s)
+ /pma2005/scripts/setup.php: 1 Time(s)
+ /robots.txt: 1 Time(s)
+ /scripts/setup.php: 1 Time(s)
+ /sqlmanager/scripts/setup.php: 1 Time(s)
+ /sqlweb/scripts/setup.php: 1 Time(s)
+ /typo3/phpmyadmin/scripts/setup.php: 1 Time(s)
+ /w00tw00t.at.blackhats.romanian.anti-sec:): 1 Time(s)
+ /web/phpMyAdmin/scripts/setup.php: 1 Time(s)
+ /web/scripts/setup.php: 1 Time(s)
+ /webadmin/scripts/setup.php: 1 Time(s)
+ /webdb/scripts/setup.php: 1 Time(s)
+ /websql/scripts/setup.php: 2 Time(s)
+ /xampp/phpmyadmin/scripts/setup.php: 1 Time(s)
+
+Non je n'épluche pas les logs du serveur en guise de petit-déjeuner,
+[logwatch](http://www.logwatch.org/) m'envoie un compte-rendu des entrées
+pertinentes :-) A priori je ne crains pas grand chose sauf s'ils trouvent une
+faille dans WordPress et me vident ce blog mais j'ai un système de sauvegarde
+en place basé sur [Rsync](http://fr.wikipedia.org/wiki/Rsync). J'ai néanmoins
+rajouté un peu de sécurité Apache :
+
+- autoriser à redéfinir la sécurité globale à chaque niveau en passant le
+paramètre AllowOverride à All dans /etc/apache2/sites-available/<ma
+definition de site>
+- ajout d'un fichier.htaccess à la racine html pour refuser tout le monde ( deny
+from all )
+- ajout d'un fichier.htaccess au niveau de Piwik pour refuser tout accès depuis
+l'Internet ( allow from 192.168.0.0/255.255.0.0, deny from all )
+
+Comment tester que ces règles sont appliquées ? on peut utiliser un proxy
+Web ou bien tester depuis son téléphone avec le réseau 3G de son opérateur :
+-)
diff --git a/content/blog/2010/2010-08-09-installation-dun-serveur-de-courrier.md b/content/blog/2010/2010-08-09-installation-dun-serveur-de-courrier.md
new file mode 100755
index 0000000..8695911
--- /dev/null
+++ b/content/blog/2010/2010-08-09-installation-dun-serveur-de-courrier.md
@@ -0,0 +1,81 @@
+---
+layout: post
+title: Installation d'un serveur de courrier
+category: Hébergement
+---
+
+Je vais détailler l'installation d'un serveur
+[Postfix](http://fr.wikipedia.org/wiki/Postfix) /
+[Dovecot](http://fr.wikipedia.org/wiki/Dovecot) sous Debian. Le serveur
+[SMTP](http://fr.wikipedia.org/wiki/SMTP) installé par défaut est
+[Exim](http://fr.wikipedia.org/wiki/Exim) mais je l'ai remplacé par Postfix que
+je connais un peu (rien de personnel contre Exim qui fait sûrement très bien
+son travail). Je veux gérer mon courrier depuis Thunderbird et utiliser le
+protocole [IMAP](http://fr.wikipedia.org/wiki/IMAP) pour laisser les messages
+sur le serveur. D'abord on installe avec apt-get qui s'occupera de la
+désinstallation d'Exim.
+
+ apt-get install postfix dovecot
+
+Mon gros souci est bien sûr la sécurité : se faire pirater son courrier n'est
+pas une pensée agréable mais envisager qu'on utilise son serveur de courrier
+pour spammer l'est encore moins. Il faut donc envisager une authentification
+SMTP, des mots de passe robustes et un cryptage des données SSL. On peut
+générer soi-même son certificat mais on aura des soucis avec les applications
+clientes car il ne sera pas authentifiée par une autorité reconnue. La plupart
+de ces autorités font payer ce service. Un compromis que j'ai jugé acceptable
+consiste à requérir les services de [CAcert](http://www.cacert.org) qui permet
+de signer des clefs que vous aurez générées, sous réserve de prouver que
+vous êtes détenteur du domaine (rien de méchant il suffit de confirmer un
+courrier sur une adresse de ce domaine).
+
+Quand on reçoit le certificat on l'installe sous etc/ssl/certs/dovecot.pem et
+on installe la clef privée sous etc/ssl/private/dovecot.pem. Il faut ensuite
+adapter la configuration de Dovecot sous /etc/dovecot/dovecot.conf :
+
+ ssl_disable = no
+ ssl_cert_file = /etc/ssl/certs/dovecot.pem
+ ssl_key_file = /etc/ssl/private/dovecot.pem
+ disable_plaintext_auth = yes
+
+ auth default {
+ mechanisms = cram-md5
+
+ socket listen {
+ client {
+ # Assuming the default Postfix $queue_directory setting
+ path = /var/spool/postfix/private/auth
+ mode = 0660
+ # Assuming the default Postfix user and group
+ user = postfix
+ group = postfix
+ }
+ }
+ passdb passwd-file {
+ args = /etc/dovecot/cram-md5.pwd
+ }
+ }
+
+L'authentification CRAM-MD5 peut-être préférée à LOGIN, elle permet de
+gérer les comptes indépendamment des comptes UNIX. Sa configuration est
+détaillée [ici](http://wiki.dovecot.org/HowTo/CRAM-MD5?action=show&redirect
+=CRAM-MD5).
+
+Pour Postfix on se simplifie grandement la vie en s'appuyant sur Dovecot pour
+l'autentification. Voici les paramètres clés de /etc/postfix/main.cf :
+
+ smtpd_tls_cert_file=/etc/sl/certs/dovecot.pem
+ smtpd_tls_key_file=/etc/ssl/private/dovecot.pem
+ smtpd_use_tls=yes
+ myhostname = "le nom DNS de mon serveur"
+ relayhost = "le serveur SMTP de mon fournisseur"
+ mynetworks = 192.0.0.0/8, 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
+ smtpd_sasl_type = dovecot
+ smtpd_sasl_auth_enable = yes
+ smtpd_recipient_restrictions = permit_sasl_authenticated, reject_unauth_destination
+
+Il ne faut pas oublier de mettre en place les règles NAT pour ouvrir le port 25
+et 143 vers l'extérieur et de redémarrer les services :
+
+ /etc/init.d/dovecot restart
+ /etc/init.d/postfix restart
diff --git a/content/blog/2010/2010-10-01-hello-moto-droid.md b/content/blog/2010/2010-10-01-hello-moto-droid.md
new file mode 100755
index 0000000..a18548a
--- /dev/null
+++ b/content/blog/2010/2010-10-01-hello-moto-droid.md
@@ -0,0 +1,20 @@
+---
+layout: post
+title: Hello Moto Droid
+categories: Android Mobilité
+---
+
+Après deux ans de bons et loyaux services j'ai remisé mon Nokia E61i pour un
+téléphone plus récent. J'ai hésité entre le Nokia N900 et un smartphone
+sous Android. Finalement le côté prototype d'essai du N900 m'a refroidi, je ne
+peux pas changer tous les ans et c'est Android qui a gagné la mise, mon choix
+s'est arrêté sur un Motorola Milestone (Droid pour les States). En tant que
+téléphone, j'ai apprécié la continuité avec mon Nokia E, un téléphone
+lourd qui tient dans la main, pèse dans la poche et propose un clavier
+physique... car j'ai ou plutôt avais quelques inquiétudes sur mon aptitude à
+utiliser le clavier tactile. Finalement j'utilise les deux mais je privilégie
+le clavier physique pour les SMS et les emails pour le lien avec l'écriture, la
+composition qu'il m'inspire :-) Le système Android a été une vraie
+découverte, appréciée pour l'ergonomie et la logique d'ensemble. Par contre
+le Market est un vrai foutoir ! Néanmoins, en se documentant sur des sites qui
+conseillent les meilleures applications on arrive à trouver ce qu'on cherche.
diff --git a/content/blog/2010/2010-10-04-restauration-du-firmware-original-du-routeur-d-link.md b/content/blog/2010/2010-10-04-restauration-du-firmware-original-du-routeur-d-link.md
new file mode 100755
index 0000000..0730b52
--- /dev/null
+++ b/content/blog/2010/2010-10-04-restauration-du-firmware-original-du-routeur-d-link.md
@@ -0,0 +1,24 @@
+---
+layout: post
+title: Restauration du firmware original du routeur D-Link
+category: Matériel
+---
+
+La semaine dernière, j'ai crashé mon routeur D-Link DIR-300 que j'avais
+mis à jour vers [OpenWrt](http://openwrt.org/) l'année dernière. Je crois que
+j'ai abusé des paramètres Wifi avancés pour ajuster notamment la force du
+signal. J'ai saisi cette occasion pour revenir au firmware original qui fait
+certes moins de choses mais qui est beaucoup plus léger. OpenWrt fonctionne sur
+ce modèle mais il utilise quasiment 90% de la mémoire et ça se ressent en
+manipulant l'interface d'administration et probablement sur le fonctionnement
+quand il faut monter en charge. J'ai trouvé un excellent tutorial pour revenir
+au firmware d'origine sur le blog de [kaillasse91](http://kaillasse91.free.fr
+/DIR-300_OpenWrt_Restauration_firmware_original.html). Il s'appuie sur le blog
+de [shadowandy](http://www.shadowandy.net/2007/10/flashing-dir-300-back-to-
+original-firmware.htm) mais en corrigeant certaines erreurs et en détaillant
+les manipulations pour Ubuntu. J'ai pu l'appliquer sans problème à ArchLinux :
+-) Il faut installer le paquet **tftp-hpa** qui fournit le serveur
+[tftp](http://fr.wikipedia.org/wiki/TFTP) et installer **Putty** avec un coup de
+yaourt car le client Telnet par défaut ne semble pas permettre le CRTL-C pour
+prendre la main au démarrage du routeur. Ensuite c'est comme une recette de
+cuisine :D
diff --git a/content/blog/2010/2010-10-12-passage-a-slitaz-3-0.md b/content/blog/2010/2010-10-12-passage-a-slitaz-3-0.md
new file mode 100755
index 0000000..4ef927c
--- /dev/null
+++ b/content/blog/2010/2010-10-12-passage-a-slitaz-3-0.md
@@ -0,0 +1,19 @@
+---
+layout: post
+title: Passage à Slitaz 3.0
+category: GNU/Linux
+---
+
+Un titre alternatif serait "Suite des tribulations de ma voisine avec son
+Pentium II". Le disque dur de 20 Go a rendu l'âme le week-end dernier. Par
+chance, on lui a donné une machine de la même époque mais avec une carte
+mère hors-service. J'ai sorti les tournevis et nous avons récupéré un disque
+dur... de 20 Go (le standard de l'époque), une barrette mémoire de 128 Mo ce
+qui nous permet d'atteindre 384 Mo et un lecteur DVD-ROM. Ma voisine a beaucoup
+apprécié son passage à GNU/Linux, j'ai donc réinstallé
+[Slitaz](http://www.slitaz.org/fr) 3.0, dernière version stable sortie fin du
+mois de mars. C'est toujours aussi léger, on a senti de suite le bénéfice des
+128 Mo supplémentaires. Elle se retrouve avec une machine opérationnelle pour
+le Web, parce que IE fourni avec Windows 98 c'est plus ça ;-) et une
+logithèque de belle taille pour la bureautique et la musique, ses deux
+activités principales.
diff --git a/content/blog/2010/2010-10-30-applications-android.md b/content/blog/2010/2010-10-30-applications-android.md
new file mode 100755
index 0000000..26fcba6
--- /dev/null
+++ b/content/blog/2010/2010-10-30-applications-android.md
@@ -0,0 +1,35 @@
+---
+layout: post
+title: Applications Android
+category: Android
+---
+
+Après quelques semaines d'utilisation je peux établir une liste des
+applications que j'utilise réellement sur mon Milestone.
+
+* TweetDeck, un bon client Twitter. J'en ai essayé beaucoup, la plupart sont
+très bons mais TweetDeck a le petit + qui fait la différence pour moi, il
+supporte Google Buzz.
+* gReader Pro, lecteur de flux pour Google Reader. A part des petits soucis de
+synchro qui sont progressivement résolus, c'est le must pour lire ses flux RSS.
+* Tâches d'Astrid, un GTD open source qui s'interface avec Remember The Milk,
+Producteev (que je ne connaissais pas) et le plus appauvri Google Task.
+L'interface va a l'essentiel, on trouve des fonctions avancées si on les
+cherche, c'est très bien pensé.
+* Dolphin Browser HD, un navigateur plus rapide, une mise en page des colonnes de
+texte automatique quand on zoome. Il est pas mal mais les barres latérales
+surgissent souvent quand on veut juste se déplacer sur la page. J'espère
+trouver encore mieux... des suggestions ?
+* Les gadgets qui simplifient la vie : APNDroid pour couper l'Internet Mobile d'un
+clic, NetCounter pour surveiller son trafic sur le mois, No Lock pour
+désactiver le verrouillage, Quick Settings pour régler vite certains réglages
+* Le multimédia : RadioMee (beaucoup de radios), Radio France (idéal pour les
+podcasts de Radio France), Shazam (classique !), Pic Say Pro (il m'a tellement
+amusé que je l'ai acheté), Canal + (si quelqu'un connaît une autre
+application qui permet de regarder plus que iTélé ;-) ) et AlloCiné (belle
+application bien réalisée)
+* Les informations : News Republic (intéressant car on peut se promener par sujet
+d'actualité), Marianne 2
+* Les jeux : on n'est pas sur iPhone mais la qualité arrive :-) Angry Birds
+(+++), Frozen Bubble, Alchemy (permet de faire des associations marrantes pour
+créer de nouveaux éléments) et Bubble Blast II.
diff --git a/content/blog/2010/2010-11-09-fais-roter-ton-droid.md b/content/blog/2010/2010-11-09-fais-roter-ton-droid.md
new file mode 100755
index 0000000..38788f6
--- /dev/null
+++ b/content/blog/2010/2010-11-09-fais-roter-ton-droid.md
@@ -0,0 +1,27 @@
+---
+layout: post
+title: Fais rôter ton Droid
+category: Android
+---
+
+A défaut d'écrire un article orignal je me suis lâché sur le titre ;-)
+Jusqu'à maintenant je ne voyais pas trop d'intérêt à "rooter" Android
+à part pour épater les gens en montrant un shell avec un #. Mais on ne peut
+pas installer d'applications sur la SD avec Android 2.1 et la mémoire du
+Milestone n'est pas énorme. Alors il devient intéressant de pouvoir
+désinstaller des applications systèmes... à chacun de juger ce qui est
+inutile, me concernant j'ai viré MotoNav, Facebook, Email (qui fait doublon
+avec GMail), Gesture, l'Aide, l'interface simplifiée pour le Dock, le Portail
+Motorola et l'Agenda d'Entreprise.
+
+D'abord j'ai rooté (pas beau ce terme mais je n'ai pas trouvé mieux) le
+Milestone sans problème en suivant le [tutorial d'Android France](http :
+//android-france.fr/2010/05/31/motorola-milestone-root-android-2-1/). Ensuite
+j'ai fait le fainéant en achetant la version Pro de Titanium Backup qui permet
+de faire des sauvegardes sur SD et sur DropBox et désinstaller ce qu'on veut !
+A manier avec Parcimonie si elle traîne dans les parages...
+
+Le bilan est positif, j'ai récupéré beaucoup de place et j'ai pu installer la
+grosse bêta de Firefox qui plantouille encore partout pour voir l'avancement du
+projet. Et je crois que la batterie tient plus longtemps... impression ?
+Peut-être pas j'ai viré deux services d'arrière-plan.
diff --git a/content/blog/2010/2010-12-07-envie-de-vitesse.md b/content/blog/2010/2010-12-07-envie-de-vitesse.md
new file mode 100755
index 0000000..8d9657d
--- /dev/null
+++ b/content/blog/2010/2010-12-07-envie-de-vitesse.md
@@ -0,0 +1,22 @@
+---
+layout: post
+title: Envie de vitesse
+category: Archlinux
+---
+
+Après presque une année avec Archlinux j'ai eu envie de booster un peu mon
+pingouin : rien à reprocher à Gnome mais un OS opérationnel en moins de 2
+minutes serait sympa.
+
+D'abord j'ai optimisé le temps de boot grâce aux recommandations du [Wiki
+d'Arch](http://wiki.archlinux.org/index.php/Improve_Boot_Performance). Ensuite,
+j'ai remplacé Gnome par [OpenBox](http://openbox.org/) couplé avec
+[Tint2](http://code.google.com/p/tint2/) pour avoir une barre de tâches
+minimaliste et une systray. La configuration d'OpenBox est simple, un fichier
+autostart.sh déclare ce qu'il faut lancer au démarrage. Le package MenuMaker
+permet de générer un menu complet, qu'on peut ensuite facilement épurer avec
+un éditeur de texte.
+
+Au final j'ai divisé le temps de boot par 2 et je suis authentifié tellement
+vite (merci [Slim](http://slim.berlios.de/) ) que le Wifi n'est pas encore
+connecté... le comble ;-)
diff --git a/content/blog/2010/2010-12-12-video-pour-psp-avec-ffmpeg.md b/content/blog/2010/2010-12-12-video-pour-psp-avec-ffmpeg.md
new file mode 100755
index 0000000..f4c738b
--- /dev/null
+++ b/content/blog/2010/2010-12-12-video-pour-psp-avec-ffmpeg.md
@@ -0,0 +1,33 @@
+---
+layout: post
+title: Vidéo pour PSP avec ffmpeg
+category: GNU/Linux
+---
+
+La Jackson-mania n'est pas prête de s'éteindre ;-) Mon fils m'a demandé
+d'installer des clips Youtube de Michael sur sa PSP. Pour télécharger du
+YouTube il n'y a que l'embarras du choix : de l'extension Firefox à l'outil en
+ligne de commande. Mon choix s'est porté sur ClipGrab qui permet de choisir la
+qualité de vidéo désirée.
+
+ [
+](/images/03x/clipgrab.png)
+
+Pour convertir au format PSP j'avais utilisé PSPVC disponible sur
+[AUR](http://aur.archlinux.org/index.php?setlang=fr) mais il ne fonctionne plus
+depuis le passage d'Arch à Python2. J'ai donc fouillé du côté des forums
+pour voir ce qu'on pouvait faire avec les 2 ténors de la conversion vidéo sur
+GNU/Linux : mencoder et ffmpeg. La [documentation Ubuntu](http://doc.ubuntu-
+fr.org/ffmpeg) pour ffmpeg apporte l'essentiel de la solution à part une
+coquille sur un paramètre et le nom des librairies h264 qu'il faut adapter. La
+commande ultime est donc :
+
+``` shell
+ffmpeg -i [input_file] -r 29.97 -vcodec libx264 -s 640x480 -aspect 16:9 -flags +loop -cmp
+ +chroma -deblockalpha 0 -deblockbeta 0 -b 768k -maxrate 1500k -bufsize 4M -bt 256k
+ -refs 1 -bf 3 -coder 1 -me_method umh -me_range 16 -subq 7
+ -partitions parti4x4+parti8x8+partp8x8+partb8x8 -g 250 -keyint_min 25 -level 30
+ -qmin 10 -qmax 51 -qcomp 0.6 -trellis 2 -sc_threshold 40 -i_qfactor 0.71 -acodec aac
+ -ab 112k -ar 48000 -ac 2 -s 480x272 -aspect 4:3 -strict experimental [output_file.MP4]
+```
\ No newline at end of file
diff --git a/content/blog/2010/2010-12-25-probleme-de-resolution-avec-xorg.md b/content/blog/2010/2010-12-25-probleme-de-resolution-avec-xorg.md
new file mode 100755
index 0000000..3194a9e
--- /dev/null
+++ b/content/blog/2010/2010-12-25-probleme-de-resolution-avec-xorg.md
@@ -0,0 +1,30 @@
+---
+layout: post
+title: Problème de résolution avec Xorg
+category: GNU/Linux
+---
+
+Il arrive que la résolution native de mon écran 1280x800 ne soit pas reconnue
+au démarrage. X démarre en 1024x768. Il y a plusieurs façons de résoudre le
+problème : on peut créer un fichier de configuration Xorg.conf ou bien
+rajouter le mode dynamiquement. J'ai privilégié la seconde option. La commande
+gtf permet de calculer les bons paramètres en fonction d'une résolution et
+d'un taux de rafraîchissement :
+
+``` shell
+$ gtf 1280 800 60
+# 1280x800 @ 60.00 Hz (GTF) hsync: 49.68 kHz; pclk: 83.46 MHz
+Modeline "1280x800_60.00" 83.46 1280 1344 1480 1680 800 801 804 828 -HSync +Vsync
+```
+
+Le résultat peut être passé à la commande xrandr pour ajouter le mode
+dynamiquement. Voici le script complet à exécuter au démarrage :
+
+``` shell
+xrandr --newmode "1280x800_60.00" 83.46 1280 1344 1480 1680 800 801 804 828 -HSync +Vsync
+xrandr --addmode LVDS1 "1280x800_60.00"
+xrandr --output LVDS1 --mode "1280x800_60.00"
+```
+
+Le nom de l'écran de sortie (LVDS1 dans mon cas) est donné par xrandr qui
+résume la configuration.
diff --git a/content/blog/2010/2010-12-25-tiny-tiny-rss.md b/content/blog/2010/2010-12-25-tiny-tiny-rss.md
new file mode 100755
index 0000000..6d1515d
--- /dev/null
+++ b/content/blog/2010/2010-12-25-tiny-tiny-rss.md
@@ -0,0 +1,24 @@
+---
+layout: post
+title: Tiny Tiny RSS
+categories: Android GNU/Linux Hébergement
+---
+
+J'ai découvert récemment une alternative à Google Reader : [Tiny Tiny
+RSS](http://tt-rss.org/). L'avantage par rapport à un simple client de flux
+c'est d'avoir un serveur qui actualise les flux périodiquement et qui offre une
+interface Web pour la consultation. J'ai pu installer facilement Tiny Tiny RSS
+sur mon hébergement [O2Switch](http://www.o2switch.fr/). Basé sur PHP et MySQL
+l'installation chez un hébergeur ne pose pas de souci. Le point délicat est la
+synchronisation des flux. Le Wiki de Tiny Tiny propose trois solutions. Dans le
+cas d'un hébergement, on ne peut généralement pas installer le daemon mais on
+peut lancer le rapatriement des flux par une commande sous Cron.
+
+Mon utilisation au quotidien alterne l'utilisation Desktop et Mobile ; par
+chance un projet cousin [ttrss-reader-fork](http://code.google.com/p/ttrss-
+reader-fork/) propose une application cliente pour Android qui se connecte à un
+serveur Tiny Tiny RSS. C'est une application de qualité sous licence GPL dont
+le développeur Nils Braden est très actif. J'ai posé un bug jeudi dernier, il
+était corrigé moins de 2 jours après :-)
+
+
diff --git a/content/blog/2010/2010-12-28-syncml.md b/content/blog/2010/2010-12-28-syncml.md
new file mode 100755
index 0000000..32f0d50
--- /dev/null
+++ b/content/blog/2010/2010-12-28-syncml.md
@@ -0,0 +1,37 @@
+---
+layout: post
+title: SyncML
+categories: Android GNU/Linux Hébergement
+---
+
+Il y a un point qui me gênait depuis mon passage à Android c'est d'avoir
+confié tous mes contacts à Google. J'ai confiance dans la société... ce
+n'est pas Facebook ;-) mais on n'est pas à l'abri d'un piratage de compte. J'ai
+donc voulu reprendre la main sur ces données (je sais c'est un peu tard elles
+sont en cache sur leurs serveurs pour longtemps :D).
+
+Une solution possible est l'installation de la déclinaison OpenSource de
+[Funambol](http://www.funambol.com/) et du client Android Funambol Sync. On
+désactive la synchronisation des contacts Google et on configure la la
+synchronisation vers le serveur Funambol.
+
+
+
+
+
+Funambol fournit différents clients pour les mobiles et les desktops. J'ai
+testé avec succès le client pour MacOSX qui permet de synchroniser le carnet
+d'adresses.
+
+C'est viable mais Funambol est écrit en JAVA. C'est lourd et difficile à
+héberger chez un fournisseur classique. C'est vrai qu'il permet de synchroniser
+toutes sortes de données (agenda, emails, fichiers) mais mon besoin se
+réduisant aux contacts, j'ai cherché une alternative écrite en PHP. En
+fouillant j'ai trouvé un serveur [SyncML](http://fr.wikipedia.org/wiki/SyncML)
+basé sur PHP et MySQL : il s'agit de [Mooha](http://code.google.com/p/mooha/)
+qui existe en version standalone et en tant que module pour Drupal.
+
+Je l'ai déployé chez mon hébergeur favori [O2Switch](http://www.o2switch.fr/)
+avec succès. La solution finale est donc hétérogène, à l'image du Libre :
+un serveur SyncML Mooha et des applications clientes Funambol. Mais elle remplit
+le cahier des charges initial ce qui est le plus important :-)
diff --git a/content/blog/2011/2011-01-20-nouvelle-annee-et-bonnes-resolutions.md b/content/blog/2011/2011-01-20-nouvelle-annee-et-bonnes-resolutions.md
new file mode 100755
index 0000000..219da10
--- /dev/null
+++ b/content/blog/2011/2011-01-20-nouvelle-annee-et-bonnes-resolutions.md
@@ -0,0 +1,19 @@
+---
+layout: post
+title: Nouvelle année et bonnes résolutions
+category: Humeur
+---
+
+Je vais essayer de placer cette nouvelle année sous le signe de la cohérence
+et du partage. Cohérence avec moi-même d'abord : plus d'harmonie entre mes
+idées et mes actions :)- Sans devenir un barbu intraitable, je partage une
+large part des idées véhiculées par le Libre : nécessité de préserver
+l'indépendance de son informatique, de contrôler l'utilisation de ses
+données. J'irais même jusqu'à voir le Libre comme un microcosme du monde
+réel. Dans cet optique, il est temps que je sois plus actif, plus participatif
+afin d'apporter ma pierre à l'édifice. Dans l'immédiat je me forme à la
+maintenance de paquets AUR, j'ai repéré un projet intéressant qui ne fait pas
+encore partie du dépôt. A court/moyen terme, j'ai un projet de développement
+à taille humaine qui ira dans le sens du contrôle de ses données avec un
+tiers serveur qu'on peut héberger facilement et une application cliente
+Android.
diff --git a/content/blog/2011/2011-02-24-alternatives-a-phpmyadmin.md b/content/blog/2011/2011-02-24-alternatives-a-phpmyadmin.md
new file mode 100755
index 0000000..0293207
--- /dev/null
+++ b/content/blog/2011/2011-02-24-alternatives-a-phpmyadmin.md
@@ -0,0 +1,29 @@
+---
+layout: post
+title: Alternatives à phpMyAdmin
+category: Archlinux
+tag: planet
+---
+
+Je me suis intéressé aux alternatives à
+[phpMyAdmin](http://www.phpmyadmin.net/), l'outil phare d'administration mySQL,
+fourni par la plupart des hébergeurs car écrit en PHP. C'est une référence
+et à part une interface vieillisante on ne peut pas lui reprocher grand chose.
+Néanmoins j'ai testé deux autres projets écrits en PHP qui méritent le
+détour.
+
+Tout d'abord [Adminer](http://www.adminer.org/) permet l'administration de mySQL :
+ gestion des schémas, des tables, des indexes et des données. Au travers de
+modules PHP, d'autres bases sont supportées (PostgreSQL, SQLite, MS SQL,
+Oracle) avec j'imagine une liste de fonctionnalités communes à n'importe
+quelle base relationnelle.
+
+Ensuite [Chive](http://www.chive-project.com/) est un jeune projet qui mise
+beaucoup sur la qualité de l'interface graphique à grand renfort d'AJAX. Les
+fonctionnalités couvrent les besoins classiques d'administration et rajoutent
+une interface agréable avec par exemple de la coloration syntaxique dans
+l'éditeur de requête. Étonnamment Chive n'était pas encore proposé
+ArchLinux. Comme je suis intéressé par la création et la maintenance de
+paquets [AUR](http://aur.archlinux.org) j'ai saisi l'occasion de me former avec
+le projet Chive et de rendre disponible la dernière version 0.4.0 à la
+communauté Arch.
diff --git a/content/blog/2011/2011-03-01-sortie-de-chive-0-4-1.md b/content/blog/2011/2011-03-01-sortie-de-chive-0-4-1.md
new file mode 100755
index 0000000..5d1fb30
--- /dev/null
+++ b/content/blog/2011/2011-03-01-sortie-de-chive-0-4-1.md
@@ -0,0 +1,21 @@
+---
+layout: post
+title: Sortie de Chive 0.4.1
+category: Archlinux
+---
+
+Une version mineure de [Chive](http://www.chive-project.com/), l'outil
+d'administration mySQL, est sortie la semaine dernière ; elle corrige un
+certains nombre de bugs. Voici le change log officiel.
+
+ Chive 0.4.1 is out, a minor bug-fix release for the 0.4 series.
+ Bug-Fixes in this release:
+ - FileImport broken
+ - Explain not working with groupby
+ - no server infos without selecting a schema first
+ - class HttpRequest conflict with pecl http module
+ - get error after login of version 0.4.0
+ - it is better to use class CJSON instead of json_encode/json_decode
+
+J'ai mis à jour le [paquet AUR](http://aur.archlinux.org/packages.php?ID=45734)
+correspondant pour Archlinux :-)
diff --git a/content/blog/2011/2011-04-04-retour-en-auto-herbergement.md b/content/blog/2011/2011-04-04-retour-en-auto-herbergement.md
new file mode 100755
index 0000000..53a0a38
--- /dev/null
+++ b/content/blog/2011/2011-04-04-retour-en-auto-herbergement.md
@@ -0,0 +1,31 @@
+---
+layout: post
+title: Retour en auto-hébergement
+category: Hébergement
+---
+
+Le virus de l'auto-hébergement m'a repris. Je n'ai pas (encore) de matériel
+dédié ; je suis très intéressé par les plug computer à basse consommation,
+on verra quand le budget sera là :-) En attendant j'ai redonné vie à moindre
+coût à un ancestral portable équipé d'un céléron. C'est un compromis
+acceptable, j'espère qu'il tiendra quelques mois en 24/24 ;-)
+
+Tant qu'à rapatrier ses services il aurait été dommage de ne pas repenser
+tous les choix techniques, en tenant compte des performances du futur serveur
+qui seront probablement modestes (low-watt => low-perf).
+
+Le système est donc une Debian Squeeze. Fi de l'originalité ce qui compte
+c'est l'éthique de cette distribution, sa stabilité et son adaptation aux
+matériels récents et anciens ainsi que son énorme logithèque. Pour le
+serveur HTTP j'ai choisi [Nginx](http://wiki.nginx.org/NginxFr), parce que j'ai
+lu quelques articles à son propos, que c'est beaucoup plus léger. La
+documentation est encore légère mais on trouve des bons blogs pour le reste
+(comme installer et configurer [php-fm avec
+Nginx](http://blog.nicolargo.com/2011/01/installation-automatique-de-nginx-php-
+fpm-memcached-sous-debian.html) ).
+
+La pièce principale de mes services et aussi la plus publique est bien sûr ce
+blog qui a été migré vers [PluXml](http://pluxml.org/). J'en parlerais plus
+en détail dans le prochain article.
+
+
diff --git a/content/blog/2011/2011-04-25-pluxml-le-moteur-de-blog-qui-carbure-a-xml.md b/content/blog/2011/2011-04-25-pluxml-le-moteur-de-blog-qui-carbure-a-xml.md
new file mode 100755
index 0000000..e8ce1a1
--- /dev/null
+++ b/content/blog/2011/2011-04-25-pluxml-le-moteur-de-blog-qui-carbure-a-xml.md
@@ -0,0 +1,39 @@
+---
+layout: post
+title: PluXml, le moteur de blog qui carbure à XML
+categories: Blog Hébergement
+---
+
+Le titre de ce billet est un clin d’œil au site officiel de
+[PluXml](http://pluxml.org/). J'ai profité de mon retour en auto-hébergement
+pour changer de moteur de blog. Pourquoi ? Pour voir autre chose
+essentiellement... je n'ai jamais eu de souci avec WordPress, j'ai passé 3 ou 4
+mises à jour en automatique sans souci (en croisant les doigts), je faisais une
+sauvegarde hebdomadaire de la base.
+
+Deux points m'ont accroché quand j'ai entendu parler de PluXml. D'abord, la
+possibilité de s'affranchir de la base de données (stocker ses fichiers à
+plat c'est rassurant, ça simplifie les sauvegardes). Ensuite, un moteur
+rustique redonne le goût de l'effort (tu veux un plugin ? va tweaker ton thème
+à coup de JavaScript et de PHP) ; sans oublier de se rafraîchir en HTML pour
+écrire des billets car l'éditeur est sans fioriture.
+
+La migration m'a demandé une grosse journée d'effort. Un script wp2pluxml fait
+l'essentiel du travail, ensuite j'ai ajusté les tags à la main. Bon pour être
+franc, c'était jouable car j'avais une cinquantaine d'articles. J'ai vu une
+moulinette de conversion pour ceux qui viennent de DotClear sur le [Wiki de
+PluXml](http://wiki.pluxml.org).
+
+Au final les données du blog sont réparties dans quelque répertoires :
+articles, commentaires, médias. Si on ne surcharge pas trop son thème, on
+obtient un blog plus léger qu'avec WordPress et plus réactif sur des machines
+légères. Bien sûr on n'a pas la diversité des plugins de WordPress mais
+c'est aussi l'occasion de faire le point sur ce qui est vraiment nécessaire.
+Pour ma part, quand j'ai eu fait le lien avec
+[Gravatar](http://fr.gravatar.com/) et enrichi mon thème avec
+[SHJS](http://shjs.sourceforge.net/) j'avais l'essentiel.
+
+Je pense que le plus gros travail consiste à migrer sous PluXml. Si on décide
+de repartir vers un autre moteur de blog un jour, les données seront faciles à
+traiter (pas de meta informations obscures dans tous les sens) et il sera aisé
+d'écrire des moulinettes de conversion si elles n'existent pas déjà.
diff --git a/content/blog/2011/2011-06-01-gnome-3-une-belle-rupture.md b/content/blog/2011/2011-06-01-gnome-3-une-belle-rupture.md
new file mode 100755
index 0000000..5e93050
--- /dev/null
+++ b/content/blog/2011/2011-06-01-gnome-3-une-belle-rupture.md
@@ -0,0 +1,46 @@
+---
+layout: post
+title: Gnome 3, une belle rupture
+category: GNU/Linux
+---
+
+Depuis plusieurs semaines l'actu déborde de comparatifs entre
+[Gnome](http://gnome3.org/) 3 et [Unity](http://unity.ubuntu.com/) et de retours
+d'expérience (souvent négatifs) envers ces deux évolutions majeures.
+Utilisateur d'[Archlinux](http://archlinux.fr/) je n'ai pas considéré Unity
+mais je me suis intéressé à Gnome 3. J'ai noté deux doléances : les super-
+productifs qui gèrent quasiment tout au clavier et qui ont dû mal à recréer
+le même niveau d'optimisation et ceux qui apprécient la nouvelle ergonomie qui
+met un coup de jeune mais qui ont l'impression d'avoir une version inachevée
+car ils ont perdu la plupart des applets Gnome ainsi que certaines possibilités
+de personnalisation visuelle.
+
+Franchement on sent l'interface pensée pour les ordinateurs mais aussi pour les
+tablettes ; on a donc simplifié, retiré certaines personnalisations et le
+résultat reste à l'appréciation de chacun. Je l'utilise occasionnellement
+depuis trois semaines et je m'y suis à peu près habitué. Néanmoins deux
+aspects me semblent rédhibitoires pour un usage professionnel :
+
+- Ne pas voir l'ensemble des tâches ouvertes libère une place appréciable sur
+mon 13''3 mais dans le cadre d'un usage professionnel avec beaucoup
+d'applications lancés simultanément ça peut gêner, même si l'affichage des
+vignettes en un éclair avec une touche est attrayant.
+- Ne pas voir la systray est gênant car le système de notification n'est pas
+encore implémenté par toutes les applications et il est furtif.
+
+Le premier point a peu de chance de changer car c'est le plus gros changement
+ergonomique : passer d'une application à l'autre différemment et supprimer le
+concept de minimisation des fenêtres. Quant au second point il évoluera au fur
+et à mesure que les applications seront mises à jour et peut-être qu'une
+extension permettra de rendre visible la systray quand une notification n'est
+pas consommée (si cela existe déjà merci de m'en faire part).
+
+En conclusion, je dirais que l'évolution de Gnome est sympathique et rend plus
+attrayant le pingouin ; cela peut séduire des habitués de Ms Windows et MacOSX
+et je crois qu'il était important de faire un bond en avant côté ergonomie.
+Dans le cadre personnel je vais continuer à l'utiliser pour voir comment cela
+va évoluer. Pour des usages professionnels et pour ceux qui ne refusent cette
+refonte ergonomique, les projets [XFCE](http://www.xfce.org/) et
+[LXDE](http://lxde.org/) gagnent en intérêt : au delà de proposer des
+environnement plus légers et plus rapides que Gnome ou KDE ils proposent une
+alternative Desktop classique (certains taquins diraient "old school").
\ No newline at end of file
diff --git a/content/blog/2011/2011-06-04-personnalisation-de-gnome-3.md b/content/blog/2011/2011-06-04-personnalisation-de-gnome-3.md
new file mode 100755
index 0000000..d72847e
--- /dev/null
+++ b/content/blog/2011/2011-06-04-personnalisation-de-gnome-3.md
@@ -0,0 +1,29 @@
+---
+layout: post
+title: Personnalisation de Gnome 3
+categories: GNU/Linux Archlinux
+---
+
+Pour faire suite à l'article précédent, j'ai effectué des recherches sur la
+personnalisation de Gnome 3. Le fait est que c'est très flexible et accessible
+à beaucoup de personnes car l'interface est basée sur JavaScript et CSS.
+L'idée n'est pas de modifier l'installation elle-même mais d'écrire des
+extensions dans son répertoire local.local/share/gnome-shell/extensions.
+L'inconnue c'est la pérennité de ces bouts de JavaScript qui s'appuient sur
+les API de Gnome 3 au fil des versions.
+
+L'article de référence que je vous recommande est sur le [blog de Finnbarr P.
+Murphy](http://blog.fpmurphy.com/2011/05/more-gnome-shell-customization.html).
+L'auteur va très loin, du rajout d'un menu d'application discret sur le panel
+au déplacement des icônes de la systray vers le panel... exactement ce que je
+cherchais pour ne plus rater les notifications de Choqok, Empathy et Dropbox.
+
+ [
+](/images/04x/systray2panel.jpg)
+
+Je vous conseille aussi la lecture des trucs et astuces Gnome 3 parus sur [Tux-
+Planet](http://www.tux-planet.fr/toutes-les-astuces-pour-gnome-shell/) et la
+page Gnome 3 sur le [Wiki
+d'Archlinux](https://wiki.archlinux.org/index.php/GNOME_3) qui est enrichie
+régulièrement.
diff --git a/content/blog/2011/2011-06-04-sortie-de-chive-0-4-2.md b/content/blog/2011/2011-06-04-sortie-de-chive-0-4-2.md
new file mode 100755
index 0000000..12addd0
--- /dev/null
+++ b/content/blog/2011/2011-06-04-sortie-de-chive-0-4-2.md
@@ -0,0 +1,12 @@
+---
+layout: post
+title: Sortie de Chive 0.4.2
+category: Archlinux
+---
+
+[Chive](https://launchpad.net/chive), l'outil d'administration MySQL est passé
+en version 0.4.2 ; c'est une version mineure qui corrige beaucoup de bugs et
+ajoute la possibilité d ['intégrer Chive à des outils
+externes](https://blueprints.launchpad.net/chive/+spec/direct-auth). J'ai mis à
+jour le [paquet AUR](http://aur.archlinux.org/packages.php?ID=45734) pour
+Archlinux.
diff --git a/content/blog/2011/2011-06-06-beau-cadeau-pour-la-fete-des-peres.md b/content/blog/2011/2011-06-06-beau-cadeau-pour-la-fete-des-peres.md
new file mode 100755
index 0000000..1e3baed
--- /dev/null
+++ b/content/blog/2011/2011-06-06-beau-cadeau-pour-la-fete-des-peres.md
@@ -0,0 +1,20 @@
+---
+layout: post
+title: Beau cadeau pour la fête des pères
+category: Matériel
+---
+
+J'avais envie de changer de souris
+depuis un petit bout de temps avec deux critères en tête : une forme moins
+bondée qui ne casse pas le poignet et un modèle filaire. Hé bien je dois
+être difficile en matière de mulot car aucune souris ne m'a satisfait sur une
+dizaine de modèles en exposition au magasin. Deux modèles Cyborg étaient sur
+les rayons mais pas exposés. Néanmoins, la forme ne me déplaisait pas.
+N'étant pas *gamer* je ne savais rien sur les produits Cyborg... un peu de
+recherche sur le Net pour découvrir ce qui se cachait derrière ce look
+futuriste et j'étais séduit par les possibilités d'adaptation à sa
+morphologie (ajout de poids, ajustement de la longueur). Je suis reparti avec
+une souris Cyborg R.A.T. 5 après avoir vérifié rapidement qu'elle
+fonctionnerait sur nos OS alternatifs.
+
+
\ No newline at end of file
diff --git a/content/blog/2011/2011-06-11-support-des-souris-cyborg.md b/content/blog/2011/2011-06-11-support-des-souris-cyborg.md
new file mode 100755
index 0000000..8e35ab9
--- /dev/null
+++ b/content/blog/2011/2011-06-11-support-des-souris-cyborg.md
@@ -0,0 +1,57 @@
+---
+layout: post
+title: Support des souris Cyborg
+categories: GNU/Linux Matériel
+tag: planet
+---
+
+On trouve de l'information contradictoire et pas très à jour sur le support
+des souris Cyborg sous GNU/Linux. Je résume donc ce que j'ai mis en oeuvre pour
+le support du modèle R.A.T. 5 sous ArchLinux. D'abord il faut indiquer ses
+caractéristiques pour Xorg. j'ai rajouté un fichier 10-cyborg-rat-mouse.conf
+dans **/etc/X11/xorg.conf.d**.
+
+ Section "InputClass"
+ Identifier "Mouse Remap"
+ MatchProduct "Saitek Cyborg R.A.T.5 Mouse"
+ MatchDevicePath "/dev/input/event*"
+ Option "ButtonMapping" "1 2 3 4 5 6 7 2 9 10 11 12 0 0 0 16 17 18 19 20 21"
+ EndSection
+
+La souris a été pensée pour les jeux sous Ms Windows pour lequel un CD
+spécifique permet de définir des macros pour automatiser certaines actions. Un
+bouton mode à 3 couleurs permet de passer d'un jeu de macros à un autre. Dans
+chaque mode, on peut définir le rôle de la molette arrière, des 2 boutons sur
+le côté gauche. Je crois que le bouton rouge rajoute de la précision lors des
+visées dans les FPS.
+
+Même si on n'est pas joueur il serait dommage ne pas profiter de ces boutons
+supplémentaires pour se configurer des actions spécifiques. Sous Arch on peut
+installer les paquets AUR xbindkeys et xmacro. Le premier permet d'associer des
+commandes aux boutons tandis que le second permet de capturer (avec xmacrorec2)
+et d'envoyer des keystrokes (xmacroplay). D'emblée on constate que le bouton
+mode n'est pas reconnu et que le bouton arrière gauche est assimilé au bouton
+de la molette principale. Je ne sais pas si c'est une limitation de xmacro ou si
+la reconnaissance de la souris sous X est perfectible. Néanmoins, cela nous
+donne 2 boutons et une molette supplémentaires à configurer. Pour cela, il
+faut lancer xbindkeys au démarrage (le rajouter dans gnome-session-properties
+fait l'affaire), et créer un fichier de configuration **~/.xbindkeysrc**.
+
+A titre d'exemple, voici le fichier.xbindkeysrc que j'utilise actuellement :
+
+ #Ctrl-PgDn (move to previous tab): Thumbwheel right
+ "echo -e 'KeyStrPress Control_L\nKeyStrPress Page_Down\nKeyStrRelease Page_Down\nKeyStrRelease
+ Control_L' | xmacroplay :0"
+ m:0x0 + b:10
+ #Ctrl-PgUp (shift to next tab): Thumbwheel left
+ "echo -e 'KeyStrPress Control_L\nKeyStrPress Page_Up\nKeyStrRelease Page_Up\nKeyStrRelease
+ Control_L' | xmacroplay :0"
+ m:0x0 + b:11
+ #Alt-F4 (close application)): Red "Snipe" button
+ "echo -e 'KeyStrPress Alt_L\nKeyStrPress F4\nKeyStrRelease F4\nKeyStrRelease Alt_L'
+ | xmacroplay :0"
+ m:0x0 + b:12
+ #Ctrl-W (close window): Front thumb button
+ "echo -e 'KeyStrPress Control_L\nKeyStrPress w\nKeyStrRelease w\nKeyStrRelease Control_L'
+ | xmacroplay :0"
+ m:0x0 + b:9
diff --git a/content/blog/2011/2011-07-08-le-vertige.md b/content/blog/2011/2011-07-08-le-vertige.md
new file mode 100755
index 0000000..326c5cb
--- /dev/null
+++ b/content/blog/2011/2011-07-08-le-vertige.md
@@ -0,0 +1,18 @@
+---
+layout: post
+title: Le vertige
+category: Humeur
+---
+
+Je ne voyais jusqu'ici que des avantages à Archlinux et à son mode de mise à
+jour quasi temps réel. C'est fabuleux d'avoir les dernières nouveautés en
+quelques jours. Mais si je n'ai eu aucun problème sérieux lors des mises à
+jour, les changements actuels (passage à Gnome 3, deux changements de version
+majeure de Firefox en 2 mois) donnent un peu le vertige. Pour Gnome 3, c'est une
+révolution des habitudes que j'apprécie ; par contre on essuie un peu les
+plâtres au niveau stabilité et j'ai installé XFCE en parallèle pour
+l'utilisation dans le cadre du travail. Dès sa sortie j'ai adoré Firefox 4 et
+les optimisations de performance qui l'accompagnent mais à peine ai-je refait
+fonctionner toutes mes extensions que la version 5 est là. Du coup, c'est une
+période un peu instable où l'on passe plus de temps à bidouiller sa machine
+qu'à l'utiliser... mais après tout c'est qui nous plait :-)
diff --git a/content/blog/2011/2011-07-26-chive-0-5-1.md b/content/blog/2011/2011-07-26-chive-0-5-1.md
new file mode 100755
index 0000000..7de00ec
--- /dev/null
+++ b/content/blog/2011/2011-07-26-chive-0-5-1.md
@@ -0,0 +1,10 @@
+---
+layout: post
+title: Chive 0.5.1
+category: Archlinux
+---
+
+[Chive](https://launchpad.net/chive), l'outil d'administration MySQL est passé
+en version 0.5.1. La liste des changements est accessible sur [leur
+site](https://launchpad.net/chive/+announcements). Le [paquet
+AUR](http://aur.archlinux.org/packages.php?ID=45734) pour Archlinux est à jour.
diff --git a/content/blog/2011/2011-07-26-switcher-dans-le-monde-de-l-entreprise.md b/content/blog/2011/2011-07-26-switcher-dans-le-monde-de-l-entreprise.md
new file mode 100755
index 0000000..86d0b33
--- /dev/null
+++ b/content/blog/2011/2011-07-26-switcher-dans-le-monde-de-l-entreprise.md
@@ -0,0 +1,37 @@
+---
+layout: post
+title: Switcher dans le monde de l'entreprise
+category: GNU/Linux
+tag: planet
+---
+
+Dans beaucoup d'entreprises il
+est interdit de s'écarter de l'OS officiellement supporté, dans d'autres c'est
+toléré mais généralement sans filet (ne comptez pas sur le [support
+IT](http://fr.wikipedia.org/wiki/Services_d%27assistance) ) ; celles où règne
+le libre choix sont rares. J'ai eu la chance de travailler pour l'une d'entre
+elles ces derniers 18 mois. Ce qui rend le switch difficile ce sont les
+applications sans alternative. Heureusement elles sont de moins en moins
+nombreuses. Les clefs [RSA SecurID](http://www.youtube.com/watch?v=bI6IKsCs8WY)
+ont longtemps été un problème insurmontable plus spécialement sous 64 bits
+mais ce n'est plus le cas. La messagerie d'entreprise Exchange est accessible
+depuis un bail grâce à un connecteur pour Evolution. Quant à la messagerie
+instantanée d'entreprise Communicator, le [plugin
+SIPE](http://sipe.sourceforge.net/) pour Pidgin permet d'accéder à la fonction
+tchat (pour la communication voix il faudra convaincre vos interlocuteurs que
+Skype ou n'importe quel service
+[SIP](http://fr.wikipedia.org/wiki/Session_Initiation_Protocol) est bien
+supérieur). Pour les cas récalcitrant ou des applications "maison" pour
+Microsoft Windows il reste la possibilité d'utiliser
+[Wine](http://www.winehq.org/). Ce n'est pas ma tasse de thé je préfère
+cloisonner les choses et dans ce cas utiliser périodiquement une machine
+virtuelle. Pour gagner énormément de temps, on peut convertir sa machine
+physique en machine virtuelle VMware en deux coups de cuillère à pot en
+utilisant l'outil gracieusement mis à disposition : [VMware vCenter
+Converter](http://www.vmware.com/fr/products/datacenter-
+virtualization/converter).
+
+
+
+Au final on réalise que les barrières qui empêchent GNU/Linux de dépasser la
+barre des 1% de part de marché sur le Desktop ne sont pas techniques.
diff --git a/content/blog/2011/2011-09-17-bonne-rentree-a-tous.md b/content/blog/2011/2011-09-17-bonne-rentree-a-tous.md
new file mode 100755
index 0000000..44eba3e
--- /dev/null
+++ b/content/blog/2011/2011-09-17-bonne-rentree-a-tous.md
@@ -0,0 +1,16 @@
+---
+layout: post
+title: Bonne rentrée à tous
+category: Hébergement
+---
+
+La fièvre [Minecraft](http://www.minecraft.net/) a atteint mon fils et quelques
+uns de ses copains depuis deux mois. Il est amusant de voir qu'un jeu avec des
+graphismes *old-school* provoque autant d'engouement. Comme quoi c'est l'aspect
+ludique qui prime... plutôt rassurant en ces temps où la poudre aux yeux est
+souvent auto-suffisante. Du coup, j'héberge un modeste serveur Minecraft pour
+leur permettre de s'ébattre sur la même carte. Inutile de détailler
+l'installation sur une Debian c'est très bien documenté. Il est juste dommage
+que ce soit du JAVA, c'est assez lourd pour mon céléron.
+
+
diff --git a/content/blog/2011/2011-09-26-surveiller-son-blog.md b/content/blog/2011/2011-09-26-surveiller-son-blog.md
new file mode 100755
index 0000000..6a3ae52
--- /dev/null
+++ b/content/blog/2011/2011-09-26-surveiller-son-blog.md
@@ -0,0 +1,35 @@
+---
+layout: post
+title: Surveiller son blog
+categories: Hébergement Blog
+tag: planet
+---
+
+Quand on héberge son blog à la maison se pose la question de savoir s'il est
+bien accessible de l'extérieur car un problème de
+[DNS](http://fr.wikipedia.org/wiki/Domain_Name_System), une mauvaise
+configuration de la box de son fournisseur ou bien un coup de mou de celle-ci
+peuvent rendre le site inaccessible sans qu'on le sache. La première chose est
+d'avoir un test périodique lancé depuis l'Internet qui nous prévient en cas
+de problème. Plusieurs sites proposent cela gratuitement. Pour ma part
+j'utilise [UptimeRobot](http://www.uptimerobot.com) mais il y en a d'autres. Le
+point crucial c'est d'être notifié, ce qui suppose qu'on utilise une adresse
+de courriel extérieure à son serveur ou Twitter.
+
+
+
+Il est aussi important de valider que le contenu est correct. Pour cela
+j'utilise un [vérificateur de liens](http://www.brokenlinkcheck.com/) en ligne.
+Il peut y avoir des liens cassés car les ressources pointées n'existent plus
+ou bien parce qu'on a mal défini son lien vers des ressources locales et cela
+ne fonctionne pas depuis l'Internet. En fait, il est important de se mettre dans
+les même conditions quand on accède à son blog depuis le réseau local donc
+d'avoir une résolution du nom de domaine qui nous permet d'accéder au blog
+avec la même URL. La résolution
+[DNS](http://fr.wikipedia.org/wiki/Domain_Name_System) nous pointera sur
+l'adresse extérieure de la box ADSL mais la résolution
+[NAT](http://fr.wikipedia.org/wiki/Network_address_translation) ne sera pas
+effectuée car on vient du réseau local et non pas de l'Internet.
+
+Il faut donc modifier la résolution des noms pour le réseau local ;
+différentes possibilités s'offrent à nous :
diff --git a/content/blog/2011/2011-09-29-le-moteur-de-blog-pluxml-evolue.md b/content/blog/2011/2011-09-29-le-moteur-de-blog-pluxml-evolue.md
new file mode 100755
index 0000000..eaa44f5
--- /dev/null
+++ b/content/blog/2011/2011-09-29-le-moteur-de-blog-pluxml-evolue.md
@@ -0,0 +1,17 @@
+---
+layout: post
+title: Le moteur de blog PluXml évolue
+category: Blog
+---
+
+La version 5.1.3 de [PluXml](http://pluxml.org/) est sortie ! Elle contient un
+joli [lot de corrections et
+d'évolutions](http://telechargements.pluxml.org/changelog) dont je n'ai pas
+fait le tour complet (mais j'apprécie le repli de la zone chapô lors de la
+création d'un article et la re-génération des miniatures dans la gestion des
+médias). La mise à jour s'est passée sans problème :
+
+- on sauvegarde le répertoire data qui contient les articles, les médias et les
+commentaires,
+- on extrait la nouvelle archive en écrasant les fichiers existants,
+- on se connecte au blog et on accepte la mise à jour.
diff --git a/content/blog/2011/2011-10-04-installation-de-gnome-3-2-au-secours.md b/content/blog/2011/2011-10-04-installation-de-gnome-3-2-au-secours.md
new file mode 100755
index 0000000..f47f2ac
--- /dev/null
+++ b/content/blog/2011/2011-10-04-installation-de-gnome-3-2-au-secours.md
@@ -0,0 +1,38 @@
+---
+layout: post
+title: Installation de Gnome 3.2, au secours !
+category: Archlinux
+---
+
+Enfin la sortie de Gnome 3.2 ! Je m'en fais une joie depuis 1 semaine. J'ai
+résisté à la tentation de passer sous testing et j'ai attendu son arrivée
+dans le dépôt stable. La mise à jour est énorme : j'installe, je relance
+et... je n'ai que le fond d'écran sous GDM. Vu le peu de configuration
+utilisateur je n'hésite pas à supprimer tous les répertoires de paramètres :
+.gnome2,.config. Rien n'y fait. Je soupçonne une blague de GDM. Je le supprime
+et je démarre directement avec startx. Raté je n'ai toujours que le fond
+d'écran. Bon faisons propre me dis-je ! je supprime tous les paquets Gnome, je
+traque tous les fichiers affilié à Gnome ou GDM qui pourraient rester dans le
+système. Puis je réinstalle tout en [suivant le Wiki à la
+lettre](https://wiki.archlinux.org/index.php/GNOME_3). J'arrive au même
+problème. J'analyse les logs, l'occasion de corriger des problèmes annexes
+(conflit de network manager, dépendances bluetooth manquantes) puis je pense
+avoir identifié le problème lié à ma carte graphique ou à X je ne sais pas
+trop :
+
+ Error:org.freedesktop.ColorManager.Failed:
+ failed to obtain org.freedesktop.color-manager.create-device auth
+
+C'est étonnant puisque la 3.0 a fonctionné des mois. Je force Gnome en mode
+fallback et effectivement ça démarre. Au passage le mode fallback n'est pas
+qu'une version limitée graphiquement, il a son lot de défauts spécifiques
+(pas de support du microphone USB par exemple). Là j'en suis à ma deuxième
+soirée *"je répare mon Gnome"* et je commence à être à court d'idée. Je
+relance, un peu désespéré, la machine sous le kernel 3.0 (j'utilisais le
+2.6.32-LTS) et Gnome démarre en mode normal. Je n'ai pas encore d'explication,
+mes paramètres de kernel sont identiques... j'espère trouver une explication
+plus tard.
+
+Pour l'instant c'est la découverte de la 3.2... Empathy se lance mais je ne
+peux pas créer de compte :-( Bon on verra demain soir... à chaque jour son
+défi ;-)
diff --git a/content/blog/2011/2011-10-09-bilan-de-6-mois-d-auto-hebergement.md b/content/blog/2011/2011-10-09-bilan-de-6-mois-d-auto-hebergement.md
new file mode 100755
index 0000000..775a0fe
--- /dev/null
+++ b/content/blog/2011/2011-10-09-bilan-de-6-mois-d-auto-hebergement.md
@@ -0,0 +1,44 @@
+---
+layout: post
+title: Bilan de 6 mois d'auto-hébergement
+category: Hébergement
+tag: planet
+---
+
+Revenu à l'auto-hébergement depuis 6 mois, il est temps de faire un bilan.
+D'abord le domaine est passé de rognac.co.cc à madyanne.fr car [Google a exclu
+co.cc](http://www.generation-nt.com/google-spam-phishing-domaine-co-cc-
+desindexe-actualite-1229651.html) de son moteur de recherche. Je ne cours pas
+après la popularité mais de là à devenir invisible... J'ai donc acheté un
+domaine chez [Gandi](http://www.gandi.net/) et j'ai profité du pack Mail offert
+pour leur confier mon adresse principale. Suite à de multiples soucis d'ADSL,
+j'estime que le mail est trop critique pour être auto-hébergé.
+
+Les principaux attraits de l'auto-hébergement sont :
+
+* la mise à disposition de ses services quand on est mobilité,
+* la liberté de faire tourner des services atypiques (hors du cadre LAMP ) qui
+exigeraient un serveur dédié en hébergement classique,
+* le contrôle de ses données,
+* l'apprentissage de l'administration système.
+
+Aujourd'hui j'héberge [PluXml](http://pluxml.org/) (moteur de blog),
+[Piwik](http://fr.piwik.org/) (statistiques sur la fréquentation du blog),
+[Tiny Tiny RSS](http://tt-rss.org/redmine/) (lecteur de flux RSS),
+[Prosody](http://prosody.im/) (Jabber), [Subsonic](http://www.subsonic.org)
+(streaming audio), [Shaarli](http://sebsauvage.net/wiki/doku.php?id=php:shaarli)
+(partage des favoris), [Minecraft](http://www.minecraft.net/) (limité à 5
+utilisateurs simultanés) et ses
+[Mods](http://fr.wikipedia.org/wiki/Mod_%28jeu_vid%C3%A9o%29), [Mozilla
+Sync](http://docs.services.mozilla.com/howtos/run-sync.html) (synchronisation
+Firefox).
+
+Au niveau administration j'apprends peu à peu. Je fais tourner
+[logwatch](http://www.debianhelp.co.uk/logwatch1.htm) pour recevoir une analyse
+journalière des logs par mail et depuis récemment
+[fail2ban](http://www.fail2ban.org) qui scrute les logs et ajoute dynamiquement
+des règles au firewall pour bannir des adresses qui tentent des accès non
+autorisés. Je suis suffisamment en confiance pour avoir placé le serveur en
+pseudo [DMZ](http://fr.wikipedia.org/wiki/Zone_d%C3%A9militaris%C3%A9e_%28inform
+atique%29) (car j'ai un plan d'adressage unique) et autoriser un accès SSH à
+distance. Bon j'ai aussi un système de sauvegarde à jour en cas de pépin ;-)
diff --git a/content/blog/2011/2011-11-10-gnome-3-pour-un-usage-professionnel.md b/content/blog/2011/2011-11-10-gnome-3-pour-un-usage-professionnel.md
new file mode 100755
index 0000000..2938322
--- /dev/null
+++ b/content/blog/2011/2011-11-10-gnome-3-pour-un-usage-professionnel.md
@@ -0,0 +1,20 @@
+---
+layout: post
+title: Gnome 3 pour un usage professionnel ?
+category: Archlinux
+---
+
+Depuis que ma machine ArchLinux / Gnome 3 est devenue ma machine de travail
+principale, j'ai un peu la nostalgie de Gnome 2. J'ai greffé une barre de
+tâches [Tint2](http://code.google.com/p/tint2/), activé l'extension qui
+rajoute le menu des applications. Bref on se débrouille pour améliorer sa
+productivité ! Je suis curieux de voir [la couche MGSE de Linux
+Mint](http://blog.linuxmint.com/?p=1851) qui va sortir sous peu. Si ça comble
+les manques de Gnome 3 on peut rêver d'un portage AUR sur Arch. De toute
+façon, revenir en arrière ne me semble pas une bonne idée : le [fork
+Mate](https://github.com/Perberos/Mate-Desktop-Environment) va introduire son
+lot de bugs et il n'a pas vocation à évoluer. Je reste attaché à Gnome, mes
+expériences XFCE et LXDE ont été passagères. Mais je vais changer de machine
+sous peu et je pèse le choix entre Archlinux avec un Gnome 3 "amélioré" et
+une Debian, ce qui laisserait plusieurs mois à Gnome 3 pour grandir et combler
+ses lacunes. A cogiter...
diff --git a/content/blog/2011/2011-12-11-chive-a-muri.md b/content/blog/2011/2011-12-11-chive-a-muri.md
new file mode 100755
index 0000000..e4ae827
--- /dev/null
+++ b/content/blog/2011/2011-12-11-chive-a-muri.md
@@ -0,0 +1,16 @@
+---
+layout: post
+title: Chive a mûri
+category: Archlinux
+---
+
+[Chive](http://www.chive-project.com/), l'outil d'administration MySQL est
+sorti en version 1.0, preuve qu'il atteint une maturité certaine au yeux de ses
+développeurs. Beaucoup de bugs ont été corrigé depuis la version 0.5 et des
+nouvelles fonctionnalités ont vu le jour comme le support des commandes de
+maintenance de table et l'affichage du temps de calcul des requêtes. Pour ne
+rien gâter, c'est l'interface d'administration la plus conviviale de sa
+catégorie (merci
+[Ajax](http://fr.wikipedia.org/wiki/Asynchronous_JavaScript_and_XML) ). Le
+paquet [AUR](http://aur.archlinux.org/packages.php?ID=45734) est disponible pour
+[Archlinux](http://archlinux.fr/).
diff --git a/content/blog/2011/2011-12-30-la-version-noel-de-tiny-tiny-rss.md b/content/blog/2011/2011-12-30-la-version-noel-de-tiny-tiny-rss.md
new file mode 100755
index 0000000..f6c5ef0
--- /dev/null
+++ b/content/blog/2011/2011-12-30-la-version-noel-de-tiny-tiny-rss.md
@@ -0,0 +1,21 @@
+---
+layout: post
+title: La version Noël de Tiny Tiny RSS
+category: Hébergement
+---
+
+L'excellent [logiciel d'aggrégation de flux RSS](http://tt-rss.org)
+est sorti en version 1.5.8.1 peu avant Noël. Quelques bugs sont
+corrigés et la version mobile "classic", classée obsolète depuis quelques
+versions, a été enlevé. C'est facheux car si elle ne brillait pas par son
+look and feel, elle apportait le même niveau de fonctionalités que la version
+Web standard. En lot de consolation, on a la version mobile "tout court", qui a
+certes un super look *à la iphone* mais aucune fonctionalité avancée. On peut
+juste ouvrir les flux un par par un avec un superbe effet de glissement vers la
+droite, aucune possibilité de marquer une catégorie entière comme lue, pas
+d'entrée "tous les articiles". je suppose que l'équipe mise sur les
+applications mobiles pour Android et iPhone et fait le minimum sur la version
+Web mobile. Donc méfiance si vous utilisez la version mobile classic, il vaut
+mieux rester sur Tiny Tiny RSS 1.5.6.
+
+
diff --git a/content/blog/2012/2012-01-08-installation-de-jenkins-ci.md b/content/blog/2012/2012-01-08-installation-de-jenkins-ci.md
new file mode 100755
index 0000000..3716341
--- /dev/null
+++ b/content/blog/2012/2012-01-08-installation-de-jenkins-ci.md
@@ -0,0 +1,85 @@
+---
+layout: post
+title: Installation de Jenkins CI
+category: Développement
+tag: planet
+excerpt: L'intégration continue s'inscrit dans la méthodologie Agile ; Son objectif est de garantir que le projet est stable tout au long du développement
+---
+
+
L'intégration
+continue s'inscrit dans [la méthodologie
+Agile](http://fr.wikipedia.org/wiki/M%C3%A9thode_agile) ; Son objectif est de
+garantir que le projet est stable tout au long du développement et qu'on peut
+livrer le projet à tout moment. Cela implique que les développeurs ne publient
+que des fonctionnalités ou des micro-fonctionnalités complètes (dans le sens
+entièrement implémentées et utilisables) dans le dépôt de sources et qu'on
+peut à tout moment construire le projet dans son intégralité et le déployer,
+généralement sur des environnements de tests pour que l'Assurance Qualité
+puisse tester tout au long du cycle de développement, ou bien en tant que
+version intermédiaire planifiée (milestone, alpha, beta).
+
+Ici je vais décrire l'installation du logiciel d'intégration continue [Jenkins
+CI](http://jenkins-ci.org/) dans le conteneur de Servlet
+[Tomcat](http://tomcat.apache.org/) sous Ubuntu Server 10.4. D'abord on installe
+Tomcat 6 avec le système de paquets :
+
+``` shell
+sudo apt-get install tomcat6
+```
+
+Ensuite on installe manuellement le WAR de Jenkins CI :
+
+``` shell
+# move to tomcat webapps dir
+cd /var/lib/tomcat6/webapps
+sudo wget http://mirrors.jenkins-ci.org/war/latest/jenkins.war
+```
+
+Si Tomcat était lancé, Jenkins va être déployé et disponible en quelques
+secondes. Sinon démarrez Tomcat :
+
+``` shell
+sudo /etc/init.d/tomcat6 start
+```
+
+Jenkins est accessible ici : [http://<nom du
+serveur>:8080/jenkins](http://localhost:8080/jenkins)
+
+Par défaut la sécurité n'est pas activée et tout le monde peut accéder et
+administrer Jenkins. Nous allons remédier à cela en modifiant les paramètres
+de sécurité dans la partie administration qu'on accède en cliquant sur le
+lien *[Administrer Jenkins](http://localhost:8080/jenkins/manage)* puis *[Configurer le système](http://localhost:8080/jenkins/configure)*.
+
+
+
+Après enregistrement, un bouton *S'identifier* fait son apparition dans la
+bannière en haut à droite. Jenkins a délégué à Tomcat la gestion des
+utilisateurs, il faut donc créer, au minimum, un administrateur Jenkins. Editez
+le fichier /var/lib/tomcat6/conf/tomcat-users.xml avec votre éditeur favori et
+ajoutez le rôle 'admin' et un administrateur, par exemple :
+
+```
+
Mon grand
+espoir était d'utiliser une [Debian](http://www.debian.org/) stable, ce qui
+m'aurait laissé encore 1 an de tranquillité sous Gnome 2. Mais j'ai déchanté
+! Après installation à partir des beaux DVD "Squeeze" récemment reçus j'ai
+réalisé que la version stable embarque un kernel 2.6.32, trop ancien pour
+gérer le chipset Wifi et que les versions de Mozilla sont vraiment anciennes.
+Les [backports officiels](http://backports-master.debian.org/) n'ont pas aidé
+à résoudre ces points. La perspective de *tweaker* manuellement la
+distribution m'a effleuré. J'ai plutôt modifié les dépôts pour passer en
+Testing. Ce que j'ai gagné c'est le passage à Gnome 3 et une gestion du Wifi
+boiteuse. De plus Testing évolue continuellement. L'objectif initial n'étant
+pas de passer à une pseudo-rolling release, j'ai quitté Debian avec quelques
+regrets.
+
+Sur le coup, mon raisonnement fut "tant qu'à faire une croix sur Gnome 2,
+autant installer une distribution récente". Ce fut donc Ubuntu 11.10 avec Unity
+ou Gnome 3. Bon Gnome 3 je connais, je l'ai utilisé presque 1 an à la maison.
+C'est mignon, bien pensé mais pas adapté à mon usage où je papillonne toute
+la journée parmi une vingtaine d'applications lancées. Du coup, j'ai donné sa
+chance à Unity et j'ai tenu 2 semaines :-) Mais le bilan n'est pas si négatif.
+J'ai beaucoup apprécié l'espace gagné sur l'écran grâce à la barre de menu
+unique (comme dans le monde des pommes). Ce qui me déplait fortement c'est la
+difficulté à trouver une application dans le panel. Quelle idée marketing
+tordue de mixer les applications installées et celles disponibles dans l'Ubuntu
+store!!! On peut contourner le problème en rajoutant le [Classic Menu
+Indicator](http://www.webupd8.org/2011/06/use-classic-menu-in-unity-
+classicmenu.html) mais le problème de basculement parmi une vingtaine
+d'applications lancées reste entier.
+
+Las j'ai transformé mon Ubuntu en Xubuntu. Ce que je peux dire sur XFCE a été
+lu ou dit ailleurs : avec des efforts de personnalisation on arrive à recréer
+un Gnome 2-like (en moins beau, moins bien intégré). On a une vraie barre des
+tâches qui peut regrouper intelligemment les applications lancées et le menu
+n'est pas une porte ouverte sur une boutique d'applications. Par contre le
+gestionnaire de fichier Thunar est moins bien que Nautilus (notamment il manque
+la gestion des onglets) et **on a le goût amer d'avoir quelque chose de presque
+aussi bien qu'en... 2010** ;-) L'année 2010 c'est Ubuntu 10.04 juste avant que
+Canonical n'entame le grand chantier Unity et que l'équipe Gnome ne démarre sa
+révolution pour ouvrir Gnome aux tablettes et aux netbooks (en oubliant les
+gens qui utilisent leur machine pour travailler). Bref 2010 c'est l'avant
+dernière version "Gnome 2" sortie par Canonical dans [une version LTS maintenue
+jusqu'en avril 2013](http://doc.ubuntu-fr.org/lucid). D'un coup il y a eu
+déclic ! Serait-il possible que cette version avec un support étendu soit
+capable de gérer mon matériel acheté en fin d'année 2011 ?
+
+Et bien la réponse est positive, avec quelques ajustements mineurs :
+
+* l'activation des dépôts officiels "lucid-backports" et "lucid-proposed" pour
+passer au plus récent kernel proposé en 2.6.x, à savoir le 2.6.38-13 (si
+nécessaire on peut aller jusqu'au 3.0.0-15) et bénéficier de Firefox 9.
+* l'ajout du dépôt Ubuntuzilla pour bénéficier de Thunderbird 9 car la version
+3.x fournie par défaut ne propose pas l'extension Lightning.
+* La désactivation du driver Nouveau (encore expérimental en 10.04) -
+blacklisté dans /etc/modprobe.d/blacklist.conf - l'utilisation de la carte
+Intel est bien suffisante pour mon usage.
+
+Tous les outils que j'utilise quotidiennement pour le travail fonctionnent
+parfaitement (Eclipse, JAVA, VMWare Player, Skype), l'environnement de bureau
+est un bonheur retrouvé. Pour info, Ubuntu 10.04 démarre et s'arrête 2 fois
+plus vite qu'une version 11.10. Que fait Canonical depuis 3 versions ? - ah oui
+ils focalisent sur l'environnement de bureau :-( Après un mois d'errements,
+j'ai enfin l'impression d'avoir la distribution qu'il me faut pour cette
+machine. J'aurais pu intituler cet article "Retour vers le futur".
diff --git a/content/blog/2012/2012-03-03-surveiller-sa-ligne-adsl-avec-munin.md b/content/blog/2012/2012-03-03-surveiller-sa-ligne-adsl-avec-munin.md
new file mode 100755
index 0000000..b73c615
--- /dev/null
+++ b/content/blog/2012/2012-03-03-surveiller-sa-ligne-adsl-avec-munin.md
@@ -0,0 +1,106 @@
+---
+layout: post
+title: Surveiller sa ligne ADSL avec Munin
+category: Hébergement
+tag: planet
+---
+
+Je me suis intéressé à la supervisition de ma box ADSL afin de grapher la
+bande passante montante et descendante ainsi que les valeurs de bruit et
+d'atténuation, ceci dans le but de vérifier la stabilité des valeurs dans le
+temps et de corréler des impressions de dégradation avec des mesures
+concrètes.
+
+La première étape nécessite de trouver un protocole fournissant les
+informations nécessaires. Etant abonné Orange je suis équipé d'une livebox 2
+qui fournit un service [HTTP](http://fr.wikipedia.org/wiki/HTTP) et un service
+[TELNET](http://fr.wikipedia.org/wiki/TELNET). Sur l'ancienne génération le
+mot de passe du compte root était connu et on pouvait tirer les informations
+nécessaires depuis le service TELNET. De ce que j'ai lu dans les forums, le mot
+de passe est inconnu sur la nouvelle génération et la seule option reste
+l'interface HTTP, pas vraiment le protocole idéal pour de la supervision. Fort
+heureusement, un script PERL pour piloter la box a été écrit par
+[teebeenator](http://www.forum-orange.com/forums/profile.php?id=29572) et
+sympathiquement fourni à la communauté des utilisateurs. Ce script est
+téléchargeable [ici](http://www.forum-
+orange.com/forums/viewtopic.php?id=32420).
+
+
La deuxième étape consiste à choisir un
+outil de supervision capable de collecter des valeurs et de créer des graphes,
+un outil de la famille [MRTG](http://fr.wikipedia.org/wiki/MRTG) : après un
+test de [Cacti](http://www.cacti.net/) qui est un bon outil mais que j'ai jugé
+trop complexe par rapport à mon besoin initial, mon choix s'est porté sur
+[Munin](http://munin-monitoring.org/) : un outil simple (voire rustique) écrit
+en PERL, aucune interface graphique d'administration, une interface Web 1.0
+(sans JavaScript) qui présente des graphes à la journée, consolidés à la
+semaine, au mois et à l'année générés statiquement en tant qu'images
+bitmap. L'installation est triviale et correctement documéntée pour Debian sur
+[le Wiki de Munin](http://munin-monitoring.org/wiki/Documentation). Dans mon
+cas, je déploie sur mon petit serveur Debian Squeeze et j'utilise
+[NginX](http://fr.wikipedia.org/wiki/Nginx) en tant que serveur HTTP. Faire un
+lien symbolique de /var/www/... vers le répertoire www de Munin
+(/var/cache/munin/www) est suffisant pour lier le serveur Web à Munin.
+
+La troisième et dernière étape consiste à étendre Munin en créant des
+plugins. D'abord on collecte les données, c'est réalisé par un shell script
+qui appelle le script PERL de teebeenator et qui sauve les donnée dans un
+fichier texte. Cette collecte est réalisée toutes les 5 minutes grâce à
+CRON.
+
+``` shell
+perl livebox.pl --user=admin --pass=
Faisant suite à
+[l'article décrivant l'installation de Jenkins
+CI](http://blogduyax.madyanne.fr/index.php?article63/installation-de-jenkins-
+ci), nous allons voir comment gérer un projet en reprenant la configuration
+déployée sous Tomcat avec Ubuntu 10.04 serveur. Pour rappel, [Jenkins
+CI](http://fr.wikipedia.org/wiki/Jenkins_%28informatique%29) permet de mettre en
+place une intégration continue afin de traquer d'éventuelles régressions d'un
+projet logiciel pendant le cycle de développement. En pratique, il sait
+accéder à la plupart des gestionnaires de sources et s'interface avec la
+plupart des système de build. Son rôle principal consiste à recompiler le
+projet périodiquement, dérouler les tests unitaires et produire des
+notifications si quelque chose va de travers.
+
+Mon projet d'exemple est représentatif de mes activités de ces derniers mois :
+le développement d'un logiciel écrit en Java qui utilise le système de build
+[Apache Maven](http://fr.wikipedia.org/wiki/Apache_Maven) pour construire le
+projet. D'abord il faut installer Maven
+
+``` shell
+$ apt-get install maven2
+```
+
+Maven est géré nativement par Jenkins (sans l'ajout de plugin). On accède à
+la configuration de l'outil Maven depuis la page d'administration globale :
+
+
+
+A l'exécution, Jenkins cherche les données relatives à Maven dans
+/usr/share/tomcat6 car il s'exécute dans le conteneur de servlet Tomcat en tant
+qu'application Web. Si le projet nécessite un fichier de configuration Maven
+particulier, il faut le copier dans **/usr/share/tomcat6/.m2/settings.xml** et
+il faut s'assurer que l'utilisateur tomcat6 possède tous les droits sur le
+répertoire.m2.
+
+Maintenant, nous sommes prêts à créer un nouveau Projet. Les projets de type
+Maven ont leur propre type de projet :
+
+
+
+Peu d'informations sont nécessaires pour définir un projet de type Maven :
+* l'interaction avec le gestionnaire de sources,
+* le chemin du fichier POM.XML qui contient la description du build Maven,
+* les "goals" de compilation du projet.
+
+Dans mon exemple, le gestionnaire de source est Subversion (SVN pour les
+proches) et il est supporté en standard, de même que CVS. La liste est
+restreinte mais ne paniquez pas, une quantité de plugins permettent de
+supporter à peu près tout ce qui existe (Bazaar, GIT, ClearCase,
+Mercurial,...). Cerise sur le gâteau la gestion des plugins n'est pas
+bidouillesque. Les plugins sont supportés officiellement, listés et
+installables depuis l'interface d'administration de Jenkins.
+
+Configurer SVN pour le projet se borne à définir l'URL du projet et configurer
+l'authentification.
+
+
+
+Une section Maven définit les "goals" à exécuter et le chemin du fichier de
+build POM.XML. Les "goals" 'clean' 'install' sont les cibles classiques pour
+nettoyer puis reconstruire tout le projet.
+
+
+
+Le build peut être déclenché de plusieurs manières: manuellement ou
+automatiquement. Dans ce dernier cas, ce peut être sur changement des sources
+dans le gestionnaire de sources, indirectement dans le cas de multi-projets
+ayant des dépendances (où l'on recompile le projet B chaque fois que le projet
+A est construit). Il y a d'autres cas plus spécifiques, voire très
+particuliers :-) gérés par des plugins.
+
+Dans notre exemple je reste simple et je définis un déclenchement de build du
+projet sur modification du gestionnaire de source. De manière similaire à
+l'outil CRON, on peut définir le mot-clef '@hourly' qui signifie qu'une fois
+par heure Jenkins regarde si quelque chose à changé sur SVN (c'est à dire si
+un développeur a publié du nouveau code).
+
+
+
+Dans le cas de mon projet dont la compilation prend une vingtaine de minutes
+c'est une valeur sensée. Quand l'intégration continue est présentée aux
+développeurs, il prennent rapidement leur marque par rapport au fait que le
+projet est vérifié chaque début d'heure et ils évitent quelques pièges :
+
+* morceler des 'commits' qui ne compilent pas (ce qui est une mauvaise pratique en
+soi) et pire, publier un peu avant l'heure entière ce qui augmente le risque de
+casser le build de l'intégration continue pendant la prochaine heure,
+* publier en fin d'heure, ce qui limite les chances de rattraper le coup en cas de
+problème inattendu.
+
+Le dernier point restant à voir pour boucler l'exemple, c'est la notification
+des développeurs quand l'intégration continue échoue. Là aussi on peut
+élaborer un système complexe, toute une catégorie de plugins existe pour
+s'interfacer avec des systèmes existants (SCM, Messengers) ou rester basique et
+envoyer une notification par email.
+
+
+
+Jenkins CI conserve un certain nombre de builds et il affiche une météo du
+build en fonction de la stabilité des derniers résultats. En cas d'erreur, il
+envoie les parties pertinentes. Si cela ne suffit pas à identifier la cause de
+l'erreur, toutes les traces de console sont conservées et attachées à chaques
+build.
+
+Jenkins CI peut être mis en œuvre en moins d'une journée sur un projet simple
+et ainsi apporter les bénéfices d'une intégration continue à une équipe de
+développeurs et de testeurs. Mais l'outil est d'une telle richesse qu'il peut
+apporter beaucoup plus :
+
+* support de projets complexes par une architecture maître/esclave pour
+déléguer la construction de sous-parties du projet,
+* support de langages / systèmes de builds / gestionnaires de sources très
+étendu,
+* déclenchement de tâches post-build pour générer des rapports (analyse de la
+qualité du code, couverture du code par des tests), déployer les versions
+produites automatiquement.
+
+Né du fork de Hudson l'année dernière (suite à un différent avec Oracle),
+Jenkins CI est un projet open source (sous licence MIT) en plein essor, ce que
+confirme le rythme régulier des sorties et l'activité de son forum.
diff --git a/content/blog/2012/2012-04-15-mes-applications-pour-blackberry.md b/content/blog/2012/2012-04-15-mes-applications-pour-blackberry.md
new file mode 100755
index 0000000..b3a2165
--- /dev/null
+++ b/content/blog/2012/2012-04-15-mes-applications-pour-blackberry.md
@@ -0,0 +1,51 @@
+---
+layout: post
+title: Mes applications pour Blackberry
+category: Mobilité
+---
+
+Après une longue période sous Android j'ai migré vers Blackberry. Certes,
+Android est ce qui s'approche le plus d'un OS libre (on peut même le
+[degoogler](http://blogduyax.madyanne.fr/index.php?article41/syncml) ) mais j'ai
+eu envie de découvrir autre chose : d'abord un système non tactile, ça peut
+sembler à un retour en arrière mais ça me correspond bien (ça me rappelle
+mon Nokia E61), une vraie bouffée d'air frais même après une période à
+subir les erreurs de jeunesse d'Android. On dit souvent "terminal Blackberry" et
+j'ai compris ce terme à l'utilisation : on est plus face à un téléphone
+ultra-communiquant qu'une tablette avec option téléphone. C'est d'ailleurs mon
+principal grief contre l'Android d'aujourd'hui : qu'on ait laissé autant de
+liberté aux applications de dégrader le système voire le planter. Bon
+attention, ce n'est pas un article pro-blackberry Mais j'apprécie la cohérence
+de son système (même s'il est rustique), sa stabilité et son autonomie
+(grâce à la technologie Push). Le point faible est bien sûr le nombre
+d'applications disponibles, ce qui devrait s'améliorer les mois à venir.
+Néanmoins, si on a des besoins limités et orientés professionnel on trouve
+son bonheur. Voici la sélection des applications qui me sont indispensables :
+
+
+
+* Imo Instant Messenger : comme Meebo c'est un service Web 2.0 qui permet de
+créer un compte unique chez eux pour accéder à ses comptes Jabber, Skype, et
+autres. Mais il permet aussi de se connecter individuellement à ses comptes
+multi-protocoles et il propose une application pour Blackberry, officiellement
+en bêta mais qui fonctionne très bien et n'inonde pas de publicité. Vu la
+pauvreté des clients Jabber dans le BlackBerry Store c'est une aubaine.
+* BBSSH : un fabuleux client SSH sous licence GPL.
+* mProductive : une applications commerciale de gestion du temps qui centralise
+intelligemment les évènements du calendrier, les tâches et les mémos. Après
+avoir testé toutes celles du BB Store en essai gratuit je me suis résolu à
+investir 5$ dans mProductive Lite et je ne le regrette pas, je l'utilise
+quotidiennement.
+* Poynt : un classique qui permet de trouver des points d'intérêt proches de
+vous (restaurants, pharmacies...)
+* FidMe : un autre classique qui existe pour d'autres plateformes, permettant de
+stocker vos cartes de fidélité.
+* France 24 : une des rares applications permettant de visionner le journal TV. On
+la trouve sur le BB Store.
+
+Si vous avez quelques perles à partager n'hésitez pas à laisser un
+commentaire.
+
+Je rassure ceux qui me connaissent je nage toujours dans l'Android : j'ai
+installé une pre-Cyanogen 9 sur une tablette Nook et Cyanogen 7.1 sur un
+Motorola Defy la semaine dernière :-)
diff --git a/content/blog/2012/2012-06-19-chive-passe-en-version-1-1.md b/content/blog/2012/2012-06-19-chive-passe-en-version-1-1.md
new file mode 100755
index 0000000..f1086c2
--- /dev/null
+++ b/content/blog/2012/2012-06-19-chive-passe-en-version-1-1.md
@@ -0,0 +1,26 @@
+---
+layout: post
+title: Chive passe en version 1.1
+category: Archlinux
+tag: planet
+---
+
+Le gestionnaire de base MySQL alternative crédible et sexy à phpMyAdmin, le
+bien nommé [Chive](http://www.chive-project.com/) est sorti en version 1.1.
+
+C'est une version considérée majeure par ses développeurs qui apporte deux
+fonctionnalités :
+
+* la première passe inaperçue pour l'utilisateur lambda que je suis : la
+possibilité d'empaqueter Chive en tant qu' archive Phar. C'est utile à ceux
+qui déploient Chive le temps d'un développement sur un serveur Web tiers - qui
+a dit "squat moderne" ;-) - car on ne déploie qu'une archive et PHP l'exécute
+sans l'extraire.
+* la seconde est le remplacement de l'éditeur de code SQL "maison" par l'éditeur
+ACE, projet soutenu par la fondation Mozilla. C'est un changement qui sera
+bénéfique pour le produit en terme de maintenabilité et de qualité du code.
+
+Rajoutez à ces deux changements quelques correctifs et on obtient le
+millésimé 1.1 de ce beau projet. J'ai mis à jour le paquet
+[AUR](http://en.wikipedia.org/wiki/Arch_Linux#Arch_User_Repository) pour la
+distribution [ArchLinux](http://www.archlinux.org/).
diff --git a/content/blog/2012/2012-07-13-ranger-son-cartable.md b/content/blog/2012/2012-07-13-ranger-son-cartable.md
new file mode 100755
index 0000000..fa58366
--- /dev/null
+++ b/content/blog/2012/2012-07-13-ranger-son-cartable.md
@@ -0,0 +1,35 @@
+---
+layout: post
+title: Ranger son cartable
+category: Humeur
+tag: planet
+---
+
+Les vacances approchent ! Avant d'aller construire des châteaux de sable, c'est
+le bon moment pour mettre de l'ordre dans ses dossiers, faire le point sur
+l'année professionnelle écoulée et... tenir à jour son curriculum vitae. [La
+dernière fois que je m'étais prêté à
+l'exercice](http://blogduyax.madyanne.fr/index.php?article25/decouvrir-latex)
+avait été l'occasion de me familiariser avec LaTeX, d'apprécier la clarté du
+langage et la qualité du rendu en PDF avec pdflatex. J'ai décidé de continuer
+sur la même voie, avec l'objectif de produire une mise en page moins austère
+à défaut de pouvoir rajeunir le candidat ;-)
+
+
En cherchant des idées
+de mise en forme j'ai découvert [moderncv](http://www.ctan.org/pkg/moderncv),
+une classe de document LaTeX qui permet de structurer le document par des
+commandes supplémentaires (définir les données personnelles, définir une
+entrée d'expérience,...) et choisir une mise en forme (casual, classic) en
+fonction des goûts.
+
+J'ai utilisé la version 1.0 sortie cette année avec Tex 2012. Sous Fedora 17,
+ma nouvelle distribution, les paquets Tex sont anciens. J'ai tenté
+l'installation expérimentale de Tex 2012 évoquée sur le Wiki de Fedora mais
+elle semble incomplète. Le mieux c'est de se référer à [la distribution Tex
+Live](http://www.tug.org/texlive/) et d'utiliser [l'installateur
+léger](http://www.tug.org/texlive/acquire-netinstall.html) qui télécharge et
+installe Tex depuis le réseau.
+
+Pour inspirer ceux qui se veulent se lancer sans partir de zéro, le CV complet
+de Jean Code est téléchargeable [ici](/documents/moderncv.zip).
diff --git a/content/blog/2012/2012-09-23-bonne-rentree.md b/content/blog/2012/2012-09-23-bonne-rentree.md
new file mode 100755
index 0000000..0c2482f
--- /dev/null
+++ b/content/blog/2012/2012-09-23-bonne-rentree.md
@@ -0,0 +1,12 @@
+---
+layout: post
+title: Bonne rentrée
+category: Humeur
+---
+
+Le blog n'est pas mort même si son auteur passe beaucoup de temps à regarder
+la série Walking Dead ces dernières semaines ;-) Comme chaque année, entre
+les vacances et la rentrée, GNU/Linux est passé en priorité basse. Mais
+l'envie reste intacte et un récent changement professionnel (oui encore) me
+permet d'explorer de nouveaux usages et d'utiliser de nouveaux projets libres
+qui devraient inspirer des articles les semaines à venir.
diff --git a/content/blog/2012/2012-09-25-compilation-de-tuxboot-sur-fedora-17.md b/content/blog/2012/2012-09-25-compilation-de-tuxboot-sur-fedora-17.md
new file mode 100755
index 0000000..b2d8a4f
--- /dev/null
+++ b/content/blog/2012/2012-09-25-compilation-de-tuxboot-sur-fedora-17.md
@@ -0,0 +1,37 @@
+---
+layout: post
+title: Compilation de Tuxboot sur Fedora 17
+category: GNU/Linux
+tag: planet
+---
+
+Tuxboot est un fork de Unetbootin qui permet de créer une version USB de
+**Clonezilla live** et **GParted live**, ainsi que DRBL live et Tux2live. C'est
+l'outil recommandé par Clonezilla pour créer une clef USB Clonezilla Live. Ils
+fournissent des paquets pour Debian et les sources. Etant sur Fedora 17, j'ai
+opté pour la compilation à partir des sources :
+
+* Récupérer les sources sur le site de Tuxboot (http://tuxboot.org) :
+tuxboot-0.4.src.tar.gz
+* Installer les outils de développement QT nécessaires à la compilation : yum
+install qt-devel
+* Installer les paquets 7z recommandés pour l'exécution : yum install p7zip
+p7zip-plugins
+* Décompresser l'archive dans un répertoire de travail : tar xvf
+tuxboot-0.4.src.tar.gz
+* Suivre la procédure du fichier INSTALL fourni en adaptant les noms des
+exécutables pour Fedora
+
+Voici le source du fichier INSTALL
+
+``` shell
+cp tuxboot.pro tuxboot-pro.bak
+sed -i '/^RESOURCES/d' tuxboot.pro
+lupdate-qt4 tuxboot.pro
+lrelease-qt4 tuxboot.pro
+qmake-qt4 "DEFINES += NOSTATIC CLONEZILLA" "RESOURCES -= tuxboot.qrc"
+make
+mv tuxboot-pro.bak tuxboot.pro
+```
+
+Si la compilation se passe bien, l'exécutable tuxboot est créé.
diff --git a/content/blog/2012/2012-09-29-eclipse-juno-sous-gnu-linux.md b/content/blog/2012/2012-09-29-eclipse-juno-sous-gnu-linux.md
new file mode 100755
index 0000000..6104a8c
--- /dev/null
+++ b/content/blog/2012/2012-09-29-eclipse-juno-sous-gnu-linux.md
@@ -0,0 +1,50 @@
+---
+layout: post
+title: Eclipse Juno sous GNU/Linux
+category: Développement
+tag: planet
+---
+
+La dernière version d'Eclipse, sortie en juin dernier, a pour nom de code
+**Juno**. Eclipse c'est un [IDE](http://fr.wikipedia.org/wiki/Environnement_de_d
+%C3%A9veloppement_int%C3%A9gr%C3%A9) pour le développement Java bâti sur une
+plateforme ouverte, extensible à au possible par le biais de plugins. Du coup,
+Eclipse est livré sous licence EPL (Eclipse Public License), une licence
+reconnue libre par la FSF mais moins contraignante que la GPL avec laquelle est
+est incompatible d'ailleurs, afin de permettre à des éditeurs de bâtir des
+logiciels propriétaires (ou privateurs selon les termes de Richard Stallman) en
+s'appuyant sur sa plateforme.
+
+Selon sa distribution (Debian-based, Fedora, Arch ou autre), on peut utiliser le
+système de paquets pour installer Eclipse mais je trouve préférable
+d'installer manuellement en téléchargeant depuis [le site
+officiel](http://www.eclipse.org/) car la plateforme est décomposée en un
+certain nombre de sous-projets et différents assemblages peuvent téléchargés
+depuis le site (Eclipse for Java EE, Eclipse for Java, Eclipse Classic). En
+installant manuellement on s'évitera les problèmes de mise à jour non
+maîtrisés et les problèmes de dépendances manquantes entre sous-projets.
+
+Après avoir démarré Juno, deux éléments visuels m'ont choqué : le
+dégradé de la barre d'outil et la taille de fonte excessive de certains
+titres.
+
+
+
+Personnaliser l'apparence d'Eclipse a toujours été un peu casse-tête. Le menu
+apparence dans les préférences regorge d'options pour modifier l'apparence des
+différents éditeurs de code (Java, XML,...) mais rien pour certains aspects
+globaux comme ceux qui dérangent justement.
+
+Dans ce cas, la solution vient d'une extension qui permet de modifier la CSS
+définissant ces aspects de l'interface. Pour cela, il faut installer le plugin
+**E4 CSS Editor** depuis le site suivant : [http://download.eclipse.org/e4/updat
+es/0.12](http://download.eclipse.org/e4/updates/0.12).
+
+
+
+Une fois l'éditeur CSS installé, il s'active quand on ouvre l'option
+Préférences / Apparence dans le menu Windows. Pour diminuer la fonte et
+harmoniser le style de la barre d'outils avec le reste de l'interface, il faut
+appliquer la modification suivante (la version modifiée est à droite) :
+
+
diff --git a/content/blog/2012/2012-12-04-installer-sabnzbd-derriere-nginx.md b/content/blog/2012/2012-12-04-installer-sabnzbd-derriere-nginx.md
new file mode 100755
index 0000000..047f982
--- /dev/null
+++ b/content/blog/2012/2012-12-04-installer-sabnzbd-derriere-nginx.md
@@ -0,0 +1,118 @@
+---
+layout: post
+title: Installer SABnzbd derrière Nginx
+category: Hébergement
+---
+
+[SABnzbd](http://sabnzbd.org/), comme son nom ne l'indique pas vraiment, est un
+lecteur de news binaires. Il permet de récupérer des fichiers depuis
+[Usenet](http://fr.wikipedia.org/wiki/Usenet). C'est une application serveur,
+qu'on héberge derrière un serveur Web, et qui offre une interface de gestion
+depuis un navigateur. Il faut bien sûr l'associer à un compte chez un
+fournisseur Usenet. Je ne détaille pas plus l'utilisation de l'outil, le site
+officiel est suffisamment documenté, mais plutôt son installation dans le
+cadre de l'auto-hébergement avec le serveur Web Nginx en frontal et non pas le
+traditionnel Apache.
+
+Depuis [la page de téléchargement](http://sabnzbd.org/download/) on peut
+télécharger les sources Python. Les manipulations suivantes sont réalisées
+sur une Debian 6 avec Python, Nginx et OpenSSH installés.
+
+
+``` shell
+# on installe sous /srv
+cd /srv
+wget http://sourceforge.net/projects/sabnzbdplus/files/sabnzbdplus/0.7.6/
+ SABnzbd-0.7.6-src.tar.gz/download -O SABnzbd-0.7.6-src.tar.gz
+tar xvf SABnzbd-0.7.6-src.tar.gz && rm -f SABnzbd-0.7.6-src.tar.gz
+# on crée un lien symbolique /srv/sabnzbd pour gérer aisément les futures mises à jour
+ln -s SABnzbd-0.7.6 sabnzbd
+```
+
+L'étape suivante consiste à démarrer SABnzbd pour définir sa configuration
+générale et **aussi restreindre l'adresse d'écoute** à l'interface localhost
+(127.0.0.1) pour forcer le passage par Nginx et son authentification que nous
+allons mettre en place par la suite. On peut automatiser le démarrage en
+rajoutant un script sabnzbd sous /etc/init.d tel que celui-ci :
+
+``` shell
+### BEGIN INIT INFO
+# Provides: sabnzd
+# Required-Start: $local_fs $remote_fs
+# Required-Stop: $local_fs $remote_fs
+# Should-Start: $all
+# Should-Stop: $all
+# Default-Start: 2 3 4 5
+# Default-Stop: 0 1 6
+# Short-Description: Start/stop Sabnzbd
+# Description: Start/stop Sabnzbd
+### END INIT INFO
+
+PATH=/sbin:/bin:/usr/sbin:/usr/bin
+
+. /lib/lsb/init-functions
+
+if [ "$#" -ne 1 ]; then
+ log_failure_msg "Usage: /etc/init.d/sabnzd" \
+ "{start|stop}"
+ exit 2
+fi
+
+case "$1" in
+ start)
+ python /srv/sabnzbd/SABnzbd.py -d -f /root/.sabnzbd/sabnzbd.ini
+ exit $?
+ ;;
+ stop)
+ /usr/bin/wget -q --delete-after "http://localhost:7777/sabnzbd/api?mode=shutdown
+ &apikey;=24be83f61210daad59aa0e90223ccd4f"
+ exit $?
+ ;;
+ *)
+ log_failure_msg "Usage: /etc/init.d/sabnzbd" \
+ "{start|stop}"
+ exit 2
+ ;;
+esac
+
+log_failure_msg "Unexpected failure, please file a bug."
+exit 1
+```
+
+On active ce script sous Debian avec update-rc.d sabnzbd defaults. Finalement on
+configure Nginx comme proxy. Je me suis borné à un accès HTTP protégé par
+une authentification utilisateur / mot de passe mais HTTPS est recommandé.
+
+``` nginx
+server {
+ listen 80;
+ server_name www.yourserver.yourdomain;
+ root /var/www/www;
+ access_log /var/log/nginx/www.access.log;
+ error_log /var/log/nginx/www.error.log;
+
+ location /sabnzbd {
+ auth_basic "Restricted area";
+ auth_basic_user_file /var/www/htpasswd;
+ proxy_set_header X-Forwarded-Host $host;
+ proxy_set_header X-Forwarded-Server $host;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_pass http://127.0.0.1:7777/sabnzbd;
+ }
+}
+```
+
+Pour la création du fichier d'authentification **htpasswd** je vous renvoie à
+la [FAQ de Nginx](http://wiki.nginx.org/Faq#How_do_I_generate_an_htpasswd_file_w
+ithout_having_Apache_tools_installed.3F) car plusieurs méthodes sont possibles.
+Gare à sécuriser son accès et à le placer hors des répertoires servis par
+Nginx. A ce stade SABnzbd fonctionne à moitié :-) En effet SABnzbd ne va pas
+servir toutes les ressources (HTML / CSS) et il faut les lier statiquement à
+Nginx.
+
+``` shell
+# on lie les ressources statiques du thème Plush
+mkdir -p /var/www/www/sabnzbd
+ln -s /srv/sabnzbd/interfaces/Plush/templates/static /var/www/www/sabnzbd/static
+ln -s /srv/sabnzbd/interfaces/Config/templates/staticcfg /var/www/www/sabnzbd/staticcfg
+```
diff --git a/content/blog/2012/2012-12-31-bilan-de-l-annee-2012.md b/content/blog/2012/2012-12-31-bilan-de-l-annee-2012.md
new file mode 100755
index 0000000..eeb7d8e
--- /dev/null
+++ b/content/blog/2012/2012-12-31-bilan-de-l-annee-2012.md
@@ -0,0 +1,28 @@
+---
+layout: post
+title: Bilan de l'année 2012
+category: Humeur
+tag: planet
+---
+
+L'année a été bien remplie ! Au niveau de mon implication dans le logiciel
+Libre, je n'ai pas réalisé tout ce que j'avais en tête, par manque de temps,
+mais je me suis vraiment fait plaisir. Après un premier semestre où j'avais
+carte blanche pour le choix des outils de l'équipe et où j'ai mis en place le
+serveur de développement (Debian, Subversion, Redmine, Jenkins, Sonar), j'ai
+intégré une nouvelle société avec une double casquette développeur Java /
+admin système GNU/Linux qui m'amène à mettre en place des solutions de Haute
+Disponibilité.
+
+
Sinon ma belle découverte de l'année c'est Fedora que j'utilise au travail et
+à la maison depuis 6 mois. Alors que j'ai surtout utilisé des distributions
+basées sur Debian hormis ArchLinux par le passé, j'ai été enchanté par le
+spin XFCE de Fedora 17. Mon portable relativement récent est correctement
+géré *"out of the box"*, les dépôts Fedora sont plutôt complets et
+généralement on trouve une version RPM des logiciels moins libres. L'outil de
+gestion de paquets Yum est bluffant par sa rapidité grâce à un système de
+téléchargement différentiel qui permet d'économiser de la bande passante.
+Vivement Fedora 18 :-)
+
+Bonnes fêtes de fin d'année à tous !
diff --git a/content/blog/2013/2013-01-06-marre-des-aquariums.md b/content/blog/2013/2013-01-06-marre-des-aquariums.md
new file mode 100755
index 0000000..b044e3b
--- /dev/null
+++ b/content/blog/2013/2013-01-06-marre-des-aquariums.md
@@ -0,0 +1,81 @@
+---
+layout: post
+title: Marre des aquariums
+category: Humeur
+tag: planet
+---
+
+Deux expériences récentes m'ont conforté dans l'importance de supporter le
+Libre et rappelé que la bataille ne se joue pas que dans la sphère
+professionnelle, bien au contraire.
+
+Par confort (et la faiénantise n'est jamais loin), j'avais acheté un boitier
+multimédia il y a 3 ans à l'époque ou le Media Player de mon fournisseur
+Internet montrait ses limites à streamer certains formats vidéo du PC à la
+TV. Le boitier a bien rempli son rôle, on l'allume en même temps que la TV, il
+démarre en 3s et il décode quasiment tout. Simple comme un téléphone à
+compote ;-) Seulement deux ans plus tard, on est passé de "il décode quasiment
+tout" à "il décode pas mal de trucs". Confiant, je saute sur mon panda roux
+pour naviguer sur la toile, me disant qu'il existe probablement des mise à jour
+de firmware chez le constructeur ou mieux un firmwware alternatif développé
+par des passionnés qui rajoute des fonctionnalités. Et bien choux blanc ! Le
+constructeur préfère sortir des nouveaux modèles que rallonger la durée de
+vie des anciens. Rien d'étrange à cela, il s'agit d'une société commerciale
+dont l'objectif premier est de réaliser du chiffre d'affaire. Quant aux
+passionnés, ils existent certainement mais soit le boitier multimédia est
+très bien verrouillé, soit le challenge attire moins les foules que craquer la
+dernière console à la mode. Au final, je me retrouve avec un boitier
+multimédia en fin de vie car son logiciel n'a pas évolué depuis 2010.
+Sanction méritée ! J'ai clairement manqué de nez en choississant un
+constructeur qui ne déverrouille pas ses firmware, qui n'anime pas une
+communauté de passionnés de ses produits. A refaire aujourd'hui, je miserai
+sur un mini PC avec une GeeXboX ou un truc du genre, en tout cas une solution
+plus pérenne où le logiciel n'est pas fermé.
+
+La deuxième expérience ou plutôt désillusion concerne la nouvelle console
+portable de Sony. C'est Noël et l'unique cadeau que désire mon fils c'est une
+Vita. C'est cher mais toute la famille met la main à la poche et on achète le
+fantasme. La console est offerte avec deux jeux. Première chose qui me fait
+tiquer, pas de jeu dans le carton mais deux coupons pour les télécharger sur
+le Store. Adieu donc la possibilité de les revendre à la boutique d'occasion
+du coin quand on en sera lassé afin d'acheter un autre titre. Etant moi-même
+un joueur occasionnel sur PC avec un compte Steam je digère l'info : on (et je
+m'inclus) a tué le marché de l'occasion PC, celui des consoles va suivre et
+nous crèverons avec nos identifiants en emportant nos téléchargements dans la
+tombe (je vous renvoie à la chanson 'Société Anonyme' d'Eddy Mitchell). En
+bon parent, nous suivons les règles établies : j'ai un compte principal car je
+suis majeur et je crée un compte secondaire pour un enfant de 10 ans qui est
+associé à la console. Et là, la blague commence. On peut autoriser de jouer
+un titre interdit aux -18 ans dont on a la cartouche par l'application contrôle
+parental de la console, mais on ne peut pas télécharger depuis le Store un des
+deux jeux offerts interdit aux -12 ans. Pour cela il n'y a aucun paramètre. On
+pourrait s'attendre à un système de notification du compte principal qui
+pourrait approuver ou non, après tout ils ont nos emails, en plus de nos âges
+et nos adresses :-( Mais visiblement, Sony s'est protégé à fond et a nivelé
+par le bas en mettant en place une politique de sécurité dure et identique
+pour tous les continents. Donc au final que fait-on ? Et bien on ment en
+conséquence de cause. On crée un autre compte secondaire en augmentant l'âge
+de son enfant afin qu'il puisse jouer à son jeu. Le constructeur de la console
+est tranquille, il a rempli son devoir de garde chiourme et c'est le parent qui
+prend la décision de tricher pour biaiser le système de protection mal pensé.
+
+Que faut-il en conclure ? Et bien plusieurs choses je crois:
+
+* Qu'il n'y a pas que des OS de la banquise chez moi. Par facilité, par manque
+d'alternative et parce que, comme le disait récemment Cyrille on ne peut pas
+imposer de force nos idées à nos proches, on fait entrer des objets connectés
+non libres du 21ème siècle dans la maison.
+* Avec le sourire et en tendant la carte bleue nous sommes en train de nous
+enfermer volontairement dans des beaux aquariums multicolores, où nager est un
+plaisir des yeux jusqu'à ce qu'on s'écrase le nez sur la vitre. C'est le point
+le plus inquiétant pour moi : la multiplication des Store auquels on se soumet
+avec la satisfaction imbécile d'appartenir à son siècle et de participer au
+progrès.
+* A chacun de balayer devant sa porte. Pour ma part, je vais engager l'année avec
+l'esprit des deux dernières années : en restreignant les besoins artificiels,
+en réfléchissant d'abord à l'adéquation entre le besoin et l'objet lors d'un
+achat ainsi qu'à la pérennité de la solution. La sphère familiale et ludique
+ne doit pas être sous-estimée c'est là que se jouent maintenant les batailles
+qui définiront nos libertés demain.
+
+
diff --git a/content/blog/2013/2013-01-16-mise-a-jour-de-fedora-17-vers-fedora-18.md b/content/blog/2013/2013-01-16-mise-a-jour-de-fedora-17-vers-fedora-18.md
new file mode 100755
index 0000000..6eca436
--- /dev/null
+++ b/content/blog/2013/2013-01-16-mise-a-jour-de-fedora-17-vers-fedora-18.md
@@ -0,0 +1,55 @@
+---
+layout: post
+title: Mise à jour de Fedora 17 vers Fedora 18
+category: GNU/Linux
+tag: planet
+---
+
+15 Janvier 2013 : c'est la sortie officielle de la Fedora 18, très attendue car
+sa sortie fût décalée plusieurs fois, ce qui est à l'honneur des
+développeurs : sortir quand le niveau de qualité est atteint malgré le fait
+qu'on soit une distribution mainstream très attendue. Je vous renvoie à
+[l'article très complet posté par Renault sur LinuxFR pour la liste des
+nouveautés.](http://linuxfr.org/news/sortie-de-fedora-18-alias-spherical-cow).
+Moi je faire un retour d'expérience rapide sur une mise à jour réussie depuis
+le Spin XFCE de Fedora 17.
+
+ [FedUp](http://fedoraproject.org/wiki/FedUp) est le nouvel outil pour gérer
+les mises à jour de Fedora 17 et ultérieur. Voici les étapes que j'ai suivi
+pour mettre à jour ma distribution :
+
+* s'assurer que le système est à jour : yum upgrade. Puis redémarrer la machine
+si le Kernel a été mis à jour.
+* installer FedUp : yum --enablerepo=updates-testing install fedup
+* désactiver tous les dépôts tiers définis tels que RPM Fusion. En ligne de
+commande, cela consiste à rajouter enabled=0 aux fichiers.repo que l'on trouve
+sous /etc/yum.repos.d.
+* se déconnecter graphiquement et lancer FedUp en tant que root ou avec sudo
+depuis un VTY : fedup-cli --network 18 --debuglog fedupdebug.log
+* s'armer de patience, les téléchargements des paquets F18 commencent. Quand
+c'est terminé, FedUp demande de redémarrer la machine. C'est au redémarrage
+que le processus de mise à jour est effectué. Je ne sais pas exactement
+combien de temps cela prend, j'ai dormi ;-)
+
+Si tout se passe bien, on se retrouve avec une Fedora 18 opérationnelle. La
+commande **uname -r** indique qu'on est passé en kernel 3.7.2-201.fc18.x86_64.4
+Pour être complet, on peut aussi mettre à jour Grub 2 manuellement [comme
+indiqué sur la page Wiki de FedUp](http://fedoraproject.org/wiki/FedUp#How_Can_
+I_Upgrade_My_System_with_FedUp.3F).
+
+ **[EDIT]** J'ai remarqué que le nouveau pare-feu ne fonctionnait plus même
+après l'installation des paquets firewall-config et firewall-applet. Le service
+démarre, on peut modifier la configuration mais elle n'est pas prise en compte.
+Il semble qu'un coup de **yum -y distro-sync** finalise la mise à jour en
+supprimant les paquets obsolètes. Le pare-feu est opérationnel au
+redémarrage. Ce nouveau pare-feu mériterait d'ailleurs un article : plus
+simple et plus clair à configurer, gestion de 2 configurations (la courante et
+la stockée).
+
+Certains paquets obsolètes peuvent rester. Les [conseils de
+llaumgui](http://www.llaumgui.com/post/fedora-17-in-da-place) restent
+d'actualité.
+
+J'ai aussi eu un problème avec la gestion de l'énergie interceptée par
+systemd avant XFCE. C'est résolu [dans ce
+post.](http://comments.gmane.org/gmane.linux.redhat.fedora.general/423516)
diff --git a/content/blog/2013/2013-03-14-migration-du-blog-sous-pelican.md b/content/blog/2013/2013-03-14-migration-du-blog-sous-pelican.md
new file mode 100755
index 0000000..4271fcc
--- /dev/null
+++ b/content/blog/2013/2013-03-14-migration-du-blog-sous-pelican.md
@@ -0,0 +1,57 @@
+---
+layout: post
+title: Migration du blog sous Pelican
+categories: Blog Hébergement
+tag: planet
+---
+
+Et oui, un de plus à migrer son blog sous [Pelican](http://docs.getpelican.com) !
+J'ai lu plusieurs récits de migration depuis trois mois, ce qui dénote un
+engouement certain pour ce moteur de blog par... essentiellement des développeurs.
+La perspective de gérer ses articles comme du code, avec un
+article par fichier, de construire le blog avec une commande 'make' et
+publier dans un gestionnaire de source nous ramène en terrain familier.
+
+Les points suivants ont achevé de me convaincre :
+
+* l'écriture dans une syntaxe simplifiée (un markup langage) ; j'ai opté pour
+ [Markdown](http://daringfireball.net/projects/markdown/). Je peux commencer
+ l'écriture d'un article depuis n'importe quel équipement, même l'application mémo
+ de mon téléphone.
+* la possibilité de tout gérer depuis un terminal en mode texte, de
+ l'écriture d'un article à sa publication. Ce qui me permet de travailler
+ facilement depuis n'importe où avec une connexion SSH sur mon serveur
+* La génération de pages statiques. Adieu PHP, on peut héberger encore plus
+ facilement.
+
+En fait c'est le prolongement du raisonnement qui m'avait fait passer de
+WordPress à [PluXml](http://www.pluxml.org).
+
+L'import depuis PluXml est faisable par l'import RSS mais la conversion en Markdown est
+approximative. J'ai donc écrit un outil de migration dédié en langage Python. Ce
+qu'il apporte c'est une mise en forme plus fidèle lors de la conversion en
+Markdown, une gestion des catégories **et des tags**. Il ne couvre peut-être
+pas tous les cas mais il m'a permis de migrer mes articles sans retouche
+manuelle. Cet outil est disponible sur mon compte GitHub :
+[PluXml2Pelican](http://github.com/kianby/pelican)
+
+Pour les thèmes c'est selon les goûts de chacun. Pelican fournit un langage de
+templating Python [Jinja 2](http://jinja.pocoo.org).
+A chacun de voir s'il veut un thème simple ou un thème plus dynamique avec du
+JavaScript. Quelques thèmes d'exemple sont fournis sur
+[GitHub](http://github.com/getpelican/pelican-themes). Pour ma part, Je suis parti d'un thème
+basé sur [Bootstrap](http://twitter.github.com/bootstrap), le kit CSS qui permet
+facilement de faire du Responsive Design afin d'avoir un site qui s'adapte à
+tous les périphériques Web (ordinateurs de bureau, tablettes, téléphones) et je
+l'ai adapté à ma sauce.
+
+En résumé, Pelican est un très beau projet. Sous le capot, on trouve un outil
+bien pensé, dans l'esprit du langage Python. Il est possible de développer des
+plugins qui effectueront des actions à différentes phases de la génération des
+pages HTML. Le seul point manquant, c'est le support des commentaires.
+Normal pour un outil qui génère des pages statiques. La solution proposée consiste
+à déléguer cette tâche à Disqus, un service Web privé. Cela ne me convient pas du tout,
+je me suis auto-hébergé pour garder la main sur mes données. J'ai gardé les
+commentaires de tous les articles et je cogite à une solution alternative....
+En attendant, j'ai ouvert un email pour le blog qu'on peut utiliser pour
+échanger : blogduyax at madyanne.fr
diff --git a/content/blog/2013/2013-03-20-haute-dispo-corosync-pacemaker-debian.md b/content/blog/2013/2013-03-20-haute-dispo-corosync-pacemaker-debian.md
new file mode 100755
index 0000000..866ae61
--- /dev/null
+++ b/content/blog/2013/2013-03-20-haute-dispo-corosync-pacemaker-debian.md
@@ -0,0 +1,260 @@
+---
+layout: post
+title: Haute Disponibilité avec Corosync et Pacemaker
+category: Cluster
+tag: planet
+---
+
+La Haute Disponibilité désigne toutes les techniques permettant d'améliorer
+la disponibilité d'un système ou de services et d'augmenter la tolérance aux pannes :
+la redondance matérielle, les clusters, la réplications des données à chaud
+physiquement (RAID 1 et RAID 5) ou logiciellement (Snapshots, DRBD), les scénarios
+de crise (mode dégradés, plan de secours). Dans une grande entreprise, cela
+peut donner lieu à un poste à responsabilité à plein temps. Mon activité professionnelle
+m'a amené à mettre en oeuvre une facette de cette problématique : un cluster
+actif / passif qui assure la disponibilité d'un service applicatif.
+
+Pour GNU/Linux, j'ai expérimenté deux logiciels permettant de gérer une infrastructure
+ de cluster :
+
+* Heartbeat qui a fait ses preuves mais qui est limité : pas de cluster à plus de 2 noeuds,
+pas de gestion très fine des ressources et des règles pour basculer d'un noeud sur l'autre.
+* [Corosync](http://www.corosync.org) et [Pacemaker](http://clusterlabs.org/wiki/Main_Page) :
+c'est le choix de la distribution Red Hat et celui que je vais détailler dans la suite de cet article.
+
+J'ai monté une maquette assez représentative composée de deux machines virtuelles Debian Wheezy
+(en version presque finale) avec 4 interfaces réseaux chacune qui font tourner un service Apache
+qu'on accède par une adresse IP gérée par le cluster.
+
+Voici un diagramme réseau de la maquette :
+
+
+
+Les interfaces eth0 et eth1 font partie d'une agrégation logique de liens et
+servent au cluster pour vérifier l'état des autres noeuds. Elles constituent un
+réseau privé avec l'autre noeud dans le réseau 10.20.13.0/255.255.255.252.
+Les interfaces eth2 et eth3 font partie d'une autre agrégation logique,
+elles fournissent le service à l'extérieur dans le réseau 192.168.1.0/24.
+
+L'agrégation logique (appelé aussi bonding) fournit une redondance supplémentaire. Si
+l'adaptateur réseau eth0 grille, le trafic transite encore grâce à eth1. On
+peut la configurer en mode actif/passif ou bien en mode load-balancing.
+
+Voici la configuration des interfaces sur la machine vm-node1 dans **/etc/network/interfaces/** :
+
+ auto bond0
+ iface bond0 inet static
+ address 10.20.13.1
+ netmask 255.255.255.252
+ bond_mode active-backup
+ bond_miimon 100
+ bond_downdelay 200
+ bond_updelay 200
+ slaves eth0 eth1
+
+ auto bond1
+ iface bond1 inet static
+ address 192.168.1.61
+ netmask 255.255.255.0
+ gateway 192.168.1.1
+ bond_mode active-backup
+ bond_miimon 100
+ bond_downdelay 200
+ bond_updelay 200
+ slaves eth2 eth3
+
+et la configuration du bonding dans **/etc/modprobe.d/bonding** :
+
+ alias bond0 bonding
+ alias bond1 bonding
+
+La configuration réseau de la machine vm-node2 est symétrique avec bond0 en
+10.20.13.2 et bond1 en 192.168.1.62.
+
+Quand la configuration réseau est ok, on peut s'occuper du cluster. D'abord il faut installer
+Corosync et Pacemaker, c'est trivial sous Debian :
+
+ apt-get install corosync pacemaker
+
+Ensuite il faut configurer Corosync. Il gère l'infrastructure de cluster, c'est à dire l'état des noeuds et
+leur fonctionnement en groupe. Pour cela, on doit générer une clef d'authenfication qui sera partagée par tous
+les noeuds du cluster. L'utilitaire **corosync-keygen** permet de générer cette clef à partir d'entrées clavier
+pseudo-aléatoires qu'il faut ensuite sécuriser et copier sur les autres noeuds.
+
+``` shell
+# génération de la clef depuis vm-node1
+corosync-keygen
+mv authkey /etc/corosync/authkey
+chown root:root /etc/corosync/authkey
+chmod 400 /etc/corosync/authkey
+
+# copie de la clef sur vm-node2
+scp /etc/corosync/authkey root@10.20.13.2:/etc/corosync/authkey
+```
+
+Corosync propose le concept d'anneaux de connexion pour assurer la communication entre noeuds. Dans le cadre de
+la maquette je définis deux anneaux : **ring0**, l'anneau de communication par défaut qui utilise le réseau privé et
+**ring1** un anneau de secours qui transite par l'intermédiaire des commutateurs (ou switchs) avec le reste du trafic.
+C'est une sécurité de plus pour le cas improbable où les deux liens eth0 et eth1 soient cassés. Corosync
+permet de définir les anneaux en terme de réseau IP / masque réseau plutôt que de définir les adresses IP.
+C'est appréciable car le même fichier de configuration peut être déployé sur tous les noeuds sans rien changer.
+
+ totem {
+ version: 2
+
+ # How long before declaring a token lost (ms)
+ token: 3000
+
+ # How many token retransmits before forming a new configuration
+ token_retransmits_before_loss_const: 10
+
+ # How long to wait for join messages in the membership protocol (ms)
+ join: 60
+
+ # How long to wait for consensus to be achieved before starting
+ #a new round of membership configuration (ms)
+ consensus: 3600
+
+ # Turn off the virtual synchrony filter
+ vsftype: none
+
+ # Number of messages that may be sent by one processor on receipt of the token
+ max_messages: 20
+
+ # Limit generated nodeids to 31-bits (positive signed integers)
+ clear_node_high_bit: yes
+
+ # Disable encryption
+ secauth: off
+
+ # How many threads to use for encryption/decryption
+ threads: 0
+
+ # Optionally assign a fixed node id (integer)
+ # nodeid: 1234
+
+ # This specifies the mode of redundant ring, which may be none, active, or passive.
+ rrp_mode: passive
+
+ interface {
+ ringnumber: 0
+ bindnetaddr: 10.20.13.0
+ mcastaddr: 226.94.1.1
+ mcastport: 5405
+ }
+ interface {
+ ringnumber: 1
+ bindnetaddr: 192.168.1.0
+ mcastaddr: 226.94.1.1
+ mcastport: 5407
+ }
+ }
+
+ amf {
+ mode: disabled
+ }
+
+ service {
+ # Load the Pacemaker Cluster Resource Manager
+ ver: 0
+ name: pacemaker
+ }
+
+ aisexec {
+ user: root
+ group: root
+ }
+
+ logging {
+ fileline: off
+ to_stderr: yes
+ to_logfile: no
+ to_syslog: yes
+ syslog_facility: daemon
+ debug: off
+ timestamp: on
+ logger_subsys {
+ subsys: AMF
+ debug: off
+ tags: enter|leave|trace1|trace2|trace3|trace4|trace6
+ }
+ }
+
+A ce stade, l'infrastructure de cluster est en place mais elle ne gère aucune ressource. Ca c'est le
+rôle de Pacemaker.
+
+On impose les contraintes de fonctionnement suivantes :
+
+1. les ressources (le service Apache et l'adresse IP du cluster) tournent sur le serveur vm-node1 dans le cas normal.
+2. le service Apache et l'adresse IP du cluster doivent tourner sur le même serveur sinon notre service est injoignable.
+3. si le service Apache se crashe sur le serveur primaire, on bascule sur le serveur secondaire.
+4. si le serveur primaire ne joint plus la passerelle Internet, on bascule sur le serveur secondaire.
+
+Pacemaker fournit quelques utilitaires en mode texte pour interagir.
+
+* **crm** permet de gérer tout l'aspect configuration.
+* **crm_mon** affiche l'état du cluster.
+
+D'abord on définit la configuration globale. On désactive le **STONITH** (Shoot The Other Node In The Head) et
+le **quorum**. Le Stonith est la possibilité de *tuer* l'autre noeud s'il ne répond plus par l'infra de cluster.
+C'est faisable sur des vrais serveurs par [IPMI](http://fr.wikipedia.org/wiki/IPMI) par exemple.
+Quant au quorum, il n'a pas de sens sur un cluster à moins de 3 noeuds.
+
+ property stonith-enabled=false
+ property no-quorum-policy=ignore
+
+On peut maintenant définir notre première ressource : l'adresse IP du cluster attaché au noeud actif.
+
+ primitive vip ocf:heartbeat:IPaddr2 params ip=192.168.1.60 cidr_netmask=24 nic="bond1" op monitor interval="10s"
+
+Puis la ressource Apache, le service critique qu'on veut fournir dans cette maquette :
+
+ primitive httpd ocf:heartbeat:apache params configfile="/etc/apache2/apache2.conf" statusurl="http://localhost/server-status" op start timeout="60s" op stop timeout="60s" op monitor timeout="20s"
+
+Le démarrage et l'arrêt d'Apache sont maintenant gérés par le cluster. Il faut fonc enlever le démarrage
+automatique du service. Sous Debian c'est avec update-rc.d :
+
+ update-rc.d -f remove apache2
+
+Vous remarquerez qu'on va plus loin que la définition d'une ressource Apache. L'attribut **statusurl** permet à
+Pacemaker d'utiliser la page de statut d'Apache pour décider d'une bascule. Il ne faut donc pas oublier de
+configurer cette URL dans Apache pour que cela fonctionne :
+
+``` apache
+
A
+l'époque de mon Motorola Droid, j'avais déjà utilisé le client Funambol pour
+synchroniser mes données avec
+[eGroupware](http://www.egroupware.org/community_edition) et je m'étais
+intéressé à *Horde*. Ce dernier semblait plus difficile à installer,
+l'interface Web était peu conviviale et j'avais mis en place eGroupware que
+j'avais utilisé 1 an avec satisfaction. J'ai su qu'une version 5 de Horde était
+sortie dans l'année et j'ai décidé de l'évaluer. Horde supporte SyncML,
+CardDAV, CalDav et son interface graphique a été rajeunie.
+
+Ma cible de déploiement est mon serveur privé virtuel avec
+l'environnement technique suivant :
+
+- Distribution Debian Wheezy
+- Serveur Web NginX
+
+L'installation est plus complexe que la moyenne mais avec un bon tuto on s'en
+sort. Horde est modulaire : un Framework et des applications. Moi j'ai besoin
+de Kronolith (la gestion du calendrier) et de Turba (la gestion des contacts).
+J'ai décliné l'installation par le système de paquets car généralement cela
+tire le serveur Apache alors que j'utilise NginX et j'ai opté pour PEAR,
+l'outil d'installation PHP que ne connaissais pas. De ma compréhension, c'est
+l'équivalent de CPAN pour PERL ou d'APT pour Debian. Horde publie ses
+composants pour l'infrastructure PEAR [sur ce serveur](http://pear.horde.org).
+
+L'installation de PEAR sur Debian est galette.
+
+ apt-get install php-pear
+
+Puis, on enregistre le canal Horde sur Pear et on installe les composants
+nécessaires :
+
+``` shell
+mkdir -p /var/www/horde
+cd /var/www/horde
+pear channel-discover pear.horde.org
+pear install horde/horde_role
+pear run-scripts horde/horde_role
+pear install -a -B horde/horde
+pear install horde/turba
+pear install horde/kronolith
+pear install horde/mnemo
+pear install horde/Horde_SyncMl
+```
+
+Dans le cas de NginX sur Debian, il faut ajuster les permissions du répertoire.
+
+ chown -R www-data:www-data /var/www/horde
+
+Et il faut créer les fichiers de configuration de chaque application à partir
+des modèles fournis :
+
+``` shell
+cd /var/www/horde/config
+for f in *.dist; do cp $f `basename $f .dist`; done
+cd /var/www/horde/kronolith/config
+for f in *.dist; do cp $f `basename $f .dist`; done
+cd /var/www/horde/turba/config
+for f in *.dist; do cp $f `basename $f .dist`; done
+cd /var/www/horde/nag/config
+for f in *.dist; do cp $f `basename $f .dist`; done
+cd /var/www/horde/mnemo/config
+for f in *.dist; do cp $f `basename $f .dist`; done
+```
+
+Il reste à configurer NginX. Je force l'utilisation de HTTPS en redirigeant les
+requêtes HTTP vers la version sécurisée du site.
+
+``` nginx
+server {
+ listen 80;
+ server_name groupware.exemple.fr;
+ rewrite ^ https://$server_name$request_uri? permanent;
+}
+
+server {
+ listen 443 ssl;
+ server_name groupware.exemple.fr;
+ root /var/www/horde;
+ index index.php;
+
+ ssl_certificate /etc/ssl/exemple.fr.cert;
+ ssl_certificate_key /etc/ssl/exemple.fr.key;
+
+ access_log /var/log/nginx/horde-access.log;
+ error_log /var/log/nginx/horde-error.log;
+
+ location / {
+ try_files $uri $uri/ /rampage.php?$args;
+ }
+
+ location ~ \.php {
+ fastcgi_split_path_info ^(.+\.php)(/.+)$;
+ fastcgi_param PATH_INFO $fastcgi_path_info;
+ fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
+ fastcgi_param PHP_VALUE "cgi.fix_pathinfo=1";
+ fastcgi_pass unix:/var/run/php5-fpm.sock;
+ fastcgi_index index.php;
+ fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
+ include fastcgi_params;
+ }
+
+}
+```
+
+Horde propose le choix entre plusieurs bases de données J'utilise déjà MySQL,
+j'ai donc créé une nouvelle base pour Horde en utilisant les outils
+en ligne de commande de MySQL.
+
+ mysql -u root -p
+ mysql> CREATE DATABASE horde;
+ mysql> GRANT ALL ON horde.* TO horde@localhost IDENTIFIED BY 'horde';
+ mysql> FLUSH PRIVILEGES;
+ mysql> EXIT;
+
+A la première connexion Web, il n'y a pas d'authentification, on est connecté
+en tant qu'administrateur sans mot de passe.
+
+#### 1ère étape : définir la base de donnée.
+
+1. Aller dans le menu Administration / Configuration
+
+
+
+2. Cliquer sur le composant Horde (horde)
+
+
+
+3. Configurer la base de donnée dans l'onglet Database
+
+
+
+#### 2ème étape : créer un utilisateur avec les droits d'administration.
+
+1. Aller dans le menu Administration / Utilisateur
+
+
+
+2. Créer un nouvel utilisateur
+
+
+
+3. Retourner dans le menu Administration / Configuration et rajouter
+ l'utilisateur nouvellement créé dans les admins de l'onglet
+ Authentification.
+
+
+
+4. Il est conseillé de tester le nouvel utilisateur en se déconnectant et en se
+ reconnectant. Si cela fonctionne, on peut enlever l'utilisateur
+ Administrator de la liste des admins.
+
+#### 3ème étape : finaliser l'installation des applications
+
+Dans le menu Administration / Configuration, tous les composants installés
+apparaîssent. Les boutons *mettre à jour toutes les configurations* et *mettre
+à jour les schémas de la base* doivent être cliqués pour finaliser l'installation.
+
+#### Conclusion
+
+L'URL CalDAV pour s'inscrire au calendrier se trouve dans les propriétés du
+calendrier de l'application Agenda, dans l'onglet *inscription*. De manière
+similaire, l'URL CardDAV se trouve dans les propriétés du carnet d'adresses.
+Quant à l'URL SyncML, c'est un point d'entrée unique pour la synchronisation de
+toutes les applications ; dans notre exemple ce serait
+http://groupware.exemple.fr/rpc.php.
+
+J'ai mis en place Horde depuis 1 semaine avec une synchronisation SyncML par
+Funambol sur mon téléphone et une synchronisation CardDAV et CalDAV depuis
+Thunderbird. J'ai lu que SyncML n'était pas très bon pour gérer les conflits de
+synchronisation mais je n'ai pas rencontré de souci. L'évaluation se passe très
+bien pour l'instant.
diff --git a/content/blog/2014/2014-01-22-qmail.md b/content/blog/2014/2014-01-22-qmail.md
new file mode 100755
index 0000000..a750409
--- /dev/null
+++ b/content/blog/2014/2014-01-22-qmail.md
@@ -0,0 +1,85 @@
+---
+layout: post
+title: SMTP Relay avec qmail sur Debian Wheezy
+category: Debian
+tag: planet
+---
+
+J'ai cherché une alternative plus simple qu'Exim et Postfix pour que mes
+serveurs Debian puissent envoyer des emails d'alerte. C'est une fonctionnalité
+utile si on installe fail2ban ou logwatch. Je n'ai pas besoin de gérer des
+utilisateurs ou de recevoir des emails, juste d'en envoyer en utilisant le
+serveur SMTP du FAI comme relais. J'ai trouvé
+[**qmail**](http://en.wikipedia.org/wiki/Qmail) en faisant quelques recherches,
+un antique MTA dont la dernière version stable 1.0.3 date de 1998 (gasp !) mais
+qui est toujours disponible dans les dépôts Debian.
+
+Avant de lancer l'installation, il faut s'assurer que le hostname du serveur
+est un FQDN, c'est à dire un nom DNS complet. Si ce n'est pas le cas, qmail
+refuse de s'installer. Si le serveur n'a pas de nom DNS, on peut mettre
+n'importe quel domaine, ça ne gêne dans la configuration que nous allons mettre
+en place. On peut modifier le hostname de manière persistente en deux étapes :
+
+1. éditer le fichier /etc/hostname
+2. forcer sa mise à jour avec la commande /etc/init.d/hostname.sh
+
+L'installation de qmail désinstalle Postfix ou Exim4 car un seul MTA peut
+s'approprier le port 25.
+
+ apt-get install qmail qmail-run
+
+Il s'agit d'un service local, on ne veut surtout pas ouvrir le port 25 sur
+Internet. On peut forcer qmail à n'écouter que sur l'interface loopback en
+modifiant le script de démarrage. Ce n'est pas l'idéal mais vu la fréquence de
+mise à jour de qmail, on ne craint pas trop de voir cette modification écrasée.
+Il faut remplacer *0* par *127.0.0.1* dans le fichier
+**/etc/qmail/qmail-smtpd/run**.
+
+Voici la version modifiée :
+
+``` shell
+ QMAILDUID=`id -u qmaild`
+ NOFILESGID=`id -g qmaild`
+ MAXSMTPD=`cat /var/lib/qmail/control/concurrencyincoming`
+ LOCAL=`head -1 /var/lib/qmail/control/me`
+
+ if [ -z "$QMAILDUID" -o -z "$NOFILESGID" -o -z "$MAXSMTPD" -o -z "$LOCAL" ]; then
+ echo QMAILDUID, NOFILESGID, MAXSMTPD, or LOCAL is unset in
+ echo /var/qmail/supervise/qmail-smtpd/run
+ exit 1
+ fi
+
+ if [ ! -f /var/lib/qmail/control/rcpthosts ]; then
+ echo "No /var/lib/qmail/control/rcpthosts!"
+ echo "Refusing to start SMTP listener because it'll create an open relay"
+ exit 1
+ fi
+
+ exec softlimit -m 7000000 \
+ tcpserver -v -R -l "$LOCAL" -x /etc/qmail/tcp.smtp.cdb -c "$MAXSMTPD" \
+ -u "$QMAILDUID" -g "$NOFILESGID" 127.0.0.1 smtp qmail-smtpd 2>&1
+```
+
+On modifie la configuration pour envoyer des emails en utilisant le serveur
+SMTP Orange en tant que root@orange.fr si on est l'utilisateur root. On
+remplace le contenu du fichier **/etc/qmail/defaulthost** avec ceci :
+
+ orange.fr
+
+On supprime le contenu du fichier **/etc/qmail/defaultdomain** et on configure
+le relais dans le fichier **/etc/qmail/smtproutes** :
+
+ smtp.orange.fr
\ No newline at end of file
diff --git a/content/blog/2014/2014-08-07-pecosys.md b/content/blog/2014/2014-08-07-pecosys.md
new file mode 100755
index 0000000..b27453d
--- /dev/null
+++ b/content/blog/2014/2014-08-07-pecosys.md
@@ -0,0 +1,133 @@
+---
+layout: post
+title: Pecosys, les commentaires avec Pelican
+categories: Hébergement Blog
+tag: planet
+---
+
+Pecosys est le projet évoqué dans mon dernier billet pour gérer des
+commentaires avec un blog statique créé avec
+[Pelican](http://docs.getpelican.com/en/3.4.0). J'ai publié [l'ensemble des
+sources sur mon GitHub](https://github.com/kianby/pecosys) sous licence GPL.
+Avant d'expliquer à quoi ça sert, une présentation des types de moteurs de
+blog s'impose.
+
+#### Petite intro sur les blog statiques
+
+Les moteurs de blog classiques comme Wordpress ou Dotclear stockent leurs
+données (articles, commentaires) dans une base de données et ils utilisent une
+logique côté serveur pour produire les pages HTML. Au fil des ans, ces moteurs
+ont rajouté beaucoup de fonctionnalités (par l'utilisation de plugins) et on
+les appelle désormais des CMS (Content Management System) car ils peuvent
+servir à bâtir tout type de site Web, en facilitant le travail de publication
+et de collaboration aux rédacteurs qui n'ont plus besoin d'être des gens
+techniques.
+
+PluXml est un moteur un peu à part, plus léger que les CMS cités ci-dessus,
+qui n'utilise pas de base de données mais stocke les données dans des fichiers
+XML. C'est un pas dans la direction des blogs statiques dans la mesure où cela
+permet de mettre son blog dans un gestionnaire de sources (comme GIT) et
+conserver une traçabilité des changements. Cela facilite aussi la migration du
+blog.
+
+Pelican et Jekyll sont des vrais blogs statiques. Ils n'utilisent pas de
+langage serveur comme PHP ou Ruby, il ne stockent pas leurs données dans une
+base de données. Les articles sont écrits dans un langage Markup comme
+[Markdown](http://daringfireball.net/projects/markdown) et la construction du
+site (le build) est réalisé hors ligne. Il génère les pages à base de HTML,
+CSS et éventuellement un zeste de JavaScript. Ces pages sont transférées vers
+le serveur HTTP hébergeant le site... et hop le site est à jour.
+
+Alors pourquoi s'embêter à gérer un site statique alors qu'un Wordpress
+s'installe en 5 minutes ?
+
+Cela dépend de tout un chacun mais j'y suis venu pour les raisons suivantes :
+
+- Les articles sont écrits dans un format simpliste (pour ma part c'est Markdown), la présentation est clairement séparée du contenu. C'est lors du build qu'on génère le code HTML en fonction de *templates* et de CSS personnalisés par nos soins. Le code HTML généré par Pelican est propre et léger. Le jour où j'ai migré de WordPress à PluXml, j'ai été horrifié par le code HTML de WordPress.
+- Le contenu du blog est un ensemble de fichier au format texte, idéal à gérer avec un gestionnaire de sources afin de garder trace des modifications. Un gestionnaire de sources devient aussi un moyen d'automatiser la mise à jour du site. On écrit et on teste sur sa machine de dev, on publie sous GIT et il suffit que le serveur rafraîchisse sa version du site quand une modification a été effectuée.
+
+#### La problématique des commentaires
+
+Pas de logique serveur, juste un ensemble de pages HTML avec un peu
+d'interactivité grâce à JavaScript. Comment gérer les commentaires avec un
+site statique ? La solution proposée par Pelican c'est l'utilisation des
+services de la société Disqus. Un peu de JavaScript embarqué au bon endroit et
+vos pages sont agrémentées d'un formulaire pour poster des commentaires qui
+envoie les données chez Disqus et l'affichage de la page dans le navigateur
+client par l'usage de JavaScript, envoie des requêtes à Disqus pour rapatrier
+les commentaires approuvées et les ajouter à la page HTML qui vient de votre
+serveur.
+
+Est-ce que vous sentez venir l'objection ?
+
+D'abord on met en place une belle mécanique,très pure, où l'on contrôle le
+contenu, l'affichage, puis on confie la partie sensible (les données
+utilisateur) à une société commerciale, qui ne demande rien en retour et qui
+propose sûrement un service aux petits oignons pour approuver les
+commentaires... mais qui garde les données. Comment une société comme Disqus
+monétise ses services ? Je ne sais pas, peu importe. Que se passe-t-il si la
+société dépose le bilan ? Là j'ai la réponse. L'ensemble des commentaires est
+perdu : une bonne partie de la richesse d'un blog, ce qui fait son histoire.
+Dommage non ?
+
+#### L'approche Pecosys
+
+Pecosys est un serveur de commentaires écrit en Python que vous hébergez sur le même serveur que votre blog. Il reçoit les commentaires à approuver depuis le blog par le biais d'un formulaire sur le blog. Pour cela, les *templates* de Pelican ont été adaptés afin de rajouter ce formulaire en bas de chaque article.
+
+Le lien entre le blog statique et le serveur Pecosys est réalisé par grâce au serveur Web. Dans le cas de NginX, il est trivial d'associer une URL à un programme Python. Dans le cas d'Apache, c'est faisable facilement en utilisant le module Proxy. Bref, le serveur Pecosys est d'abord un serveur HTTP sur lequel on poste les commentaires entrés par un formulaire classique de création de commentaires.
+
+Quand un commentaire est reçu, le serveur va faire deux trucs : sauvegarder le commentaire et le soumettre à l'administrateur du blog.
+
+La sauvegarde se fait grâce à GIT. Ah j'avais pas encore parlé de GIT :-) On suppose qu'on est dans une architecture centralisée où le blog est modifié depuis une machine de développeur et poussé (au sens GIT: PUSH) vers un *bare repository*. Dans mon cas, cette référence centrale des sources est sous BitBucket car ils acceptent la création de dépôts privés gratuitement et que je ne veux pas publier les adresses emails de tous ceux qui ont laissé un commentaire sur le blog. Souvenez-vous les commentaires font désormais partie des sources du blog, on verra comment plus loin.
+
+Donc, pour résumer :
+
+- j'écris mes articles sur ma machine de dev perso, je publie dans GIT et je pousse mes modifications au GIT centralisé de BitBucket (au sens GIT: ORIGIN).
+- mon serveur vérifie périodiquement si le dépôt BitBucket a été modifié et si c'est le cas, il rapatrie les sources du blog et reconstruit le site grâce à sa mécanique Pelican installée localement.
+- Pecosys a sa propre version du blog (au sens GIT: CLONE) maintenue à jour de BitBucket.
+
+Donc quand Pecosys reçoit un nouveau commentaire, il met à jour sa version du
+blog (la branche MASTER) et il crée une nouvelle branche XYZ pour ce
+commentaire. il sauve ce commentaire dans les sources du blog (au format
+Markdown) et il committe la branche XYZ.
+
+Ensuite, le serveur va le communiquer à l'administrateur du blog par email.
+Cela suppose qu'un email dédié est utilisé par Pecosys (pourquoi pas
+blog@mydomain.com) et qu'il connaît l'email de l'administrateur du blog (vous
+!). Cet email contient le commentaire et demande une réponse.
+
+L'administrateur du blog (toujours vous) doit répondre à cet email. Une
+réponse sans commentaire revient à approuver le commentaire et va lancer sa
+publication. Une réponse avec un commentaire "NO" (désolé pour l'originalité)
+signifie qu'on refuse le commentaire.
+
+En fonction de cette réponse, le serveur Pecosys qui vérifie sa boite de
+réception régulièrement, va traiter le commentaire :
+
+- un refus du commentaire revient à supprimer la branche GIT XYZ
+- une approbation du commentaire ramène les modifications de la branche XYZ sur la branche MASTER (au sens GIT: MERGE) et pousse les modifications sur le GIT distant (dans mon cas BitBucket)
+
+Dans les deux cas, un email de confirmation de l'action réalisée est envoyé à
+l'administrateur du blog.
+
+A ce stade, la branche de référence BitBucket est à jour donc le serveur va
+ramener ses modifications, reconstruire le site et par là même
+publier le commentaire.
+
+Si vous avez bien suivi et je sais que c'est un peu touffu et compliqué, vous
+vous demandez comment les commentaires (ces fichiers en Markdown) sont générés
+en HTML. Et bien, pas le biais d'un plugin Pelican nommé **CaCause**, en
+hommage au projet de base initié il y a un an avec [Bruno
+Adele](http://www.jesuislibre.org) et [Nahir
+Mohamed](https://github.com/nadley) dont Pecosys est une reprise des idées
+principales mais avec une réalisation différente par son dialogue basé sur
+l'email et son utilisation *forcenée* de GIT.
+
+Je teste Pecosys depuis deux semaines sur ce site et je suis prêt à donner un
+coup de main à quiconque veut se lancer. Sur GitHub, j'ai publié les sources
+du serveur mais aussi une version allégée de ce site (sans les commentaires)
+qui contient donc mes *templates* avec le formulaire et les sources du plugin.
+
+En attendant je retourne à mon farniente estival :-)
+
+
diff --git a/content/blog/2014/2014-08-12-qemu-raspbian.md b/content/blog/2014/2014-08-12-qemu-raspbian.md
new file mode 100755
index 0000000..86bfd24
--- /dev/null
+++ b/content/blog/2014/2014-08-12-qemu-raspbian.md
@@ -0,0 +1,128 @@
+---
+layout: post
+title: Emuler la Raspbian avec Qemu
+categories: Debian Matériel Virtualisation
+tag: planet
+excerpt: "Je m'intéresse de plus en plus au Raspberry et je
+franchirai peut-être le pas de l'achat dans quelque temps"
+---
+
+
Je m'intéresse de plus en plus au Raspberry et je
+franchirai peut-être le pas de l'achat dans quelque temps. J'ai voulu voir à
+quoi ressemble sa distribution principale Raspbian (basée sur Debian) en
+l'émulant sous Qemu. Je me suis basé sur [le tutorial pointé par beaucoup de
+gens dans les forums](http://xecdesign.com/qemu-emulating-raspberry-pi-the-
+easy-way/) et j'ai effectué des recherches annexes pour résoudre
+certains problèmes : taille des partitions, gestion de la souris sous Qemu. Ce
+qui suit est le résultat de mes manipulations pour émuler Raspbian avec Qemu
+depuis une distribution GNU/Linux 64 bits.
+
+En pré-requis, on suppose que Qemu est installé sur le système hôte. On
+vérifie que le processeur ARM du Raspberry est supporté par Qemu avec la
+commande suivante :
+
+``` shell
+$ qemu-system-arm -cpu ?
+```
+
+Le résultat liste les types de processeur supportés. On s'assure que **arm1176** est mentionné.
+
+### Installation de base
+
+On se crée un répertoire de travail dans lequel on va télécharger les fichiers nécessaires :
+
+- le noyau Linux [depuis ce lien](http://xecdesign.com/downloads/linux-qemu/kernel-qemu)
+- l'image de la Raspbian [depuis le site officiel](http://www.raspberrypi.org/downloads)
+
+La modification d'un fichier est nécessaire pour que la distribution
+fonctionne avec Qemu. On effectue donc un premier démarrage particulier avec
+BASH en processus INIT pour la réaliser.
+
+``` shell
+$ qemu-system-arm -kernel kernel-qemu -cpu arm1176 -m 256 -M versatilepb -no-reboot -serial stdio -append "root=/dev/sda2 panic=1 rootfstype=ext4 rw init=/bin/bash" -hda 2014-06-20-wheezy-raspbian.img
+```
+
+Quand Qemu a démarré BASH on modifie le fichier /etc/ld.so.preload
+
+ $ nano /etc/ld.so.preload
+
+On commente la première ligne du fichier :
+
+ #/usr/lib/arm-linux-gnueabihf/libcofi_rpi.so
+
+On sauvegarde (CTRL-X avec nano) et on arrête l'émulation
+
+ exit
+
+A ce stade, l'émulation Raspbian sous Qemu est fonctionnelle et on peut faire un vrai démarrage avec la commande :
+
+ $ qemu-system-arm -kernel kernel-qemu -cpu arm1176 -m 256 -M versatilepb -no-reboot -serial stdio -append "root=/dev/sda2 panic=1 rootfstype=ext4 rw" -hda 2014-06-20-wheezy-raspbian.img
+
+### Elargir la partition
+
+Il ne reste pas beaucoup d'espace disque sur la partition root. On peut
+élargir la partition, sinon on ne pourra même pas mettre à jour Raspbian avec
+apt-get. Cela nécessite plusieurs étapes.
+
+D'abord on élargit le disque avec l'utilitaire qemu-resize.
+
+ $ qemu-img resize 2014-06-20-wheezy-raspbian.img +2G
+
+Ensuite on démarre la Raspbian avec Qemu
+
+``` shell
+$ qemu-system-arm -kernel kernel-qemu -cpu arm1176 -m 256 -M versatilepb -no-reboot -serial stdio -append "root=/dev/sda2 panic=1 rootfstype=ext4 rw" -hda 2014-06-20-wheezy-raspbian.img
+```
+
+On se connecte au Raspberry avec l'utilisateur **pi** et le mot de passe
+**raspberry**. Attention si on se connecte depuis la fenêtre Qemu, le clavier
+est probablement configuré en QWERTY.
+
+On lancer l'utilitaire **fdisk** pour modifier les partitions
+
+ $ fdisk /dev/sda
+
+- supprimer la partition 2 qui commence à l'offset 122880 : commande **d** puis indiquer la partition **2**
+- recréer une partition 2 qui commence à l'offset 122880 et utilise la totalité du disque : commande **n**
+- sauvegarder les modifications : commande **w**
+- arrêter le système avec la commande **reboot**.
+
+On démarre à nouveau la Raspbian avec Qemu et on lance la commande resize2fs
+pour élargir la partition 2 :
+
+ $ resize2fs /dev/sda2
+ $ reboot
+
+### Augmenter la résolution sous X
+
+Par défaut, on a une résolution en 640x480 quand on lance LXDE avec
+**startx**. On peut monter en 800x600 en créant un fichier *xorg.conf*.
+
+ # sudo nano /etc/X11/xorg.conf
+
+Ajouter ces lignes dans le fichier :
+
+ Section "Screen"
+ Identifier "Default Screen"
+ SubSection "Display"
+ Depth 16
+ Modes "800x600" "640x480"
+ EndSubSection
+ EndSection
+
+Sauvegarde et redémarrer X pour voir le résultat.
+
+### Déplacements erratiques de la souris
+
+J'ai été confronté à ce problème lié à la configuration de Qemu. La souris se
+fige ou certaines portions de l'écrans deviennent inaccessibles. je l'ai
+résolu en lançant Qemu ainsi :
+
+ qemu-system-arm -kernel kernel-qemu -cpu arm1176 -m 256 -M versatilepb -no-reboot -serial stdio -usbdevice tablet -display sdl -append "root=/dev/sda2 panic=1 rootfstype=ext4 rw" -hda 2014-06-20-wheezy-raspbian.img
+
+Notez le paramètre *-usbdevice tablet* et *-display sdl*.
+
+### Conclusion
+
+L'émulation Qemu permet de se faire une bonne idée de la distribution. Bien sûr, ce n'est pas complètement fonctionnel car certains périphériques spécifiques au Raspberry ne sont pas présent (je pense aux entrées / sortie, au port HDMI) mais cela permet déjà beaucoup.
diff --git a/content/blog/2014/2014-09-15-install-shinken.md b/content/blog/2014/2014-09-15-install-shinken.md
new file mode 100755
index 0000000..c2f4c8e
--- /dev/null
+++ b/content/blog/2014/2014-09-15-install-shinken.md
@@ -0,0 +1,149 @@
+---
+layout: post
+title: Installation de Shinken
+category: GNU/Linux
+tag: planet
+---
+
+Dans la série "ma vie de sysadmin en semi-pro", je me suis frotté à la mise
+en place d'une supervision de type Nagios. Mon besoin est la surveillance de
+quelques serveurs et services critiques et la remontée d'alertes en cas de
+souci. Nagios est la référence dans le domaine avec des centaines de greffons
+pour surveiller la plupart des applications existantes et la possiblité de
+créer ses propres greffons pour ses applications spécifiques. Par goût de la
+démarcation (mais pas seulement), j'ai opté pour
+[Shinken](https://fr.wikipedia.org/wiki/Shinken_%28logiciel%29), un
+*fork* de Nagios qui a plusieurs avantages à mes yeux :
+
+- c'était une branche expérimentale de Nagios qui aurait dû succéder au Nagios actuel dont les critiques disent que le noyau n'évolue pas assez vite par rapport aux demandes des utilisateurs,
+- son architecture est saluée pour sa capacité de montée en charge (distribuée, balance de charge),
+- c'est écrit en Python et la compatibilité est totale avec les greffons Nagios.
+
+La supervision en général et Nagios en particulier est un vaste sujet et des
+IT administrant des milliers de serveurs et de services ont beaucoup plus de
+légitimité que moi pour en parler. Je vais me borner à décrire les étapes
+d'une installation sans problème sur un serveur Debian Wheezy.
+
+### Installation de Shinken
+
+Ce qui suit s'inspire directement du [10 minutes Shinken installation guide](https://shinken.readthedocs.org/en/latest/02_gettingstarted/installations/shinken-installation.html) avec quelques adaptations pour Debian Wheezy.
+
+Installation des paquets Debian nécessaires :
+
+ $ apt-get install python-cherrypy3 python-pip \
+ python-pycurl nagios-plugins
+
+Création d'un utilisateur **shinken** dédié :
+
+ $ adduser shinken
+
+Et finalement installation de shinken lui-même avec le programme PIP (je suppose que Python et PIP 2.x sont installés sur votre Debian) :
+
+ $ pip install shinken
+
+C'est aussi simple que cela. On a installé le moteur de Shinken mais aucune
+interface graphique. Je découvre petit à petit mais l'interface est une
+composante optionnelle et plusieurs sont proposées. J'ai choisi
+d'installer **webui**, celle recommandée qui apporte de la visualisation (la
+configuration se fait en modifiant des fichiers et en redémarrant les
+services Shinken).
+
+### Installation de Webui
+
+Shinken propose son propre gestionnaire de greffons avec le programme **shinken**.
+
+ $ shinken --init
+ $ shinken install webui
+ $ shinken install auth-cfg-password
+
+Webui nécessite un stockage en base pour stocker les préférences
+utilisateurs. On peut se limiter à SQLite, j'ai choisir MongoDB (la base
+NoSQL) qui me sert à d'autres usages.
+
+ $ apt-get install mongodb python-pymongo
+ $ shinken install mod-mongodb
+
+Editer */etc/shinken/modules/webui.cfg* et rajouter les modules dépendants :
+
+ modules auth-cfg-password,mongodb
+
+Editer */etc/shinken/brokers/broker-master.cfg* et rajouter le module webui :
+
+ modules webui
+
+Il reste à définir les contacts (personnes) du système dans
+*/etc/shinken/contacts*. Par défaut, un administrateur est défini dans
+*/etc/shinken/contacts/admin.cfg*, son mot de passe est utilisé pour
+l'interface Webui.
+
+Deux commandes servent régulièrement quand on modifie la configuration.
+
+Vérifier que la configuration est syntaxiquement correcte :
+
+ $ service shinken check
+
+Redémarrer les services Shinken :
+
+ $ service shinken restart
+
+Si tout est correct, on peut se connecter sur Webui depuis un navigateur à l'adresse :
+
+ http://
Bon si dans quelques mois, les annonces de sortie du nouveau KDE ou
+Gnome vous font ricaner, que vous ne jurez que par
+[Awesome](http://awesome.naquadah.org),
+[Rxvt](http://sourceforge.net/projects/rxvt) et
+[Tmux](http://tmux.sourceforge.net), vous êtes au bout du chemin, peut-être un
+peu trop loin d'ailleurs et vos contacts IRC ont tous une forte pilosité ;-)
+
+### Le prompt PS1
+
+Le prompt est l'invite répétée en début de ligne, entre chaque commande, un
+truc du genre **bob@montux >**. Le prompt est porté par la variable PS1 dans le
+fichier de config BASH de chaque utilisateur (~/.bashrc). En fonction des goûts
+là encore, le prompt peut être synthétique et court ou afficher le maximum
+d'informations et prendre une ligne entière. Le site
+[Bashrcgenerator.com](http://bashrcgenerator.com) propose un générateur de
+prompt par drag and drop qui couvre une petite partie de ce qui est possible.
+On peut ajouter des codes ANSI pour coloriser certaines informations. [La doc
+ArchLinux est exhaustive sur ces
+codes](https://wiki.archlinux.org/index.php/Color_Bash_Prompt). Il ne faut pas
+oublier de réinitialiser la couleur en fin de prompt pour que ça ne coule pas
+sur le reste de la ligne avec un reset. je suis adepte des prompts concis :
+
+``` shell
+White='\e[0;37m' # White
+Red='\e[0;31m' # Red
+Reset=$(tput sgr0)
+PS1="\[$White\]\u:\[$Red\]\w\[$White\] \$\[$Reset\] "
+```
+
+Pour des prompts plus sophistiqués, on peut utiliser des fonctions shell pour
+ajouter des informations dynamiques en fonction du contexte, les infos GIT dans
+le contexte d'un répertoire de source par exemple, la charge CPU, l'état de la
+batterie. [Le projet LiquidPrompt](https://github.com/nojhan/liquidprompt) en
+est un parfait exemple facile à configurer.
+
+### Les alias et les fonctions
+
+les alias sont des substitutions de commandes. On peut les utiliser pour éviter
+de mémoriser des paramètres compliquées en définissant de nouvelles commandes :
+
+``` shell
+alias la='ll -A' # 'la' : voir les fichiers cachés
+alias lk='ls -lSr' # 'lk' : trier par taille
+```
+
+Ou bien on peut redéfinir le comportement d'une commande en créant un alias du
+même nom forçant des paramètres :
+
+``` shell
+# forcer une demande de confirmation pour éviter les boulettes
+alias rm='rm --interactive --verbose'
+alias mv='mv --interactive --verbose'
+```
+
+Quant aux fonctions, elles permettent de définir des commandes en langage shell
+directement dans le fichier .bashrc. On peut facilement abuser de cette
+possibilité et alourdir le fichier avec des commandes qu'on utilise une fois
+l'an. Dans ce cas, il est préférable de les sortir et de créer des fichiers
+exécutables accessibles dans le PATH (/usr/local/bin au hasard).
+
+Voici les deux fonctions que j'utilise assez régulièrement :
+
+``` shell
+function bak() { cp "$1" "$1_`date +%Y-%m-%d_%H-%M-%S`" ; }
+
+function extract() # Handy Extract Program
+{
+ if [ -f $1 ] ; then
+ case $1 in
+ *.tar.bz2) tar xvjf $1 ;;
+ *.tar.gz) tar xvzf $1 ;;
+ *.bz2) bunzip2 $1 ;;
+ *.rar) unrar x $1 ;;
+ *.gz) gunzip $1 ;;
+ *.tar) tar xvf $1 ;;
+ *.tbz2) tar xvjf $1 ;;
+ *.tgz) tar xvzf $1 ;;
+ *.zip) unzip $1 ;;
+ *.Z) uncompress $1 ;;
+ *.7z) 7z x $1 ;;
+ *) echo "'$1' cannot be extracted via >extract<" ;;
+ esac
+ else
+ echo "'$1' is not a valid file!"
+ fi
+}
+```
+
+### Les couleurs de LS
+
+[dircolors](http://linux.die.net/man/1/dircolors) est une commande qui permet
+d'afficher le résultat de la commande **ls** en couleur. La plupart des config
+bashrc testent si dircolors est présent et l'utilise en rajoutant --color à
+ls par le biais d'un... alias (bravo à ceux qui n'ont pas lâché). Généralement,
+on a une section de ce genre dans notre .bashrc :
+
+``` shell
+# enable color support of ls
+if [ -x /usr/bin/dircolors ]; then
+ test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)"
+ alias ls='ls --color=auto'
+fi
+```
+
+Si vous avez une section de ce genre, vos commande ls sont déjà colorisées.
+Mais le choix des couleurs et le style est configurable en exportant une
+variable **LS_COLORS**. Son format est une liste séparée par des
+':'. Chaque élément définit la couleur et l'effet d'un type de fichier ou d'une
+extension.
+
+Les types de fichiers :
+
+- no NORMAL, NORM Global default, although everything should be something
+- fi FILE Normal file
+- di DIR Directory
+- ln SYMLINK, LINK, LNK Symbolic link. If you set this to ‘target’ instead of a numerical value, the color is as for the file pointed to.
+- pi FIFO, PIPE Named pipe
+- do DOOR Door
+- bd BLOCK, BLK Block device
+- cd CHAR, CHR Character device
+- or ORPHAN Symbolic link pointing to a non-existent file
+- so SOCK Socket
+- su SETUID File that is setuid (u+s)
+- sg SETGID File that is setgid (g+s)
+- tw STICKY_OTHER_WRITABLE Directory that is sticky and other-writable (+t,o+w)
+- ow OTHER_WRITABLE Directory that is other-writable (o+w) and not sticky
+- st STICKY Directory with the sticky bit set (+t) and not other-writable
+- ex EXEC Executable file (i.e. has ‘x’ set in permissions)
+- mi MISSING Non-existent file pointed to by a symbolic link (visible when you type ls -l)
+- lc LEFTCODE, LEFT Opening terminal code
+- rc RIGHTCODE, RIGHT Closing terminal code
+- ec ENDCODE, END Non-filename text
+- \*.extension Every file using this extension
+
+les effets :
+
+- 00 Default colour
+- 01 Bold
+- 04 Underlined
+- 05 Flashing text
+- 07 Reversetd
+- 08 Concealed
+
+Les couleurs :
+
+- 30 Black
+- 31 Red
+- 32 Green
+- 33 Orange
+- 34 Blue
+- 35 Purple
+- 36 Cyan
+- 37 Grey
+
+les couleurs de fond :
+
+- 40 Black background
+- 41 Red background
+- 42 Green background
+- 43 Orange background
+- 44 Blue background
+- 45 Purple background
+- 46 Cyan background
+- 47 Grey background
+
+Les couleurs suppplémentaires :
+
+- 90 Dark grey
+- 91 Light red
+- 92 Light green
+- 93 Yellow
+- 94 Light blue
+- 95 Light purple
+- 96 Turquoise
+- 97 White
+- 100 Dark grey background
+- 101 Light red background
+- 102 Light green background
+- 103 Yellow background
+- 104 Light blue background
+- 105 Light purple background
+- 106 Turquoise background
+
+Les couleurs par défaut de **dircolors** sont bien pensées mais je n'aime pas
+l'utilisation abusive de l'empâtement gras. Je définis donc la couleur bleue
+pour l'affichage des répertoire mais en style non gras, je mets par contre en
+gras les répertoire ouverts à tous les vents (avec les droits d'écriture sur le
+groupe *other*), et en rouge non gras les fichiers exécutables.
+
+``` shell
+export LS_COLORS="di=00;34:ow=01;34:ex=00;31"
+```
+
+J'espère que ces quelques exemples donnent envie de plonger dans les arcanes du
+fichier .bashrc pour l'ajuster à sa sauce et utiliser un peu plus la ligne de
+commande. De plus en plus de monde conserve ses fichiers de configuration sur
+GIT pour avoir un référentiel rapidement installable sur ses systèmes. C'est
+une habitude à laquelle j'ai aussi succombé : j'ai un projet [dotfiles sous
+GitHub](https://github.com/kianby/dotfiles).
diff --git a/content/blog/2015/2015-06-01-blog-en-mouvance.md b/content/blog/2015/2015-06-01-blog-en-mouvance.md
new file mode 100755
index 0000000..7b5dd4f
--- /dev/null
+++ b/content/blog/2015/2015-06-01-blog-en-mouvance.md
@@ -0,0 +1,51 @@
+---
+layout: post
+title: Hébergement en mouvance
+category: Hébergement
+tag: planet
+---
+
+Très satisfait de mon hébergeur actuel, je reste à l'écoute du marché. Ah
+pardon on ne parle pas recrutement j'ai confondu ;-) Je reprends : bien que
+très satisfait de mon hébergement je me suis laissé tenter par
+[FirstHeberg](https://www.firstheberg.com) qui propose une large gamme de VPS
+répartie en trois familles :
+
+- des containers légers OpenVz
+- des machines virtuelles Qemu
+- des machines virtuelles Qemu avec option de sauvegarde
+
+Chaque famille se décline bien sûr en plusieurs puissances, plusieurs capacités
+RAM et disque. Ce qui m'a intéressé c'est la possibilité de louer une machine
+virtuelle pour le même prix que mon conteneur OpenVz actuel. J'ai donc souscrit
+à l'offre GP1 cette semaine en choisissant un système Debian 8 (Jessie). La
+livraison est classique avec l'envoi des informations de connexion adresse IP,
+DNS en fhnet.fr et mot de passe du compte root. Le service SSH est activé en
+standard. Je n'ai pas encore beaucoup joué avec les outils mais une interface
+d'administration sobre fournit l'essentiel : un redémarrage forcé de la VM, la
+possibilité de réinstaller avec l'OS de son choix et des graphes d'activité du
+VPS pour la dernière heure : utilisation CPU, consommation mémoire, trafic
+réseau et activité disque.
+
+Mon objectif c'est de migrer progressivement les services d'un serveur à
+l'autre. Alors plutôt que de réinstaller manuellement j'ai saisi l'opportunité
+de me former à [Ansible](http://docs.ansible.com), un outil de déploiement et
+des gestion des configurations. L'utilisation usuelle consiste à définir des
+recettes d'installation (*playbook* dans la terminologie Ansible) et de
+vérifier la conformité des cibles de déploiement avec ces recettes. C'est un
+outil utilisé pour superviser des parcs de serveurs mais il a aussi de
+l'intérêt dans mon cas d'utilisation : j'ai créé une machine virtuelle sous
+Virtual Box avec les caractéristiques du serveur FirstHeberg et je mets au
+point mes playbooks. L'idée c'est de valider systématiquement sur la machine
+virtuelle locale avant de mettre en production et de formaliser le déploiement
+du serveur à la sauce Ansible qui emploie un format textuel et compréhensible
+afin de *versionner* les changements sous GIT et faciliter le changement
+d'hébergement dans l'avenir, bref d'avoir une démarche un peu plus
+professionnelle quant à la gestion des configurations du serveur.
+
+Pour l'anecdote, Ansible est un outil Python (hé oui encore un) comme
+[Fabric](http://www.fabfile.org) (que je connais et utilise déjà) et il ne
+demande qu'un accès SSH pour interagir avec les serveurs. De bons articles ont
+déjà été publiés sur le [Planet](http://www.planet-libre.org), je peux rajouter
+l'excellent [tuto de leucos](https://github.com/leucos/ansible-tuto) qui
+complète la documentation officielle déjà très complète par des exemples.
diff --git a/content/blog/2015/2015-06-09-srmail.md b/content/blog/2015/2015-06-09-srmail.md
new file mode 100755
index 0000000..4e443e8
--- /dev/null
+++ b/content/blog/2015/2015-06-09-srmail.md
@@ -0,0 +1,59 @@
+---
+layout: post
+title: SRmail
+category: Développement
+tag: planet
+---
+
+J'ai développé un petit bout de logiciel nommé, sans grande inspiration, SRmail
+pour "Simple Rest Mail" avec les technos que j'apprécie : le langage Python et
+le framework Web Flask. Le but de SRmail est de fournir un service local de
+récupération et d'envoi de courriels à d'autres applications. En gros, c'est
+une brique logicielle à l'écoute sur l'interface **localhost** qui permet de
+lire et d'envoyer des messages à travers une API Restful. J'insiste sur le
+terme local car l'API n'est absolument pas sécurisée : un fichier de
+configuration donne les pleins pouvoirs à SRmail pour gérer un compte par les
+protocoles IMAP et SMTP. L'intérêt c'est de centraliser la complexité de
+gestion des e-mails et de mutualiser un service entre plusieurs applications en
+plaçant la barre au niveau applicatif et non pas système.
+
+Le code et la documentation sont [sur mon
+GitHub](https://github.com/kianby/srmail). Ça s'installe facilement à la sauce
+Python dans un *virtualenv* de préférence, avec le gestionnaire de paquets
+**pip** pour récupérer les dépendances.
+
+Voici un exemple d'envoi d'e-mail en Python :
+
+``` python
+import requests
+headers = {'Content-Type': 'application/json; charset=utf-8'}
+msg = {
+ 'to': 'bill@phoenix.com',
+ 'subject': 'Got it',
+ 'content': 'See you soon!\n\n-- John'
+}
+r = requests.post('http://localhost:8000/mbox', data=json.dumps(msg), headers=headers)
+if r.status_code == 200:
+ logger.debug('Email for %s posted' % to_email)
+else:
+ logger.warn('Cannot post email for %s' % to_email)
+```
+
+Et voici le même exemple en ligne de commande avec CURL :
+
+``` shell
+curl -X POST -H "Content-Type: application/json; charset=utf-8"
+ -d '{"to":"bill@phoenix.com", "subject":"Got it",
+ "content":"See you soon!\n\n-- John"}'
+ http://localhost:8000/mbox
+```
+
+Plutôt que de faire du *polling* pour voir si de nouveaux messages sont
+arrivés, on peut définir la fréquence de polling au niveau de SRmail ainsi que
+des URL de notification vers lesquelles seront postés les messages au format
+JSON.
+
+Pour le déploiement de mes applications Python j'utilise [Supervisor](/supervisor-gestion-de-processus.html) qui
+permet de s'abstraire du système d'init (SysV, OpenRC, systemd).
+
+Voilà c'est sans prétention un outil qui peut vous être utile.
diff --git a/content/blog/2015/2015-06-13-une-semaine-ordinaire.md b/content/blog/2015/2015-06-13-une-semaine-ordinaire.md
new file mode 100755
index 0000000..c6318d6
--- /dev/null
+++ b/content/blog/2015/2015-06-13-une-semaine-ordinaire.md
@@ -0,0 +1,68 @@
+---
+layout: post
+title: Une semaine ordinaire
+category: Humeur
+tag: planet
+---
+
+Toute ressemblance avec des événements réels s'étant déroulés cette semaine
+dans ma sphère professionnelle n'est pas fortuite. La semaine a été riche en
+péripéties système et réseau, ce qui me conforte dans l'idée que gérer un
+réseau de centaines de machines ça doit pas être facile tous les jours. Fou le
+temps qu'on peut déjà passer avec une trentaine en faisant cela en dilettante
+puisque mon métier principal c'est développeur.
+
+Orange fournit un service d'adresse de messagerie pour les professionnels avec
+une sécurité renforcée. Pour lutter contre le SPAM, ils s'assurent notamment
+que les e-mails sont envoyés depuis une machine de confiance. L'envoi d'e-mails
+de ma société est devenu erratique depuis mardi. Un message un peu cryptique du
+support Orange nous informe que notre IP publique est *sur liste noire* donc
+tout le trafic Internet qui sort de nos machines est suspect. Cela explique le
+blocage des e-mails par le serveur SMTP Orange Business. Comment en est-on
+arrivé à cette situation et comment en sortir ? Un tour sur [ce genre de site
+]( http://whatismyipaddress.com/blacklist-check) permet de consulter les sites
+de référence des *listes noires* et sur certains de connaître la cause. Dans
+notre cas, le trafic Internet d'un virus sortant de notre réseau a été détecté,
+ce qui nous a promu au rang de site louche. Pour sortir de cette situation il
+faut résoudre le problème (éradiquer les machines infectées) puis demander à
+sortir de la liste noire sur sa bonne foi d'admin. Au bout de 24/48h tout
+rentre dans l'ordre.
+
+Dans un autre registre, je constate que le voisinage réseau des machines Ms
+Windows (en Workgroup) est parfois incomplet, ne présentant qu'un sous-ensemble
+des machines. Un test depuis différents OS (Windows 7, Windows 2003) me
+confirme que ce n'est pas particulier à ma Fedora et sa configuration Samba.
+Pour ce que j'en sais, dans un réseau modeste en WORKGROUP, sans controlleur de
+domaine, les machines participent à une élection pour élire un *master
+browser*, celle qui va fournir la liste du voisinage réseau. Je crains qu'avec
+nos machines de test à droite à gauche, on élise parfois une machine qui n'a
+pas de visibilité complète sur l'ensemble du réseau. La commande **nmblookup**
+des outils SAMBA permet de connaître l'adresse IP du *master browser* en cours,
+sachant qu'il change régulièrement :
+
+ nmblookup -S -M -- -.
+
+Comme dans la vie réelle, une solution consiste à influer sur le résultat de
+l'élection. C'est possible avec SAMBA et son paramétrage avancé qui lui permet
+de concourir à l'élection du *Master Browser* avec une telle réputation qu'il
+ne peut qu'être élu par ses pairs. J'ai utilisé un serveur NAS local (NAS4FREE
+sous BSD, toujours en ligne) pour ce rôle d'élu. Le voisinage réseau est
+désormais complet en toute circonstance.
+
+Pour terminer la semaine en beauté, on me met le nez sur un problème de Wi-Fi
+récurrent (et aléatoire sinon c'est pas drôle) : accroche du réseau mais pas
+d'accès Internet. Le Wi-Fi n'est pas majoritairement utilisé dans la société
+donc il impacte peu de monde et le problème traîne depuis un bail. J'avais
+envisagé un dysfonctionnement des répéteurs sans fil et évacué le problème dans
+ma tête. Mais vendredi, le problème est presque systématique je décide de le
+prendre à bras le corps. Armé d'une tablette Lenovo (attention *placement de
+produit* comme dirait mon fils) je regarde si je peux me connecter en DHCP mais
+spécifier un autre serveur DNS quand l'adresse IP que le serveur m'a assigné
+m'attire l'oeil : rien à voir avec notre réseau et non routable vers Internet.
+Après recherche on découvre un petit routeur de test branché sur le réseau avec
+la fonction "serveur DHCP" activée. Deux serveurs sur le même LAN : c'est le
+plus rapide qui répond aux demandes, cela explique le côté aléatoire du
+problème.
+
+Ce qui me plaît dans l'administration système et réseau c'est la diversité des
+problèmes et des solutions.
diff --git a/content/blog/2015/2015-06-21-deploiement-et-sauvegarde.md b/content/blog/2015/2015-06-21-deploiement-et-sauvegarde.md
new file mode 100755
index 0000000..084a967
--- /dev/null
+++ b/content/blog/2015/2015-06-21-deploiement-et-sauvegarde.md
@@ -0,0 +1,133 @@
+---
+layout: post
+title: Déploiement et sauvegarde
+category: Hébergement
+tag: planet
+---
+
+J'ai terminé la migration de mon serveur. [Comme
+annoncé](http://blogduyax.madyanne.fr/hebergement-en-mouvance.html) j'ai
+utilisé l'outil de déploiement
+[Ansible](https://fr.wikipedia.org/wiki/Ansible_%28logiciel%29) pour :
+
+- conserver l'historique d'installation du serveur,
+- valider au préalable sur une machine virtuelle locale l'installation de
+ nouveaux services,
+- être capable de rapidement redéployer un nouveau serveur.
+
+J'ai d'abord écrit un playbook de base qui configure à mon goût une Debian
+fraîchement installée : paquets supplémentaires, création des utilisateurs,
+préférences de Bash, Tmux et Vim. Les préférences sont récupérées depuis [mon
+projet dotfiles sur GitHub](https://github.com/kianby/dotfiles) et Ansible
+s'occupe de leur installation. Si demain je modifie mon prompt Bash ou si
+rajoute un plug-in à ma configuration Vim, je peux facilement synchroniser les
+changements avec un *git pull*. Ce playbook m'a déjà resservi sur le plan
+professionnel, c'est un investissement de temps déjà rentabilisé. Je l'ai
+publié dans [un projet provisioning sur
+GitHub](https://github.com/kianby/provisioning).
+
+Le second playbook est beaucoup plus personnel puisqu'il déploie ce blog. En
+cas de pépin il me permettra de me remettre en ligne rapidement. C'est un
+playbook qui peut servir de tutorial, il n'est pas complexe mais mixe
+différents types de tâches : installation de fichiers, manipulation de GIT,
+enregistrement de tâches dans Cron.
+
+Ceci dit, à contrario de mon idée initiale, je n'ai pas écrit de playbooks pour
+l'intégralité des services à déployer car c'est très consommateur en temps (or
+je suis fainéant : souvenez vous je suis développeur) et c'est peu intéressant
+pour des services faciles à installer et périssables. Je prends pour exemple
+[Piwik, l'outil de statistiques de site Web](https://piwik.org/) ; c'est une
+application LAMP (Linux, Apache, MySQL, PHP) classique qui par la suite est
+capable de se mettre à jour elle-même. Je n'ai pas vu d'intérêt à créer un
+playbook pour installer une version de Piwik qui sera obsolète dans 2 mois et
+de passer du temps à maintenir un playbook au lieu de maintenir mon serveur.
+Mes autres services, soit moins critiques, soit mis à jour automatiquement ont
+donc été installés manuellement : Piwik, Tiny Tiny RSS, Owncloud, Shaarli et
+Roundcube.
+
+L'installation est donc achevée, je suis à priori capable de remonter le blog
+en moins de deux heures sur un nouveau serveur (ce qui prendra plus de temps
+c'est de faire pointer les DNS vers la nouvelle adresse du site). Il me reste
+à détailler le sujet des sauvegardes.
+
+Mon besoin est modeste mais précis :
+
+- les articles du blog sont déjà sauvegardés dans
+ [GitHub](https://github.com/kianby/blog) (merci les blogs statiques) mais je
+ dois sauvegarder les commentaires,
+- sauvegarder la base de donnée MySQL de Tiny Tiny RSS n'a aucun intérêt mais
+ sauvegarder le fichier OPML qui contient mes abonnement RSS est important,
+- sauvegarder mes favoris conservés par Shaarli est essentiel,
+- peu m'importe mes fichiers synchronisés avec Owncloud puisque j'ai une copie
+ locale par contre il m'importe de sauvegarder mon calendrier.
+- sauvegarder les configuration du serveur HTTP (NginX dans mon cas)
+
+Ma solution est atypique et peut-être un mauvais exemple mais elle répond à mon
+besoin et je n'avais aucune envie de sortir la grosse artillerie, de dumper
+toutes mes bases et tout mon répertoire /var/www avec des centaines de fichiers
+pour créer des grosses archives sauvegardées incrémentalement vers ... un FTP
+distant ou autre. Je suis parti du principe qu'en cas de crash, je serais
+capable de remonter le blog rapidement et que je prendrais plus de temps pour
+remonter mes services donc je focalise sur les données de ces services. Ce qui
+est important par contre, c'est d'avoir une sauvegarde avec rotation qui
+conserve les 2 derniers jours, 2 dernières semaines et 2 derniers mois pour
+avoir un historique et revenir en arrière en cas de problème. J'ai donc
+personnalisé [un modeste shell
+script](https://nicaw.wordpress.com/2013/04/18/bash-backup-rotation-script) qui
+a le bon goût de gérer la rotation des sauvegardes, pour :
+
+- d'abord récupérer toutes mes données à sauvegarder à droite à gauche par
+ différents moyens : copie, extraction avec les API proposées par les
+ applications,
+- et ensuite envoyer la sauvegarde quelque part.
+
+Sachant que je n'ai pas d'autre serveur ou d'espace FTP je me suis demandé où
+serait ce *quelque part*. J'ai regardé un peu [la solution
+Hubic](https://hubic.com/fr/) mais la complexité pour en détourner l'usage de
+base qui est la synchronisation de fichiers et monter l'espace Hubic comme
+stockage distant m'a peu motivé. Une sauvegarde c'est bien quand ça fait son
+boulôt et qu'on l'oublie. J'ai moins de 2 Mo à sauvegarder par jour j'ai donc
+eu une idée, tordue au premier abord et peut-être bien aussi au second (d'un
+autre côté je suis le gars qui s'acharne à greffer des systèmes de commentaires
+à des blogs statiques donc ça n'étonnera peut-être pas grand monde) : balancer
+mes sauvegardes dans Owncloud ainsi elles seront synchronisées sur mes machines
+locales et j'aurais une notification journalière que la sauvegarde s'est bien
+déroulée.
+
+Voici donc les grandes lignes de la partie **récupération des données** :
+
+``` shell
+# Les fichiers de configuration de NginX
+cp -r /etc/nginx/* $TARGET_DIR/nginx/.
+
+# Les favoris de Shaarli stockées dans des fichiers PHP
+cp /var/www/shaarli/data/* $TARGET_DIR/shaarli/.
+
+# Le fichier OPML de Tiny Tiny RSS par son URL publique
+wget "http://ttreader.madyanne.fr/opml.php?op=publish&key=XYXYXYXYXYXYXYXYXYX" \
+ -O $TARGET_DIR/reader/reader.opml
+
+# Le fichier ICS du calendrier Owncloud
+OC_USER=owncloud_user
+OC_PWD=owcloud_password
+wget --no-check-certificate --auth-no-challenge --no-clobber \
+ --http-user=$OC_USER --http-password=$OC_PWD \
+ -O $TARGET_DIR/owncloud/cal.ics \
+ "https://owncloud.madyanne.fr/index.php/apps/calendar/export.php?calid=1"
+```
+
+Suite à cela, le script crée une belle archive et la copie dans un répertoire
+*backup* de mes fichiers Owncloud. Ce n'est pas suffisant pour qu'elle soit
+synchronisée par Owncloud car on l'a copié en douce. Il faut forcer Owncloud à
+rescanner son répertoire avec la commande suivante exécutée en tant
+qu'utilisateur *www-data*:
+
+``` shell
+su -c "/usr/bin/php /var/www/owncloud/console.php files:scan all" \
+-s /bin/sh www-data
+```
+
+Il reste encore un peu de peaufinage mais ça semble faire le boulôt et je vois la
+fin du tunnel de cette migration de serveur.
+
+
diff --git a/content/blog/2015/2015-08-10-fail2ban-configuration.md b/content/blog/2015/2015-08-10-fail2ban-configuration.md
new file mode 100755
index 0000000..8cbf3d4
--- /dev/null
+++ b/content/blog/2015/2015-08-10-fail2ban-configuration.md
@@ -0,0 +1,186 @@
+---
+layout: post
+title: Configuration de Fail2Ban
+category: Hébergement
+tag: planet
+---
+
+Après [l'aspect de la
+sauvegarde](http://blogduyax.madyanne.fr/deploiement-et-sauvegarde.html) je me
+suis attaqué à la sécurisation du serveur. C'est un vaste sujet et on n'est
+jamais certain d'être parfaitement protégé : on se documente et on essaie de
+parer à l'essentiel. Je recommande cet article publié sur [Mes potes
+Geek](https://mespotesgeek.fr/debian-8-jessie-securisation/) qui dresse un
+panorama des outils couramment utilisés et leur mise en oeuvre. Un des piliers
+de la sécurisation d'un serveur GNU/Linux est l'outil
+[Fail2Ban](http://www.fail2ban.org) qui va surveiller les logs du serveur pour
+trouver des traces d'attaque et contre-attaquer en bannissant le malotru.
+
+Techniquement, l'outil parse les logs systèmes ou applicatifs à grand coup
+d'expressions régulières et bloque les attaques avec le pare-feu
+[iptable](https://fr.wikipedia.org/wiki/Iptables). Les règles de bannissement
+sont configurables : nombre de tentatives de connexions infructueuses, durée du
+bannissement. On peut facilement étendre Fail2Ban pour ajouter la surveillance
+d'une application *maison* pour peu qu'elle écrive dans un log les tentatives
+ratées de connexion et on peut aussi personnaliser les notifications. En
+standard, Fail2Ban envoie un e-mail à l'administrateur à chaque *ban*. En
+pratique, un petit serveur comme le mien bannit une quinzaine d'adresses IP par
+jour, essentiellement des tentatives ratées par SSH et c'est vite fastidieux de
+recevoir autant d'e-mails. Fail2Ban propose un envoi groupé, c'est à dire qu'il
+regroupe un nombre d'attaques paramétrable dans un seul e-mail. C'est mieux
+mais je suis habitué à configurer mes outils pour recevoir des rapports à
+fréquence fixe, journaliers ou hebdomadaires. N'ayant rien trouvé en standard,
+j'ai décidé d'étendre Fail2Bane avec mon propre script de configuration pour
+arriver au résultat voulu.
+
+Sur Debian, la configuration est installée sous **/etc/fail2ban**. Dans ce
+répertoire, on va trouver */etc/failban/filter.d/* qui contient les filtres de
+détection et */etc/fail2ban/action.d/* qui contient les actions à appliquer.
+Le fichier de configuration principal est *jail.conf* mais on ne le modifie
+jamais (pour éviter de perdre les modifications lors des mises à jour de
+fail2ban). On préfère redéfinir les parties de la configurations modifiées dans
+un fichier *jail.local*. Pour rajouter une action personnalisée, on va donc
+rajouter un fichier d'action dans */etc/fail2ban/action.d* et décrire quand et
+comment l'appliquer dans *jail.local*.
+
+J'ai donc dupliqué le fichier d'action *sendmail-buffered* et je l'ai adapté
+pour créer *sendmail-cron*. Pourquoi CRON ? Et bien l'idée est la suivante :
+chaque bannissement est écrit dans un fichier temporaire par
+*sendmail-buffered* et quand le nombre de ligne configuré est atteint, ce
+fichier est envoyé par e-mail. Je conserve ce fonctionnement mais je change le
+déclencheur de l'envoi : ce n'est plus le nombre de lignes du fichier mais la
+présence d'un fichier *mail.flag* dans un certain répertoire qui conditionne
+l'envoi. Ce fichier *mail.flag* est créé par une tâche CRON. Ainsi, on délègue
+à CRON la configuration de la fréquence d'envoi du rapport.
+
+Quant au fichier d'action, il est simple : on conserve les IP bannies dans un
+fichier temporaire avec le détail de l'opération (date de l'attaque, filtre
+concerné, IP source) et on regarde si on a le feu vert pour créer le rapport en
+testant la présence du fichier *mail.flag*. Si c'est le cas, on envoie le
+rapport puis on supprime le fichier temporaire et le fichier *mail.flag*. Voici
+le fichier */etc/fail2ban/action.d/sendmail-cron.conf* complet :
+
+```
+ # Fail2Ban configuration file
+ #
+ # Author: Yannic Arnoux
+ # Based on sendmail-buffered written by Cyril Jaquier
+ #
+ #
+
+ [INCLUDES]
+
+ before = sendmail-common.conf
+
+ [Definition]
+
+ # Option: actionstart
+ # Notes.: command executed once at the start of Fail2Ban.
+ # Values: CMD
+ #
+ actionstart = printf %%b "Subject: [Fail2Ban]
Pour les PC, un coup de pouce peut rajeunir un matériel
+vieillissant : une distribution GNU/Linux légère et l'investissement dans un
+SSD. J'ai profité des soldes de l'été pour acheter un SSD de 64 Go pour ma
+machine principale, un portable Toshiba de 2009 (processeur Core 2 Duo et 4 Go
+de RAM) : pour 30 euros j'ai une machine bien plus pêchue qui démarre en 20s
+chrono.
+
+Mon second PC, le portable LDLC acquis en 2011 montrait des problèmes de
+surchauffe depuis quelques temps. Étant aussi ma machine de *gaming* j'étais
+assez attristé jusqu'à ce que je découvre la trappe de fond qui donne accès au
+ventilateur et à l'aération bien obstruée par la poussière. Un peu de
+nettoyage et le problème de chauffe est résolu. J'ai noté cette trappe comme un
+critère très important dans l'hypothétique achat d'un futur portable.
+
+Hypothétique, car vu [la vitesse à laquelle s'étoffe le catalogue de
+SteamOS](http://www.numerama.com/magazine/34248-steam-passe-la-barre-des-1500-jeux-video-sous-linux.html),
+il est peu probable que je rachète un portable avec autant de puissance. Je
+vais sûrement dissocier le *gaming* de mes autres activités. Après tout, un
+Core 2 duo est bien suffisant pour coder en Python et faire des expérimentation
+système avec Tux.
+
+Au delà, du combat contre l'obsolescence programmée je pense que chacun peut
+oeuvrer à son niveau pour limiter le gaspillage en prolongeant la durée
+d'utilisation de son matos par un peu de maintenance, en misant sur le bon
+cheval de l'OS et en réfrénant un peu ses pulsions de consommation ;-)
diff --git a/content/blog/2015/2015-11-15-massacre.md b/content/blog/2015/2015-11-15-massacre.md
new file mode 100755
index 0000000..98321c5
--- /dev/null
+++ b/content/blog/2015/2015-11-15-massacre.md
@@ -0,0 +1,16 @@
+---
+layout: post
+title: Massacre à Paris
+category: Humeur
+tag: planet
+---
+
+Je pensais que la tuerie de Charlie Hebdo serait le pire évènement de l'année
+2015 mais le massacre du vendredi 13 novembre a dépassé l'inimaginable.
+Après une nuit blanche à suivre les évènements, à trembler pour le
+public du Bataclan avant l'assaut, il ne reste que les pleurs devant le nombre
+de victimes et la douleur des familles dont certaines cherchent encore leurs proches.
+
+
+
+*Merci à Benjamin Regnier pour ce dessin*
diff --git a/content/blog/2015/2015-12-12-retour-experience-ubuntu-touch.md b/content/blog/2015/2015-12-12-retour-experience-ubuntu-touch.md
new file mode 100755
index 0000000..54109ba
--- /dev/null
+++ b/content/blog/2015/2015-12-12-retour-experience-ubuntu-touch.md
@@ -0,0 +1,192 @@
+---
+layout: post
+title: Retour d'expérience Ubuntu Touch
+category: Mobilité
+tag: planet
+---
+
+L'article peut sembler opportuniste par rapport aux rumeurs d'abandon de
+Firefox OS mais il n'en est rien (je le jure votre honneur). C'est seulement
+que j'ai eu la chance de toucher un Nexus 4 (merci Papa) et j'en ai profité
+pour tester le système Ubuntu Touch pendant une semaine dans mon utilisation
+quotidienne. En effet, ce téléphone est un des téléphones de référence pour la
+société Canonical, toujours maintenu alors que leur OS, très discret, fêtera
+bientôt sa 3ème bougie. Depuis le lancement de Ubuntu Touch, trois téléphones
+ont été commercialisés : deux modèles du constructeur espagnol BQ qui semblent
+très appréciés par la communauté Ubuntu et un modèle assez puissant, le MX4 du
+constructeur chinois Meizu.
+
+
Ca commence donc par l'installation du système qui est assez
+simple car d'une part le Nexus 4 a un booloader facile à déverrouiller et
+Ubuntu Touch est basé sur un Android, on utilise donc des outils Android (adb,
+fastreboot) pour flasher le système. Ensuite les outils Canonical
+interviennent, la voie simple consiste donc à s'installer une version Desktop
+de Ubuntu 14.04 ou supérieure sur un PC afin d'obtenir ces outils facilement.
+Je me suis donc basé sur [la documentation officielle du Ubuntu
+Developer](https://developer.ubuntu.com/en/start/ubuntu-for-devices/installing-ubuntu-for-devices)
+et [sur cet
+article](http://www.pcadvisor.co.uk/how-to/linux/how-install-ubuntu-touch-image-3531970)
+qui apporte quelques précisions pour le Nexus 4. On a le choix entre deux
+canaux de mise à jour système : stable ou développement. Pour me faire une
+idée la plus juste du système et ne pas la fausser avec des bugs d'une version
+en cours de développement, j'ai choisi la version stable. Ce qui est
+intéressant avec Ubuntu Touch, c'est que la version mobile fait partie
+intégrante du développement de Ubuntu, il ne s'agit d'un développement à part,
+déconnecté de la version *Desktop*. Après une installation fraîche, on a donc
+un téléphone en version 15.04 et on reçoit des OTA (mise à jour) régulièrement.
+On devrait d'ailleurs bientôt basculer en version 15.10. Canonical a une vision
+précise de ce qu'il veulent obtenir avec leur système et cela s'appelle
+Convergence. Un système mobile qui, une fois connecté à un clavier / souris en
+bluetooth et à un moniteur se transforme en *Ubuntu Desktop* capable d'exécuter
+les applications usuelles comme Libre Office ou Gimp.
+
+Pour moi, Convergence est un rêve de Geek et on a du mal à imaginer le quidam
+moyen utiliser son téléphone comme ordinateur. Et pourtant c'est un des
+principaux avantages de Touch : on n'a pas un système Unix-like castré mais un
+système GNU/linux complet. Je me suis plusieurs fois surpris à buter sur la
+manière de faire certaines choses parce que l'interface graphique n'est pas
+encore complète sur certains point et qu'il faut raisonner ligne de commande
+avec les outils usuels : du shell script (SH ou BASH) et des tâches CRON. Mais
+je m'emballe, faisons d'abord un petit tour en images du système.
+
+**L'écran de déverrouillage et ses statistiques amusantes :**
+
+
+
+
+
+**L'écran principal avec ses applications en rang d'oignons:**
+
+
+
+
+
+**Les applications favorites sur la gauche en faisant glisser le bord gauche de l'écran**
+
+**et les applications lancées en faisant glisser le bord droit de l'écran :**
+
+
+
+
+
+**Les paramètres système et un aperçu du magasin d'applications :**
+
+
+
+
+
+
+A part la particularité du tirage des bords d'écran pour faire apparaître la
+barre latérale ou passer d'une application à l'autre mais on pige vite le coup,
+on est dans une interface classique, on n'est pas perdu. Les paramètres sont
+similaires à ce qu'on peut trouver sur d'autres systèmes, le magasin Ubuntu
+Store est plus conséquent que ce à quoi je m'attendais. De ce que j'ai lu sur
+les forums de discussion Ubuntu, l'équipe Canonical a mis le focus sur le
+système dans un 1er temps, les applications viendront ensuite. Voici une liste
+de ce qui marche et de ce qui dysfonctionne sur le Nexus 4 en 15.04 OTA 8:
+
+- la téléphonie fonctionne (oui c'est bien de l'écrire pour rassurer tout le
+ monde)
+- l'envoi de SMS et de MMS fonctionne mais j'ai un doute sur la réception MMS
+ (je crois en avoir raté un)
+- le bluetooth est présent mais je n'ai pas réussi à le faire fonctionner avec
+ mon main-libre Jabra malgré un appairage réussi.
+- le GPS est capricieux
+- le tethering USB fonctionne. la fonction Hotspot Wi-Fi est censée être
+ présente mais je ne l'ai pas vu dans mes paramètres.
+- l'application e-mail officielle *Dekko* est fonctionnelle depuis peu. Elle est
+ agréable à utiliser.
+- les applications *contact* et *calendrier* sont présentes et bien faîtes.
+- les performances du systèmes sont acceptables mais perfectibles (on a une
+ patience d'1 à 2 secondes à chaque lancement d'application)
+
+Deux sujets ont exigé de mettre le nez dans la ligne de commande car ils ne
+sont pas (encore) configurables par l'interface graphique : les sonneries
+personnalisées et la synchronisation des contacts et du calendrier.
+
+D'abord il nous faut un accès SSH sur la bête. On active le mode *développeur*
+depuis les paramètres du téléphone et on se connecte avec *adb shell* pour
+activer le service SSH Ensuite on copie la clef publique de notre PC sous
+GNU/Linux dans le téléphone. Ca donne en gros les étape suivantes lues sur
+[AskUbuntu](http://askubuntu.com/questions/348714/how-can-i-access-my-ubuntu-phone-over-ssh)
+
+ adb shell android-gadget-service enable ssh
+ adb shell mkdir /home/phablet/.ssh
+ adb push ~/.ssh/id_rsa.pub /home/phablet/.ssh/authorized_keys
+ adb shell chown -R phablet.phablet /home/phablet/.ssh
+ adb shell chmod 700 /home/phablet/.ssh
+ adb shell chmod 600 /home/phablet/.ssh/authorized_keys
+
+Partant de là, on peut se passer de *adb* et se connecter directement en SSH sur
+le téléphone avec l'utilisateur phablet. Comme par défaut sur Ubuntu, le compte
+root est désactivé et l'utilisateur phablet doit utiliser *sudo* pour obtenir
+les super-pouvoirs. Ces pouvoirs ne permettent pas de modifier un fichier du
+système qui est en dehors du répertoire */home/phablet* car par sécurité les
+partitions sont montées en lecture seule. Donc on sera souvent amené à remonter
+la partition en lecture-écriture avec la commande suivante :
+
+ sudo mount /dev/loop0 / -o remount,rw
+
+On va configurer la synchronisation de nos contacts et du calendrier vers
+Owncloud par les protocoles de sychronisation **cardav** et **caldav** en
+s'inspirant de [cette
+discussion](http://askubuntu.com/questions/360466/ubuntu-touch-officially-launched-version-how-to-sync-contacts)
+sur AskUbuntu. D'abord on configure syncevolution :
+
+``` shell
+# les valeurs username, password et syncurl doivent être adaptées
+syncevolution --keyring=no --configure --template webdav username=yax password=??? syncurl="mycloud.madyanne.fr" target-config@owncloud
+syncevolution --configure --template SyncEvolution_Client sync=none syncURL=local://@owncloud username= password= peerIsClient=1 owncloud
+
+# on configure la synchro des contacts
+syncevolution --configure database=https://mycloud.madyanne.fr/remote.php/carddav/addressbooks/yax/contacts backend=carddav target-config@owncloud contacts
+syncevolution --configure sync=two-way backend=contacts database="Personnel" owncloud contacts
+
+# on configure la synchro du calendrier
+syncevolution --configure database=https://mycloud.madyanne.fr/remote.php/caldav/calendars/yax/personnel backend=caldav target-config@owncloud calendar
+syncevolution --configure sync=two-way backend=events database="Personnel" owncloud calendar
+
+# on lance une 1ère synchro qui donne priorité au serveur Owncloud
+syncevolution --sync slow owncloud contacts
+syncevolution --sync slow owncloud calendar
+```
+
+Ce qui manque juste, c'est une
+synchronisation périodique avec Owncloud par exemple une fois par heure.
+D'abord j'ai naïvement ajouté deux lignes dans la CRONTAB :
+
+ syncevolution owncloud contacts
+ syncevolution owncloud calendar
+
+Et bien ça ne marche pas car syncevolution utilise DBUS et qu'en lançant hors
+shell utilisateur, les variables d'environnement *DISPLAY* et
+*DBUS_SESSION_BUS_ADDRESS* ne sont pas initialisées. Il faut donc récupérer ces
+valeurs dans le shell script qu'on va lancer en CRON, merci
+[Alexandre](http://askubuntu.com/questions/611761/syncevolution-in-cronjob-to-sync-the-ubuntu-phone-via-caldav-arddav).
+Donc finalement c'est ce script qu'on va mettre sous CRON :
+
+``` shell
+export DISPLAY=:0.0
+export DBUS_SESSION_BUS_ADDRESS=$(ps -u phablet e | grep -Eo 'dbus-daemon.*address=unix:abstract=/tmp/dbus-[A-Za-z0-9]{10}' | tail -c35)
+syncevolution owncloud contacts
+syncevolution owncloud calendar
+```
+
+Amusant non ? J'ai joué pas mal avec la synchronisation des calendriers et des
+contacts et je peux dire que *syncevolution* tient bien la route. Le dernier
+détail indispensable pour moi, c'était de récupérer ma sonnerie habituelle ; il
+n'y a pas encore la possibilité de télécharger une sonnerie personnalisée.
+Après le chantier de la synchronisation, c'est un jeu d'enfant : il suffit de
+la convertir au format OGG et de la placer dans le répertoire
+*/usr/share/sounds/ubuntu/ringtones/*.
+
+Après une semaine d'utilisation quotidienne, j'ai trouvé le système crédible et
+agréable à utiliser. Qu'ils rajoutent un clavier physique et ce sera le
+meilleur du monde (troll inside !). Ubuntu Touch s'améliore régulièrement. Les
+développeurs se sont imposés un rythme de 6 semaines pour livrer une OTA.
+L'inconnue pour moi c'est comment Canonical espère monétiser son système et
+combien de temps ils réussiront à le pousser sans que ce soit rentable. En tout
+cas techniquement, c'est un petit bijou qui fait du pied aux Unixiens, un bol
+d'air frais quand les systèmes alternatifs au couple Android / IOS jettent
+l'éponge ou déposent le bilan l'un après l'autre.
diff --git a/content/blog/2015/2015-12-21-advanced-virtualbox.md b/content/blog/2015/2015-12-21-advanced-virtualbox.md
new file mode 100755
index 0000000..12072ba
--- /dev/null
+++ b/content/blog/2015/2015-12-21-advanced-virtualbox.md
@@ -0,0 +1,104 @@
+---
+layout: post
+title: Quelques astuces pour VirtualBox
+category: Virtualisation
+tag: planet
+---
+
+VirtualBox est un produit de virtualisation porté par Oracle qui a l'avantage
+d'être multi-plateforme (Ms Windows, OS/X, GNU/Linux) et qui est orienté
+*Desktop*, destiné à s'installer sur une machine de bureau (par opposition à un
+hyperviseur dédié à la virtualisation). Le client cible de VirtualBox c'est
+l'utilisateur lambda qui a besoin de tester occasionnellement une distribution,
+l'utilisateur professionnel de GNU/linux (félicitations tu fais partie des 1%)
+qui a besoin régulièrement d'une machine virtuelle Ms Windows pour certaines
+applications (comme Ms Office), le développeur ou le testeur de logiciel qui
+utilise intensivement la virtualisation pour déployer des environnements de
+test. J'appartiens aux trois catégories. Je ne vais pas détailler la création
+d'une machine virtuelle mais quelques astuces utiles, fruit de mon expérience
+... bon ok de mes galères :-)
+
+Dans le cadre professionnel, j'ai une machine virtuelle Ms Windows qui me sert
+à éditer et créer des documents Office. Pour éviter de dupliquer les documents,
+j'avais créé un partage Samba entre ma machine hôte et la machine virtuelle.
+J'étais fier de moi, cela fonctionnait bien... jusqu'à que j'essaie d'accéder à
+mes documents dans le TGV. La machine virtuelle était configurée en mode pont
+(*bridge*) sur l'interface Ethernet et Ms Windows configuré en IP fixe sur le
+réseau d'entreprise. L'interface Ethernet de la machine hôte étant KO, le
+partage Samba n'était pas accessible par la VM.
+
+Une solution consiste à utiliser la fonctionnalité "Dossiers partagés" de
+VirtualBox. Au niveau de la configuration de la VM, les dossiers partagés
+permettent de créer un partage Ms Windows qui pointe sur un répertoire du hôte
+et qui sera accessible quelle que soit la configuration réseau de l'hôte ou de
+la VM : réseau configuré en mode pont ou en NAT, que le réseau soit accessible
+ou non.
+
+**Configuration des dossiers partagés dans VirtualBox :**
+
+
+
+**Navigation du partage depuis la VM Ms Windows :**
+
+
+
+Quand je déploie des VMs sur mon poste de développement pour des tests, je
+configure le réseau de la machine virtuelle en mode NAT pour ne pas consommer
+d'adresse IP du réseau d'entreprise et je configure le système d'exploitation
+virtualisé (généralement un Linux) en DHCP. Dans cette configuration, c'est
+VirtualBox qui attribue une adresse IP dynamique à la VM sur un réseau NAT
+partagé entre le hôte et ses VMs. Du coup, la VM a accès au hôte, à son réseau
+local du hôte (et même à Internet) mais elle est *invisible* pour les autres
+machines du réseau local. L'avantage de cette configuration c'est qu'elle
+fonctionne si la machine hôte n'a pas de réseau : la machine hôte et la VM
+peuvent toujours communiquer. Pour que le hôte puisse se connecter à un service
+de la VM, il faut configurer la redirection de port avec VirtualBox, c'est à
+dire lier un port local de la machine hôte à un port de la VM. Par exemple, on
+peut définir qu'on veut accéder à la VM en SSH en liant le port 2222 au port 22.
+
+
+
+Ainsi un *ssh -p 2222 user@localhost* se connecte à la VM et on peut copier des
+fichiers par le même biais avec *scp*. La redirection du port Web (80) de la VM
+vers le port 8080 de la machine hôte permet d'accéder à une éventuelle
+application Web de la VM. Cela posera peut-être des soucis car cette application
+ignore le NAT et elle risque de construire des liens vers des ressouces sur le
+port 80 alors qu'on l'attaque sur le port 8080. Un moyen de contourner ce
+problème si l'application n'est pas configurable, consiste à installer un NginX
+sur la machine hôte pour faire office de proxy.
+
+``` nginx
+# Proxy
+
+upstream vbox-vm {
+ server 127.0.0.1:8080;
+}
+
+##
+# Virtual Host Config
+##
+
+server {
+ listen 80 default_server;
+ listen [::]:80 default_server;
+
+ root /var/www/html;
+
+ # Add index.php to the list if you are using PHP
+ index index.html index.htm index.nginx-debian.html;
+
+ server_name _;
+
+ location / {
+ proxy_pass http://vbox-vm;
+ }
+
+}
+```
+
+Ainsi, on peut attaquer le port HTTP de la machine locale et avoir ses requêtes
+redirigées vers le port HTTP de la VM. On n'a plus de changement de port donc
+les liens sont valides.
+
+Ces deux astuces me permettent de travailler avec mes VMs sur mon laptop de
+développement en mode déconnecté. Si vous en avez d'autres je suis preneur :-)
diff --git a/content/blog/2016/2016-01-12-virtualization-tips.md b/content/blog/2016/2016-01-12-virtualization-tips.md
new file mode 100755
index 0000000..a2ab29d
--- /dev/null
+++ b/content/blog/2016/2016-01-12-virtualization-tips.md
@@ -0,0 +1,93 @@
+---
+layout: post
+title: Mon mémo pour la virtualisation
+category: Virtualisation
+tag: planet
+---
+
+Cet article est un mémo de toutes les commandes qui me sont régulièrement
+utiles quand je manipule des machines virtuelles VirtualBox, VMware et KVM.
+L'utilitaire **qemu-img** du paquet qemu-utils (sous Debian) a bien évolué et
+c'est l'outil de prédilection pour les conversions ; on peut se passer de
+l'utilitaire *VBoxManage* (qui fait partie de VirtualBox).
+
+### Convertir une machine virtuelle VirtualBox en KVM
+
+La première approche c'est de créer une VM VirtualBox avec le type de disque
+natif VDI et de convertir le disque au format QCOW2 avec *qemu-img* :
+
+ qemu-img convert -f vdi -O qcow2 vm-disk.vdi vm-disk.qcow2
+
+Mais si la finalité c'est de mettre au point la VM sous VirtualBox avant de
+l'installer sous KVM (dans un Proxmox par exemple), on peut plutôt créer une VM
+VirtualBox directement avec le type de disque QEMU (QCOW) dans VirtualBox.
+
+
+
+Ensuite, il reste à convertir le disque du format QCOW vers QCOW2 :
+
+ qemu-img convert -O qcow2 vm-disk.qcow vm-disk.qcow2
+
+### Convertir un disque VMware en VirtualBox
+
+Le format natif des disques VMware est VMDK. L'utilitaire *VBoxManage* permet
+de convertir un fichier VMDK en VDI.
+
+ VBoxManage clonehd --format VDI vm-disk.vmdk vm-disk.vdi
+
+Mais *qemu-img* reste la voie royale pour faire le même boulôt :
+
+ qemu-img convert -f vmdk -O vdi vm-disk.vmdk vm-disk.vdi
+
+### Convertir une machine virtuelle VMware en KVM
+
+D'abord exporter la machine au format OVF puis convertir le disque avec l'ami *qemu-img* :
+
+ qemu-img convert -f vmdk -O qcow2 vm-disk.vmdk vm-disk.qcow2
+
+Ensuite, on peut créer une VM avec des caractéristiques semblables dans KVM et
+attacher le disque.
+
+### Retaper les interfaces réseau
+
+Lorsque la machine virtuelle a été créée depuis une machine physique par le
+tryptique : clonezilla / restauration virtualbox / conversion KVM, il se peut
+que la configuration logique des interfaces réseaux (*/etc/network/interfaces*
+sous Debian ou */etc/sysconfig/network-scripts/ifcfg-???* sous RedHat / CentOS)
+ne correspondent plus aux interfaces physiques. Dans ce cas il faut adapter la
+configuration UDEV qui s'occupe de réaliser cette correspondance sur la plupart
+des distributions en éditant le fichier
+*/etc/udev/rules.d/70-persistent-net.rules* :
+
+ # This file was automatically generated by the /lib/udev/write_net_rules
+ # program, run by the persistent-net-generator.rules rules file.
+ #
+ # You can modify it, as long as you keep each rule on a single
+ # line, and change only the value of the NAME= key.
+
+ # PCI device 0x8086:0x100e (e1000)
+ SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="32:94:32:76:50:6d", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"
+
+ # PCI device 0x8086:0x100e (e1000)
+ SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="6a:79:37:a3:24:32", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"
+
+ # PCI device 0x8086:0x100e (e1000)
+ SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="fa:a8:8e:cc:fd:69", ATTR{type}=="1", KERNEL=="eth*", NAME="eth2"
+
+ # PCI device 0x8086:0x100e (e1000)
+ SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="ce:1c:8c:c2:fd:f7", ATTR{type}=="1", KERNEL=="eth*", NAME="eth3"
+
+# Compacter un disque
+
+Il ne s'agit pas de modifier la taille du disque virtualisé mais de réduire son encombrement sur le disque hôte par du compactage.
+
+Depuis le système GNU/Linux virtualisé, on nullifie (horrible ce mot) l'espace libre :
+
+ dd if=/dev/zero of=/bigemptyfile bs=4096k
+ rm -rf /bigemptyfile
+
+On stoppe la VM et on utilise *vboxmanage* pour compacter le disque :
+
+ vboxmanage modifyhd disk.vdi --compact
+
+Et pour Ms Windows ? je ne sais pas et ça ne m'intéresse pas (*troll inside*)
diff --git a/content/blog/2016/2016-01-25-postfix-relay.md b/content/blog/2016/2016-01-25-postfix-relay.md
new file mode 100755
index 0000000..d77a8e8
--- /dev/null
+++ b/content/blog/2016/2016-01-25-postfix-relay.md
@@ -0,0 +1,45 @@
+---
+layout: post
+title: SMTP Relay avec Postfix
+category: GNU/Linux
+tag: planet
+---
+
+On trouve de l'information sur le relais SMTP avec Postfix un peu partout mais
+pas toujours adapté à son cas. Voici donc mon mémo, compilé à partir de
+plusieurs sources, pour utiliser Postfix comme relais SMTP avec le fournisseur
+Orange (sur le port 25 et authentifié en clair par un nom d'utilisateur et un
+mot de passe).
+
+Ajouter dans **/etc/postfix/main.cf** :
+
+ # SMTP relay
+ relayhost = smtp.orange.fr
+
+ smtpd_sasl_auth_enable = yes
+ smtp_sasl_security_options = noanonymous
+ smtp_sasl_tls_security_options = noanonymous
+
+ smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
+ sender_canonical_maps = hash:/etc/postfix/sender_canonical
+
+Créer un fichier pour définir l'authentification SMTP : **/etc/postfix/sasl_passwd**
+
+ smtp.orange.fr [utilisateur]:[mot de passe]
+
+Créer un fichier pour définir le *mapping* des expéditeurs : **/etc/postfix/sender_canonical**
+
+ root [adresse expéditeur]
+
+Ensuite il rester à créer une version *hash* des fichiers *sasl_passwd* et
+*sender_canonical* et à relancer Postfix :
+
+ $ postmap hash:/etc/postix/sasl_passwd
+ $ postmap hash:/etc/postfix/sender_canonical
+ $ /etc/init.d/postfix restart
+
+On peut tester l'envoi d'un e-mail et vérifier dans le log **/var/log/mail.log** que l'envoi se passe bien :
+
+ $ mail -s "Test depuis Postfix" [someone@somewhere.com]
+ is it working?
+ I hope so^D
diff --git a/content/blog/2016/2016-02-11-multiboot-usb.md b/content/blog/2016/2016-02-11-multiboot-usb.md
new file mode 100755
index 0000000..11a017f
--- /dev/null
+++ b/content/blog/2016/2016-02-11-multiboot-usb.md
@@ -0,0 +1,114 @@
+---
+layout: post
+title: Construire sa clef USB multiboot
+category: GNU/Linux
+tag: planet
+---
+
+J'ai essayé quantité d'utilitaires pour créer facilement une clef USB multiboot
+et aucun ne fonctionne correctement sur des serveurs racks (du type Dell
+PowerEdge). Ces utilitaires ont en commun d'utiliser syslinux et de proposer
+une interface graphique conviviale pour glisser-déposer des ISO sur la clef. Je
+ne suis pas (encore) expert en partitionnement et boot mais je m'y intéresse
+beaucoup en ce moment par la force des choses et on voit beaucoup de subtilités
+pour booter sur du GPT au lieu de MBR. A force de chercher le bon utilitaire,
+je suis tombé sur de la doc Archlinux (et oui encore) qui propose de créer
+soi-même sa clef avec **GRUB** au lieu de **syslinux**. Cela veut dire qu'on ne
+peut démarrer que des GNU/Linux et pas des utilitaires DOS (comme il y en a
+quantité pour tester les disques ou la mémoire), c'est parfait, c'est la seule
+chose que je fais. Cette documentation ArchLinux [est accessible à cette
+adresse](https://wiki.archlinux.org/index.php/Multiboot_USB_drive).
+
+Cet article est donc surtout un mémo pour moi même qui reprend les parties de
+cette doc pertinentes pour mon cas d'usage J'ai besoin d'avoir le live CD de
+CloneZilla et Knoppix ainsi que le DVD d'installation de CentOS 7 et Debian 8.
+Je suis parti d'une clef de 16 Go sur laquelle j'ai une table de partition GPT
+et une partition unique formatée en EXT2. J'avais commencé avec une partition en
+FAT32 mais on ne peut pas copier un fichier de plus de 2Go. Hors dans notre
+cas, on va copier les ISO sur la clef et laisser GRUB les monter pour y
+accéder. C'est différent des solutions basées sur syslinux où l'ISO est
+désarchivée sur la clef dans un répertoire Bref une ISO DVD d'installation de
+CentOS pèse 4 Go donc on formate en EXT.
+
+Voici ma table de partition :
+
+ $ fdisk -l /dev/sdf
+
+ Disque /dev/sdf : 14,5 GiB, 15504900096 octets, 30283008 secteurs
+ Unités : secteur de 1 × 512 = 512 octets
+ Taille de secteur (logique / physique) : 512 octets / 512 octets
+ taille d'E/S (minimale / optimale) : 512 octets / 512 octets
+ Type d'étiquette de disque : gpt
+ Identifiant de disque : 34793BF6-88B6-4325-98D8-BD79DC297619
+
+ Device Start End Sectors Size Type
+ /dev/sdf1 2048 30282974 30280927 14,4G Linux filesystem
+
+Ensuite, on crée un répertoire pour accueillir GRUB et les ISO :
+
+ $ mount /dev/sdf1 /mnt
+ $ mkdir -p /mnt/boot/iso
+
+Et on installe GRUB :
+
+ grub-install --force --target=i386-pc --recheck --boot-directory=/mnt/boot /dev/sdf
+
+Il reste à copier les ISO dans le répertoire */mnt/boot/iso* et à créer un
+fichier *mnt/boot/grub/grub.cfg*. Tout le problème est de configurer correctement
+GRUB pour monter chaque type de distribution. Pour certaines, il n'y a pas de
+solution pour que ça fonctionne. Le documentation ArchLinux liste la
+configuration GRUB pour un certain nombre de distributions.
+
+Voici ma configuration **/mnt/boot/grub/grub.cfg** pour les distributions installées sur ma clef :
+
+ # path to the partition holding ISO images (using UUID)
+ set imgdevpath="/dev/disk/by-uuid/53ac1278-3d48-4528-a348-2eb3b7b8dc93"
+
+ # define globally (i.e outside any menuentry)
+ insmod search_fs_uuid
+ search --no-floppy --set=isopart --fs-uuid 40c8461c-a5fd-4b3b-9a78-f8e92275ea98
+ # later use inside each menuentry instead
+ loopback loop ($isopart)$isofile
+
+ menuentry "Live clonezilla-live-2.4.2-61-amd64" {
+ set isofile="/boot/iso/clonezilla-live-2.4.2-61-amd64.iso"
+ loopback loop $isofile
+ linux (loop)/live/vmlinuz findiso=$isofile boot=live union=overlay username=user config
+ initrd (loop)/live/initrd.img
+ }
+
+ menuentry "Live clonezilla-live-2.2.2-32-i686-pae" {
+ set isofile="/boot/iso/clonezilla-live-2.2.2-32-i686-pae.iso"
+ loopback loop $isofile
+ linux (loop)/live/vmlinuz boot=live live-config noswap nolocales edd=on nomodeset ocs_live_run=\"ocs-live-general\" ocs_live_extra_param=\"\" ocs_live_keymap=\"\" ocs_live_batch=\"no\" ocs_lang=\"\" GRUB_GFXMODE=1024x768 ip=frommedia nosplash toram=filesystem.squashfs findiso=$isofile
+ initrd (loop)/live/initrd.img
+ }
+
+ menuentry "Live Knoppix_v7.6.1DVD-2016-01-16-EN" {
+ set isofile="/boot/iso/KNOPPIX_V7.6.1DVD-2016-01-16-EN.iso"
+ loopback loop $isofile
+ linux (loop)/boot/isolinux/linux bootfrom=/mnt-iso/$isofile acpi=off keyboard=fr lang=fr
+ initrd (loop)/boot/isolinux/minirt.gz
+ }
+
+ menuentry "Install CentOS-7-x86_64-DVD-1511" {
+ set isofile="/boot/iso/CentOS-7-x86_64-DVD-1511.iso"
+ loopback loop $isofile
+ linux (loop)/isolinux/vmlinuz noeject inst.stage2=hd:UUID=53ac1278-3d48-4528-a348-2eb3b7b8dc93:/$isofile
+ initrd (loop)/isolinux/initrd.img
+ }
+
+ menuentry 'Install Debian-8.3.0-amd64-firmware' {
+ set isofile='/boot/iso/firmware-8.3.0-amd64-netinst.iso'
+ set initrdfile='/boot/iso/debian-8.3.0-am64-initrd.gz'
+ loopback loop $isofile
+ linux (loop)/install.amd/vmlinuz vga=791 iso-scan/ask_second_pass=true iso-scan/filename=$isofile
+ initrd $initrdfile
+ }
+
+Pour trouver l'identifiant UUID de la clef qu'on claque dans la variable
+*imgdevpath* en début de config et qu'on passe à *inst.stage2* dans la section
+CentOS ou l'identifiant de la partition *fs-uuid* qu'on passe à la commande search,
+on utilise la commande **blkid** :
+
+ blkid /dev/sdf1: UUID="53ac1278-3d48-4528-a348-2eb3b7b8dc93" TYPE="ext2" PARTUUID="40c8461c-a5fd-4b3b-9a78-f8e92275ea98"
diff --git a/content/blog/2016/2016-05-08-mon-informatique.md b/content/blog/2016/2016-05-08-mon-informatique.md
new file mode 100755
index 0000000..3ec984b
--- /dev/null
+++ b/content/blog/2016/2016-05-08-mon-informatique.md
@@ -0,0 +1,118 @@
+---
+layout: post
+title: Mon informatique personnelle
+category: Hébergement
+tag: planet
+---
+
+C'est une période de réflexion et de mise en ordre de mon informatique
+personnelle. Après un hiver rigolo à changer de distribution toutes les deux
+semaines sur mon fidèle portable, l'occasion de découvrir quelques distributions
+peu connues et sympathiques comme la [NuTyX](http://nutyx.org), de faire mon
+test annuel de BSD et en conclure que ce n'est pas (encore) pour moi ou que je
+n'aime toujours pas KDE, avant de revenir à ma distribution de départ : une
+Debian Jessie avec Mate Desktop, l'environnement de bureau qui progressivement
+uniformise l'ensemble de mes machines. J'ai longtemps utilisé XFCE, que
+j'apprécie toujours, mais je trouve un charme *old school* inimitable à Mate
+Desktop qui me rappelle ma jeunesse ;-) Fini donc le yoyo des distributions pour
+quelques temps, il est temps de se servir de sa bécane au lieu de la
+réinstaller.
+
+Le sujet de réflexion du moment, c'est **la sécurité des données**. C'est loin
+d'être une obsession pour moi mais il y a un minimum à faire pour ne pas se
+trouver démuni quand le pépin arrivera (et il arrivera forcément). J'ai donc
+recensé mes données sensibles et importantes. Je me rends compte que je
+trimballe pas mal de données sensibles sur mon portable, notamment ma base de
+données [KeepassX](https://www.keepassx.org) qui conserve mes identifiants de la
+quantité de sites Web que je fréquente. Mon portable fait des sauvegardes vers
+la seule machine fixe de la maison, un iMac de 2007 (pas de troll merci) et je
+fais régulièrement un clone de cette machine sur un disque dur externe. L'iMac
+conserve aussi les photos familiales, on arrive à 60 Go de photos. Ce sont les
+données importantes à ne surtout pas perdre. J'ai donc une sauvegarde de tout ça
+en local mais pas de sauvegarde sur un autre site. En cas de gros pépin
+(cambriolage, incendie), j'ai tout faux :-(
+
+Pour protéger mes données sensibles en déplacement, j'ai opté pour le
+chiffrement du disque dur à la réinstallation de ma Debian et j'ai mis en place
+des certificats Let's Encrypt pour mon installation d'Owncloud et mon WebMail
+Roundcube.
+
+Pour sauvegarder mes données à l'extérieur, j'ai d'abord envisagé un serveur
+plus gros que celui qui héberge mon blog et mon cloud actuellement et une
+solution simple basée sur Rsync. Le prix de l'espace disque m'a un peu refroidi
+et je me suis intéressé aux solutions de stockage pur pour retenir Hubic qui,
+sur le papier, a beaucoup d'atouts (oui ça va se gâter si vous êtes des fans OVH
+qui ne supportent pas la critique de leurs idôles, sautez les paragraphes qui
+suivent) :
+
+* la réputation de l'hébergeur OVH
+* un stockage sur des serveurs localisés en France
+* un stockage triplé sur trois serveurs différents
+* un coût qui écrase toute concurrence : 1 euros les 100 Go par mois
+
+J'avais testé Hubic lors de sa sortie avec l'offre de 25 Go offerts, c'était en
+bêta test, il y avait beaucoup de soucis et tout a été refait techniquement
+depuis, je me suis dit banco et j'ai souscrit pour une année. Dommage !
+
+J'ai d'abord sorti mes photos du *silo* iPhoto de MacOS pour les stocker de
+manière standard : un répertoire par année, puis un répertoire combinant la date
+et le nom de l'évènement. Pour cela, je remercie [Brian et sa moulinette
+magique](https://github.com/BMorearty/exportiphoto). J'ai posé les photos dans
+mon répertoire synchronisé avec Hubic et j'ai regardé tourner la machine une
+semaine. Ca n'est pas choquant, j'ai une ligne ADSL avec un upload moyen et j'ai
+limité Hubic pour ne pas utiliser toute la bande passante. En parallèle je me
+suis intéressé à sortir de iPhoto en installant la gallerie Web Piwigo sur ma
+vieille version de MacOs (Snow Leopard). Je passerais rapidement sur mes galères
+avec le monde de la pomme : installer MacPorts pour pouvoir juste installer Git,
+installer HomeBrew et virer MacPort pour éviter les conflits, trouver une
+version de Xcode d'époque et finalement installer une stack MNMP (MacOS / NginX,
+MySQL, PHP) opérationnelle, puis finalement Piwigo.
+
+Ah Piwigo c'est pas mal ! De belles galeries en mode Web, une gestion des droits
+utilisateurs, une gestion de l'unicode parfaite (???) Enfin parfaite... sans
+bug en tout cas, car inexistante ce qui gomme tout problème d'intéropérabilité,
+les accents ne sont pas supportés dans les noms de fichiers, ni les espaces
+juste le classique *A-Za-z0-9_-*. C'est probablement un choix rationnel pour une
+galerie destinée à héberger des photos sur le Web mais sur le coup ça ne m'a
+pas arrangé. J'ai regardé mes photos juste synchronisées sur Hubic et j'ai
+commencé une moulinette pour détecter les caractères interdits. Rien de trop
+méchant au final, 98% des fichiers sont déjà corrects, par contre 95% des
+répertoires ont des accents ou des espaces. Dans la lancée j'ai fait une
+moulinette *crade* pour renommer mes répertoires. C'est là que j'ai vu la 1ère
+faille d'Hubic qui a commencer à supprimer les fichiers pour repousser les mêmes
+fichiers dans un répertoire avec un nom différent. En gros, chez Hubic, il n'y a
+pas de somme de contrôle pour détecter qu'un fichier a juste changé de nom ou
+que le répertoire a changé de nom. Pire que cela, la suppression est
+désespérement longue : c'est le désavantage de la fameuse triple redondance, on
+attend la confirmation de suppression des données sur les trois data centers. A
+ce stade, j'ai trouvé malin de stopper le client de synchronisation, de virer
+mes photos localement et de passer par l'interface Web Hubic pour supprimer les
+données, pensant que ça serait plus rapide. Erreur, cela a pris environ 8
+heures.
+
+Ne me laissant pas décourager, j'ai regénéré un répertoire propre avec mes
+photos bien formatées [en forkant la moulinette de
+Brian](https://github.com/kianby/exportiphoto) pour rajouter une option et je
+suis reparti pour une petite semaine de synchronisation avec Hubic. Ca s'est
+bien passé, j'ai un serveur Piwigo local accessible par Wifi dans la maison.
+Mais deux choses m'ont gratté :
+
+* parfois le client Hubic télécharge à nouveau des photos (alors qu'il possède
+ la version de référence des données)
+* la taille occupée par mes données sur l'interface d'administration Hubic ne
+ correspond pas à ce que je compte sur mon disque.
+
+Du coup, je me suis mis à douter de l'intégrité de mes données. J'ai souscrit un
+mois d'hébergement pour un serveur avec 100 Go de disque et j'ai installé une
+Debian et le client Hubic pour Linux. J'ai commencé à rapatrier mes données sur
+ce serveur. A mon grand étonnement, le téléchargement n'est guère plus plus
+rapide que l'envoi, des débits entre 50 et 250 Ko/s. Le rapatriement des données
+a pris 4 jours. En grand parano, j'ai fait un checksum MD5 de l'ensemble des
+fichiers et j'ai comparé avec ma référence sur l'iMac. Et bien ça correspond,
+Hubic fonctionne (les fans OVH, vous pouvez revenir).
+
+Au final, je vais changer de solution de sauvegarde à cause du manque de
+confiance que j'ai acquis en deux semaines de test et des faibles performance
+en téléchargement. Je m'oriente donc vers une solution classique avec un serveur
+hébergé et du probablement du rsync et je cherche la perle rare dans les tarifs
+que je m'impose, mais c'est une autre histoire.
diff --git a/content/blog/2016/2016-06-18-histoire-herbergement.md b/content/blog/2016/2016-06-18-histoire-herbergement.md
new file mode 100755
index 0000000..19daced
--- /dev/null
+++ b/content/blog/2016/2016-06-18-histoire-herbergement.md
@@ -0,0 +1,98 @@
+---
+layout: post
+title: Histoire d'hébergement
+category: Hébergement
+tag: planet
+---
+
+Dans la continuité de [mon article
+précédent](http://blogduyax.madyanne.fr/mon-informatique-personnelle.html) je
+continue à mettre de l'ordre dans mon informatique. Après le renoncement de
+confier à Hubic mes 70 Go de photos familiales j'ai recherché une solution
+classique : un hébergement de serveur avec suffisamment d'espace disque qui
+puisse à la fois accueillir mes photos (synchronisées en *rsync*) et mes
+services (blog, cloud) pour ne pas exploser ma facture d'hébergement.
+
+L'hébergement c'est une belle jungle avec :
+
+* des poids lourds : quelques gros hébergeurs qui possèdent leur infrastructure
+ système et réseau (OVH et Online par exemple).
+* des grossistes : des hébergeurs qui louent en volume chez les gros hébergeurs
+ et qui façonnent des offres commerciales un peu différentes, un peu
+ l'équivalent des MVNO dans le domaine de la téléphonie
+* des petits hébergeurs qui possèdent leur propre infra et essaient de tirer
+ leur épingle du jeu avec des offres différentes (techniquement ou commercialement)
+
+Tout d'abord il n'y a pas d'hébergeur miracle qui possède la meilleure offre du
+marché. En fonction du type d'hébergement (serveur physique ou virtuel) et de
+la gamme, on va trouver des offres plus intéressantes chez l'un ou chez
+l'autre.
+
+Moi je cherchais un serveur virtuel VPS (pour sa flexibilité et son faible taux
+de pannel) avec une assurance de sauvegarde des données (snapshot ou espace
+FTP) pour rapidement tout restaurer en cas de panne. J'ai écarté les
+grossistes, ça ne m'intéresse pas d'avoir un hébergeur qui dépend d'un autre
+pour résoudre les incidents techniques. J'ai d'abord exploré le monde des
+petits hébergeurs où on trouve quelques perles (des hébergeurs à fond sur le
+Green IT) et des gens qui ne tiennent pas la route malgré un site Web
+alléchant.
+
+Après deux expériences foireuses chez des petits hébergeurs, j'ai failli opter
+pour une Dedibox de Online : du serveur physique à un prix plancher ; le pendant
+chez OVH est la gamme Kimsufi. Du serveur physique, pas très cher donc, mais
+avec souvent un service minimum (pas de RAID, pas de sauvegarde). Dedibox
+propose 100 Go de FTP et ça me semblait pas mal, sans surprise. je connais
+l'offre à titre professionnel : le taux de dispo est impressionnant et la bande
+passante très bonne. Seul hic, c'est un peu en dessus de mon buget de 9 euros HT
+par rapport aux 8 euros TTC d'aujourd'hui chez FirstHeberg. Par contre, avec une
+Dedibox j'avais un gros disque de 1 To.
+
+J'allais me lancer quand j'ai aperçu les offres Scaleway sur le site Online.
+C'est quoi [Scaleway](https://www.scaleway.com) ? C'est une filiale de Online
+avec un positionnement **Cloud**. Le problème du terme Cloud, c'est qu'on l'a
+tellement usé et absusé (hein les marketeux) qu'on ne sait plus de quoi on parle
+là. Scaleway se positionne sur le créneau de Amazon AWS et de Google App Engine
+avec une offre tarifée à l'heure qui permet de faire du pilotage / de
+l'orchestration pour par exemple automatiser des déploiements de nouveaux
+serveurs dans le cadre d'une intégration continue d'un logiciel en cours de
+développement, ou démarrer une grappe de serveurs supplémentaire pour absorber
+une charge Web dans le cas d'un architecture balancée. Pour cela, ils proposent
+des API et un matériel original puisqu'il s'agit d'un serveur physique peu
+performant basé sur une architecture ARM. Je parle ici du serveur C1, leur
+premier modèle. L'offre est originale car ce genre d'orchestration se fait
+généralement sur du virtuel pour sa souplesse à stopper, démarrer, reconfigurer
+des VMs et eux proposent un micro serveur qui ne consomme pas grand chose avec
+l'argument que sur du physique il n'y a pas d'inconnu sur la performance comparé
+au virtuel où votre voisin (que vous ne connaissez pas) a mangé la CPU de
+l'hyperviseur. C'est donc un peu comme si on avait un Raspberry chez un
+hébergeur avec une grosse bande passante. Ils arrivent à mettre plus de 900
+serveurs dans un rack 1U. Le côté *green IT* m'a séduit.
+
+Et l'espace disque ? C'est l'autre grosse particularité de l'offre. L'espace
+disque est attribué par tranche de 50 Go (1 euros la tranche) et géré
+dynamiquement puisque la vocation du Scaleway est d'offir la même souplesse que
+les VPS : stopper, déplacer, redéployer... Donc en fait, les données sont
+centralisées (dans un gros NAS). Et au démarrage d'un serveur,
+elles sont rapatriées pour être attachées au boot. Quand le serveur est stoppé,
+elles sont réécrites dans le central. Pour quelques centimes, on peut conserver
+un snapshot de notre disque.
+
+Ce qui m'a plus dans cette offre ce sont les points suivants :
+
+* un hébergement physique
+* la flexibilité de rajouter ou d'enlever des volumes disques
+* une architecture ARM : performances modestes faible consommation électrique
+
+Est-ce que c'est une offre adaptée à un hébergement classique ? Clairement, ce
+n'est pas la cible et le Scaleway n'a pas été conçu pour héberger un blog et
+quelques services Cloud mais il peut le faire avec un bémol sur l'arrêt /
+relance du serveur : le temps de rapatriement des données vers l'espace central
+est très long. Surtout qu'aux 50 Go de base, j'ai souscrit un volume
+supplémentaire de 100 Go pour stocker mes fameuses photos. J'ai tout stoppé pour
+réaliser un snapshot du disque système (pas de snapshot à chaud) mais on ne
+stoppe pas un serveur régulièrement donc c'est gérable. Autre point à prendre en
+considération : l'architecture ARM est supportée par peu de distributions. Sans
+surprise, j'ai choisi Debian. Tout ajout de logiciel qui ne ferait pas partie du
+système de paquets nécessite une compilation pour la plateforme ARM.
+
+J'ai achevé ma migration vers Scaleway depuis un mois et jusqu'ici tout va bien :-)
diff --git a/content/blog/2016/2016-08-06-un-pas-en-avant.md b/content/blog/2016/2016-08-06-un-pas-en-avant.md
new file mode 100755
index 0000000..aa0001f
--- /dev/null
+++ b/content/blog/2016/2016-08-06-un-pas-en-avant.md
@@ -0,0 +1,69 @@
+---
+layout: post
+title: Un pas en avant, deux pas en arrière
+category: Mobilité
+tag: planet
+---
+
+Entre la fin du système Blackberry 10 qui se profile et une certaine lassitude
+de mon Q5, j'ai eu envie de changer de téléphone et de me faire plaisir : un
+écran plus grand, une bonne autonomie (le point faible des smartphones), un bon
+appareil photo. Comme j'ai une tablette Android depuis presque 2 ans (une belle
+Lenovo Yoga 2 en 8 pouces) je me suis dit pourquoi pas un téléphone Android, je
+ferai comme pour la tablette, privilégier le dépôt F-Droid et ses applications
+libres : OSM, Firefox et consorts. Les rayons des téléphones Android dans les
+magasins ont tendance à me faire sourire ; une suite de briques entre 5'' et
+5''7, des appareils photo entre 13 et 20M pixels. Rien de tripant, la tristesse
+d'un monde uniforme. En plaçant l'autonomie en tête de mes critères avec un
+écran de plus de 5'' j'ai vite réduit la liste, et les occasions des soldes ont
+placé le Samsung A5 sur ma route.
+
+j'ai craqué pour la bête et j'ai apprécié la beauté de l'objet : très bel écran,
+des matières nobles (du vrai aluminium). L'autonomie tient ses promesses pour un
+smartphone de cette taille, 2 bonnes journées en utilisation modérée. J'ai joué
+deux semaines avec, surtout avec les GPS et je me suis rendu compte que je
+m'étais planté, que le téléphone n'est pas adapté à moi, indépendamment de toute
+polémique autour du système d'exploitation **presque libre** : trop lourd et
+trop grand pour une utilisation quotidienne, trop fragile et trop cher aussi ;
+j'avais l'impression de manipuler une poupée de porcelaine.
+
+En terme de services rendus, je reconnais, pour mon cas (désespéré), l'utilité
+de l'appareil photo et du GPS avec un temps de fix extrèmement rapide. Le reste
+je n'en ai pas besoin. En bref, je me suis planté ; je me suis laissé tenter par
+les sirènes de la consommation pour voir si par hasard je ne serais pas l'homme
+du 21ème siècle. Et bien raté, j'ai entendu récemment qu'aussi moderne et à la
+page qu'on puisse être, on appartient à son siècle, celui qui nous a vu naître.
+Sur ce coup là je confirme.
+
+J'ai négocié une reprise de mon appareil par ma moitié (profil bas, pas fier le
+gars) et je suis revenu à mon ancien téléphone, enfin plus exactement à mon
+ancien... ancien téléphone, mon Blackberry Bold 9780 sous BBOS 6. Pour 20 euros,
+j'ai remis une batterie neuve et je suis revenu au meilleur téléphone avec
+clavier physique que j'ai pu avoir ; c'est sur celui ci que je tape cet article
+d'ailleurs.
+
+Alors qu'est-ce qu'on fait avec un téléphone pareil en 2016 ? Et bien beaucoup
+de communication écrite (des textos et des e-mails), des appels (hein des appels
+pour quoi faire), du tethering USB pour partager sa 3G avec son PC en
+déplacement. Ah oui on fait une croix sur la 4G mais pour envoyer des e-mails
+c'est pas très grave. Et c'est comme ca qu'on se retrouve à développer
+[mail2diaspora](https://github.com/kianby/mail2diaspora) pour avoir la
+possibilité de diaspoter sa vie, à chaud, n'importe où.
+
+La synchronisation du calendrier et des contacts je m'en passe : un export des
+contacts de Cozy Cloud fait l'affaire pour l'instant. Pour le calendrier, je
+saisis dans Cozy Cloud et je demande des rappels par e-mails (la fonctionnalité
+qui manquait à Owncloud).
+
+Quoi d'autre ? Je recommence à écouter des podcasts grâce à l'application native
+de Blackberry et des radios Web. Je pars en vacances dans une semaine et je vais
+emmener mon bridge Lumix que je néglige ces dernières années au profit du
+smarphone pour son instantanéité (on l'a dans la poche, on vise et on partage
+avec ses proches). La je vais essayer de faire de la belle photo en prenant le
+temps
+
+Dans un an et des brouettes, on aura plus d'antennes 4G qu'autre chose et je
+n'aurais proablement plus de réception dans certaines zones, il sera temps de se
+poser la question du changement.
+
+
diff --git a/content/blog/2016/2016-10-31-peu-de-neuf.md b/content/blog/2016/2016-10-31-peu-de-neuf.md
new file mode 100755
index 0000000..d94fdb9
--- /dev/null
+++ b/content/blog/2016/2016-10-31-peu-de-neuf.md
@@ -0,0 +1,54 @@
+---
+layout: post
+title: Peu de neuf
+category: Hébergement
+tag: planet
+---
+
+Déjà Halloween ! Le temps à filé depuis mon dernier article sur ce blog. J’écris
+surtout des articles techniques à propos d’expérimentations système ou de
+projets personnels en programmation. Et visiblement je suis plus fainéant depuis
+le printemps dernier. Une autre excuse est que mon activité sur le réseau social
+Diaspora, par mon compte sur [Framasphère](https://framasphere.org) (déjà 2 ans,
+merci encore Framasoft) est devenue plus régulière, mais pas encore chronophage.
+Parfois je balance une idée et un lien et cela aurait pu donner un vrai article
+sur le blog avec un peu d’effort. C’est le plaisir de l’instantanéité qui
+l’emporte sur la réflexion et le labeur. Et puis il y a aussi l’impression que
+beaucoup de sujets sont déjà traités, des nouvelles plumes apparaissent dans le
+flux du Planet, et c’est très bien.
+
+De fait, je n’ai pas fait grand-chose de nouveau depuis le printemps.
+
+J’ai tâté un peu de la gestion de conteneur LCX dans Debian et caressé l’idée de
+cloisonner mes services hébergés. Mais rien n’est décidé pour l’instant. N’ayant
+pas encore eu d’occasion d’expérimenter Docker professionnellement, je l’ai
+aussi envisagé comme une opportunité de casser l’installation monolithique de
+mon serveur et de tout repenser en services éclatés dans des conteneurs légers.
+L’idée fait lentement son chemin. Docker c’est tout un univers avec ses outils
+de déploiement, de supervision, d’orchestration, [sûrement pas un outil
+parfait](https://blog.imirhil.fr/2016/10/09/docker-container-hell.html), mais il
+est sûr que la conteneurisation succède à la virtualisation, comme elle-même
+s’est imposée, sans équivoque, en son temps.
+
+Ah, j’ai enfin installé une instance de Wallabag sur ma stack NginX / PHP /
+MySQL, la moindre des choses après avoir profité plus d’un an du service
+Framabag.
+
+Et, surtout, j’ai repris la main sur mes e-mails. Depuis ma période
+auto-hébergement un peu chaotique à cause d'une ligne ADSL peu fiable, j’avais
+décidé de ne plus gérer mon propre serveur de mail car c’est un service trop
+critique et j’avais laissé Gandi s’en occuper pour moi (c’est inclus avec la
+gestion de mon nom de domaine). Au passage, le service Gandi est impeccable, ça «
+juste marche » :-) Bref, le serveur étant désormais chez un hébergeur avec un
+réseau fiable, j’ai remonté un serveur de mail avec la stack habituelle :
+postfix, dovecot, spamassassin, roundcube. C’est toujours les mêmes outils, la
+difficulté aujourd’hui, c’est d’avoir l’air honnête pour ne pas voir ses e-mails
+refoulés : ce fut l’occasion de [s’intéresser à SPF, DKIM et DMARC](http://www.badsender.com/2014/01/13/delivrabilite-spf-dkim-dmarc) pour
+authentifier ses e-mails.
+
+Voilà, cela commence à faire une belle liste de services hébergés sur mon
+serveur : le blog, son système de gestion des commentaires, les flux RSS (avec
+TT RSS), les fichiers, les contacts et l’agenda synchronisés (grâce à Cozy
+Cloud), et puis les e-mails.
+
+Bon je vous laisse, on vient de sonner, c’est pour du racket de bonbons :-)
diff --git a/content/blog/2016/2016-12-04-rationalisation.md b/content/blog/2016/2016-12-04-rationalisation.md
new file mode 100755
index 0000000..ec5dc93
--- /dev/null
+++ b/content/blog/2016/2016-12-04-rationalisation.md
@@ -0,0 +1,48 @@
+---
+layout: post
+title: Rationalisation de mon informatique
+categories: Humeur Debian
+tag: planet
+---
+
+Je continue la rationalisation de mon informatique.
+
+J'avais opté pour un environnement commun à la maison et au bureau : XFCE
+pendant 3 ans et Mate depuis le début de cette année, sans oublier mes outils
+*console* [configurés aux petits oignons](https://github.com/kianby/dotfiles)
+(BASH, TMUX, VIM). Ensuite j'avais éténdu au système d'exploitation en
+remplaçant ma Fedora du bureau par une Debian stable, identique à celle qui
+tourne sur mon fidèle compagnon à la maison, un petit [portable Toshiba
+Portégé](http://www.toshiba.fr/discontinued-products/portege-m800-10d) acquis
+en 2009 et qui a retrouvé la pêche avec un SDD à 30 euros. Mon second portable,
+qui a lui aussi de la bouteille mais beaucoup plus de puissance, un portable
+LDLC de 2011 en Core i7 avec 8Go de RAM faisait tourner ArchLinux depuis 5 ans.
+Ce dernier bastion est tombé, et j'ai installé une Debian Testing (donc une
+quasi Stretch) à la place de Arch ; rien de personnel, cela va dans le sens de
+ma démarche. Avoir une testing me permettra d'anticiper les évolutions sur mes
+environnements stables.
+
+Et le fun dans tout ça me direz-vous ? le test de distribution exotiques ? Pour
+cela on a inventé la virtualisation et j'ai aussi deux petits disques 2''5 que
+je peux installer dans le Toshiba pour évaluer une distribution GNU/Linux
+voire, soyons fou, un BSD en grandeur nature.
+
+Le second dommage collatéral, après Arch, a été Cozy Cloud car je suis revenu à
+Nextcloud ce week-end pour deux raison :
+
+* certains problèmes de synchronisation qui ne seront probablement pas corrigés
+ avant fin 2017, après la grosse refonte du back-end en cours chez Cozy.
+* le manque d'une synchronisation sélective pour ne pas synchroniser certains
+ répertoires sur ma machine du bureau. Pour la même raison (refonte du
+ backend) on peut supposer que le client de synchronisation n'évoluera pas trop
+ les 12 prochains mois
+
+Je suis et je reste un fervent supporter de Cozy Cloud car ils ont une plus
+grande ambition que de fournir une synchronisation de fichiers, de contacts et
+d'agendas. Ils ont une vision d'un produit (ou service) qui crée de la valeur
+grâce à l'Open Data tout en étant respectueux de la vie privée. Pour décoller,
+ils auront besoin d'entreprises et d'hébergeurs. En tant que modeste
+utilisateur en auto-hébergement, je continuerai à évaluer la solution et à
+faire mes remontées à l'équipe mais dans le contexte d'une maquette
+d'évaluation en parallèle. Au jour le jour, il me faut une solution sans
+surprise.
diff --git a/content/blog/2016/2016-12-30-bilan-2016.md b/content/blog/2016/2016-12-30-bilan-2016.md
new file mode 100755
index 0000000..04653e8
--- /dev/null
+++ b/content/blog/2016/2016-12-30-bilan-2016.md
@@ -0,0 +1,87 @@
+---
+layout: post
+title: Mon bilan 2016
+category: Humeur
+tag: planet
+---
+
+C'est le moment du bilan personnel de l'année écoulée. Si je regarde mon compte
+GitHub, je vois peu de code cette année et
+[Mail2Diaspora](https://github.com/kianby/mail2diaspora) est mon seul nouveau
+projet. Si je jette un œil au blog, j'ai réussi à réduire ma production en deçà
+d'un billet mensuel. Pourtant je n'ai pas diminué mon temps passé sur
+l'informatique au sens large. Alors il est vrai que je suis beaucoup plus
+régulier sur Diaspora, ce qui explique en partie la baisse du nombre de
+billets. Il est plus simple de partager un lien technique avec un commentaire
+rapide (mais pertinent hein) que d'élaborer un long article après une
+expérimentation plus poussée. Ma consommation de jeux vidéos a diminué
+elle-aussi et je ne me suis pas encore jeté à corps perdu dans le bricolage ou
+la cuisine. Finalement, en repassant l'année au ralenti, j'ai passé énormément
+de temps à apprendre et me perfectionner dans mon métier de programmeur, dont
+je ne parle pas souvent. Apprendre, c'est une pratique que j'exerce régulièrement depuis
+une dizaine d'années suite à un licenciement où j'avais réalisé être un peu
+largué techniquement : la faute à la routine d'un poste et la fainéantise.
+Depuis cette époque je me tiens informé : langages, méthodes, conception tout
+ce qui touche à mon métier. Je lis beaucoup : de la documentation, des retours
+d'expérience d'experts, et j'expérimente un peu.
+
+J'ai beaucoup joué avec Javascript l'année dernière et la moitié de ce que j'ai
+appris est déjà *has-been*. Mais ce n'est pas grave ; ça n'a pas été inutile
+car cela me servira pour aborder d'autres outils et d'autres Frameworks.
+J'avais aussi suivi une formation sur la programmation fonctionnelle en Scala
+avec l'organisme de cours en ligne Coursera. Il est possible que je ne fasse
+plus jamais de Scala mais l'éclairage sur la programmation fonctionnelle est
+transposable, il ouvre l'esprit sur d'autres façons de penser et de coder.
+
+Et il ne s'agit pas que de langages et de frameworks. On n'est pas largué parce
+qu'on ne connaît pas un langage. Si un recruteur voit les choses de cette
+manière c'est qu'il a une vision limitée du potentiel de la personne, juste
+réduite à des mots clefs dans un CV. Pour voir plus loin, il faut qu'il
+connaisse le métier, pose les bonnes questions et surtout comprenne les
+réponses. Ce n'est pas un tâcle, mais on voit une catégorie de recruteurs
+sortis tout droit d'écoles de commerce qui ne connaissent absolument rien au
+métier et dont le seul talent est finalement de faire correspondre des
+mots-clés dans des annonces avec des mots-clés dans des profils. Quel gâchis
+pour eux et quelle frustation pour les candidats qu'ils approchent...
+
+Au delà des technos, rester en phase avec le métier de développeur c'est
+s'intéresser à tous les aspects, réfléchir verticalement, ne pas rester
+cantonné au code et aux langages : s'intéresser à l'agilité, à la qualité du
+code : un vaste sujet qui va des tests unitaires à l'intégration et au
+déploiement continus et qui amène à aborder des outils comme Jenkins, Docker,
+Sonar. Et puis il y a les bonnes pratiques, mon dada en prenant de l'âge. Faire
+n'est plus suffisant, réaliser selon l'état de l'art dans le domaine est
+beaucoup plus gratifiant. Ces bonnes pratiques sont présentes dans tous les
+domaines. Ce sont les design patterns en programmation, la compréhension des
+concepts et de la philosophie derrière une techno pour l'utiliser dans le bon
+cadre et en tirer la quintessence. Ne pas utiliser la programmation orienté
+objet en JAVA ou utiliser Ansible comme un bête installeur via SSH, c'est
+dommage et c'est passer à côté de la puissance qu'on aurait pu en tirer.
+
+Quand on a étiré ses connaissances dans plusieurs domaines avec cet état
+d'esprit on atteint la satisfaction de l'artisan qui sait choisir l'outil le
+plus approprié pour chaque tâche, on peut prétendre faire de l'architecture
+logicielle : être capable de choisir le bon langage et le bon paradigme de
+programmation pour un projet, les bons frameworks, et mettre en place les
+outils nécessaires à une production de qualité. Le seul hic c'est le temps. Il
+y a tellement de sujets et cela prend déjà tant de temps pour se maintenir dans
+son cœur de métier, qu'il faut obligatoirement sélectionner. Dans mon cas, le
+cœur c'est d'abord le développement avec des solides compétences en JAVA et
+PYTHON, deux écosystèmes qui évoluent en permanence. En parallèle ce sont les
+méthodes et outils transverses, valables pour tout langage : tests,
+intégration, méthodes agiles. Et comme j'ai une fibre système, de par ma
+formation initiale, que j'ai bien fait évoluer depuis 6 ans, je me maintiens
+sur les outils de déploiement, la virtualisation et les conteneurs.
+
+Pour en revenir à l'année écoulée, j'ai mis le paquet sur le langage PYTHON que
+je pratique pourtant depuis 15 ans et sur lequel j'ai décidé de grimper en
+compétence. Remise à niveau sur l'aspect fonctionnel du langage, découverte de
+nouvelles librairies. J'ai aussi appliqué un conseil lu chez
+[Sam](http://sametmax.com) : la lecture de bon code écrit par d'autres. Et
+c'est ainsi que j'ai disséqué le code de quelques librairies standard de
+PYTHON, notamment les collections. Et c'est un très bon conseil, on en tire des
+façons de faire, des conceptions élégantes et cela démystifie le côté un peu
+magique de certaines librairies en regardant sous le capot. C'est un effort que
+je vais continuer en 2017.
+
+Bonnes fêtes de fin d'année à tous.
diff --git a/content/blog/2017/2017-01-29-ne-pas-couper-branche.md b/content/blog/2017/2017-01-29-ne-pas-couper-branche.md
new file mode 100755
index 0000000..9497d4e
--- /dev/null
+++ b/content/blog/2017/2017-01-29-ne-pas-couper-branche.md
@@ -0,0 +1,46 @@
+---
+layout: post
+title: Ne pas couper la branche
+category: Hébergement
+tag: planet
+---
+
+Je continue à héberger mes services personnels sur un serveur Dedibox propulsé
+par une Debian. En 2016, j'ai rajouté deux services : mon instance de
+[Wallbag](https://wallabag.org/fr) et le [serveur de
+mail](http://blogduyax.madyanne.fr/peu-de-neuf.html) du domaine *madyanne.fr* à
+ceux existants : mon lecteur de flux RSS (Tiny Tiny RSS), mon cloud (NextCloud)
+et ce blog. La reprise en main des e-mails a été une très bonne idée, c'est
+formateur et on décide des limites : le nombre de comptes et d'alias, l'espace
+de stockage alloué à chaque compte.
+
+Mais il faut penser qu'en cas de panne du serveur, on n'a plus d'e-mail et
+surtout pas d'alerte à moins d'utiliser un e-mail alternatif. J'utilise mon
+e-mail *@madyanne.fr* pour l'ensemble des services mais il faut faire une
+exception pour Gandi qui gère mes DNS et Online qui héberge mon serveur. Sinon,
+je ne suis pas prêt de recevoir une notification en cas d'interruption de
+service du serveur de mail.
+
+J'aurais pu me servir de mon e-mail Google, qui me sert seulement pour
+accéder au Play Store avec mes équipements Android, mais ses e-mails sont
+récupérés par *madyanne.fr* grâce à Fetchmail. J'ai donc dépoussiéré un vieil
+e-mail Free, inutilisé depuis 15 ans, inconnu des spammeurs et je l'ai ajouté
+comme e-mail d'alerte chez Online et Gandi. En prime, j'ai créé un compte sur
+[Uptime Robot](https://uptimerobot.com) qui vérifie que le blog est accessible
+toutes les 5 minutes et m'envoie une alerte e-mail sur mon compte principal et
+chez Free.
+
+Bon c'est pas mal, je n'ai pas coupé la branche sur laquelle je suis assis : si
+le serveur de mail tombe, j'aurais des alertes... à condition de vérifier
+régulièrement la boite de réception de mon e-mail chez Free. Ca veut dire
+rajouter gérer deux comptes e-mails sur mon téléphone et je n'ai pas envie de
+cette contrainte. L'idéal serait de recevoir un SMS si un e-mail arrive chez
+Free, ce qui doit être exceptionnel car symptomatique de gros problème. Me
+voici donc en quête d'un service gratuit d'envoi de SMS et après diverses
+pérégrinations j'ai fini sur [IFTTT](https://ifttt.com). Bon c'est gratuit donc
+c'est probablement moi le produit et ne sachant pas trop quel est le *business
+model* de IFTTT je ne sais pas encore quelle part de mon âme j'ai bradé Si
+vous avez une alternative pas chère pour cette partie d'envoi de SMS je suis
+intéressé.
+
+
diff --git a/content/blog/2017/2017-02-02-extensions-firefox.md b/content/blog/2017/2017-02-02-extensions-firefox.md
new file mode 100755
index 0000000..e782fce
--- /dev/null
+++ b/content/blog/2017/2017-02-02-extensions-firefox.md
@@ -0,0 +1,55 @@
+---
+layout: post
+title: Mes extensions Firefox en 2017
+category: Mozilla
+tag: planet
+---
+
+2017 est une année charnière pour la Fondation Mozilla qui doit convaincre que
+Firefox reste son fer de lance dans la lutte pour les standards ouverts du Web.
+Certes ils ont commis des erreurs de gouvernance : l'abandon de FirefoxOS qui
+avait déjà une base d'utilisateurs, le rêve de pouvoir mettre un orteil dans le
+domaine des objets connectés face à des sociétés qui en ont fait leur cheval de
+croissance pour les prochaines années. Mais la meute des utilisateurs
+mécontents devrait se calmer, reconnaître ce que Mozilla a apporté au Web et
+soutenir Firefox car ce n'est pas le moment de déserter. Mozilla a besoin de
+sa base d'utilisateurs pour pouvoir financer les évolutions majeures annoncées
+en 2017.
+
+[Trois ans plus
+tard](http://blogduyax.madyanne.fr/mes-extensions-firefox.html), je refais la
+liste des extensions que j'utilise quotidiennement ; pas de révolution mais des
+mises à jour sur les thèmes qui me tiennent à coeur : sécurité de navigation,
+protection de la vie privée. Quand je relis ma liste, je ne vois aucune
+alternative crédible à Firefox.
+
+**Navigation améliorée**
+
+- [uBlock Origin](https://addons.mozilla.org/fr/firefox/addon/ublock-origin/?src=ss) : bloqueur de pub
+- [Wallabag](https://addons.mozilla.org/fr/firefox/addon/wallabag-v2/) : sauvegarde de la page dans Wallabag pour lecture ultérieure
+- [Nimbus](https://addons.mozilla.org/fr/firefox/addon/nimbus-screenshot) : capture d'écran
+- [I Don't care about cookies](https://addons.mozilla.org/fr/firefox/addon/i-dont-care-about-cookies/?src=api) : accepte les bandeaux officiel informant que le site enregistre des cookies
+
+**Sécurité**
+
+- [HTTPS Everywhere](https://www.eff.org/https-everywhere) : forcer l'utilisation de HTTPS au lieu de HTTP.
+- [YesScript](https://addons.mozilla.org/fr/firefox/addon/yesscript/?src=api) : liste noire de blocage JavaScript
+- [Popup Blocker Ultimate](https://addons.mozilla.org/fr/firefox/addon/popup-blocker-ultimate) : blocage des popups
+- [Flagfox](https://addons.mozilla.org/fr/firefox/addon/flagfox/?src=search) : affiche le drapeau du pays où est situé le site Web et procure des outils de vérification
+
+**Protection de la vie privée**
+
+- [Privacy Badger](https://addons.mozilla.org/fr/firefox/addon/privacy-badger17/) : bloquer
+ les mouchards du Web.
+- [Cookies Exterminator](https://addons.mozilla.org/fr/firefox/addon/cookies-exterminator) : suppression des cookies à la fermeture des onglets.
+- [Google Search Link Fix](https://addons.mozilla.org/fr/firefox/addon/google-search-link-fix) : supprime les redirections de lien des pages de résultat de Google
+
+**Développement Web**
+
+- [Wappalyzer](https://wappalyzer.com) : une extension qui dévoile les technologies utilisées par les sites web
+- [SQLite Manager](https://addons.mozilla.org/fr/firefox/addon/sqlite-manager) : gestion de bases de donnée SQLite
+- [Simple Locale Switcher](https://addons.mozilla.org/fr/firefox/addon/simple-locale-switcher) : changement de langue de l'interface utilisateur
+- [Firestorage Plus](https://addons.mozilla.org/fr/firefox/addon/firestorage-plus/?src=search) : inspection du stockage local
+- [Firebreak](https://addons.mozilla.org/fr/firefox/addon/firebreak/?src=search) : trouver le point de rupture dans les *responsive designs*
+- [En-tête HTTP](http://livehttpheaders.mozdev.org) : afficher les en-têtes HTTP
+- [Cookie Manager](https://addons.mozilla.org/en-US/firefox/addon/cookies-manager-plus) : gestion des cookies installés
diff --git a/content/blog/2017/2017-02-10-serveur-svn.md b/content/blog/2017/2017-02-10-serveur-svn.md
new file mode 100755
index 0000000..ae322d1
--- /dev/null
+++ b/content/blog/2017/2017-02-10-serveur-svn.md
@@ -0,0 +1,102 @@
+---
+layout: post
+title: Un serveur SVN en 5 minutes
+category: Développement
+tag: planet
+---
+
+Bien qu'on soit en 2017, on peut avoir besoin d'un gestionnaire de source
+centralisé et Subversion reste une valeur sure. On va donc s'installer un
+serveur SVN sur Debian Jessie en 5 minutes chrono.
+
+D'abord on installe SVN et on crée un répertoire pour les données.
+
+ $ apt-get install subversion
+ $ mkdir -p /srv/svn/repos
+
+Et on initialise un dépôt (aka *repository*) nommé "yaxsoft".
+
+ $ svnadmin create /svn/repos/yaxsoft
+
+On ajoute des droits d'accès simples : un utilisateur en lecture-écriture, pas
+d'accès anonyme.
+
+Editer */srv/svn/repos/yaxsoft/svnserve.conf* :
+
+ [general]
+ password-db = passwd
+ authz-db = authz
+ realm = Yax Repo
+
+Editer */srv/svn/repos/yaxsoft/conf/authz* :
+
+ [groups]
+ dev = yannic
+
+ [/]
+ * =
+ @dev = rw
+
+Editer */srv/svn/repos/yaxsoft/conf/passwd* :
+
+ [users]
+ yannic = mon_mot_de_passe
+
+On crée un répertoire pour les logs :
+
+ $ mkdir -p /var/log/svn
+
+On ajoute un utilisateur UNIX *svn* qui va lancer le serveur et aura les
+permission sur les fichiers de données :
+
+ $ adduser svn --system --disabled-login --no-create-home --group
+ $ chown -R svn:svn /srv/svn /var/log/svn
+
+On crée le fichier avec les paramètres de lancement du service */etc/default/svnserve* :
+
+ DAEMON_ARGS="--daemon --pid-file /srv/svn/svnserve.pid --root /srv/svn/repos --log-file /var/log/svn/svnserve.log"
+
+Enfin, on définit le recyclage des logs avec un fichier */etc/logrotate.d/svn* :
+
+ /var/log/svn/*.log {
+ daily
+ missingok
+ rotate 10
+ compress
+ notifempty
+ create 640 svn svn
+ sharedscripts
+ postrotate
+ if /bin/systemctl status svnserve > /dev/null ; then \
+ /bin/systemctl restart svnserve > /dev/null; \
+ fi;
+ endscript
+ }
+
+Il reste à créer un fichier de lancement pour **systemd** : */etc/systemd/system/svnserve.service* :
+
+ [Unit]
+ Description=Subversion daemon
+ After=syslog.target network.target
+
+ [Service]
+ Type=forking
+ PIDFile=/srv/svn/svnserve.pid
+ EnvironmentFile=/etc/default/svnserve
+ ExecStart=/usr/bin/svnserve $DAEMON_ARGS
+ ExecReload=/bin/kill -s SIGHUP $MAINPID
+ User=svn
+ Group=svn
+ KillMode=process
+ Restart=on-failure
+
+ [Install]
+ WantedBy=multi-user.target
+
+Finalement, on met le service en démarrage automatique et on lance notre serveur SVN :
+
+ $ systemctl daemon-reload
+ $ systemctl enable svnserve
+ $ systemctl start svnserve
+
+Notre SVN est accessible en **svn://mon_serveur/yaxsoft**.
diff --git a/content/blog/2017/2017-02-24-termux-pour-quoi-faire.md b/content/blog/2017/2017-02-24-termux-pour-quoi-faire.md
new file mode 100755
index 0000000..79d0fef
--- /dev/null
+++ b/content/blog/2017/2017-02-24-termux-pour-quoi-faire.md
@@ -0,0 +1,49 @@
+---
+layout: post
+title: Termux pour quoi faire ?
+categories: GNU/Linux Mobilité
+tag: planet
+---
+
+Cascador m'a communiqué son engouement pour [Termux](https://termux.com) à
+travers sa série d'articles [Termux sur
+Android](https://www.blog-libre.org/serie/termux-sur-android). En quelques
+mots, Termux est un terminal pour Android qui émule un environnement Debian et
+permet d'installer certains programmes à travers le gestionnaire de paquets
+**apt**. Point intéressant, cela fonctionne sans avoir *rooté* son appareil
+Android et le projet est plutôt actif avec des mises à jour de paquets
+régulières. La série de Cascador décrit différents scénarios d'utilisation :
+installer un serveur SSH, utiliser des outils console, accéder à des API
+Android.
+
+
J'ai bien mordu, jusqu'à me faire offrir un super clavier
+bluetooth pour Noël (merci frérot).
+
+Le risque était que le coup de coeur retombe ; qu'après avoir
+bien rigolé à installer **vim** et consorts, on s'essoufle à cause des
+limitations techniques (on n'a pas un vrai Linux, le matériel a des
+performances limitées) ou du manque d'utilité. Et bien, après 3 mois
+d'utilisation, je peux témoigner que ce n'est pas mon cas. J'ai deux cas
+d'usages récurrents (en plus de faire le malin) sur ma tablette.
+
+Premier usage : j'ai un Linux dans la poche (enfin dans le sac à dos) qui me
+permet d'accéder à mes serveurs hébergés. Termux va plus loin qu'un simple
+client SSH car je peux rapatrier et transférer des fichiers, j'ai des outils de
+base de Linux (curl, wget). La tablette est Wifi et je peux monter un Hotspot
+Wifi avec mon téléphone donc je peux faire le pompier de n'importe où.
+
+Seconde utilisation : j'ai installé tout ce qu'il faut pour écrire mes articles
+de blog. C'était un peu prédestiné à vrai dire : ayant un blog statique dans
+lequel j'écris mes articles en
+[Markdown](https://daringfireball.net/projects/markdown), j'ai besoin d'outils
+*console* uniquement : **vim** pour écrire et **python** pour générer le blog
+en HTML. Du coup en local je peux écrire et vérifier ma production. Et avec une
+connexion Internet, je publie l'article grâce à **git**.
+
+Termux est une application publiée sur le Play Store et sur F-Droid, sous
+licence GPL, qui vaut le coup d'être testée. Et en fonction de vos besoin, vous
+pourriez bien y trouver un intérêt sur le long terme.
+
+
+
diff --git a/content/blog/2017/2017-02-27-gnu-systemlinuxd-gnomeos.md b/content/blog/2017/2017-02-27-gnu-systemlinuxd-gnomeos.md
new file mode 100755
index 0000000..401af7b
--- /dev/null
+++ b/content/blog/2017/2017-02-27-gnu-systemlinuxd-gnomeos.md
@@ -0,0 +1,104 @@
+---
+layout: post
+title: De GNU/Linux à gnuSystemlinuxdGnomeOs
+categories: GNU/Linux BSD Humeur
+---
+
+Cet article n'est pas un réquisitoire contre **systemd** mais l'argumentaire de
+mon positionnement qui me situe quelque part entre les deux positions
+régulièrement entendues :
+
+- systemd c'est tout pourri, la preuve regardez ce bug
+- systemd c'est le progrès inévitable et en plus ça ne change rien pour l'utilisateur final
+
+J'ai vécu en première ligne l'arrivée de systemd dans nos distributions et,
+professionnellement, l'impact a été la nouvelle manière de décrire des
+services. C'est simple et standard entre les distributions qui ont basculé sur
+systemd soit presque l'intégralité des distributions *mainstream* en 5 ans :
+Redhat / Centos / Fedora bien sûr puisque le projet est dirigé par Lennart
+Poettering, un employé de Redhat, Ubuntu et... Debian qui a dérogé à sa ligne
+de conduite d'intégrer des outils mâtures et stables et a misé sur systemd,
+probablement trop tôt, et s'est mis en conflit avec une partie de ses
+contributeurs qui ont pris la porte et démarré le projet
+[Devuan](https://devuan.org/fr/). Je ne vais pas m'étendre car c'est polémique
+mais il y a une pression de l'équipe systemd, depuis sa création, pour forcer
+son adoption rapide par les distributions ce qui a fortement contribué à son
+image de [boatware](https://fr.wikipedia.org/wiki/Bloatware) truffé de bugs.
+
+Bon ok, mais c'est quoi le but de systemd ? Au début, je pensais que ça se
+cantonnait à un nouveau système d'init plus rapide et standardisé. Après des
+discussions avec mon double Linuxien à moustache et diverses lectures il
+ressort que plus rapide (car systemd est parallèlisé) est un argument léger :
+sur un serveur on s'en cogne, et les 1% d'utilisateurs de Linux Desktop ne
+verront aucune différence avec un SSD à 30 balles. Par contre, ce parallélisme
+cause un manque de prédictabilité de l'ordre de démarrage et pose des problèmes
+aux gens qui font de l'embarqué avec Linux (et là on ne parle pas de 1%
+d'utilisateurs mais du gigantesque marché de l'IoT et du M2M).
+
+Bon, mais alors c'est quoi le but de systemd ? Il semble que ce soit la
+fourniture d'API pour faire papa / maman afin que l'environnement de bureau
+Gnome sur lequel à misé Redhat puisse devenir plus qu'un simple environnement
+de bureau mais une expérience utilisateur disruptive par une intégration
+poussée avec son système d'exploitation (pensez à un pingouin qui court sur une
+banquise en train de se réchauffer). Bref, Gnome veut devenir le nouveau
+MacOS/X pour atteindre... 2% du marché des PC de bureau... à une époque où le
+PC ne se vend plus. Bon j'ironise mais je comprends l'objectif de l'équipe
+Gnome qui a envie de passer à la vitesse supérieure et qui est le seul DE en
+position de le faire aujourd'hui. Donc cette élaboration d'une API standard
+entre les distributions serait la justification aux modules engrangés par
+systemd: gérer les points de montage, remplacer CRON, résoudre le DNS [avec
+brio](https://www.blog-libre.org/2017/04/20/essuyer-les-platres-dns-sur-ubuntu).
+
+En tirant une ligne vers l'horizon et en fermant un oeil, on voit la finalité :
+Linux, Systemd, Wayland, Gnome => un Linux Desktop OS avec un niveau de
+finition et une accessibilité au même niveau qu'un Mac OS/X, un Windows 10 ou
+un Android. Avec le soutien de Redhat, je ne doute pas qu'ils vont réussir :
+systemd va se stabiliser et se fiabiliser. Pour quel marché, c'est moins
+clair...
+
+Ce qui me gêne, moi, c'est la mise en terre de la philosophie UNIX. Ca ne
+semble pas parler beaucoup aux utilisateurs enthousiastes (ou résignés) de
+systemd. C'est peut-être une différence de culture ou de génération. La planète
+linuxienne est enthousiaste sur son système, beaucoup sont même concernés par
+la liberté à travers les licenses. Moi j'ai connu UNIX avant de connaître
+Linux. J'ai adoré les cours de mon vieux professeur en salopette qui les mains
+dans les poches nous faisait revivre la naissance d'Internet à travers les
+différents protocoles basés sur TCP/IP et le fonctionnement interne d'un
+système UNIX. J'ai connu les UNIX propriétaires (Solaris, HP/UX, AIX) et j'ai
+adoré sa philosophie :
+
+- KISS : Keep It Simple Stupid
+- un outil => une tâche
+- des mécanismes éprouvés pour faire travailler ces outils ensembles (comme les |)
+- le format texte privilégié en toute circonstance sur le binaire
+
+Quand Linux est arrivé, j'ai bien sûr apprécié de pouvoir installer un UNIX sur
+un PC personnel mais c'est aussi le GNU et la GPL qui m'ont séduit, la notion
+de partage et de retour des contributions à la communauté. J'admire le noyau
+Linux pour ce qu'il est devenu en l'espace de 20 ans, en terme de performance,
+de fiabilité et de support du matériel. Mais c'est juste un kernel ; ce qui
+compte aussi énormément c'est la GPL et la philosophie UNIX du système complet.
+
+Systemd est une anti-thèse à la philosophie UNIX : un init binaire, des logs
+binaires, une construction théoriquement modulaire mais avec tellement de
+dépendances qu'il s'impose comme indispensable, une réinvention de la roue en
+permanence. Il est plausible que systemd s'invite dans le kernel Linux dans
+quelque temps. Et le résultat sera sûrement appétissant à l'oeil pour le Linux
+de bureau et il simplifiera la vie de certains administrateurs systèmes. Ceux qui
+envient leurs collègues certifiés Microsoft apprécieront même.
+
+Mais Linux ne sera plus un système UNIX... Et si je veux utiliser un UNIX-Like
+j'ai Android, et bientôt Windows 10 vu la vitesse du rapprochement de Microsoft
+avec Canonical.
+
+Donc si je veux utiliser un système UNIX, il me reste :
+
+- les BSD qui, paradoxalement, alors qu'ils sont issus des UNIX propriétaires, apparaîssent aujourd'hui comme les dépositaires de la foi (euh philosophie)
+- quelques rares distributions GNU/Linux qui aiment UNIX (comme Gentoo ou Slackware par exemple). Non ce n'est pas de la vaine résistance. Linux ce n'est pas juste un kernel et des programmes GNU. Il y a autre chose à préserver.
+
+J'ai donc décidé de n'utiliser plus que des systèmes qui respectent ces
+critères. Ca n'empêchera pas la terre de tourner et *gnuSystemlinuxdGnomeOs* de
+voir le jour et occuper sa place mais, comme pour le 7 mai prochain, c'est à
+chacun de se positionner en son âme et conscience.
+
+Moi j'ai choisi UNIX.
diff --git a/content/blog/2017/2017-06-05-lavie-lamour-lesvaches.md b/content/blog/2017/2017-06-05-lavie-lamour-lesvaches.md
new file mode 100755
index 0000000..6d8ef7e
--- /dev/null
+++ b/content/blog/2017/2017-06-05-lavie-lamour-lesvaches.md
@@ -0,0 +1,23 @@
+---
+layout: post
+title: La vie, l'amour, les vaches
+category: Humeur
+tag: planet
+---
+
+C'est une année de recentrage, dans la lignée de 2016, où la vie numérique
+prend un peu moins de place. Ce n'est pas planifié, c'est arrivé un peu comme
+ça, un peu provoqué par les événements : deux changements professionnels en 6
+mois, beaucoup de réflexion sur la vie, des week-ends plus orientés *bricolage*
+que geekerie... c'est peut-être un effet de bord de la quarantaine, ce qui m'a
+inspiré le titre de cet article, en référence au film avec Billy Crystal de
+1991.
+
+Bref, je continue à suivre l'actualité "Admin sys" par hobby et l'actualité du
+développement par passion pour mon métier. Je suis l'actualité Linux en
+filigrane, je m'arrête souvent au titre pour les articles du style "la distrib
+Zorglub, fork de (Debian|Ubuntu) est sortie". Je préfère de loin les articles
+sur l'auto-hebergement, la protection de la vie privée ou le DIY et je lis tout
+ce que je trouve sur BSD.
+
+
diff --git a/content/blog/2017/2017-06-18-sublime-vs-atom.md b/content/blog/2017/2017-06-18-sublime-vs-atom.md
new file mode 100755
index 0000000..68ec9db
--- /dev/null
+++ b/content/blog/2017/2017-06-18-sublime-vs-atom.md
@@ -0,0 +1,69 @@
+---
+layout: post
+title: Sublime Text vs Atom
+category: Développement
+tag: planet
+---
+
+Je suis un utilisateur intermédiaire de VIM. Je connais les commandes de base
+et certaines plus avancées, j'utilise quelques plug-ins et je suis friand des
+articles du style *"10 tips for VIM power users"*. J'installe Vim sur tous mes
+systèmes et c'est mon éditeur favori en mode console, généralement pour des
+connexions distantes SSH sur des serveurs. Pour progresser plus, et *level-up
+comme disent les jeunes*, il faudrait pratiquer quotidiennement et l'utiliser
+comme IDE, ce qu'il peut être pour les langages du Web et beaucoup d'autres.
+Mais je ne suis pas aussi engagé et j'aime bien utiliser un éditeur de texte
+avancé plus classique (comprenez avec pilotage à la souris, des onglets et une
+barre de menu), en complément de Eclipse, mon IDE pour Java. Depuis quelques
+années, cet éditeur c'est [Sublime Text](https://www.sublimetext.com) dans sa
+version 3 et je n'ai rien à redire. Sublime est élégant, performant et il a
+amené des fonctionnalités puissantes, qu'on peut retrouver dans VIM avec les
+bons plugins, mais dans un éditeur graphique et convivial : l'extensibilité des
+fonctions (plug-ins), des thèmes, la minimap sur la droite de l'éditeur, la
+fonction *goto anything*.
+
+Ceci dit, je regarde ce qui sort regulièrement, et depuis 2 ans, je teste
+régulièrement [Atom](https://atom.io), l'éditeur conçu par GitHub. Ce qui me
+plait dans Atom, c'est que l'équipe GitHub a développé l'outil pour le
+développement dont ils avaient besoin, en s'inspirant du meilleur de ce qui
+existe (et beaucoup de Sublime) tout en essayant de faire mieux. Présenté comme
+un *Hackable Editor* c'est sur ce terrain qu'il montre sa grande force, son
+extensibilité. Mon test de la mouture du moment, montre des nets progrès de la
+stabilité et des performances.
+
+Caractéristques de **Sublime Text** :
+
+- développé par Jon Skinner, licence propriétaire
+- multiplateforme : Ms Win, Mac OS/X, Linux
+- code natif C++ et Python
+- extensions en Python, fédérées par Will Bond sur [Package Control](https://packagecontrol.io)
+- +4000 paquets : la plupart sous licences open source
+- versioning : création 2008, sublime 2 puis Sublime 3, officiellement en bêta *stable* depuis janvier 2013
+- prix : autour de 70$
+
+Caractéristiques d'**Atom** :
+
+- développé par GitHub, licence MIT
+- multiplateforme : Ms Win, Mac OS/X, Linux
+- plateforme Web Electron (basée sur Chromium et NodeJS)
+- codé en CoffeScript, un langage qui se transcompile en JavaScript
+- étendu par des plug-ins en Node.js et ouverture JavaScript vers C++ pour s'interfacer avec des produits tiers
+- +6000 paquets : la plupart sous licences open source
+- versioning : création 2014, v 1.17.2
+
+L'empreinte mémoire est à l'avantage de Sublime, moins de -100 Mo au démarrage.
+Atom ne peut pas rivaliser sur ce plan avec son architecture Web basée sur
+Electron. Si votre utilisation consiste à charger des fichiers de dizaines de
+milliers de lignes (épluchage de logs par exemple), choisissez Sublime ou Vim
+car Atom sera lent. Par contre, si vous cherchez un éditeur multi-langages pour
+écrire du Python, du Ruby, du JavaScript, du CSS, de l'HTML, Atom est une
+alternative sérieuse. Son éco-système grossit très vite : +6000 plug-ins. Basé
+sur Electron, il est *Web* lui-même et on peut exécuter / déboguer du
+JavaScript depuis l'éditeur.
+
+En conclusion, Sublime est plus généraliste et plus performant pour gérer des
+fichiers volumineux. Atom est plus versatile et la croissance du nombre de
+plug-ins montre l'engouement des développeurs Web. J'ai une licence Sublime
+mais j'ai fait la bascule sur Atom depuis quelques semaines pour tout ce qui
+est développement (JAVA mis à part).
+
diff --git a/content/blog/2017/2017-06-21-openbsd-installation.md b/content/blog/2017/2017-06-21-openbsd-installation.md
new file mode 100755
index 0000000..1392a2a
--- /dev/null
+++ b/content/blog/2017/2017-06-21-openbsd-installation.md
@@ -0,0 +1,106 @@
+---
+layout: post
+title: Deux installations de OpenBSD
+categories: Hébergement BSD
+---
+
+Déjà un peu évoqué sur Diaspora, j'ai migré mon serveur vers OpenBSD depuis
+deux mois à une période où les planètes étaient alignées : j'avais du temps et
+l'envie, et aussi une revanche à prendre suite à une installation ratée l'année
+dernière sur mon portable. Les BSD m'intriguaient depuis longtemps, plus
+spécialement OpenBSD et j'avais commencé à regarder et apprécier la qualité de
+la documentation et j'avais l'image d'une petite communauté qui prend le temps
+de réfléchir, de bien faire les choses sans céder aux sirènes de la mode, en
+maintenant un cap : la sécurité avant tout et le KISS. Ce qui me retenait
+hormis la difficulté apparente, c'était mon goût pour la GPL. Les mois ont
+passé, la tournure qu'a pris Linux a commencé à me déplaire. Puis Thuban a
+publié la première version de son livre sur l'auto-hébergement avec OpenBSD et
+il a montré que non seulement ce n'etait pas si compliqué mais qu'on pouvait
+faire tourner tous les services de l'auto hébergement. C'est un point très
+important car venant d'une distribution Linux comme Debian avec ses milliers de
+programmes, on peut craindre qu'OpenBSD soit pauvre et qu'il faille tout se
+compiler à la mimine. En fait, la vérité est ailleurs, pardon à mi chemin :
+pour une utilisation serveur, on trouve tout ce qu'il faut pour de
+l'hébergement de services et plus en standard (*out of the box*) que certaines
+distributions Linux pour l'administration système.
+
+Ça a ravivé la flamme et migrer mon serveur vers OpenBSD c'etait concret en
+terme d'objectif. J'héberge un certain nombre de services : lecteur de flux RSS
+(Tiny Tiny RSS), gestionnaire de favoris (Shaarli), partage de fichier,
+synchronisation d'agenda et de carnet d'adresse (NextCloud), lecture hors ligne
+(Wallabag) et ce blog (Pelican / Stacosys). Des services classiques mais sur un
+nouveau système avec des programmes différents et une administration
+différente. Ma cible c'est donc [ma Dedibox chez
+Online](https://www.online.net/fr/serveur-dedie/dedibox-sc) pour laquelle
+OpenBSD n'est pas encore officiellement supporté mais FreeBSD est proposé, ce
+qui augure du bon concernant le support du matériel. En cherchant un peu sur la
+toile, quelques courageux aguerris avaient déjà expérimenté et [partagé une
+méthode d'installation
+manuelle](https://devnullblg.wordpress.com/2014/04/18/openbsd-installation-on-a-dedibox-sc-gen2).
+Je me suis donc lancé, muni :
+
+- des [pages man](http://man.openbsd.org/cgi-bin/man.cgi) : sur OpenBSD c'est
+ beaucoup plus que de simples pages man ; très détaillées, agrémentées
+ d'exemples, c'est l'essentiel de la documentation officielle.
+- du livre [Héberger son serveur avec OpenBSD](https://www.atramenta.net/books/heberger-son-serveur-avec-openbsd/562)
+- de quelques retours d'expérience sur le Net.
+- [du Wiki OBSD4](https://obsd4a.net/wiki)
+
+J'ai pris mon temps pour me familiariser avec les programmes développés par
+OpenBSD. C'était le principal intérêt : ne pas juste réinstaller un serveur Web
+et PHP mais apprendre le système et ses programmes particuliers : le pare-feu
+(pf), le serveur HTTP (httpd), le load-balancer applicatif (relayd). Sur
+quelques jours, j'ai remonté un serveur avec tous mes services, sécurisé et
+simpliste d'administration. Ça tourne depuis 2 mois et à part un oeil au
+rapport de sécurité quotidien envoyé par le serveur dans ma boite e-mail et aux
+bulletins de sécurité publiés par l'équipe OpenBSD, je n'ai plus rien fait.
+
+C'est le week-end dernier que j'ai réalisé que les connaissances acquises
+risquaient de se perdre par manque de pratique. Et puis je suis loin de tout
+maîtriser, j'etais reste au chapitre de la théorie sur les mises à jour de
+sécurité par exemple. Or j'ai maintenant un serveur OpenBSD en production...
+Ma solution : pratiquer plus régulièrement donc installer OpenBSD sur mon
+vénérable Toshiba portege (année 2009, core 2 duo, 4go de ram, ssd de 64 Go,
+écran 13''3) et conserver mon vieux portable Ldlc (année 2011, i7, 8go ram, 750
+Go hdd, écran 15''6) sous Linux. Et c'est ainsi que j'ai retenté l'installation
+sur le fameux Toshiba. Le plus gros écueil avec BSD c'est le support du
+matériel, moins vaste que sur Linux.
+
+Le toshi est un bon candidat avec ses composants tout Intel (carte graphique,
+chipset Wi-Fi). Et pourtant les problèmes ont commencé dès l'installation avec
+un gel du boot depuis la clef USB à cause de l'acpi, un standard pas toujours
+correctement implémenté par les constructeurs et où la rigueur d'OpenBSD a été
+bloquante. Après desactivation temporaire de l'acpi depuis le UKC (User Kernel
+Configuration) j'ai pu mener l'installation jusqu'au bout.
+
+Le démarrage se passe bien, le système est fonctionnel mais je n'ai pas de
+réseau. Un message au boot suggère que le firmware du chipset n'est pas
+disponible. En effet, aucun code propriétaire n'est embarqué dans OpenBSD.
+Depuis un autre PC, j'ai téléchargé [le firmware
+nécessaire](http://firmware.openbsd.org/firmware/6.1) et je l'ai installé avec
+[fw_update](http://man.openbsd.org/fw_update.1). J'ai du wifi après c'est de la
+configuration : l'installation de xfce (il paraît que mate est pour bientôt),
+mes outils habituels (Vim, Tmux, Firefox, Thunderbird).
+
+Dernier écueil, j'ai planté pendant l'installation de XFCE avec *pkg_add* car
+le PC chauffe pas mal, à cause de son âge. Sur Linux, j'utilise des outils
+comme *cpufreq* pour limiter la fréquence du processeur. J'ai cherché un
+équivalent un petit moment avant de m'apercevoir que c'est en standard dans
+OpenBSD et qu'il suffit de configurer le Kernel avec des directives comme
+[hw.setperf par sysctl](http://man.openbsd.org/sysctl.8). Le planté en pleine
+installation de paquets a corrompu la référence de pkg. Je ne pouvais plus
+terminer l'installation, le système voyait des incohérences entre ce qui était
+déjà installé et sa base de référence. J'ai regénéré sa référence en combinant
+les outils **pkg_check** et **pkg_delete**. Ca m'a mis en confiance sur la
+robustesse du système de gestion de paquets. A cette étape, j'ai un laptop sous
+OpenBSD avec XFCE.
+
+J'ai enchaîné sur les patchs de mise à jour de sécurité du kernel avec
+**syspatch**, un outil récent qui permet d'appliquer des patchs binaires et de
+regénérer un nouveau kernel. Je me suis rassuré en appliquant les patchs
+publiés depuis la sortie de OpenBSD 6.1 sur le portable pour valider la
+manipulation puis j'ai fait de même sur le serveur.
+
+J'utilise indifféremment mes deux portables selon les jours donc je devrais
+alterner régulièrement entre Linux et OpenBSD et suivre l'évolution de ces deux
+mondes parallèles, à la fois très proches et très différents.
diff --git a/content/blog/2017/2017-07-12-migration-hugo.md b/content/blog/2017/2017-07-12-migration-hugo.md
new file mode 100755
index 0000000..22b7249
--- /dev/null
+++ b/content/blog/2017/2017-07-12-migration-hugo.md
@@ -0,0 +1,71 @@
+---
+layout: post
+title: Migration du blog sous Hugo
+category: Blog
+tag: planet
+---
+
+J'ai remplacé le le moteur de blog statique Pélican par Hugo et à vrai dire, ce
+n'était pas prévu. Un peu cloué par le rhume pour le week-end, j'ai suivi la
+recommandation du médecin de rester tranquille. La cervelle fonctionnant encore
+un peu, j'ai consulté ma liste de projets pour l'année, vous savez cette liste
+mi-voeux / mi-résolutions qu'on établit en début d'année. En bonne place,
+j'avais noté *"apprentissage ou perfectionnement dans un langage informatique"*.
+Les années précédentes, j'ai fait un peu de Javascript, notamment [un prototype
+de MVC avec MEAN](https://github.com/kianby/sandbox), de la glue Web à droite à
+gauche mais j'ai toujours l'impression de partir de zéro avec ce langage.
+Pourtant Javascript est de plus en plus incontournable professionnellement, même
+pour un développeur plutôt teinté backend. Mais pour bien progresser il aurait
+fallu partir avec un objectif projet, pas des exemples.
+
+Au lieu de ça, j'ai flâné sur Rust et Go, des langages bas niveau (rien de
+péjoratif). Cela fait un moment que je lorgne sur Go et franchement ce qui me
+retient c'est le fait que ce soit porté par Google. J'ai un peu en travers leur
+habitude de balancer les projets quand ils n'en ont plus besoin ou leurs
+ruptures sans compatibilité ascendante (hein Angular). Bref j'hésite à
+m'investir... Mais il faut reconnaître que Go est sorti en 2007, ils l'utilisent
+vraiment en interne (pas comme Angular) et ça me plairait de rajouter un langage
+plus bas niveau que Java ou Python avec des performances supérieures à mon
+catalogue. A force de traîner sur des sites qui parlent du langage Go je suis
+tombé sur Hugo, un moteur de blog statique. J'ai trouvé la documentation très
+bien écrite et c'est un point de plus en plus important pour moi. J'ai décidé de
+l'essayer... juste pour voir.
+
+Je ne vais pas refaire pas la pub du blog statique. Démarré sur la plate-forme
+Blogger, j'ai successivement migré ce blog sous Wordpress, PluXml, puis Pélican
+et je ne reviendrai pas en arrière. D'un blog statique avec des articles écrit
+en Markdown il est aisé de migrer vers n'importe où et on maîtrise le code HTML
+généré (celui de Wordpress était particulièrement dégueulasse). En pratique ça
+m'a pris une heure pour écrire une moulinette qui a transformé mes articles au
+format de Hugo, c'est-à-dire qui a transformé les metadata de chaque article, le
+contenu restant [au format
+Markdown](https://daringfireball.net/projects/markdown).
+
+Ce qui m'a pris du temps c'est le thème. J'ai testé quelques thèmes de
+contributeurs, beaucoup lu la documentation détaillant la création de son propre
+thème et je me suis lancé en transposant mon thème de Pélican (enfin les parties
+HTML CSS) en mieux : avec les parties spécifiques paramétrables, dans un esprit
+de réutilisation et de partage (oui c'est beau) même si ça n'arrivera
+probablement jamais car mon thème est.. moche mais beau pour moi, amélioré,
+raffiné au fil des ans, allégé avec [Pure CSS](https://purecss.io). Si je devais
+changer un truc ce serait ajouter un peu couleur sur la bannière de haut de
+page, ça ferait moins de gris. Quand le thème a été achevé on aurait dit une
+copie du blog original mais qui se **génère en 1/2 seconde au lieu de 5
+secondes**, la rapidité du langage Go compilé est réelle. J'ai retravaillé les
+catégories et utilise intelligemment les tags pour générer des flux RSS
+spécifiques notamment celui du [Planet Libre](http://planet-libre.org). Le
+résultat est propre, exempt des années de bidouilles et de verrues que j'avais
+ajouté sur Pélican.
+
+J'ai un peu tâtonné pour générer exactement les mêmes URL puis j'ai abandonné.
+J'ai préféré ajouter l'année dans l'URL d'un article, adieu mon référéncement
+Google et mes millions de lecteurs désorientés ;-) Pour limiter la casse, j'ai
+rajouté une règle au niveau du serveur HTTP pour rediriger les erreurs 404 vers
+la page d'accueil.
+
+Dernière angoisse, est-ce que le langage Go allait être disponible sur OpenBSD ?
+La réponse est oui, et encore mieux, le projet Hugo fournit un binaire pour
+OpenBSD. La mise en place sur l'hébergement a été galette. Quant au [système de
+gestion des commentaires](https://github.com/kianby/stacosys) il est à nouveau
+opérationnel (c'est l'avantage de maîtriser sa stack de logiciels) mais ça m'a
+donné un peu de fil à retordre... Cela fera le sujet d'un prochain article.
diff --git a/content/blog/2017/2017-07-16-performance-python-web.md b/content/blog/2017/2017-07-16-performance-python-web.md
new file mode 100755
index 0000000..e877e80
--- /dev/null
+++ b/content/blog/2017/2017-07-16-performance-python-web.md
@@ -0,0 +1,161 @@
+---
+layout: post
+title: Performance Python Web
+categories: Développement Hébergement Blog
+---
+
+J'ai terminé l'article précédent en évoquant le [système de gestion des
+commentaires Stacosys](https://github.com/kianby/stacosys) et sa mise en place
+sur le blog propulsé par [Hugo](https://gohugo.io). Il est installé sur le même
+serveur que le blog mais il pourrait tout à fait être déporté car le blog
+statique interagit avec lui par du code JavaScript qui envoit des requêtes
+RESTful afin de :
+
+- récupérer le nombre de commentaires d'un article
+- récupérer les commentaires d'un article
+- soumettre un nouveau commentaire
+
+Avant de migrer vers Hugo, les commentaires étaient visibles seulement à
+l'intérieur des articles. C'est à dire qu'une page de blog affiche un extrait de
+l'article, à raison de 10 articles par page, et une pagination (page précédente /
+page suivante) permet de naviguer. C'est seulement quand on lit un article
+particulier qu'en fin de page on a un bouton *"voir les XX commentaires"* qui
+affiche le nombre de commentaires de l'article. Donc en navigation, on n'a
+aucune requête vers Stacosys. C'était un choix technique pour ne pas le
+surcharger de requête. En réécrivant le thème, j'ai trouvé sympa d'ajouter
+l'affichage du nombre de commentaires de chaque article sur la page principale,
+ce qui se fait un peu de partout.
+
+Cela ressemble à ceci :
+
+
+
+La récupération du nombre de commentaires des 10 articles de la page est
+réalisée en JavaScript donc de manière asynchrone et on envoie 10 requêtes vers
+le serveur HTTP de Stacosys qui est celui du framework Python Flask. J'ai voulu
+tester un peu les limites du système pour avoir une idée de ce le blog est
+capable de supporter.
+
+Le test consiste à effectuer le plus de requêtes possible pendant 1 minute avec
+une charge de 250 clients simultanés par seconde. Avec 10 articles par page,
+cela correspond à 25 lecteurs simultanés et particulièrement excités qui tapent
+frénétiquement sur la touche F5 pour rafraichir la page du navigateur donc
+beaucoup plus de lecteurs avec un comportement *normal*. Sur une base de 8
+secondes de visite par page, cela correspond à 200 visiteurs simultanés. J'en
+suis loin, c'est mon nombre de visites par jour :-) mais cela donne un objectif
+de charge à tenir.
+
+Quand la minute est écoulée on regarde **combien de requêtes** on a pu
+satisfaire et **le temps de réponse moyen** pour les satisfaire. La qualité du
+résultat dépend de ces deux variables. J'ai fixé arbitrairement 10 secondes
+comme temps de traitement acceptable. Les requêtes non honorées dans ce laps de
+temps sont marquées en erreurs. N'ayant pas 250 volontaires, j'ai utilisé une
+plate-forme de test non libre (oui je sais
+[Richard](https://fr.wikipedia.org/wiki/Richard_Stallman)...)
+
+Comment lire le tableau des résultats :
+
+- La colonne *workers* indique le nombre de processus ou threads travaillant en
+parallèle pour traiter les requêtes.
+- Le temps de réponse est en millisecondes avec le temps minimum, le temps moyen et le temps maximum.
+- Les erreurs sont des timeout : la requête n'a pas pu être honorée en moins de 10 secondes.
+
+J'ai d'abord fait un test dans l'état actuel avec Stacosys en HTTPS et le
+résultat est assez décevant. Pour le test, j'ai repassé Stacosys en HTTP et le
+résultat m'a étonné :
+
+ | Serveur | Workers | Temps de réponse | Requêtes | Erreurs |
+ | ----------- | :-----: | :----------------: | -------: | ------: |
+ | Flask HTTP | 1 | 95 > 2595 > 20000 | 7169 | 197 |
+ | Flask HTTPS | 1 | 104 > 4194 > 32000 | 4043 | 326 |
+
+On constate un écroulement complet en HTTPS. Je sais qu'il y a un coût, mais la
+gestion SSL étant portée par le serveur HTTP en frontal, je n'aurais pas pensé à
+une telle baisse de performance.
+
+Comme on récupère un nombre de commentaires par article, une information non
+critique, j'ai envisagé de demander cette information en HTTP. Ca n'aurait pas été
+glorieux mais la différence de performance est telle que je l'ai envisagé avec
+deux options qui ne peuvent pas fonctionner.
+
+**Option 1** : le blog reste en HTTPS et fait des appels CORS en HTTP à Stacosys.
+Ce n'est pas autorisé par les navigateurs car on n'a pas le droit de baisser la sécurité.
+
+**Option 2** : le blog revient en HTTP, après tout ce ne sont que des articles et il
+appelle Stacosys tantôt en HTTP, tantôt en HTTPS, en fonction de la criticité de
+l'information. On posterait les commentaires en HTTPS mais on fournirait le
+nombre de commentaires par article en HTTP. Et bien c'est impossible aussi car
+avec une configuration SSL un peu sérieuse, le paramètre
+[HSTS](https://fr.wikipedia.org/wiki/HTTP_Strict_Transport_Security) est activé
+pour éviter les attaques du type
+[man-in-the-middle](https://fr.wikipedia.org/wiki/Attaque_de_l%27homme_du_milieu)
+et, dans mon cas, j'ai fixé la durée HSTS à 1 année. Donc si je désactive HTTPS,
+les navigateurs de mes lecteurs continueront à se connecter en HTTPS, à moins de
+purger leur paramétrage. N'ayant pas les numéros de téléphone de tout le monde,
+c'est foiré. C'est à garder en mémoire pour ceux qui envisageraient de passer à
+HTTPS avec Let's Encrypt pour voir... Le retour en arrière n'est pas évident si
+HSTS est en place.
+
+Donc il va falloir vivre avec HTTPS et essayer d'améliorer les performances !
+
+
+
+Il est vrai que le serveur HTTP de Flask est préconisé pour le développement et
+pas la production. On recommande d'utiliser [Gunicorn](http://gunicorn.org) ou
+[Uswgi](https://uwsgi-docs.readthedocs.io/en/latest) qui sont optimisés (avec
+des parties écrites en langage C ou C++), fournissent de la concurrence dans le
+traitement. J'ai testé Uswgi qui m'a donné beaucoup de fil à retordre par sa
+complexité de configuration. J'ai fait un test un peu meilleur mais avec une
+charge CPU beaucoup plus lourde. Il faut trouver un équilibre entre le gain de
+performances Web et l'impact sur la charge CPU du serveur en rajoutant des
+processus *workers*.
+
+Ces deux serveurs Web sont probablement très bien et tout le monde semble les
+utiliser pour la mise en production d'application Python Web sérieuses mais pour
+mon besoin plus humble, ça me gêne de modifier l'application à cause du
+déploiement. Alors à force de chercher j'ai déniché une alternative qui
+s'appelle [Sanic](http://sanic.readthedocs.io) : un serveur HTTP en pur Python
+qui utilise les capacités de traitement asynchrones de Python 3.5 ce qui lui
+permet avec 1 worker, de doubler les performances de Flask. Remplacer Flask par
+Sanic dans une application Flask c'est galette : les développeurs de Sanic ont
+défini une API très proche, pensée pour que la migration se fasse rapidement.
+
+Voici les résultats de Sanic avec différentes configurations de *workers* :
+
+ | Serveur | Workers | Temps de réponse | Requêtes | Erreurs |
+ | ----------- |:-------:|:------------------:| --------:| -------:|
+ | Flask HTTPS | 1 | 104 > 4194 > 32000 | 4043 | 326 |
+ | Sanic HTTPS | 1 | 85 > 2657 > 20023 | 8741 | 123 |
+ | Sanic HTTPS | 2 | 85 > 2087 > 23634 | 7048 | 198 |
+ | Sanic HTTPS | 4 | 86 > 1777 > 18936 | 8102 | 191 |
+
+On constate que le nombre de requête traités grimpe et que le temps de réponse
+moyen s'améliore. Par contre, le nombre d'erreur augmente un peu. La performance
+HTTP progresse car le serveur est capable de gérer plus de requêtes mais le
+temps de traitement ne progresse pas et il faut toujours effectuer une requête
+dans la base de données pour renvoyer le nombre de commentaires. Pire, cette
+partie requête en base n'est pas asychrone donc on bloque un *worker*. Pour la
+1ère page du blog qui est la plus consultée, ce sont les mêmes compteurs qui
+sont demandés par chaque visiteur. Il y a un réel intérêt à mettre en cache ces
+valeurs pour diminuer le temps de traitement. C'est ce que j'ai fait
+programmatiquement dans Stacosys avant de relancer un test de performance avec
+le cache activé.
+
+ | Serveur | Workers | Temps de réponse | Requêtes | Erreurs |
+ | ------------------- |:-------:|:------------------:| --------:| -------:|
+ | Flask HTTPS | 1 | 104 > 4194 > 32000 | 4043 | 326 |
+ | Sanic HTTPS | 4 | 86 > 1777 > 18936 | 8102 | 191 |
+ | Sanic HTTPS + cache | 4 | 81 > 1152 > 12408 | 13558 | 210 |
+ | Sanic HTTPS + cache | 1 | 81 > 1367 > 18869 | 11589 | 171 |
+
+On traite plus de requêtes en moins de temps, le gain est palpable. Le cache est
+pour beaucoup dans le gain et pour le dernier test je suis revenu à 1 worker
+seulement pour limiter la charge CPU du serveur. Le résultat est honorable avec
+plus de 11000 requêtes traitées et un taux d'erreur assez bas. C'est cette
+configuration que j'ai mis en place sur le blog.
+
+Après avoir rédigé cet article, j'ai effectué un test basique (pas dans le
+contexte Stacosys) avec le serveur HTTP du langage Golang et le résultat m'a
+ramené à mes lectures du moment sur les architectures microservices, les couches
+protocolaires optimisées comme [nanomsg](http://nanomsg.org) et les langages
+compilés. Il n'est pas exclu que je réécrive mes outils différemment.
diff --git a/content/blog/2017/2017-07-20-flux-rss-esprit-du-libre.md b/content/blog/2017/2017-07-20-flux-rss-esprit-du-libre.md
new file mode 100755
index 0000000..ba7871a
--- /dev/null
+++ b/content/blog/2017/2017-07-20-flux-rss-esprit-du-libre.md
@@ -0,0 +1,41 @@
+---
+layout: post
+title: Flux RSS et esprit libre
+categories: Blog Humeur
+---
+
+J'ai réalisé que mon flux RSS est tronqué depuis [ma migration sous
+Hugo](/2017/migration-du-blog-sous-hugo) et je viens de corriger le tir. Loin de moi
+l'idée de forcer les gens à venir sur le blog pour lire l'article en entier et
+ainsi gonfler mes statistiques (ridiculement basses) ou flatter mon égo. Mea
+culpa auprès du [Planet Libre](http://www.planet-libre.org) aussi d'avoir fourni
+un article tronqué.
+
+En cherchant des informations pour définir mon flux RSS correctement je suis
+tombé sur le blog d'un anglophone, appelons le Jim, qui dénonce le choix du
+développeur de Hugo d'avoir insidieusement glissé le passage d'un flux complet à
+un flux partiel au détour d'une version, sous le fallacieux argument que c'est
+ce que veulent la plupart des utilisateurs. Pour remettre le problème en
+perspective, on n'est impacté que si on n'a pas défini son propre modèle de
+document RSS pour son site, auquel cas c'est le modèle par défaut fourni par
+Hugo qui est utilisé ; et c'est ce modèle qui a changé entre deux versions. En
+lisant la doc de Hugo on est capable de définir son propre modèle RSS en 10
+minutes.
+
+En parcourant le blog de Jim, on lit qu'il a récemment quitté Pélican pour Hugo
+et qu'il est assez remonté que le développeur du projet fasse des choix pareils
+et qu'il compte migrer son blog vers Wordpress. Deux jours plus tard, il pond un
+nouvel article incendiaire pour informer ~~que Wordpress ne fonctionne pas en
+IPv6~~ qu'il ne comprend rien. Jim est prolifique ; il pond plusieurs articles
+par semaine et il a des idées sur tout. Enfin comme dirait Coluche il a surtout
+des idées.
+
+Alors voici quelques rappels et conseils à tous les Jim de la planète :
+
+- utiliser un projet libre ou open source ne donne pas de droit privilégié envers la gouvernance du projet. Les développeurs du projets ne travaillent pas pour toi en fait et ils risquent même de mener le projet selon leurs envies.
+- l'investissement minimal que tu te dois en tant qu'utilisateur, pour éviter les surprises, c'est de te tenir au courant des sorties de version et de leur contenu (le fameux *changelog*).
+- l'investissement plus coûteux en temps consiste à suivre les discussions sur les orientations, voire à participer pour influer sur l'evolution du projet : la plupart des projets ont un forum ou un espace de discussion.
+- et si rien ne te convient tu peux toujours prendre un clavier, apprendre la programmation si nécessaire, et démarrer toi même le projet qui convient à ton besoin. Tu ne le meneras probablement pas à terme mais tu auras appris beaucoup de choses et ça t'aura peut-être rendu plus humble et respectueux du travail des autres.
+- tu peux aussi choisir des projet commerciaux (open source ou privateurs) qui te donneront accès à du support et au droit de râler car tu es un client.
+
+Voilà Jim, la balle est dans ton camp :-)
diff --git a/content/blog/2017/2017-07-24-golang-a-la-rescousse.md b/content/blog/2017/2017-07-24-golang-a-la-rescousse.md
new file mode 100755
index 0000000..dd4b850
--- /dev/null
+++ b/content/blog/2017/2017-07-24-golang-a-la-rescousse.md
@@ -0,0 +1,175 @@
+---
+layout: post
+title: Performances, Golang à la rescousse
+categories: Développement Blog
+tag: planet
+---
+
+Dans l'[article précédent](/2017/performance-python-web) j'ai optimisé le
+[système de gestion des commentaires
+Stacosys](https://github.com/kianby/stacosys) en :
+
+- remplaçant le serveur HTTP de [Flask](http://flask.pocoo.org) par [Sanic](http://sanic.readthedocs.io), un serveur HTTP Python tirant parti des capacités asynchrones de Python 3.5 et multi-processus (plusieurs *workers*)
+- ajoutant un cache mémoire à la partie de l'API de Stacosys qui récupère le compteur de commentaires d'un article
+
+J'ai terminé sur une performance bien améliorée :
+
+- plus de 11000 requêtes traitées en 1 minute
+- un temps de requête moyen de 1,3 seconde
+- une répartition du temps de traitement entre 81 ms et 18 secondes (assez élevé)
+- 171 des requêtes (soit 1,5 %) avec un temps de traitement supérieur à 10 secondes
+
+L'architecture avec Sanic ressemble à ceci :
+
+
+
+Pour être complet le serveur HTTPS NginX en frontal de Stacosys est configuré
+avec 4 *workers* et il déverse les requêtes sur Sanic configuré avec 2
+*workers*, qui lui seul utilise 30% de la CPU lors du test. L'impact sur la CPU
+est important et doit être mis en balance avec le gain en performance car
+d'autres services tournent sur le même serveur.
+
+[NginX](https://fr.wikipedia.org/wiki/Nginx) est un serveur Web très complet et
+il y a des configurations avancées de mise en cache qui, d'après sa
+documentation, pourraient s'appliquer à mon scénario : un serveur HTTP en mode
+Proxy qui renvoie au format JSON les résultats d'une API. Si c'est le cas, cela
+rendrait caduque la nécessité d'ajouter un cache au niveau du serveur HTTP de
+Stacosys. J'ai fait quelques essais et je ne suis pas arrivé à un résultat
+fonctionnel. Si vous avez des retours d'expérience, j'aurais voulu mesurer les
+performances de cette solution. Logiquement, elle devrait l'emporter sur les
+autres.
+
+Je cherchais depuis un petit moment une ~~occasion~~ excuse pour écrire un peu
+de Golang. Un test HTTP (hors contexte) de Golang m'a convaincu que je pourrais
+m'en servir. Le langage [Golang](https://golang.org) a la particularité d'être
+compilé, typé, multi-plateforme et il fournit en standard des fonctionalités de
+haut niveau comme HTTP (client et serveur), de la crypto et de la compression,
+le support du JSON. [Le débat reste
+ouvert](http://spf13.com/post/is-go-object-oriented) sur le fait que Golang soit
+un langage orienté objet. En tout cas, il propose un paradigme de programmation
+simple et une richesse de librairies qui le rendent très intéressant pour du
+développement généraliste où la performance compte.
+
+J'ai donc restauré Stacosys en situation initiale (retour au serveur HTTP de Flask)
+et j'ai ajouté un serveur HTTP avec cache en Golang qui sert de proxy à NginX pour
+récupérer le compteur de commentaires. Les autres appels à l'API de Stacosys sont
+envoyés directement à Stacosys.
+
+L'architecture devient ainsi :
+
+
+
+Dans cette configuration, j'ai relancé mon fameux test étalon. On éclate tout
+avec + de 14000 requêtes traitées, un taux d'erreur équivalent mais surtout un
+temps de réponse moyen divisé par 4 et une charge CPU d'à peine 7%. Le serveur
+HTTP est mono-processus mais il utilise à fond les capacitéss des goroutines de
+Golang pour gérer la concurrence de traitement.
+
+ | Serveur | Workers | Temps de réponse | Requêtes | Erreurs |
+ | ------------------- |:-------:|:------------------:| --------:| -------:|
+ | Flask HTTPS | 1 | 104 > 4194 > 32000 | 4043 | 326 |
+ | Sanic HTTPS + cache | 4 | 81 > 1152 > 12408 | 13558 | 210 |
+ | Sanic HTTPS + cache | 1 | 81 > 1367 > 18869 | 11589 | 171 |
+ | Golang HTTPS | ? | 80 > 341 > 6745 | 14663 | 175 |
+
+Pour les fans de code, voici celui du serveur HTTP avec cache :
+
+``` golang
+ package main
+
+ import (
+ "encoding/json"
+ "flag"
+ "fmt"
+ "github.com/patrickmn/go-cache"
+ "io/ioutil"
+ "net/http"
+ "os"
+ "time"
+ )
+
+ // ConfigType represents config info
+ type ConfigType struct {
+ HostPort string
+ Stacosys string
+ CorsOrigin string
+ }
+
+ var config ConfigType
+ var countCache = cache.New(5*time.Minute, 10*time.Minute)
+
+ func die(format string, v ...interface{}) {
+ fmt.Fprintln(os.Stderr, fmt.Sprintf(format, v...))
+ os.Exit(1)
+ }
+
+ func commentsCount(w http.ResponseWriter, r *http.Request) {
+
+ // only GET method is supported
+ if r.Method != "GET" {
+ http.NotFound(w, r)
+ return
+ }
+
+ // set header
+ w.Header().Add("Content-Type", "application/json")
+ w.Header().Add("Access-Control-Allow-Origin", config.CorsOrigin)
+
+ // get cached value
+ cachedBody, found := countCache.Get(r.URL.String())
+ if found {
+ //fmt.Printf("return cached value")
+ w.Write([]byte(cachedBody.(string)))
+ return
+ }
+
+ // relay request to stacosys
+ response, err := http.Get(config.Stacosys + r.URL.String())
+ if err != nil {
+ http.NotFound(w, r)
+ return
+ }
+ defer response.Body.Close()
+ body, err := ioutil.ReadAll(response.Body)
+ if err != nil {
+ http.NotFound(w, r)
+ return
+ }
+
+ // cache body and return response
+ countCache.Set(r.URL.String(), string(body), cache.DefaultExpiration)
+ w.Write(body)
+ }
+
+ func main() {
+ pathname := flag.String("config", "", "config pathname")
+ flag.Parse()
+ if *pathname == "" {
+ die("%s --config
+
+ {{ if isset . "site" }}
+
+ {{ end }}
+ {{ .author }}
+ - {{ .date }}
+
Le serveur est monolithique donc le choix du système d'exploitation est crucial.
+
+En entreprise, il dépend de la politique interne, des goûts et compétences des
+administrateurs système. Généralement on limite la fragmentation des systèmes
+déployés. On choisira par exemple RedHat pour les serveurs critiques et CentOS
+pour les autres afin d'avoir une homogénéité. Des besoins particuliers (comme
+le pare-feu) pourront amener à installer des systèmes spécifiques (comme
+PFSense).
+
+Dans le cas de l'auto-hébergement, c'est open bar et nul besoin de se
+justifier. On choisit Gloup parce que c'est cool et qu'on veut appendre à le
+maîtriser, ou bien parce qu'on pense que c'est le meilleur choix technique (ou
+philosophique).
+
+Ce qu'il faut savoir c'est que ce système fournit de base une logithèque plus
+ou moins étendue par son gestionnaire de paquets. S'il manque des choses, on
+peut ajouter d'autres sources, comme des dépôts tiers de contributeurs. En
+dernier ressort, on peut compiler à partir des sources, ce qui peut être un
+vrai travail de portage si le programme en question n'est pas prévu pour ce
+système. On est très dépendant des versions proposées par le système
+d'exploitation et si on a besoin de faire coexister plusieurs versions d'un
+même programme, ça commence à se compliquer grandement. Quand on montera en
+version le système d'exploitation, tous ces ajouts *non standard* (paquets non
+officiels, programmes compilés à partir des sources) compliqueront la mise à
+jour du système d'exploitation.
+
+### Phase 2 : pas de limite
+
+Et puis est apparue la virtualisation ! le choix du système d'exploitation
+n'est plus une limitation, on mixe à son gré et le système hôte (appelé
+hyperviseur) a le rôle principal d'exécuter avec célérité les machines
+virtuelles. On a encore une petite adhérence à l'architecture matérielle : si
+on tourne sur une architecture x86, on doit installer des systèmes supportant
+cette architecture. La virtualisation a un coût même si elle s'appuie sur des
+instructions dédiées du processeur pour être très performante.
+
+Sur du matériel modeste, ce qui est souvent le cas en auto-hébergement, on
+privilégiera les technologies de conteneurs (LXC pour Linux, Jails pour
+FreeBSD) pour isoler ses services et faire cohabiter des versions spécifiques
+ou différentes. Les conteneurs sont plus limités que les machines virtuelles
+car ils partagent le kernel du système hôte. Sur un serveur Linux, des
+containers LXC pourront exécuter différentes distributions GNU/linux, mais
+seulement du Linux. Cela permet déjà de faire plein de trucs cool, chaque
+conteneur a son IP, on choisit le système le plus adapté à ce qui sera
+installé dessus (Debian CentOS, Alpine, ...).
+
+Si on a confiance dans ce qui s'exécute sur ses conteneurs (ce qui devrait
+être le cas en auto-hébergement perso), l'approche de la sécurité du serveur
+est simple : un gros pare-feu au niveau du serveur physique pour n'ouvrir que
+les ports publiques sur Internet et les conteneurs peuvent communiquer entre
+eux par des adresses privées.
+
+### Phase 3 : centré sur l'application
+
+Puis Docker a lancé sa technologie de conteneur d'application, basé
+techniquement sur les conteneurs Linux LXC mais avec l'enjeu de faire oublier
+le système sous-jacent :
+
+- un conteneur Docker = une application (le processus en PID 1)
+- un portail d'applications permet de télécharger des images prêtes à l'emploi
+- les dépendances entre conteneurs sont déclarées explicitement
+
+Le tout s'accompagne d'un ensemble de bonnes pratiques : pas de données dans
+les conteneurs d'applications, une configuration passée au conteneur lors de
+son initialisation. Bref je vais pas détailler, plein de bons articles sur le
+sujet ont déjà été publiés. Mais c'est une technologie qui vaut la peine de
+jouer d'être essayée. Elle ne révolutionne pas la technique sous-jacente qui
+existait déjà mais les usages et la façon de repenser un déploiement de
+services, réparti entre plusieurs conteneurs faciles à mettre à jour, une
+abstraction totale par rapport au système hôte.
+
+Ne nous voilons pas la face, Docker c'est la fin de la distribution serveur.
+Est-ce que Debian est mieux que CentOS sur un serveur ? On s'en cogne car peu
+importe la logithèque la distribution et les versions fournies de chaque
+librairie. En installant Docker dessus, on en fait un chef d'orchestre dont le
+rôle se limite à exécuter des dizaines ou des centaines de conteneurs. Et le
+catalogue d'applications est énorme, comme les versions proposées. Et si on ne
+trouve pas vie ou qu'on a besoin d'empaqueter ses propres applications en
+conteneurs Docker, on apprend à fabriquer ses propres conteneurs en quelques
+heures d'auto-formation.
+
+Bon j'ai l'air emballé sur Docker et c'est le cas, d'un point de vue
+professionnel. Ce n'est pas mon rêve pour mon auto-hébergement, les conteneurs
+ont tous la même taille, ça manque de diversité et de fun pour moi.
+
+
+
La
+plupart des entreprises sont entre la phase 2 et la phase 3 : elle ont
+virtualisé tout ce qui est possible et elles migrent des services sous
+Docker.
+
+Mais que choisir, au final, pour de l'auto-hébergement ? Et bien, je dirais :
+**"faîtes vous d'abord plaisir"**. BSD, Linux, il y a de quoi faire. Quitter
+le monolithique et passer à l'étape 2 ou 3 ouvre d'autres perspectives dans la
+gestion de son serveur. Fan du pare- feu PF ? ajoutez une machine virtuelle
+avec PFSense pour gérer la sécurité de votre serveur. Si professionnellement
+vous risquez d'être concernés par Docker, formez-vous parce que c'est
+intéressant et que ça peut être utile (mais ne baclez pas l'aspect sécurité
+des containers). Moi j'ai une passion pour les conteneurs *maison* qui me
+permettent de moduler à ma guise : des petits conteneurs avec l'esprit Docker
+pour les micro- services (avec Alpine Linux), des gros conteneurs pour les
+applications plus conséquentes (comme Nextcloud). Longue vie à l'auto-
+hébergement, profitons-en tant que l'Internet n'est pas à péage :-)
diff --git a/content/blog/2018/2018-02-16-surveiller-etat-serveur.md b/content/blog/2018/2018-02-16-surveiller-etat-serveur.md
new file mode 100755
index 0000000..5685279
--- /dev/null
+++ b/content/blog/2018/2018-02-16-surveiller-etat-serveur.md
@@ -0,0 +1,58 @@
+---
+layout: post
+title: Surveiller l'état du serveur
+category: Hébergement
+tag: planet
+---
+
+J'ai un peu compliqué l'installation de mon serveur en répartissant les
+services dans des conteneurs. J'ai un serveur HTTP NginX en frontal qui
+distribue les requêtes vers les bon conteneurs en fonction du nom DNS (un
+reverse proxy). Je me retrouve donc avec une dizaine de conteneurs, partageant
+un même plan d'adressage IP, et presque autant de serveurs HTTP. J'ai eu
+besoin d'un outil qui me donne une vision globale de l'état du serveur et soit
+capable de m'alerter en cas d'incident.
+
+J'aurais pu m'orienter vers des solutions de supervision (Nagios et autres),
+surtout vu mon background sur le sujet, mais le besoin est simple et les
+ressources de mon serveur sont limitées. Je n'ai pas jugé utile de dégainer
+la grosse artillerie. J'avais noté l'existence de
+[Cachet](https://cachethq.io), utilisé, notamment, [par
+Framasoft](https://status.framasoft.org), qui fournit une page de statut et
+gère les notifications (e-mail ou abonnement RSS). Cachet, pour les intimes,
+se cantonne donc à la visualisation et la notification. On crée des
+composants, on les regroupe à sa guise, et une API Rest permet d'alimenter en
+événements : changer l'état d'un composant (opérationnel, hors service,
+partiellement défaillant), déclarer une maintenance planifiée. Il y a aussi
+des indicateurs mais je n'ai pas encore exploré cette possibilité.
+
+Comme pleurniché dans Diaspora, le plus dur c'est de l'installer, surtout
+quand je rate la ligne importante du manuel qui précise que PHP 5 est requis
+(la version 7 n'est pas encore supportée). Je me retrouve avec des erreurs
+bizarres sans lien évident avec la version (du moins quand on n'est pas
+PHPiste confirmé). Après une relecture du guide d'installation, plutôt bien
+fait, et correction de mon déploiement, l'installation se déroule sans
+problème avec Composer qui télécharge et installe les dépendances. Cachet est
+prévu pour un grand nombre d'utilisateurs donc une base MySQL ou PostgreSQL
+est recommandée. Pour peu d'utilisateurs il peut fonctionner avec SQLite, mon
+choix de prédilection, quand c'est possible, pour ne pas multiplier les
+serveurs de base de données, ni partager un serveur de base de données entre
+mes conteneurs.
+
+Une fois installé et la configuration HTTP mise en place, on accède à
+l'interface d'administration pour créer ses objets. J'ai créé un groupe
+**Système** avec tous mes conteneurs et un groupe **Service** avec mes
+services critiques.
+
+
+
+Pour animer les statuts des composants c'est donc indépendant de Cachet. L'API
+REST de Cachet est bien pensée et bien documentée. Elle permet de créer /
+modifier des objets ou de les animer. Je me suis limité à cette dernière
+possibilité pour l'instant en développant un programme qui récupère l'état des
+conteneurs, des services et envoie les changements d'etat à Cachet. Ce
+programme est exécuté toutes les 5 minutes. C'est sans prétention et ça répond
+à mon besoin ; le code source est [ici](https://github.com/kianby/cachetmonitor).
+
+Ma page de statut est accessible ici : https://status.madyanne.fr
+
diff --git a/content/blog/2018/2018-04-07-travailler-sous-windows.md b/content/blog/2018/2018-04-07-travailler-sous-windows.md
new file mode 100755
index 0000000..b1dadf4
--- /dev/null
+++ b/content/blog/2018/2018-04-07-travailler-sous-windows.md
@@ -0,0 +1,61 @@
+---
+layout: post
+title: Travailler sous Windows
+category: Humeur
+---
+
+Depuis presque une année, je suis revenu à un poste de travail professionnel
+sur Ms Windows 7, pour me conformer à la politique de l'entreprise qui
+m'emploie. La réadaptation a été un peu douloureuse (doux euphémisme...) après
+6 années de bonheur avec des distributions comme Fedora et Debian.
+
+Le premier point qui m'a vraiment gêné c'est l'installation de logiciels :
+
+- trop de sources pour installer un programme : le site officiel, des sites alternatifs, c'est une jungle dont les prédateurs sont le spyware et le malware.
+- aucune gestion centrale des mises à jour : certains programmes installent une cochonnerie lancée au démarrage pour détecter la présence de mise à jour, d'autres le font à chaque lancement et quant à ceux qui restent, il faut deviner qu'ils ne sont pas dans leur dernière version
+
+Dans Windows 10, une boutique d'applications a été rajoutée, néanmoins, je
+doute qu'elle soit assez complète dans mon cadre d'utilisation et pour
+l'instant je suis sous Windows 7. Sur les conseils éclairés de mon ami
+moustachu, j'ai essayé et rapidement adopté
+[Chocolatey](https://chocolatey.org), un gestionnaire de programmes très
+complet, géré en ligne de commande. C'est ma source d'installation prioritaire
+car je peux mettre à jour tous mes programmes en une commande. Si ce n'est pas
+disponible dans Chocolatey, je me rabats sur les méthodes traditionnelles.
+
+Le second point qui pique c'est l'absence d'un terminal digne de ce nom. La
+taille des fenêtres CMD n'est toujours pas redimensionnable dynamiquement et il
+n'y a pas d'onglets. Plusieurs alternatives existent, j'ai opté pour
+[Cmder](http://cmder.net) basé sur [ConEmu](https://conemu.github.io), un peu
+plus connu, qui comble ces lacunes. J'ai aussi besoin d'un shell Unix pour
+certaines tâches et me connecter en SSH sur des serveurs. Après beaucoup de
+recherches infructueuses, j'ai opté pour [MSYS2](https://www.msys2.org), un
+terminal moderne (colorisé, gestion des onglets) qui sous le capot repose sur
+[Cygwin](https://www.cygwin.com) auquel on a greffé le gestionnaire de paquets
+en ligne de commande de ArchLinux, à savoir Pacman. Qui a eu l'occasion d'utiliser
+l'installeur graphique de Cygwin pour ajouter ou mettre à jour des paquets
+comprendra vite l'avantage d'avoir un Pacman en mode console... ce n'est pas du
+tout une fantaisie de geek.
+
+A ce stade, j'étais paré pour bosser sereinement.
+
+J'ai installé [Clover](http://en.ejie.me) pour rajouter des onglets à
+l'explorateur de fichier standard de Ms Windows, je ne voulais pas le remplacer
+par une alternative mais juste ajouter ce qui lui manque. Très récemment
+j'ai installé [Keypirinha](http://keypirinha.com)
+pour ~~ne plus avoir à fouiller le menu Démarrer~~ lancer les applications
+rapidement. Pour le reste, mes outils n'ont pas vraiment changé : je navigue
+sur la toile avec [Firefox](https://www.mozilla.org/fr/firefox), mon bloc-notes
+déstructuré est [Zim](http://zim-wiki.org), je me connecte aux bases de données
+avec [DBeaver](https://dbeaver.jkiss.org), je reste fidèle à
+[Eclipse](https://eclipse.org) pour le développement Java et pour le reste
+(JavaScript, HTML, CSS, Python, Markdown) j'ai goûté à [Visual Studio
+Code](https://code.visualstudio.com), fortement inspiré du meilleur de Sublime
+Text, avec une richesse et une qualité de plugins supérieure (un avis qui n'engage que
+moi). Bravo à Microsoft pour cet outil, quand c'est réussi, il faut le dire.
+
+Malgré ce changement de système de système d'exploitation, je continue à
+privilégier les logiciels libres et Open Source, pas seulement par conviction
+mais aussi parce que c'est du gagnant-gagnant. Et je rassure mon auditoire : je
+n'ai pas sombré du côté obscur et privateur, mes serveurs restent sous Unix
+ainsi que ma machine perso.
\ No newline at end of file
diff --git a/content/blog/2018/2018-04-15-bitwarden.md b/content/blog/2018/2018-04-15-bitwarden.md
new file mode 100755
index 0000000..8e335e3
--- /dev/null
+++ b/content/blog/2018/2018-04-15-bitwarden.md
@@ -0,0 +1,47 @@
+---
+layout: post
+title: Les mots de passe
+category: Sécurité
+tag: planet
+---
+
+J'ai été sensible assez tôt à l'importance de la sécurité des mots de passe. Aujourd'hui, plus qu'hier, on ouvre quantité de comptes sur des sites de commerce, de banque ou d'assurance, de santé. J'avais choisi le logiciel [KeePassX](https://www.keepassx.org), un coffre fort numérique protégé par un mot de passe unique, et suivi les bonnes pratiques : associer un mot de passe costaud et différent pour chaque site. Tout avait bien démarré avec de la bonne volonté, mais l'informatique des nuages et la mobilité ont progressivement compliqué les choses.
+
+Au début, c'était simple car on avait une machine familiale dans la maison. Puis au fil des ans, j'ai acquis un portable, puis une tablette et un smartphone, et le casse-tête de la synchronisation entre les périphériques s'est posé. J'ai commencé simple (la machine familiale est la machine maître pour le fichier et des copies sont installées sur les autres périphériques) puis ça a fini par une synchronisation de la base KeePassX à travers Nextcloud, ce qui permet à n'importe quel périphérique de rajouter un mot de passe si besoin.
+
+Enfin il s'est rajouté le problème de l'accès à ses mots de passe depuis des machines tierces (en milieu professionnel notamment). On peut ouvrir les mots de passe sur le téléphone et recopier le mot de passe dans le navigateur de la machine mais c'est pénible. Quand on est développeur, on a forcément une identité numérique (un compte GitHub, un compte StackOverflow, etc...) et on n'est pas ~~forcément~~ schizophrène donc on ne va pas en ouvrir un différent à chaque changement de poste. Du coup, j'ai ajouté la synchronisation de Mozilla Firefox dans la boucle, protégé par un *master password* pour partager certains identifiants liés à mon activité professionnelle en me rassurant que la référence c'est ma base KeePassX.
+
+Le bilan, au bout de 12 ans, c'est que c'est un sacré bazar :
+
+- j'utilise une version antédiluvienne de KeePassX pour être compatible avec celle supportée par mon téléphone : la sécurité globale est nivelée par celle du maillon le plus faible
+- j'ai des mots de passe dans KeePassX, des doublons dans Firefox et probablement des mots de passe oubliés uniquement mémorisés dans Firefox.
+- la sécurité du stockage des mots de passe dans Firefox [n'est pas terrible](https://www.bleepingcomputer.com/news/security/firefox-master-password-system-has-been-poorly-secured-for-the-past-9-years) mais c'est tellement commode le remplissage automatique des formulaires quand on est sur un site.
+- la base KeePassX est physiquement sur mon téléphone : même si c'est chiffré sérieusement, combien de temps faudrait-il à quelqu'un de motivé et équipé pour la craquer en cas de vol ?
+
+Cela fait beaucoup de points négatifs, il était temps de repenser tout cela et de se mettre au goût du jour. J'ai regardé un peu ce qui se fait avec quelques idées en tête :
+
+- copier-coller des mots de passe entre une application et un site Web c'est dépassé (et compliqué sur un appareil mobile),
+- stocker une base de mots de passe sur un périphérique mobile c'est risqué,
+- le risque de piratage des sites Web est plus grand qu'auparavant, la solution doit être simple pour créer un mot de passe différent par site.
+
+J'ai finalement choisi [BitWarden](https://bitwarden.com) qui remplit mes critères. Le coffre-fort est hébergé sur leurs serveurs, dans le cloud Azure Microsoft pour être exact. On peut décider de l'héberger soi-même mais je doute faire mieux que des professionnels pour en sécuriser l'accès. On déverrouille l'accès au coffre-fort avec un mot de passe maître, le seul à retenir finalement ; idéalement c'est une phrase plutôt qu'un simple mot de passe car toute la sécurité repose sur lui. Et si on l'oublie, ce n'est pas la peine de le demander aux administrateurs de BitWarden car ils ne l'ont pas, il n'est pas stocké chez eux. L'avantage de BitWarden par rapport à d'autres solutions du même genre c'est aussi qu'il propose des applications pour toutes les plateformes : des extensions de navigateurs, des applications bureau et mobiles. Autre bon point, ils ont des fonctions d'import pour la plupart des solutions concurrentes.
+
+Alors comment décider de faire confiance à BitWarden ? Ce qui compte pour moi c'est :
+
+- la publication en Open Source du cryptage pour être audité en toute transparence,
+- la possibilité de sortir ses données avec un export en CSV,
+- le sérieux de l'hébergement de la solution.
+
+La confiance, c'est compliqué. Quelles que soient les garanties, il y a un moment où, en son âme et conscience, il faut se lancer ou rebrousser chemin. J'ai franchi le pas et décidé de leur confier mes mots de passe.
+
+Premier écueil pour sortir les mots de passe de Firefox : l'extension [Password Exporter](https://addons.mozilla.org/en-US/firefox/addon/password-exporter) ne supporte pas Firefox 57, j'installe la version Firefox 52 ESR. D'ailleurs on annonce la version Firefox 62 ESR pour le mois d'août, ça me conforte dans l'idée que c'est le moment de s'en occuper. L'extension exporte les mots de passe dans un fichier CSV et BitWarden permet de les importer. Pour KeePass, on a un import mais comme j'ai une version KeePassx 0.4 j'ai du passer par la migration vers une version récente de KeePass avant de pouvoir importer ma base de mots de passe dans BitWarden. A ce stade, j'ai un coffre-fort avec plein de doublons entre les données de FireFox et KeePass ; bien fait pour moi, le gros ménage commence.
+
+Je désactive la mémorisation des identifiants de Firefox et je vide les identifiants enregistrés puis j'installe l'extension BitWarden pour Firefox. On ouvre le coffre-fort en entrant son méga mot de passe.
+
+
+
+On peut paramétrer la fermeture du coffre-fort. A la maison, on laissera le coffre-fort ouvert jusqu'à la fermeture du navigateur ; au travail on optera pour une fermeture automatique sur inactivité, au bout de 15 minutes. Le principal intérêt d'avoir un gestionnaire de mots de passe couplé au navigateur c'est le remplissage des formulaires pour ne plus faire de copier-coller de mots de passe. L'icône de BitWarden change quand un mot de passe est disponible pour un site et il suffit de le sélectionner pour remplir le formulaire.
+
+
+
+J'ai terminé ma bascule vers BitWarden depuis une semaine ; je me sers de l'extension Firefox et de [l'accès Web](https://vault.bitwarden.com), je n'ai installé aucune application native sur mes périphériques. Par sécurité, j'ai prévu une sauvegarde régulière et manuelle vers un support physique, c'est à dire un export des mots de passe vers une clef USB qui reste dans un coffre (non numérique celui-ci)... au cas où BitWarden disparaitrait ou bien si je deviens amnésique ;-)
\ No newline at end of file
diff --git a/content/blog/2018/2018-05-20-bilan-hebergement-container.md b/content/blog/2018/2018-05-20-bilan-hebergement-container.md
new file mode 100755
index 0000000..91bae00
--- /dev/null
+++ b/content/blog/2018/2018-05-20-bilan-hebergement-container.md
@@ -0,0 +1,41 @@
+---
+layout: post
+title: Hébergement et taille de containers
+categories: Hébergement Containers
+tag: planet
+---
+
+Dans le prolongement de mon article ["Choix du système pour s'auto-héberger"](https://blogduyax.madyanne.fr/2018/quel-systeme-serveur), je peux faire un bilan des 6 mois écoulés avec mon hébergement à base de containers LXC avec la distribution [Proxmox](https://fr.wikipedia.org/wiki/Proxmox_VE).
+
+# Commençons par les avantages
+
+Le passage d'une installation monolithique à une installation containerisée avec des services répartis dans une dizaine de containers donne la flexibilité de choisir le meilleur outil pour chaque tâche :
+
+- les micro-services Python se contentent de containers Alpine ultra-légers (64 Mo de RAM).
+- le service Nextcloud a migré d'un container Alpine à un container ArchLinux. Je n'aurais jamais pensé utiliser Arch sur un serveur mais c'est une bonne solution pour garantir une version stable et toujours à jours en terme de sécurité de Nextcloud.
+- [le middleware RabbitMQ](https://blogduyax.madyanne.fr/2018/mes-notes-sur-rabbitmq) est installé sur sa distribution de prédilection **CentOS** dans un container dédié.
+
+La modularité facilite l'administration du serveur : on a besoin d'un nouveau service, on rajoute un container et on limite les risques de *casser quelque chose* sur l'installation existante.
+
+L'interface Web d'administration de Proxmox est de qualité. Au delà de la gestion des machines virtuelles KVM et des containers LXC, elle donne une vision des ressources CPU /Mémoire consommées par container et au niveau physique.
+
+
+
+# Ce qui n'est pas parfait
+
+J'ai un service Nextloud, aisé à gérer dans un seul container avec l'application, les données et la base de donnée. Pour sauvegarder, c'est moins drôle, cela revient à sauvegarder le container de bientôt 100 Go avec Proxmox et la balancer sur l'espace FTP de 100 Go offert par Online. Autre option, sauvegarder les données du calendrier et les contacts [avec des scripts *maison*](https://blogduyax.madyanne.fr/2015/deploiement-et-sauvegarde/) et mettre en place une sauvegarde classique vers un disque externe des fichiers synchronisés sur mon ordinateur portable. C'est vers cette solution que je m'oriente.
+
+La nuée de services développés par bibi autour du blog (SRMail, Stacosys) serait parfaite pour Docker. Aujourd'hui c'est installé dans des containers LXC, avec des partages de répertoires entre le hôte et les containers pour externaliser la configuration et les données. Docker permettrait de standardiser cet assemblage et d'en profiter à la maison pour facilement remonter un environnement de test.
+
+C'est vraiment le point négatif : j'ai des relations troubles entre la machine hôte et les containers. J'ai installé un serveur NginX sur Proxmox qui fait du proxy vers les NginX des différents containers en fonction du service demandé. J'ai partagé des répertoires entre le hôte et les containers pour externaliser les parties sensibles (la configuration et les données) et faciliter leur sauvegarde puis la machine hôte. Je gère les certificats Let's Encrypt au niveau du hôte aussi. Bref j'ai une installation *custom* de Proxmox avec des containers mais aussi plein de trucs installés au niveau de l'hyperviseur.
+
+# Conclusion
+
+Ca fonctionne bien mais si j'ai un souci (mise à jour de Proxmox qui casse quelque chose, panne du serveur), je risque de passer des jours à tout remettre en service car j'ai tout installé à la mano. L'idée de tout reprendre à zéro en passant plus de temps pour tout containeriser refait surface. L'idéal pour moi serait de tout exécuter dans des containers et d'avoir une seule arborescence de fichiers à sauvegarder. J'avais tâté un peu Docker et je sais que ça prend pas mal de temps de repenser en containers, de choisir les bonnes images de base... Autre bémol, miser sur une seule entreprise ne m'emballe pas, malgré les efforts de l'[Open Container Initiative](https://blog.docker.com/2017/07/demystifying-open-container-initiative-oci-specifications) pour standardiser partiellement la technologie.
+
+Donc j'étudie les options :
+
+- un provisioning avec Ansible d'un container LXC générique
+- l'ajout de Docker à Proxmox pour rajouter Docker au panel KVM / LXC: dockeriser c'est long, donc garder Proxmox permettrait de répondre rapidement à un besoin avec un container LXC, quitte à dockeriser ensuite le service dans un 2ème temps...
+
+Si vous avez des suggestions je suis carrément preneur :-)
\ No newline at end of file
diff --git a/content/blog/2018/2018-05-27-proxmox-reseau.md b/content/blog/2018/2018-05-27-proxmox-reseau.md
new file mode 100755
index 0000000..dd81654
--- /dev/null
+++ b/content/blog/2018/2018-05-27-proxmox-reseau.md
@@ -0,0 +1,116 @@
+---
+layout: post
+title: Proxmox, NAT et DHCP
+categories: Hébergement Containers
+---
+
+J'ai eu beaucoup de retours à [mon dernier article](https://blogduyax.madyanne.fr/2018/hebergement-containers/) qui ont alimenté ma réflexion et m'ont permis de clarifier mon objectif avec mon serveur [Proxmox](https://fr.wikipedia.org/wiki/Proxmox_VE). J'ai décidé de pousser plus loin avec les containers LXC, de ne pas utiliser Docker sur le serveur mais d'améliorer certains aspects de mon installation : containeriser ce que j'ai installé directement sur l'hyperviseur (que ce soit par flemme, pour aller vite ou par manque de connaissances) et automatiser le déploiement de certains containers pour faciliter une éventuelle migration et me permettre d'installer un environnement de test local.
+
+Voici un diagramme à gros grain de l'architecture actuelle :
+
+
+
+Au niveau de l'hyperviseur, on a un pare-feu et une interface *Bridge* et j'ai installé un serveur NginX au niveau de l'hyperviseur qui joue le rôle de proxy Web vers les containers. Cela implique de modifier la configuration de NginX à chaque ajout d'un service Web et donc de se connecter en SSH à l'hyperviseur. C'est le premier point que je compte améliorer en migrant ce serveur Web vers un container. Or les containers sont configurés en IP fixe. Pour simplifier les configurations, je veux attribuer les adresses IP par DHCP et d'utiliser des noms DNS plutôt que des adresses.
+
+Au préalable, approfondissons la configuration réseau de mon Proxmox déjà en place... rien de révolutionnaire car la plupart de ces choix ont été documentés par d'autres (et j'ai seulement assemblé pour arriver à mes fins) mais ça permettra de mieux comprendre la partie DHCP qui arrive ensuite. Mon serveur est [une Dedibox hébergée chez Online](https://www.online.net/fr/serveur-dedie) et Proxmox est une distribution officiellement supportée, donc l'installation initiale est réalisée via l'interface Web d'administration du serveur. De base, une interface physique est configurée avec l'adresse IP fixe du serveur et l'adresse IP de la passerelle. Online attribue une adresse IP fixe à chaque dédibox et on peut acheter des adresses IP supplémentaires. C'est idéal pour associer une adresse IP à chaque container, mais on ne va pas faire ça du tout car :
+
+1. c'est coûteux (2 euros HT par IP / mois) pour le l'auto-hébergement,
+2. chaque container est directement exposé sur Internet donc il doit être capable d'assurer sa sécurité.
+
+On va plutôt créer un réseau privée (non routable sur Internet), caché derrière l'IP publique du serveur. Les containers peuvent envoyer du trafic sortant sans restriction et le trafic entrant passe par le tamis du pare-feu avant d'être redirigé vers le bon container. C'est similaire à ce qu'on a tous à la maison avec un réseau en 192.168.x.x. derrière une box ADSL (ou fibre pour les chanceux). Pour cela on crée une interface *bridge* nommée vmbr0 qui sert de passerelle aux containers et on ajoute une règle de translation d'adresse (NAT) pour faire passer le trafic sortant de vmbr0 vers l'interface physique enp1s0.
+
+Configuration dans */etc/network/interfaces* :
+
+ auto lo
+ iface lo inet loopback
+
+ auto enp1s0
+ iface enp1s0 inet static
+ address xx.xx.xx.xx
+ netmask 255.255.255.0
+ gateway xx.xx.xx.1
+
+ auto vmbr0
+ iface vmbr0 inet static
+ address 10.10.10.1
+ netmask 255.255.255.0
+ bridge_ports none
+ bridge_stp off
+ bridge_fd 0
+ post-up echo 1 > /proc/sys/net/ipv4/ip_forward
+ post-up iptables -t nat -A POSTROUTING -s '10.10.10.0/24' -o enp1s0 -j MASQUERADE
+ post-down iptables -t nat -D POSTROUTING -s '10.10.10.0/24' -o enp1s0 -j MASQUERADE
+
+Sans surprise, le pare-feu de Proxmox est basé sur [iptables](https://fr.wikipedia.org/wiki/Iptables) et l'interface Web facilite vraiment sa configuration en présentant trois niveaux de pare-feu : un niveau datacenter (qui peut contenir plusieurs Proxmox si on gère un cluster), un niveau noeud et un niveau container. On peut activer le pare-feu à chaque niveau.
+
+Ma configuration de base est la suivante :
+
+- au niveau datacenter
+
+ - input policy = DROP : tout le trafic entrant non autorisé explicitement est rejeté
+ - output policy = ACCEPT : tout le trafic sortant est autorisé
+ - autoriser le PING entrant des serveurs ONLINE (62.210.16.0/24) pour qu'ils puissent m'avertir si mon serveur n'est plus joignable
+
+- au niveau noeud (mon proxmox principal)
+
+ - autoriser TCP/8006 entrant : l'accès distant à l'interface Web de Proxmox
+ - autoriser SSH
+ - autoriser HTTP et HTTPS
+
+Pour finaliser l'aspect sécurisé, on peut installer fail2ban pour scruter les logs des services critiques et bannir les fâcheux.
+
+A ce niveau là, on a un Promox opérationnel : les containers en IP fixe dans le réseau 10.10.10.0/24 peuvent communiquer avec l'extérieur. On va modifier le système pour fournir du DHCP. La première action consiste à remplacer [le serveur DNS Bind](https://fr.wikipedia.org/wiki/BIND) fourni avec Proxmox par [Dnsmasq](https://fr.wikipedia.org/wiki/Dnsmasq) qui combine les fonctions DNS et DHCP.
+
+ systemctl disable bind9
+ apt-get install dnsmasq
+
+Et on crée un fichier de configuration dans */etc/dnsmasq.d/containers* :
+
+ domain-needed
+ bogus-priv
+
+ no-poll
+ no-hosts
+
+ no-dhcp-interface=enp1s0
+ interface=vmbr0
+
+ expand-hosts
+ domain=madyanne.lan
+
+ dhcp-authoritative
+ dhcp-leasefile=/tmp/dhcp.leases
+
+ dhcp-range=10.10.10.100,10.10.10.200,255.255.255.0,12h
+ dhcp-option=3,10.10.10.1
+ dhcp-option=19,1
+ dhcp-option=6,10.10.10.1
+
+ cache-size=256
+
+ log-facility=/var/log/dnsmasq.log
+ #log-queries
+
+Quelques points clés de la configuration :
+
+- une allocation DHCP entre 10.10.10.100 et 10.10.10.200
+- on fixe la passerelle de sortie 10.10.10.1
+- un domaine *interne* : madyanne.lan
+- les baux DHCP sont stockés dans un fichier */tmp/dhcp.leases*
+
+Pour tester, je configure un container en DHCP, démarre le container et... ça ne marche pas :-) Le container n'arrive pas à récupérer une adresse IP. En fait, le pare-feu bloque les requêtes DHCP. Je débloque la solution en autorisant les ports UDP/67 et UDP/68 en entrée de l'interface vmbr0.
+
+La configuration du pare-feu au niveau Proxmox est la suivante :
+
+
+
+Ainsi configuré, cela fonctionne ! Dnsmasq ajoute automatiquement les noms obtenus par DHCP à son service DNS. Ainsi depuis n'importe quel container je peux adresser un autre container par nom court :
+
+ # ping dev
+ PING dev (10.10.10.100) 56(84) bytes of data.
+ 64 bytes from dev.madyanne.lan (10.10.10.100): icmp_seq=1 ttl=64 time=0.137 ms
+ 64 bytes from dev.madyanne.lan (10.10.10.100): icmp_seq=2 ttl=64 time=0.076 ms
+
+Il reste un problème en suspens : les containers de type Alpine ont le mauvais goût de ne pas propager leur nom au serveur DHCP ; c'est peut-être paramétrable dans leur [service Udhcpc](https://wiki.alpinelinux.org/wiki/Udhcpc), il faut que je regarde...
+
+Ma prochaine évolution consiste à migrer le serveur NginX installé par mes soins au niveau de le Proxmox vers un container dédié avec la gestion des certificats SSL Let's Encrypt.
\ No newline at end of file
diff --git a/content/blog/2018/2018-08-15-blog-spam.md b/content/blog/2018/2018-08-15-blog-spam.md
new file mode 100755
index 0000000..dc4926c
--- /dev/null
+++ b/content/blog/2018/2018-08-15-blog-spam.md
@@ -0,0 +1,51 @@
+---
+layout: post
+title: Spam des commentaires
+categories: Blog Containers
+tag: planet
+---
+
+Pour lutter contre le spam dans les commentaires du blog, j'ai opté pour la simplicité dès le début parce que l'audience est restreinte, que je ne veux pas compliquer la vie des lecteurs avec des systèmes de captchas (de plus en plus illisibles d'ailleurs) et que [je veux préserver l'accès au blog sans JavaScript](/2017/un-blog-plus-respectueux/) pour les durs, les vrais, les tatoués ;-)
+
+Ma naïve défense est basée sur un [pot de miel](https://fr.wikipedia.org/wiki/Honeypot) : un champ caché dans le formulaire de saisie de commentaire, invisible pour l'humain normalement constitué, qui ne peut donc être rempli que par un bot qui analyse les pages HTML. Ces commentaires sont jetés directement par [mon gestionnaire de commentaires Stacosys](https://github.com/kianby/stacosys). Pendant longtemps, ce fut une défense suffisante ; de rares fois un facheux postait un commentaire pour me vanter un site de vente de pilules : je refusais le commentaire et voilà.
+
+Mais depuis quelques temps, je reçois des rafales de spams : soit les robots sont plus efficaces et analysent aussi la CSS de la page, soit quelqu'un a embauché une armée de zombies pour poster manuellement sur tous les sites à moins de 100 visiteurs / jour. J'ai donc mis en place une 2ème ligne de défense. Quand j'étiquète *spam* le commentaire, Stacosys écrit une ligne de log avec l'adresse IP du spammeur, et [fail2ban](https://github.com/fail2ban/fail2ban) ajoute une règle *iptables* pour le bannir. La méthode n'est pas révolutionnaire, ça a demandé quelques lignes de code dans Stacosys ; ce qui est plus intéressant, c'est sa mise en oeuvre dans une architecture Docker avec un reverse proxy.
+
+
+
+Nginx joue le rôle de *reverse proxy*, il balance les requêtes du blog vers Hugo et le post du formulaire vers Stacosys. Pour ne pas perdre l'adresse IP réelle du visiteur, on la propage jusqu'à Stacosys dans l'attribut HTTP *X-Forwarded-For*.
+
+On a une configuration NginX de ce genre :
+
+ location /newcomment {
+ proxy_set_header Host $host;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $remote_addr;
+ proxy_pass http://stacosys:8100/newcomment;
+ }
+
+ location / {
+ proxy_set_header Host $host;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $remote_addr;
+ proxy_pass http://nginx-blog;
+ }
+
+Stacosys est un container Docker donc l'application (PID 1) écrit ses logs dans la sortie standard (STDOUT) ; c'est le comportement par défaut. Mais, afin d'ajouter des règles *iptables*, le container **fail2ban** a besoin de lire ces logs. On va donc exporter les logs de stacosys vers le container **logger** en rajoutant une section **logging** dans le fichier *docker-compose* qui décrit le lancement du service **stacosys** :
+
+ logging:
+ driver: syslog
+ options:
+ syslog-address: "tcp://127.0.0.1:514"
+ tag: "stacosys"
+
+et le container **logger**, qui n'est rien d'autre qu'un serveur syslog, écrit ses logs dans un volume Docker :
+
+ logger:
+ image: bobrik/syslog-ng
+ volumes:
+ - syslog:/var/log/syslog-ng
+ ports:
+ - "514:514"
+
+ Le volume de données **syslog** est partagé avec le container **fail2ban** qui peut ainsi lire les logs de stacosys, appliquer ses règles de filtrage et définir dynamiquement des règles *iptables* pour bannir les vilains.
\ No newline at end of file
diff --git a/content/blog/2018/2018-10-04-docker-server.md b/content/blog/2018/2018-10-04-docker-server.md
new file mode 100755
index 0000000..ff55523
--- /dev/null
+++ b/content/blog/2018/2018-10-04-docker-server.md
@@ -0,0 +1,186 @@
+---
+layout: post
+title: Installation d'un serveur de containers
+categories: Hébergement Containers
+tag: planet
+---
+
+Plus des notes techniques pour ma mémoire défaillante qu'un véritable article, je vais compiler les étapes d'installation d'un serveur de containers. Quel système d'exploitation ? j'ai envie de dire on s'en cogne mais il est préférable de choisir une distribution poussée par Docker pour se simplifier la vie ; ce sera donc Debian 9 *Stretch* supportée sur Dedibox.
+
+J'installe donc via l'interface d'administration Online. Je choisis le mot de passe *root*, le compte utilisateur et son mot de passe. Online me communique ma configuration réseau :
+
+- Adresse IP : xxx.yyy.zzz.xxx
+- Masque réseau : 255.255.255.0
+- Passerelle : xxx.yyy.zzz.1
+- DNS primaire : 62.210.16.6
+- DNS secondaires : 62.210.16.7
+
+# SSH
+
+Je vérifie qu'on peut se connecter au serveur :
+
+ ssh yax@xxx.yyy.zzz.xxx
+
+Je me déconnecte et génère une clef avec **ssh-keygen**, en choisissant une clef RSA. On peut fournir une *passphrase* si on pense qu'elle peut tomber entre de mauvaises mains. Je nomme ma clef *fr_mondomaine* ; cela génère une clef publique *fr_mondomaine_rsa.pub* et une clef privée *fr_mondomaine_rsa*.
+
+Je copie la clef publique sur le serveur :
+
+ ssh-copy-id -i fr_mondomaine_rsa.pub yax@xxx.yyy.zzz.xxx
+
+On peut simplifier la connexion au serveur en modifiant la configuration du client SSH *~/.ssh/config* de sa machine pour que l'utilisateur et la clef soient choisis sans le spécifier sur la ligne de commande :
+
+ Host fr.mondomaine
+ User yax
+ Hostname xxx.yyy.zzz.xxx
+ IdentityFile ~/.ssh/fr_mondomaine_rsa
+
+Je vérifie qu'on se connecte sans saisir de mot de passe :
+
+ ssh fr.mondomaine
+
+J'interdis complètement la connexion SSH au compte *root*. Pour cela, je me connecte au serveur, je passe en *root* avec **su** et j'édite le fichier de configuration du service SSH */etc/ssh/sshd_config* pour fixer les paramètres suivants :
+
+ PermitRootLogin no
+ PasswordAuthentication no
+
+Je redémarre le service SSH :
+
+ systemctl restart sshd
+
+Et si on s'est raté ou si on perd la clef RSA sur notre PC à la maison ? Et bien on est bon pour redémarrer le serveur en mode secours avec la console Dedibox, monter les partitions et se *chrooter* pour arranger la configuration de SSH. C'est encore faisable facilement car systemd n'a pas encore binarisé tout le système (*troll inside*).
+
+Je ne configure pas **sudo**, je veux pouvoir tout faire avec un utilisateur standard, les connexions à root par **su** doivent rares, principalement pour effectuer les mises à jours du système Debian.
+
+# Docker
+
+Installation de Docker CE sur Debian Stretch avec la procédure officielle qui ajoute des dépôts APT Docker pour récupérer une version de Docker plus récente que celle fournie avec Debian Stretch : https://docs.docker.com/engine/installation/linux/docker-ce/debian/
+
+Installation d'une version récente de **Docker Compose** en suivant aussi la procédure officielle : https://docs.docker.com/compose/install/
+
+Ajout de l'utilisateur yax dans le groupe docker
+
+ usermod -aG docker yax
+
+Démarrage automatique de Docker:
+
+ systemctl enable docker
+
+# Pare-feu
+
+J'installe **shorewall** pour IPv4, un pare-feu puissant qui ne rajoute pas de service supplémentaire au système puisqu'il traduit ses règles assez complexes en règles *iptables*.
+
+ apt-get install shorewall
+
+Par sécurité, le temps de mettre au point les règles, je désactive le démarrage automatique :
+
+ systemctl disable shorewall
+
+Si ça foire, je pourrai toujours forcer un redémarrage électrique du serveur :-)
+
+Docker a la particularité de gérer ses propres règles *iptables* pour l'accès aux containers ce qui rend sa cohabitation délicate avec tout pare-feu basé sur *iptables* Depuis quelques versions, Shorewall supporte Docker, ce qui revient à dire qu'il le laisse faire sa sauce et gère les règles *iptables* qui lui sont propres.
+
+Donc j'édite */etc/shorewall/shorewall.conf* et déclare que je vais utiliser Docker :
+
+ STARTUP_ENABLED=Yes
+ DOCKER=Yes
+
+Puis j'édite */etc/shorewall/zones* pour définir mes zones :
+
+ #ZONE TYPE OPTIONS
+ fw firewall
+ net ipv4
+ dock ipv4 # 'dock' is just an example
+
+Et les règles de passage d'une zone à l'autre en éditant */etc/shorewall/policy* :
+
+ #SOURCE DEST POLICY LEVEL
+ $FW net ACCEPT
+ net all DROP info
+ dock $FW REJECT
+ dock all ACCEPT
+ # last rule
+ all all REJECT info
+
+Enfin, j'associe les zones aux interfaces physiques (attention *enp1s0* est le nom de l'interface Ethernet de mon serveur), en éditant */etc/shorewall/interfaces* :
+
+ ?FORMAT 2
+ #ZONE INTERFACE OPTIONS
+ net enp1s0 dhcp,tcpflags,logmartians,nosmurfs,sourceroute=0
+ dock docker0 bridge,routeback=0 #Disallow ICC
+
+Là on a un pare-feu opérationnel qui refuse toute connexion entrante ; on ajoute quelques règles pour autoriser le PING ICMP et les connexions SSH avec une limite de 3 connexions par minute (pour calmer les facheux).
+
+Ca se passe dans le fichier */etc/shorewall/rules* :
+
+ #ACTION SOURCE DEST PROTO DEST SOURCE ORIGINAL RATE USER/ MARK CONNLIMIT TIME HEADERS SWITCH HELPER
+ # PORT PORT(S) DEST LIMIT GROUP
+ ?SECTION ALL
+ ?SECTION ESTABLISHED
+ ?SECTION RELATED
+ ?SECTION INVALID
+ ?SECTION UNTRACKED
+ ?SECTION NEW
+
+ # Drop packets in the INVALID state
+
+ Invalid(DROP) net $FW tcp
+
+ # Drop Ping from the "bad" net zone.. and prevent your log from being flooded..
+
+ Ping(ACCEPT) net $FW
+
+ # Permit all ICMP traffic FROM the firewall TO the net zone
+ ACCEPT $FW net icmp
+
+ SSH(ACCEPT) net all - - - - s:1/min:3
+
+
+# Tester la sécurité
+
+Là ça devient plus amusant ! Je reboote et je démarre manuellement shorewall puis je jette un oeil à la bonne cohabitation des règles **iptables** entre Shorewall et Docker :
+
+ iptables -L -n -v
+
+D'abord je teste les accès distants :
+
+- on peut scanner les ports avec NMAP depuis sa machine : on voit le port 22 ouvert
+- on vérifie facilement que SSH est limité à 3 connexions par minute
+
+Enfin je teste la sécurité intra-docker en déployant 3 containers Docker avec [l'image tcpping](https://hub.docker.com/r/kianby/tcpping/) :
+
+ version: "3"
+ services:
+ web1:
+ image: tcpping
+ expose:
+ - 80
+ networks:
+ - frontend
+ web2:
+ image: tcpping
+ networks:
+ - frontend
+ - backend
+ web3:
+ image: tcpping
+ ports:
+ - 8000:80
+ networks:
+ - backend
+ networks:
+ frontend:
+ backend:
+
+Les containers web1 et web2 sont sur le réseau *frontend*
+Les containers web2 et web3 sont sur le réseau *backend*
+
+Je vérifie les points suivants :
+
+- chaque container peut accèder à Internet
+- aucun container ne peut accéder au serveur : ni ping, ni SSH
+- web1 et web2 se voient en ICMP et en TCP 80
+- web2 et web3 se voient en ICMP et en TCP 80
+
+Je refais un scan de port plus poussé avec NMAP et je vois que le port 22 et 8000 (celui de web3) sont accessibles depuis Internet.
+
+Si je liste les règles *iptables*, je remarque que l'isolation des réseaux entre les containers donne lieu à des règles *iptables* supplémentaires.
\ No newline at end of file
diff --git a/content/blog/2018/2018-10-07-gadgetbridge.md b/content/blog/2018/2018-10-07-gadgetbridge.md
new file mode 100755
index 0000000..a86a173
--- /dev/null
+++ b/content/blog/2018/2018-10-07-gadgetbridge.md
@@ -0,0 +1,40 @@
+---
+layout: post
+title: Gadget Bridge et autres connectés
+category: Matériel
+tag: planet
+---
+
+Je porte un bracelet Xiaomi Mi-Band connecté depuis Noël dernier. Ce n'est pas un cadeau tentateur pour libriste en perdition mais un achat assumé. L'angoisse de l'approche de la cinquantaine probablement, je voulais moi aussi mesurer la qualité de mon sommeil et mon manque d'activité physique, bref vérifier [si moi aussi je ne serais pas l'homme du 21ème siècle.](https://www.youtube.com/watch?v=AEv9VLQegvY&list=PLTwkIOfLU8_reQI_2mapPF4zv2Co6lSTg&index=8) Je pensais que ça m'amuserait quelques semaines mais c'est devenu une habitude et ça a aidé à une reprise d'activité sportive plus régulière.
+
+Le bracelet est autonome ; il a des capteurs, il enregistre et à l'occasion on synchronise les données vers une application mobile. Dans ce mode, il a une autonomie de 4 à 6 semaines, c'est impressionnant. On peut aussi l'utiliser en mode connecté au téléphone pour envoyer des notifications en temps réel : appels, messages. Ce mode est beaucoup plus consommateur en batterie (du bracelet et du téléphone).
+
+J'ai utilisé l'objet en mode autonome pendant plusieurs mois. Le premier jour, j'ai installé l'application officielle Xiaomi qui s'occupe aussi des mises à jour du firmware. Il faut créer un compte chez Xiaomi (sic!)
+et le lendemain matin on apprend qu'on a mieux dormi que 43% des autres ~~membres du troupeau~~ utilisateurs. Et oui, le ticket d'entrée du 21ème siècle coûte le leg de ses données personnelles... que deviennent les données ensuite ? combien d'années avant qu'elles soient revendues à mon groupement mutualiste qui me fera un tarif santé fonction de mon rythme de vie ? Bref, on sait où ça mène !
+
+Donc déconnexion de l'appli officielle et recherche d'une meilleure solution ; je n'ai pas cherché longtemps, je traîne suffisamment sur [la boutique F-Droid](https://f-droid.org) pour avoir remarqué l'application [Gadgetbridge](https://github.com/Freeyourgadget/Gadgetbridge) qui :
+
+- gère la plupart des bracelets / montres Xiaomi et les Pebble,
+- conserve les données sur l'appareil et propose même un import / export de la base de données
+- propose des fonctionnalités communes à tous les équipements supportés : activité (compteur de pas), qualification du sommeil, réveil,
+- des fonctionnalités spécifiques en fonction du type de bracelet ou de montre joliment détaillées [dans cette matrice](https://github.com/Freeyourgadget/Gadgetbridge/blob/master/FEATURES.md)
+
+Je n'ai pas parlé de la fonction réveil. Ca peut sembler anecdotique mais quand on est traumatisé par les sonneries à l'aube, on échange volontiers contre la douce vibration du bracelet.
+
+
+
+Récemment je suis passé dans le mode d'utilisation connecté au téléphone alors que je refusais, au début, ce fil à la patte. Mais avec ces téléphones Android un peu récents, tous identiques, rectangulaires, sans saveur où les constructeur ont le droit de choisir la taille et la qualité de l'appareil photo mais surtout aucune personnalisation matérielle non validée par le dieu Google, on n'a même plus la LED de notification qu'on trouvait sur les premiers modèles et on se retrouve finalement à les allumer régulièrement juste pour vérifier si on n'a pas raté un appel ou un SMS important. J'ai donc commencé à utiliser le mode notification du bracelet en environnement professionnel.
+
+La notification sur le bracelet Mi Band 2 est minimale : on sait que le téléphone (en vibreur dans un coin) sonne ou qu'on a reçu un message. C'est déjà pas mal et ça m'a donné envie de passer au niveau supérieur avec la montre Xiaomi Amazfit Bip qui reçoit les messages SMS, affiche le nom des correspondants des appels et peut même afficher les prévisions météorologiques. Pour le reste on retrouve les fonctionnalités du bracelet Mi Band (someil, activité) et la même technologie d'écran qui fournit une autonomie de plusieurs semaines. C'est ce qui a entériné mon choix d'ailleurs, je fuis les montres qu'il faut recharger chaque soir.
+
+C'est donc mon cadeau d'anniversaire (merci M. de mon coeur), étrenné depuis 2 semaines, toujours de concert avec Gadgetbridge qui est la meilleure solution pour ce matériel car il sait résoudre le problème des accents. En effet, la montre propos un firmware chinois et un firmware anglais pour l'international. Soit on teste des firmware non officiels pour le français, soit on reste en international ce qui est mon choix. Et dans ce cas-ci, les SMS sont épurés de leurs caractères accentués ce qui complique un peu la lecture. Gadgetbridge fournit un paramètre *transcription* qui remplace les accents par leur équivalent ASCII : "é" devient "e", ce qui est bien mieux qu'un abscons symbole ¤
+
+La fonction météo semblait mal engagée mais on trouve l'application *Weather Notification* sur F-DROID qui fournit les prévisions de OpenWeather Map à GadgetBridge et cela fonctionne très bien.
+
+Enfin que serait une montre connectée sans la possibilité de changer de cadran au gré de ses humeurs. Le site [Amazfitwatchfaces](https://amazfitwatchfaces.com/bip/) recense les contributions des graphistes et permet de télécharger des nouveaux cadrans. On peut créer un compte et voter pour les meilleurs artistes pour les encourager, c'est bon enfant.
+
+
+
+Bon voilà je suis revenu sur Android et je suis connecté. A ce propose je remercie le talentueux [Bunnyy](https://forum.xda-developers.com/member.php?u=8946392) pour le portage de [la ROM Resurection Remix](https://forum.xda-developers.com/samsung-a-series/development/rom-resurrection-remix-rr-v6-unofficial-t3765542) sur Samsung A5 2016 : je compte sur toi pour faire fonctionner les appels Bluetooth sous peu.
+
+Est-ce que je suis entré dans le 21ème siècle ? un peu mais tout est loin de me plaire et j'essaie de ne choisir que les meilleurs côtés :-)
\ No newline at end of file
diff --git a/content/blog/2018/2018-11-03-il-court-furet.md b/content/blog/2018/2018-11-03-il-court-furet.md
new file mode 100755
index 0000000..f649e62
--- /dev/null
+++ b/content/blog/2018/2018-11-03-il-court-furet.md
@@ -0,0 +1,42 @@
+---
+layout: post
+title: Il court, il court, le furet
+categories: Humeur Containers
+---
+
+Il court, il court, le furet... ça résume à peu près mes semaines en ce moment. Le thème de celle-ci (oui j'ai des semaines à thème) est la vente d'électro-ménager sur le site du Bon Coin (à ne pas confondre avec le bon sens près de chez vous) pour cause de rénovation. D'ailleurs si quelqu'un veut un frigo pas cher qu'il me contacte ;-)
+
+Mon expérience passée des annonces m'a définitivement vacciné d'afficher mon téléphone ou mon e-mail principal. Heureusement on peut masquer son téléphone le temps de s'assurer que la personne est vraiment interessée. Quant à l'e-mail, un jetable ferait l'affaire. Bon un jetable du style [10 minutes e-mail](https://10minutemail.com) c'est un peu court pour une annonce destinée à être publiée une semaine. Du coup il me reste deux options :
+
+1. créer un alias ou un e-mail chez moi puisque je suis maître de mon ~~destin~~ domaine
+2. créer une boite chez un fournisseur
+
+Je cherche un fournisseur respectable qui propose le service de transfert des e-mails pour tout rediriger sur mon e-mail principal. Je pensais que La Poste propose ce service mais il semble que cette époque soit révolue. Après quelques égarements avec des offres floues qui annoncent des options qui s'avèrent finalement payantes (n'est-ce pas Net-C) je finis chez un GAFAM et tant qu'à faire le plus gros de tous : Google... *applaudissements du lectorat en liesse, perte de ceux qui manquent d'humour*
+
+Alors Google c'est *all inclusive* : récupération des autres boites e-mail (miam miam de la donnée), transfert vers une autre boite (pas grave j'ai tout lu au passage), toutes les options avancées sont offertes. Au moins le contrat est clair : tu as un service haut de gamme mais tu paies avec tes données. Pas de souci, ils vont se régaler avec mes conversations dartyesque :-)
+
+Bon utiliser Google d'accord, mais soyons un peu parano en évitant de transférer les e-mails vers ma boite principale ; inutile de donner un lien facile à établir, faisons transpirer un peu leur IA. Je peux récupérer les e-mail à distance mais GMail râle dès qu'on active IMAP ou POP3 qu'il considère, à raison, comme des protocoles moins sécurisés. Je vais donc faire un rebond : GMail transfère tous les e-mails vers ma vénérable boite e-mail Free et je prévois de rapatrier celle-ci vers mon e-mail principal par POP3.
+
+Bon rapatrier une boite e-mail par POP3 et faire un transfert SMTP c'est pas sorcier, il y a plein de documentation sur fetchmail / procmail / les relay MTA. C'est vrai et j'ai passé un couple d'heures à paramétrer tout cela pour finalement jeter l'éponge : manque de temps sur mon planning de furet et moins de goût à peaufiner une config système au poil pendant des heures. Du coup, j'ai mis ma casquette de codeur et réglé le problème par code en une heure de temps avec Python et ses librairies SMTP et POP3 incluses dans un projet nommé [popforward](https://github.com/kianby/popforward) ; *vous apprécierez ma créativité pour le nommage*.
+
+A ce stade, vous pensez : *"c'est bizarre il ne nous a pas encore bassiné avec Docker"*... j'y viens :-)
+
+La mise en prod a pris 15 minutes chrono : écriture d'un docker-compose en utilisant [mon image pour les applications Python](https://hub.docker.com/r/kianby/pythonapp/) et déploiement sur le serveur de containers.
+
+``` docker
+popforward:
+ image: kianby/pythonapp:latest
+ environment:
+ APP_NAME: popforward
+ APP_CONFIG: /app/config.ini
+ volumes:
+ - ${SOURCEDIR}/popforward:/app/popforward
+ - ${DATADIR}/popforward/popforward.config.ini:/app/config.ini
+```
+
+Bon... je retourne courir !
+
+
+
+*[Photo by Alex Makarov on Unsplash](https://unsplash.com/photos/pIarqh5GU0I?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText)*
+
diff --git a/content/blog/2018/2018-12-02-retour-migration-docker.md b/content/blog/2018/2018-12-02-retour-migration-docker.md
new file mode 100755
index 0000000..c720f75
--- /dev/null
+++ b/content/blog/2018/2018-12-02-retour-migration-docker.md
@@ -0,0 +1,60 @@
+---
+layout: post
+title: Retour sur la migration vers Docker
+categories: Containers Hébergement
+tag: planet
+---
+
+Ce ne sera pas un scoop car j'ai distillé l'information à travers mes derniers articles : j'ai transformé mon serveur de virtualisation en serveur de containers Docker depuis quelques mois. C'est l'occasion de faire un bilan en listant ce qui a bien fonctionné mais aussi ce qui a posé problème, et les avantages et inconvénients d'un serveur de containers. Au préalable, je n'utilise pas Docker dans un contexte professionnel mais pour héberger mes services personnels.
+
+Docker n'est pas une lubie... je suis ses avancées depuis plus de trois ans. Il a eu sa période très instable où le choix de la distribution et surtout du kernel étaient primordiaux, puis celle où la sécurité était discutable. Mais aujourd'hui il est difficile de trouver des arguments pour ne pas au moins l'essayer. Docker est une vague de fond qui a déjà conquis les grandes entreprises et les développeurs. Ces derniers maintiennent de plus en plus souvent une version Docker de leurs logiciels en plus (mais jusqu'à quand ?) des paquets pour telle ou telle distribution. [J'ai déjà abordé le sujet](https://blogduyax.madyanne.fr/2018/quel-systeme-serveur/) : pour moi Docker, c'est la fin de la distribution serveur à court terme comme [flatpak et consorts](https://fr.wikipedia.org/wiki/Flatpak) annoncent la fin de la distribution bureau à moyen terme.
+
+On entend souvent :
+
+ Docker n'a rien inventé, les containers existaient déjà !
+
+Oui c'est vrai, on avait déjà chroot, LXC, OpenVz, les jails. D'ailleurs Docker s'est appuyé sur LXC dans ses premières versions. Mais ça, c'est la plomberie du sous-sol. C'est nécessaire et ça doit être performant mais ça ne résume pas Docker et ça n'explique pas son succès qui, pour moi, a 3 raisons principales :
+
+1. l'abstraction (partielle) au système d'exploitation, ce qui donne accès à Docker à un autre public que des ingénieurs système
+2. un langage de description *Dockerfile* / *docker-compose.yml* facile d'apprentissage
+3. et, surtout, un écosystème communautaire : je parle bien sûr du marché au containers : [le Hub](https://hub.docker.com/)
+
+Si je fais un parallèle rapide avec le langage Java, Maven a beaucoup concouru à son succès en donnant accès à toutes les librairies tierces Open Source. Et bien c'est exactement ce que fait Docker avec le hub : récupérer une image pour l'enrichir et fabriquer la sienne.
+
+On est en plein dans l'essence même de l'Open Source, le partage. Il faut toutefois prendre des précautions :
+
+- priviligier une image officielle d'un logiciel
+- ne pas se dispenser de lire son Dockerfile pour voir comment elle est construite et sur quelles couches elle s'appuie
+
+En fait, ce sont les mêmes réflexes qu'avec l'intégration d'une librairie inconnue à son programme. Cela explique aussi l'engouement des développeurs pour Docker et on peut faire plein de parallèles avec le développement. J'ai passé du temps à pratiquer et j'ai pris de la compétence progressivement. Je pense avoir atteint le 2ème dan, selon ma vision de la courbe d'apprentissage de Docker :
+
+- **1er dan** : docker file : écriture, réutilisation, exposition / attachement de ports, utilisation des volumes, publication dans une registry
+- **2ème dan** : docker compose : composition de containers, communication intra-container, compréhension du cycle de vie des images et des containers
+- **3ème dan** : orchestration, supervision, sécurité avancée : Kubernetes, Docker Swarm, audits de sécurité
+
+Ma prochaine étape est d'effleurer le 3ème dan avec Swarm. Faute de ressources matérielles suffisantes, je ne me formerai probablement pas à Kubernetes dans la sphère personnelle.
+
+Pour progresser, j'ai déployé au plus vite pour me confronter en situation réelle. A l'époque, mon serveur fonctionnait avec des containers LXC dans Proxmox. Il a donc été aisé de migrer des bouts vers Docker sans faire la bascule d'un coup. De plus, j'avais le pare-feu de Proxmox et mes containers s'exécutaient dans une marchine virtuelle KVM ; cela m'a permis de me concentrer sur la création des images et des containers et retarder l'apprentissage de la sécurisation.
+
+Une bonne partie des containers font tourner des projets persos écrits en Python. j'ai donc naturellement créé une image commune pour les applications Python. Par paresse et comme je ne suis pas dans un contexte professionnel, j'ai réutilisé la même image pour plusieurs containers / applications en connectant un volume avec les sources Python dessus. Dans un contexte professionnel, j'aurais créé une image versionnée pour chaque application embarquant les sources. J'ai publié mes [quelques images sur le Hub](https://hub.docker.com/u/kianby/) et les sources sont [sur mon GitHub](https://github.com/kianby/docker)
+
+J'ai basé mon démarrage sur un simple fichier docker-compose qui décrit tous mes containers et une commande *docker-compose up* pour tout démarrer. Quand je me suis senti à l'aise et capable de sécuriser correctement Docker, [j'ai réinstallé le serveur de zéro avec une Debian et Docker](https://blogduyax.madyanne.fr/2018/installation-dun-serveur-de-containers/) pour en faire un serveur de containers bare metal.
+
+Pour la supervision, je suis resté simple en installant [Portainer](https://www.portainer.io/) pour redémarrer les containers, voir les logs... et [Glances](https://nicolargo.github.io/glances/) pour avoir une vision détaillés de l'usage des ressources. Les 2 outils sont s'exécutent eux-même dans des containers.
+
+Voilà j'en suis à 18 containers déployés avec 30% des 4 Go de RAM du serveur utilisé. Les performances sont très proches d'une installation monolithique. Docker demande un peu plus de RAM car même si les images sont légères on duplique des OS légers. En tout cas, on est très au dessus des performances de la virtualisation.
+
+Le plus gros bénéfice de ma migration est un environnement de test identique, le truc que je n'ai jamais pu avoir auparavant. Pour cela, j'ai souscrit un nom de domaine .space à 0,99 centimes (merci les promos) et j'ai décliné la configuration de mon environnement sur ce domaine. Résultat, j'ai un environnement complet qui tourne sur mon PC de développement : très appréciable quand la moitié des containers exécutent du code écrit par soi-même et quand on veut tester des nouveaux containers avant de les mettre en production. Autre avantage, la sauvegarde en un tour de main : une arborescence de données, quelques volumes Docker.
+
+Ce qui a moins bien marché, c'est le 1er démarrage de mes containers Python dépendants les uns des autres et habitués à avoir les services dépendants opérationnels. Dans Compose, on ne définit ~~pas~~ plus d'ordre de démarrage. le cycle de vie des containers est aussi plus volatile : une modification de *docker-compose* recrée juste les containers impactés. On a donc plus souvent des containers détruits / recréés. C'est donc une bonne approche d'avoir du code orienté micro-services, capable de :
+
+- gérer la non disponibilité d'un service en fournissant un service dégradé
+- stocker localement les données reçues pour les traiter quand l'ensemble du système redevient opérationnel
+
+J'ai donc revu le code de certains de mes projets pour leur ajouter une base de donnée locale SQLite et gérer le dynamisme de l'environnement. C'est positif et pas forcé par Docker ; son fonctionnement rend juste cette approche pertinente et on obtient du code plus résilient. Je suis très satisfait de cette migration et pas prêt de revenir en arrière.
+
+
+
+**Est-ce que Docker est indétrônable ? Est-ce qu'il y aura une alternative libre ?**
+
+Une partie de Docker est sous licence Open Source et on a des alternatives pour l'exécution de containers (comme rkt de CoreOS). L'arrivée un peu tardive de Swarm et les lacunes de ses premières versions ont permis à Kubernetes de remporter une grosse partie du marché de l'orchestration. Mais Docker a construit une communauté ces cinq dernières années et démocratisé la publication de containers au format Dockerfile, difficile d'imaginer qu'il puisse disparaitre comme ça. En tout cas, je pense que la mode de la containerisation a gagné le marché durablement.
diff --git a/content/blog/2019/2019-01-12-sarah-connor.md b/content/blog/2019/2019-01-12-sarah-connor.md
new file mode 100755
index 0000000..de9744e
--- /dev/null
+++ b/content/blog/2019/2019-01-12-sarah-connor.md
@@ -0,0 +1,26 @@
+---
+layout: post
+title: Sarah Connor ?
+category: Humeur
+---
+
+Quels voeux pour cette nouvelle année ? Rien ! Du moins rien d'annoncé à la cantonnade aux proches, mes voeux les plus chers restent à l'intérieur, bien enfouis comme si cela augmente leurs chances de se réaliser. Depuis 10 ans, je me sens dans la tête de Sarah Connors, vous savez l'héroïne de Terminator, celle qui sait que le monde va basculer, et qui s'y prépare pendant les années qui restent pendant que le reste du monde continue à tourner.
+
+Aucun envoyé du futur n'est venu m'annoncer de catastrophe (pour terminer le parallèle avec Terminator) mais je m'intéresse à beaucoup de domaines en dehors de l'informatique et Internet est une source inépuisable depuis longtemps. J'avais un excellent professeur d'histoire-géographie au lycée qui nous demandait de regarder le JT la veille des cours. Le lendemain, il prenait un sujet abordé brièvement (comme tous les sujets enchaînés au journal télévisé), c'était souvent un sujet international et il remontait le temps pour nous expliquer les tenants et aboutissants et finalement nous faire comprendre le présent. J'adorais et c'est cette année là que j'ai compris, bien tardivement, à quoit servait vraiment l'Histoire.
+
+Vers 2006, je découvrais [le blog de Paul Jorion](https://www.pauljorion.com/blog/) et ses articles économiques qui donnaient une lecture de l'actualité différente des médias traditionnels ; c'était construit, justifié, scientifique et petit à petit ça montrait l'imminence d'une crise financière alors que personne n'en parlait. Et elle est arrivée, [la fameuse crise](https://fr.wikipedia.org/wiki/Crise_financi%C3%A8re_mondiale_de_2007-2008) ! Des gens ont perdu leur emploi et leur maison, des banques ont fait faillite. C'était la preuve que le système financier basé sur la croissance infinie ne peut plus fonctionner et, selon moi, le coup de semonce annonciateur d'une nouvelle ère où on allait repenser tout ce qui ne marche pas : le consumérisme à outrance, la spéculation sur les récoltes, les fonds de pension... la liste est longue ; et naïvement je pensais qu'on reviendrait à un capitalisme modéré qui ne mise plus sur des bulles mais sur la vraie valeur des entreprises et le développement durable. Naïveté quant tu nous tiens... les choses ont repris sur le même tempo ; on a condamné quelques sous-fifres, réinjecté de l'argent public dans les banques pour sécher les larmes des banquiers, et dans quelques grosses entreprises qui faisaient un chantage au chômage (comme l'industrie automobile au U.S.) et repris le Business as usual.
+
+Mais dans ma tête, la certitude que ça ne pouvait pas aller bien loin sans changement était ancrée. Et le courant de la collapsologie, qui a depuis peu des articles dans [la presse grand public](https://www.lemonde.fr/climat/article/2018/12/14/pablo-servigne-il-est-possible-que-nos-societes-industrielles-se-degradent-beaucoup-plus-rapidement-que-les-anciennes-civilisations_5397728_1652612.html), confirme que ce n'est plus une idée marginale. Le sujet est devenu *mainstream* car beaucoup de gens en ont pris conscience et sont inquiets. Certains ont dépassé le stade du deuil, l'étape difficile où il faut accepter que le monde que nous avons connu va changer drastiquement et irrémédiablement, et ils se tiennent au courant, veulent savoir quelles crises surviendront en premier et comment se préparer pour en souffrir le moins. Face à ce futur pas très réjouissant, je constate deux réactions la plupart du temps :
+
+- les croyants en un Dieu technologique, certains que des scientifiques ont déjà toutes les solutions dans un tiroir de leur bureau et que quand on n'aura plus de pétrole, on les mettra en place en un claquement de doigt.
+- les gens qui sont dans le déni ou l'optimisme béat : ce n'est pas possible, l'homme est résilient, il en a connu d'autres... et qui espèrent surtout que le pire arrivera après eux, que leurs enfant gèreront quoi :-(
+
+La décroissance, ce n'est pas la fin du monde... mais ça y ressemble un peu. Et pendant que des scientifiques brillants gaspillent leurs neurones pour installer une colonie sur Mars ou construire des voitures sans chauffeur pour que des crétins puissent consulter leur fil Facebook au lieu de conduire, les grandes décisions ne sont pas prises. L'écologie c'est super mais ça ne va pas assez vite car il ne faut brusquer personne : ni les états, ni les grandes entreprises, ni les citoyens. Les politiques ne sont élus que pour 4 ans, les entreprises veulent du profit, les citoyens ne sont pas prêts à changer de paradigme. Et c'est là le drame de la situation : regarder l'iceberg se rapprocher pendant que les gens dansent devant l'orchestre.
+
+Moi l'optimisme forcé, ça n'a jamais été mon fort ; je préfère la lucidité et je constate la révision des données chaque année, ce pic pétrolier qu'on estimait vers 2050 et qui est déjà derrière nous, l'emballement du réchauffement qui force les scientifiques à réajuster leurs projections chaque semestre. Alors il ne faut pas prendre toutes les études pessimistes pour argent comptant et sombrer dans le désespoir mais se tenir au courant, essayer de faire la part des choses et voir comment se positionner face aux bouleversements à venir (je trie mes déchets mais ça ne suffit pas).
+
+Quelques références en vrac :
+
+1. Usbek et Rica : [Lanceurs d'alerte ou survivalistes sectaires : qui sont vraiment les collapsologues ?](https://usbeketrica.com/article/lanceurs-d-alerte-ou-survivalistes-sectaires-qui-sont-vraiment-les-collapsologues)
+2. Peertube: [Pablo Servigne : penser l'effondrement de notre monde](https://peertube.fr/videos/watch/5c59e576-f56c-4178-bd0a-bfca7b75db3d)
+3. partage-le.com : [Nicolas Casaux : Le problème de la collapsologie](http://partage-le.com/2018/01/8648/)
\ No newline at end of file
diff --git a/content/blog/2019/2019-02-07-bilan-hebergement.md b/content/blog/2019/2019-02-07-bilan-hebergement.md
new file mode 100755
index 0000000..21ab8c8
--- /dev/null
+++ b/content/blog/2019/2019-02-07-bilan-hebergement.md
@@ -0,0 +1,38 @@
+---
+layout: post
+title: Bilan hébergement 2018
+category: Hébergement
+tag: planet
+---
+
+Voici un rapide état de l'hébergement et des changements survenus l'année dernière. Mon serveur est toujours chez Online mais j'ai troqué ma Dédibox Start avec 1 téra de disque SATA contre le modèle avec 120 giga de SSD et je sens vraiment la différence sur la latence des services Web. Je ne m'étends pas sur la migration de OpenBSD vers Proxmox puis Docker en 14 mois, largement décrite [ici](https://blogduyax.madyanne.fr/2018/hebergement-containers/) et [là](https://blogduyax.madyanne.fr/2018/retour-sur-la-migration-vers-docker/).
+
+### Mes incontournables
+
+Mes services hébergés restent essentiellement les mêmes.
+
+J'use et abuse de l'excellent [Wallabag](https://wallabag.org/fr) pour lire en différé mes articles rencontrés au détour d'une recherche.
+
+Je lis quotidiennent mes flux RSS. J'ai récemment viré Tiny Tiny RSS dont l'application mobile m'insupportait de plus en plus pour une découverte opportune (merci F-Droid): [Selfoss](https://www.selfoss.aditu.de/) qui prouve qu'on peut faire mieux avec moins (au revoir PostgreSQL et bonjour SQLite) et avoir une application mobile **ergonomique**.
+
+C'est d'ailleurs mon leitmotiv : privilégier le minimalisme s'il apporte le service rendu et l'isolation des services (Docker quoi) donc SQLite c'est parfait.
+
+Je suis toujours fan de [Shaarli](https://sebsauvage.net/wiki/doku.php?id=php:shaarli) qui stocke mes favoris depuis presque 5 ans.
+
+Le blog est toujours là, propulsé par [Hugo](https://gohugo.io/), mais j'ai viré tout analyseur de trafic.
+
+### Les disparitions
+
+Je n'héberge plus mon cloud. Ce n'est pas une décision technique (j'ai géré mon Nextcloud pas mal de temps), mais une volonté de déléguer à des tiers de confiance ce qui me prend du temps à administrer. J'ai commencé avec [la gestion des mots de passe](https://blogduyax.madyanne.fr/2018/les-mots-de-passe/) déléguée à BitWarden (ce qui fait grincer les dents de quelques libristes).
+
+J'ai confié mes données à [Cozy Cloud](https://cozy.io) ; j'ai choisi l'offre d'hébergement 1 téra que je teste toujours gracieusement (merci les gars !). Cozy c'est plus que du stockage de fichier, c'est un concept qui n'a pas d'équivalent (du moins unifié dans le même outil) avec sa panoplie de connecteurs pour récupérer ses factures et ses remboursements de santé. Le partenariat avec Linxo est génial (et je ne dis pas ça parce que Linxo est réussite locale) car il apporte une analyse des données et effectue des rapprochements intelligents (un remboursement de sécu et le paiement du médecin généraliste par exemple). L'équipe de Cozy est sympa, accessible. Moi je suis une feignasse car j'ai commencé à développer un connecteur pour récupérer les factures des Eaux de Marseille mais c'est en chantier :-(
+
+J'ai délégué la gestion de mon agenda et de mes contacts à l'association *a mère Zaclys* qui propose (entre autre service) une instance Nextcloud. C'est de l'associatif et je n'ai pas souvenir d'une seule interruption de service sur l'année écoulée. Pour quelques euros à l'année, on ~~peut~~ doit les encourager à continuer :-)
+
+### Les nouveautés 2018
+
+J'ai découvert [Jirafeau](https://gitlab.com/mojo42/Jirafeau) pour partager simplement des fichiers. Je ne l'utilise pas beaucoup mais j'ai aimé l'outil donc je l'ai ajouté à ma panoplie... en 30 minutes (je vous ai parlé de Docker ?).
+
+J'ai eu besoin de garder trace des corrections et évolutions de mes projets persos et d'écrire un peu de documentation. Comme je ne voulais pas dépendre plus de GitHub, j'ai installé mon [service Redmine](https://www.redmine.org/) qui regroupe dans le même outil une gestion de tickets et un Wiki. Ca fait le job mais je trouve l'interface un peu molle et je suis pas convaincu par l'ergonomie générale. Si je trouve une meilleure alternative, je migrerai.
+
+J'ai commencé à utiliser [Qwant](https://www.qwant.com) à 100% en début 2018, en perso et en pro et je suis satisfait des résultats. Au début, il m'arrivait de vérifier pertinence d'un résultat de recherche (souvent anglophone) en faisant appel à Google. Ce n'est plus le cas, je suis convaincu de la qualité du résultat. On peut vraiment être fier de Qwant (Cocorico !). Je n'en dirai pas autant de Mozilla, je reste un grand supporter de Firefox mais la confiance a été écornée donc je leur confie ma navigation mais pas plus.
diff --git a/content/blog/2019/2019-02-08-url-hugo.md b/content/blog/2019/2019-02-08-url-hugo.md
new file mode 100755
index 0000000..2143342
--- /dev/null
+++ b/content/blog/2019/2019-02-08-url-hugo.md
@@ -0,0 +1,36 @@
+---
+layout: post
+title: Hugo et les URLs
+category: Blog
+---
+
+J'ai publié le dernier article avec un accent dans l'URL : https://blogduyax.madyanne.fr/2019/bilan-h%C3%A9bergement-2018/
+
+Le moteur de blog Hugo compose lui-même l'URL à partir du titre de l'article. C'est commode mais toujours heureux. Et le temps que je m'en aperçoive, trois commentaires avaient été postés sur l'article. Que fait-on quand un a bug non corrigé par ~~manque de temps~~ **fainéantise** dans [son système de gestion de commentaires](https://github.com/kianby/stacosys) ?
+
+1. on corrige le bug
+2. on modifie l'URL de l'article
+
+La première option est trop dure un vendredi soir donc j'ai opté pour la seconde.
+
+Modifier une URL avec Hugo, ce n'est pas difficile : il suffit de rajouter un **slug** à l'entête de l'article pour définir soi-même l'URL :
+
+ slug = "bilan-hebergement-2018"
+
+Et paf, l'article est accessible ici : https://blogduyax.madyanne.fr/2019/bilan-hebergement-2018/
+
+Mais quid des agrégateurs de liens comme [le Journal du Hacker](https://www.journalduhacker.net) et des lecteurs qui ont mis l'article en favori ? Ils vont se retrouver avec une belle erreur 404. Alors, dans le temps, j'aurais défini un alias au niveau du serveur HTTP (NginX dans mon cas) pour rediriger l'ancienne URL vers la nouvelle. Et j'aurais eu une belle configuration NginX au bout de quelques années sans vraiment savoir si tout est pertinent. Hugo propose une notion d'alias qui génère directement une page de redirection de l'ancienne URL vers le nouvel emplacement.
+
+Ca se règle donc au niveau de l'article en ajoutant les propriétés **slug** et **alias** à l'entête :
+
+ +++
+ title = "Bilan hébergement 2018"
+ date = "2019-02-07"
+ slug = "bilan-hebergement-2018"
+ aliases = ["/2019/bilan-hébergement-2018/"]
+ categories = ["Hébergement"]
+ tags = ["planet"]
+ +++
+
+
+Merci Victor ;-)
diff --git a/content/blog/2019/2019-03-02-tmux-msys2.md b/content/blog/2019/2019-03-02-tmux-msys2.md
new file mode 100755
index 0000000..0d40d0e
--- /dev/null
+++ b/content/blog/2019/2019-03-02-tmux-msys2.md
@@ -0,0 +1,38 @@
+---
+layout: post
+title: Tmux et MSYS2
+category: GNU/Linux
+tag: planet
+---
+
+Toujours condamné aux logiciels de l'éditeur de Redmond dans le milieu professionnel, je suis un fidèle utilisateur de [MSYS2](https://www.msys2.org/), un Cygwin auquel on a greffé Pacman... pas le mentos jaune mais le gestionnaire de paquet de ArchLinux. Mais pourquoi faire un truc pareil me direz-vous ? Et bien pas seulement pour le plaisir de la ligne de commande ! L'interface d'installation et mise à jour des paquets Cygwin ressemble à ça :
+
+
+
+Alors si je peux avoir la même chose avec une commande, vérifier la liste des dépendances que je vais installer au préalable, je dis banco :
+
+ pacman -S gcc-g++
+
+MSYS2 a simplifié quelques trucs ; par exemple, les partitions Ms Windows sont directement sous la racine : /C, /D
+
+Ma principale utilisation de MSYS consiste à accéder de multiples serveurs distants par SSH et faire du copier-coller entre sessions mais aussi avec le presse-papier système, joliment surnommé *clipboard Windows*. Et c'est là qu'intervient mon outil console préféré : [tmux](https://tmux.github.io).
+
+Tmux est supporté par MSYS2 dans sa version 2.8. J'avais un peu délaissé l'outil depuis la version 2.4, ce fut l'occasion de dépoussiérer ma configuration et d'obtenir des réglages qui fonctionnent aussi bien sur GNU/Linux que sur MSYS 2/Ms Windows.
+
+Sous Cygwin le presse-papier est un device */dev/clipboard* et le copier de Ms Windows vers MSYS2 est géré de base : un SHIFT-INS colle dans MSYS2. Dans l'autre sens, il faut ajouter le nécessaire dans la configuration de TMUX. Je préfère le mode VIM plutôt que le mode EMACS donc ma configuration est en fonction :
+
+ # copy to Ms Windows clipboard
+ if -b '[ -c /dev/clipboard ]' 'bind-key -T copy-mode-vi y send-keys -X
+ copy-pipe-and-cancel "tmux save-buffer - > /dev/clipboard"'
+
+La configuration complète est accessible sous Gitoube : https://github.com/kianby/dotfiles/blob/master/tmux/__tmux.conf
+
+Et comme on est au 21ème siècle, j'ai réalisé une petite vidéo pour montrer le copier-coller en image avec ~~youteubé~~ [asciinema](https://asciinema.org). Désolé pour le sur-place dans la séquence entre 2 minutes et 2'50, j'ai fait une pause tisane ;-)
+
+
+
+Comme à la fin de toute vidéo, il y a un bonus ! Je cherchais aussi un outil pour réaliser une interface console de connexion aux serveurs SSH et, encore mieux, j'ai découvert le projet [sshto](https://github.com/vaniacer/sshto) qui exploite directement le fichier **~.ssh/config** pour construire automatiquement une telle interface.
+
+
+
+Le mode console a encore de beaux jours devant lui !
diff --git a/content/blog/2019/2019-04-14-refonte-compl-te-du-blog.md b/content/blog/2019/2019-04-14-refonte-compl-te-du-blog.md
new file mode 100755
index 0000000..42ecbf4
--- /dev/null
+++ b/content/blog/2019/2019-04-14-refonte-compl-te-du-blog.md
@@ -0,0 +1,34 @@
+---
+layout: post
+published: true
+title: Refonte complète du blog
+categories: Blog
+tags: ''
+---
+Le blog a pris son envol et il a désormais son propre nom de domaine **blogduyax.fr**.
+
+Ce n'est qu'un changement parmi une multitude, et un drôle de cheminement qui d'une idée de base un peu floue a mené à une refonte complète du blog :
+
+- abandon du moteur de blog [Hugo](https://gohugo.io/) pour [Jekyll](https://jekyllrb.com/)
+- mise à la retraite du système maison de commentaires **Stacosys** pour [Isso](https://posativ.org/isso/)
+- hébergement sur GitHub Pages
+
+Certains diront que j'ai mis de l'eau dans mon vin et ils n'auront pas tort ;-)
+
+Comment en suis-je arrivé là ? Et bien j'avais en idée de faciliter la chaîne de publication des articles. J'adore ce qu'apporte un moteur statique : l'écriture des articles en Markdown et une génération en pages statiques, la facilité à publier le contenu sous gestion de sources (GIT). Mais la publication nécessite d'allumer un ordinateur de peaufiner le brouillon et de de faire un *git push* pour publier. Rien de complexe mais la nécessité de repasser par un PC pour publier alors que ma vie est plutôt mobile.
+
+J'ai envisagé de coder une interface d'administration Web avec un éditeur Markdown (on en trouve plusieurs en JavaScript sous licence Open Source) et une interaction avec GIT pour fluidifier la publication. Mais je n'ai pas trouvé l'étincelle pour démarrer donc j'ai fait des recherches pour voir si ça n'existe pas prêt à l'emploi, j'étais même prêt à changer de moteur de blog si nécessaire. J'ai regardé les extensions de Hugo, [les autres moteurs statiques](https://www.staticgen.com/) et même [les CMS en fichier à plat](https://www.flatphile.co/). J'ai installé beaucoup de containers Docker pour évaluer les fonctionalités. Grav, Bludit, PhileCMS... beaucoup de moteurs avec des atouts mais aucun ne m'a vraiment enthousiasmé.
+
+Puis j'ai découvert [Prose.io](http://prose.io) qui donne tout son potentiel avec Jekyll. Je m'étais intéressé à Jekyll avant de choisir Pelican en 2013 et c'est l'écosystème Python que je connais bien qui avait orienté mon choix en défaveur de Ruby. Pas de regret mais là j'ai regardé Jekyll en détail et je l'ai trouvé très attractif : simple, cohérent, mature, bien documenté et extensible par des plugins. Alors au niveau des performances, on génére les pages du blog en 15 secondes plutôt que 5 mais ce n'est pas un critère important pour mon utilisation. J'ai choisi un thème et j'ai commencé la migration de mes pages. On reste sur du Markdown donc le gros du travail c'est la migration des *metadata* et l'adaptation du thème.
+
+Il y a possibilité d'héberger Prose sur ses propres serveur mais j'avais déjà passé un cap et accepté l'idée d'héberger le blog sur GitHub Pages ce qui me permet de préserver le fonctionnement actuel, à savoir pouvoir écrire mon article en Markdown depuis mon PC et générer le blog localement avec mon Jekyll en mode développement avant de publier avec un *git push*. Mais je peux aussi écrire un article en mobilité depuis Prose et publier directement l'article. Choquant ? pas tant que ça ! je sépare l'hébergement du blog du reste de mon infrastructure et je garde la main sur les données. Si l'orientation de GitHub ne me plait pas ou s'ils changent les règles d'hébergement, je récupère mon blog Jekyll et je l'héberge sur mon serveur dédié.
+
+Et quid des commentaires ? Les URLs des articles ont bougé donc j'ai bousillé tout le référencement et je n'avais pas envie de me casser la tête à maintenir des redirections entre les anciennes URLs et les nouvelles. J'aurais pu adapter la partie *front-end* de Stacosys pour qu'elle devienne full JavaScript et soit intégrable dans le blog mais il aurait aussi fallu modifier l'ensembles des URLs. J'ai évalué Isso et j'ai décidé que Stacosys pouvait prendre sa retraite. Né au moment où il n'y avait pas beaucoup de solutions pour les blogs statiques, il n'a plus d'avantages fonctionnel. Isso a une administration Web en plus des notifications par e-mail, ce que j'avais prévu de développer... un jour. Inutile de réinventer la route, j'héberge Isso sur mon serveur dédié et il sert les commentaires du blog sur l'autre domaine. J'ai migré les commentaires existants car l'histoire d'un blog ce ne sont pas que des articles.
+
+
+
+
+
+
+
+
diff --git a/content/blog/2019/2019-05-12-antisocial.md b/content/blog/2019/2019-05-12-antisocial.md
new file mode 100755
index 0000000..2ebcc8f
--- /dev/null
+++ b/content/blog/2019/2019-05-12-antisocial.md
@@ -0,0 +1,33 @@
+---
+layout: post
+published: true
+title: Antisocial en veilleuse
+categories: Humeur
+---
+Je traîne beaucoup moins sur Diaspora : je poste très peu et j'ai fait récemment une grosse lessive parmi les gens et les hashtags que je suivais.
+
+### La descente
+
+C'est en partie à cause de la triste actualité des six derniers mois ; les gilets jaunes, les violences, le bashing anti-gouvernement, il n'y avait plus que cela dans mon fil d'actu Diaspora. Des gens que je suivais pour leurs publications sur le Libre et l'Open Source ont commencé à militer et c'est devenu leur sujet principal. Paradoxalement, alors que je limite la pollution de mon esprit en ne regardant plus les informations télévisées depuis des années, je me suis retrouvé à avoir le point de vue du réseau social sur un sujet brûlant d'actualité. Et au bout de quelques semaines de matraquage j'ai eu un ras-le-bol, la surdose et j'ai commencé à couper les sources.
+
+Ca m'a fait prendre du recul sur le réseau en entier et reconsidérer ma façon de l'utiliser. Ce qui me plait dans Diaspora c'est la possibilité de suivre une personne ou de suivre un hashtag donc un centre d'intérêt. Mais les deux possibilités ont des inconvénients.
+
+### Suivre toutes les publications d'une personne
+
+Cela suppose que tout ce qu'il publie va vous intéresser. C'est rarement le cas ! L'exemple *des gilets jaunes* montre l'inconvénient à son paroxysme où on finit par virer la personne. Sans en arriver là, on a toujours du bruit : des publications qui ne nous intéressent pas donc du temps perdu et le besoin de filtrer l'information.
+
+Un autre problème est la manie de certains de copier-coller des articles en intégralité. Etant dans une consommation mobile de Diaspora, c'est pas génial de faire défiler 30000 pixels pour arriver à la publication suivante dans le flux d'actualité. Je préfère un lien vers l'article et un commentaire personnel qui me donne envie de l'ouvrir.
+
+### Suivre un hashtag pour alimenter un centre d'intérêt
+
+C'est une fonctionnalité géniale pour couvrir un sujet d'intérêt mais qui peut avoir des désagréments : du bruit car la publication n'est pas intéressante ou hors-sujet, ou bien on assiste à une conversation publique entre deux personnes. Par exemple j'aime les photos de villes anciennes et je découvre des trucs sympas. Par contre je m'intéresse à la collapsologie et là c'est du concentré d'ondes négatives, du militantisme local mais rarement du contenu qui m'intéresse. Après c'est le risque, un hashtag c'est ouvert donc il faut s'attendre à traiter du déchet (donc passer du temps) pour trouver des pépites.
+
+### Et le micro-blogging ?
+
+Vu le genre de publication que je fais sur Diaspora et ce que j'en attends, je me suis dit que le micro-blogging était peut-être plus indiqué pour moi : une publication courte avec un lien ou une photo et un commentaire ou un ressenti. J'ai installé une instance Pleroma une journée puis je l'ai démonté et je me suis inscrit sur Mastodon chez [la mère Zaclys](https://mastodon.zaclys.com).
+
+J'ai toujours un compte Twitter où je ne publie rien mais qui me sert à suivre quelques comptes officiels qu'on ne retrouvera jamais sur le Fediverse. Ma première mauvaise idée a été de republier le compte Twitter LesNews sur le Fediverse via un bot : lesnews_bot at botsin.space. C'était marrant à faire, ça m'a amusé une paire d'heures (https://hub.docker.com/r/kianby/tweet-toot) mais j'ai réalisé que je dupliquais le modèle que je fuyais : inonder des fils de toots avec de l'information mal qualifiée.
+
+Finalement le micro-blogging n'est pas plus adapté à ma sociabilité virtuelle limitée donc je reste sur Diaspora pour garder le contact avec mon petit cercle de connaissances et je restreins les hashtags suivis. Je me concentre sur la source des infos plutôt que les gens qui les relaient, c'est moins d'énergie perdue. Pour les domaines liés à l'informatique (technos, système, Linux) on a de toute façon a peu près tous les mêmes sources. Si la personne produit du contenu sur un site je la rajoute à mes fidèles flux RSS que j'écluse quotidiennement. Et je redécouvre les newsletter grâce à [Carl Chenet](https://carlchenet.com/votre-veille-technologique-pendant-les-vacances/). C'est un média intéressant, une publication hebdomadaire est idéale pour mon cas, ça laisse la semaine pour lire, le contenu a été filtré en amont, c'est efficace.
+
+
diff --git a/content/blog/2019/2019-05-18-souvenir-de-blog.md b/content/blog/2019/2019-05-18-souvenir-de-blog.md
new file mode 100755
index 0000000..2dfe83e
--- /dev/null
+++ b/content/blog/2019/2019-05-18-souvenir-de-blog.md
@@ -0,0 +1,11 @@
+---
+layout: post
+published: true
+title: Souvenir de blog
+categories: Blog
+---
+J'aime bien l'allure du nouveau blog mais l'ancien *Blog du Yax* me manque un peu, probablement parce que j'avais tout fait de A à Z, le HTML, le CSS et le JavaScript. Le résultat faisait un peu amateur mais c'était ma création.
+
+Il me reste [Archive.org](https://web.archive.org/web/20180331143503/https://blogduyax.madyanne.fr/) pour les souvenirs :-)
+
+
diff --git a/content/blog/2019/2019-05-28-r-duire-la-voilure.md b/content/blog/2019/2019-05-28-r-duire-la-voilure.md
new file mode 100755
index 0000000..a52a573
--- /dev/null
+++ b/content/blog/2019/2019-05-28-r-duire-la-voilure.md
@@ -0,0 +1,14 @@
+---
+layout: post
+published: true
+title: Réduire la voilure
+categories: Hébergement
+tags: ''
+---
+
+Séparer l'hébergement du blog du reste de l'infrastructure a été une bonne idée, je n'ai plus de scrupule à effectuer mes maintenances sans préavis, parfois avec moins de préparation puisque ça ne dérange que moi. Ayant viré pas mal de containers *maison* autour du blog, il me reste [Isso](https://posativ.org/isso/) pour gérer les commentaires et mes applications indispensables : [Wallabag](https://wallabag.org) pour sauver un article et le lire plus tard, [Shaarli](https://www.shaarli.fr/) pour gérer les favoris, [Selfoss](https://www.selfoss.aditu.de/) pour les flux RSS. J'ai aussi une instance de [Gitea](https://gitea.io) qui me fournit un wiki basique et un miroir de mes projets GitHub. J'avais aussi en tête de rapatrier ma photothèque de 70 Go, actuellement hébergée gracieusement par Cozy Cloud.
+
+Pour ces quelques services je n'ai pas besoin de beaucoup de puissance, la dedibox SC est devenue surdimensionnée et son augmentation de tarif a joué dans ma décision de réduire la voilure et de trouver un hébergement moins cher, avec au moins 200 Go de disque. Dédié ou VPS KVM, peu importe si je peux migrer mes containers Docker dessus. La dedibox coûte 11,99 euros par mois, je pensais trouver facilement une alternative en dessous de 8 euros. J'ai vite déchanté... Le prix des hébergements a grimpé depuis [ma dernière quête](https://blogduyax.fr/2016/06/18/histoire-herbergement.html) et cela concerne aussi les offres VPS avec des offres plus spécialisées : du VPS basique avec un disque de 5 ou 10 Go et du VPS *storage* avec plus de disque (et souvent moins de puissance). Pour avoir 200 Go de stockage on tombe dans la catégorie stockage et la plupart des offres sont aussi chères que la dedibox SC qui est pourtant un serveur physique dédié. J'ai eu du mal à trouver une offre compétitive pour mon cas d'usage ; c'est en traînant sur le canal **vps** de Reddit que j'ai trouvé mon offre à Munich chez [Contabo](https://contabo.com) avec leur VPS S SSD avec 200 Go de disque, 4 coeurs virtuels et 8 Go de RAM pour 4,99 euros. Le serveur physique est un XEON E5-2630. En pratique, j'ai moins de latence pour accéder à mes services. Il faut voir sur le long terme... en fonction de la charge de mes co-locataires sur le serveur physique ça pourrait se dégrader mais jusqu'ici je suis très satisfait du rapport qualité / prix.
+
+
+
diff --git a/content/blog/2019/2019-06-29-markdown-interg-n-rationnel.md b/content/blog/2019/2019-06-29-markdown-interg-n-rationnel.md
new file mode 100755
index 0000000..3bf59ed
--- /dev/null
+++ b/content/blog/2019/2019-06-29-markdown-interg-n-rationnel.md
@@ -0,0 +1,47 @@
+---
+layout: post
+published: true
+title: Markdown intergénérationnel
+categories: Développement
+---
+Je suis un fan du Markdown depuis que je connais son existence : un langage de balise lisible, aisément mémorisable pour écrire sans distraction en se concentrant sur le contenu, pas sur la forme. C'est le Markdown qui m'a intéressé aux générateurs de sites statiques. Il est parfait pour l'écriture mais il montre ses limites pour produire du document (ce pour quoi il n'a pas vraiment été conçu). Mais un langage de balise est par nature extensible donc des extensions ont vu le jour pour générer une table des matières, gérer des tableaux et d'autres trucs plus exotiques...
+
+Mermaid permet de concevoir des diagrammes de flux, de séquence et de Gantt, sans application, car c'est un langage de script où l'on décrit le diagramme et Mermaid effectue le rendu graphique. Je vous renvoie [à la doc](https://mermaidjs.github.io) mais ça permet de faire des trucs cools. On n'a pas la main sur le rendu (car il est généré automatiquement), cela ne remplace donc pas un outil graphique pour les diagrammes complexes mais c'est idéal pour incorporer des diagrammes de moyenne complexité dans un document produit par un langage de balise comme Markdown, ou pour du rendu dynamique dans une application Web.
+
+L'outil libre, véritable *couteau suisse* de la conversion de documents est [Pandoc](https://pandoc.org). Avec lui on peut convertir du LaTeX en PDF, du markdown en HTML, faire intéropérer des formats Wiki, les possibilités sont énormes. Un [filtre Mermaid pour Pandoc](https://github.com/raghur/mermaid-filter) existe donc on peut tirer parti de Mermaid dans la conversion d'un document Markdown vers HTML ou PDF.
+
+C'est là que le titre de mon article intervient : Pandoc est écrit en Haskell, un langage des années 90 avec une version majeure par décennie, alors que Mermaid est écrit en Node.JS, un langage en plein bouillonnement qui revisite une partie de son éco-système chaque année. Il est génial que les deux langages s'allient pour fournir l'intégration de Mermaid dans Pandoc mais comment installer tout cela ?
+
+Pandoc est un vétéran, on le trouve dans toute distribution GNU/Linux bien née. Node.JS c'est plus compliqué. J'avais une version plutôt récente et je me suis fait rejeter pendant l'installation de Mermaid par NPM. A mon avis, la meilleure approche avec Node.JS consiste à l'installer par un autre canal que les dépôts. J'ai viré toute installation venant des dépôts sur ma machine et j'ai installé un outil qui s'appelle [n](https://github.com/tj/n) via NPM dont le rôle est gérer les installations de Node.JS. Cerise sur le gateau, il permet de faire cohabiter plusieurs versions de Node.JS, par exemple la LTS 10.16.0 et la dernière version 11.x.
+
+Bien outillé, j'ai retenté l'installation du filtre :
+
+ npm install --global mermaid-filter
+
+Mais elle échoue sur le téléchargement de chromium pendant l'installation d'une dépendance appelée *pupeteer* avec un message d'erreur abscons. La recherche de solution est un peu inquiétante : un gars aurait pu installer en utilisant un miroir chinois de npmjs, un autre l'a fait à la mano depuis une installation manuelle de chromium. Finalement c'est Stack Overflow qui fournit une solution plus acceptable en élevant les droits pendant l'installation du paquet :
+
+ npm install puppeteer --unsafe-perm=true --allow-root
+
+Et là ça se passe bien !
+
+Du coup je prépare un petit bout de Markdown avec du Mermaid dedans pour tester :
+
+ # Markdown et plus
+
+ Un diagramme rendu par Mermaid.
+
+ ~~~mermaid
+ sequenceDiagram
+ Alice->>John: Hello John, how are you?
+ John-->>Alice: Great!
+ ~~~
+
+N'ayant pas installé le module node en tant que root mais sous mon utilisateur, mon test de Pandoc référence l'emplacement de l'installation :
+
+ pandoc -t html -F ~/node_modules/mermaid-filter/index.js -o mermaid.html mermaid.md
+
+Et voici le rendu HTML:
+
+
+
+Bon markdown !
diff --git a/content/blog/2019/2019-07-26-je-vous-l-avais-bien-dit.md b/content/blog/2019/2019-07-26-je-vous-l-avais-bien-dit.md
new file mode 100755
index 0000000..ed61a50
--- /dev/null
+++ b/content/blog/2019/2019-07-26-je-vous-l-avais-bien-dit.md
@@ -0,0 +1,20 @@
+---
+layout: post
+published: true
+title: Je vous l'avais bien dit
+categories: Hébergement
+tags: ''
+---
+Mini-bilan après les décisions des 8 derniers mois : migration Docker, refonte du blog, nouveau domaine, hébergement chez GitHub Pages...
+
+Je n'ai pas achevé le système de sauvegarde (alors que je tourne sur un VPS à 4 euros le mois),
+
+Je n'ai pas achevé le système de monitoring,
+
+Je viens de découvrir que le blog a perdu *magiquement* sa barre de navigation ! Je ne sais pas depuis quand, ce qui est sûr c'est que je ne maîtrise pas la génération HTML des pages GitHub.
+
+J'ai voulu lever le pied sur la gestion de l'infra, me reposer sur GitHub mais c'est la cata ! Il est temps de se retrousser les manches
+
+
+
+*Nous savons tous le réel plaisir que vous avez à dire : je vous l'avais bien dit...*
diff --git a/content/contact.html b/content/contact.html
new file mode 100644
index 0000000..f868ad9
--- /dev/null
+++ b/content/contact.html
@@ -0,0 +1,21 @@
+
+
Contact
+{{ title }}
+
+
Foo
\n') + + def test_markdown_import_error(self): + makesite._test = 'ImportError' + original_log = makesite.log + + makesite.log = self.mock + self.mock_args = None + content = makesite.read_content(self.md_post_path) + + makesite._test = None + makesite.log = original_log + + self.assertEqual(content['content'], '*Foo*') + self.assertEqual(self.mock_args, + ('WARNING: Cannot render Markdown in {}: {}', + self.md_post_path, 'Error forced by test')) + + def test_no_markdown_rendering(self): + content = makesite.read_content(self.no_md_post_path) + self.assertEqual(content['content'], '*Foo*') + + def test_no_markdown_import_error(self): + makesite._test = 'ImportError' + original_log = makesite.log + + makesite.log = self.mock + self.mock_args = None + content = makesite.read_content(self.no_md_post_path) + + makesite._test = None + makesite.log = original_log + + self.assertEqual(content['content'], '*Foo*') + self.assertIsNone(self.mock_args) diff --git a/test/test_file_io.py b/test/test_file_io.py new file mode 100644 index 0000000..3760956 --- /dev/null +++ b/test/test_file_io.py @@ -0,0 +1,39 @@ +import unittest +import os +import shutil + +import makesite +from test import path + + +class FileIOTest(unittest.TestCase): + """Tests for file I/O functions.""" + + def test_fread(self): + text = 'foo\nbar\n' + filepath = path.temppath('foo.txt') + with open(filepath, 'w') as f: + f.write(text) + text_read = makesite.fread(filepath) + os.remove(filepath) + self.assertEqual(text_read, text) + + def test_fwrite(self): + text = 'baz\nqux\n' + filepath = path.temppath('foo.txt') + makesite.fwrite(filepath, text) + with open(filepath) as f: + text_read = f.read() + os.remove(filepath) + self.assertEqual(text_read, text) + + def test_fwrite_makedir(self): + text = 'baz\nqux\n' + dirpath = path.temppath('foo', 'bar') + filepath = os.path.join(dirpath, 'foo.txt') + makesite.fwrite(filepath, text) + with open(filepath) as f: + text_read = f.read() + self.assertTrue(os.path.isdir(dirpath)) + shutil.rmtree(path.temppath('foo')) + self.assertEqual(text_read, text) diff --git a/test/test_headers.py b/test/test_headers.py new file mode 100644 index 0000000..56eeb4a --- /dev/null +++ b/test/test_headers.py @@ -0,0 +1,43 @@ +import unittest +import makesite + + +class HeaderTest(unittest.TestCase): + """Tests for read_headers() function.""" + + def test_single_header(self): + text = '' + headers = list(makesite.read_headers(text)) + self.assertEqual(headers, [('key1', 'val1', 19)]) + + def test_multiple_headers(self): + text = '\n' + headers = list(makesite.read_headers(text)) + self.assertEqual(headers, [('key1', 'val1', 20), ('key2', 'val2', 38)]) + + def test_headers_and_text(self): + text = '\n\nFoo\n' + headers = list(makesite.read_headers(text)) + self.assertEqual(headers, [('a', '1', 14), ('b', '2', 28)]) + + def test_headers_and_blank_line(self): + text = '\n\n\n\n' + headers = list(makesite.read_headers(text)) + self.assertEqual(headers, [('a', '1', 14), + ('b', '2', 29), + ('c', '3', 43)]) + + def test_multiline_header(self): + text = '\n' + headers = list(makesite.read_headers(text)) + self.assertEqual(headers, [('a', '1', 13), + ('b', '2', 27), + ('c', '3', 40)]) + + def test_no_header(self): + headers = list(makesite.read_headers('Foo')) + self.assertEqual(headers, []) + + def test_empty_string(self): + headers = list(makesite.read_headers('')) + self.assertEqual(headers, []) diff --git a/test/test_list.py b/test/test_list.py new file mode 100644 index 0000000..8acb2ef --- /dev/null +++ b/test/test_list.py @@ -0,0 +1,46 @@ +import unittest +import shutil +import os +import makesite +from test import path + +class PagesTest(unittest.TestCase): + def setUp(self): + self.site_path = path.temppath('site') + + def tearDown(self): + shutil.rmtree(self.site_path) + + def test_list(self): + posts = [{'content': 'Foo'}, {'content': 'Bar'}] + dst = os.path.join(self.site_path, 'list.txt') + list_layout = '{{ content }}
' + makesite.make_list(posts, dst, list_layout, item_layout) + with open(os.path.join(self.site_path, 'list.txt')) as f: + self.assertEqual(f.read(), 'Foo
Bar
{{ key }}:{{ title }}:{{ content }}
' + makesite.make_list(posts, dst, list_layout, item_layout, + key='val', title='lorem') + with open(os.path.join(self.site_path, 'list.txt')) as f: + text = f.read() + self.assertEqual(text, + 'val:foo:Foo
val:bar:Bar
{{ content }}
' + makesite.make_list(posts, dst, list_layout, item_layout, key='val') + + expected_path = os.path.join(self.site_path, 'val.txt') + self.assertTrue(os.path.isfile(expected_path)) + with open(expected_path) as f: + self.assertEqual(f.read(), 'Foo
Bar
{{ summary }}
' + posts = makesite.make_pages(src, post_dst, post_layout, author='Admin') + makesite.make_list(posts, list_dst, list_layout, item_layout) + with open(os.path.join(self.site_path, 'list.txt')) as f: + self.assertEqual(f.read(), '{{ title }}:{{ author }}:Foo
bar:Admin:Bar