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 "" to >> _site/README.md + echo view the example website. >> _site/README.md + echo >> _site/README.md + echo [makesite]: https://github.com/sunainapai/makesite >> _site/README.md + echo [commit]: https://github.com/sunainapai/makesite/commit/$$($(REV)) >> _site/README.md + echo [demo]: https://tmug.github.io/makesite-demo >> _site/README.md + # + # Publish makesite-demo. + mv _site /tmp + cd /tmp/_site && git init + cd /tmp/_site && git config user.name Makesite + cd /tmp/_site && git config user.email makesite@example.com + cd /tmp/_site && git add . + cd /tmp/_site && git commit -m "Auto-generated with sunainapai/makesite - $$($(REV))" + cd /tmp/_site && git remote add origin https://github.com/tmug/makesite-demo.git + cd /tmp/_site && git log + cd /tmp/_site && git push -f origin master + +loc: + grep -vE '^[[:space:]]*#|^[[:space:]]*$$|^[[:space:]]*"""' makesite.py | wc -l + +FORCE: diff --git a/README.md b/README.md new file mode 100755 index 0000000..da0f411 --- /dev/null +++ b/README.md @@ -0,0 +1,413 @@ +makesite.py +=========== +Take full control of your static website/blog generation by writing your +own simple, lightweight, and magic-free static site generator in +Python. That's right! Reinvent the wheel, fellas! + +[![View Source][SOURCE-BADGE]](makesite.py) +[![View Demo][DEMO-BADGE]](https://tmug.github.io/makesite-demo) +[![MIT License][LICENSE-BADGE]](LICENSE.md) + +[SOURCE-BADGE]: https://img.shields.io/badge/view-source-brightgreen.svg +[DEMO-BADGE]: https://img.shields.io/badge/view-demo-brightgreen.svg +[LICENSE-BADGE]: https://img.shields.io/badge/license-MIT-blue.svg + + +Contents +-------- +* [Introduction](#introduction) +* [But Why?](#but-why) +* [Get Started](#get-started) +* [The Code](#the-code) +* [Layout](#layout) +* [Content](#content) +* [Credits](#credits) +* [License](#license) +* [Support](#support) + + +Introduction +------------ +This repository contains the source code of an example website +containing two static blogs and a few static pages. The website can be +generated by running [makesite.py](makesite.py). The output looks like +[this](https://tmug.github.io/makesite-demo). That's it! + +So go ahead, fork this repository, replace the [content](content) with +your own, and generate your static website. It's that simple! + +You are [free](LICENSE.md) to copy, use, and modify this project for +your blog or website, so go ahead and fork this repository and make it +your own project. Change the [layout](layout) if you wish to, improve +the [stylesheet](static/css/style.css) to suit your taste, enhance +[makesite.py](makesite.py) if you need to, and develop your website/blog +just the way you want it. + + +But Why? +-------- +For fun and profit! Okay, maybe not for profit, but hopefully for fun. + +Have you used a popular static site generator like Jekyll to generate +your blog? I have too. It is simple and great. But then did you yearn +to use something even simpler to generate your blog? Do you like Python? +Perhaps the thought of writing your own static site generator crossed +your mind but you thought it would be too much work? If you answered +"yes" to these questions, then this project is for you. + +With [makesite.py](makesite.py), you are in full control. There is no +hidden magic! There is no need to read any documentation to understand +how it works. There is no need to learn how to write configuration files +to produce some desired effect. + +With [makesite.py](makesite.py): + + - The code is the documentation. + - The code is the configuration. + +Everything is laid out as plain and simple Python code for you to read +and enhance. It is less than 130 lines of code (excluding comments, +docstrings, and blank lines). It gets you off the ground pretty quickly. +You only need to execute `makesite.py`. + +You can develop a decent website/blog within a few minutes and then you +can begin tinkering with the [source code](makesite.py), the +[layout](layout), and the [stylesheet](static/css/style.css) to +customize the look and feel of your website to your satisfaction. + + +Get Started +----------- +This section provides some quick steps to get you off the ground as +quickly as possible. + + 1. For a quick demo on your local system, just enter this command: + + make serve + + If you don't have `make` but have Python 3.x, enter this command: + + python3 makesite.py + cd _site + python3 -m http.server + + Note: In some environments, you may need to use `python` instead of + `python3` to invoke Python 3.x. + + If you only have Python 2.7, enter this command: + + python makesite.py + cd _site + python -m SimpleHTTPServer + + Then visit http://localhost:8000/. It should look like + [this](https://tmug.github.io/makesite-demo). + + Note: You can run [makesite.py](makesite.py) with Python 2.7 or + Python 3.x. + + 2. You may see a few `Cannot render Markdown` warning messages in the + output of the previous command. This is due to the fact that an + example [blog](content/blog) in this project has a few posts written + in Markdown. To render them correctly, install the `commonmark` + package with this command: + + pip install commonmark + + Then try the previous step again. + + 3. For an Internet-facing website, you would be hosting the static + website/blog on a hosting service and/or with a web server such as + Apache HTTP Server, Nginx, etc. You probably only need to generate + the static files and know where the static files are and move them + to your hosting location. + + If you have the `make` command, enter this command to generate your + website: + + make site + + If you don't have `make` but have `python3`, enter this command: + + python3 makesite.py + + Note: In some environments, you may need to use `python` instead of + `python3` to invoke Python 3.x. + + If you only have `python`, enter this command: + + python makesite.py + + The `_site` directory contains the entire generated website. The + content of this directory may be copied to your website hosting + location. + + +The Code +-------- +Now that you know how to generate the static website that comes with +this project, it is time to see what [makesite.py](makesite.py) does. +You probably don't really need to read the entire section. The source +code is pretty self-explanatory but just in case, you need a detailed +overview of what it does, here are the details: + + 1. The `main()` function is the starting point of website generation. + It calls the other functions necessary to get the website generation + done. + + 2. First it creates a fresh new `_site` directory from scratch. All + files in the [static directory](static) are copied to this + directory. Later the static website is generated and written to this + directory. + + 3. Then it creates a `params` dictionary with some default parameters. + This dictionary is passed around to other functions. These other + functions would pick values from this dictionary to populate + placeholders in the layout template files. + + Let us take the `subtitle` parameter for example. It is set + to our example website's fictitious brand name: "Lorem Ipsum". We + want each page to include this brand name as a suffix in the title. + For example, the [about page](https://tmug.github.io/makesite-demo/about/) + has "About - Lorem Ipsum" in its title. Now take a look at the + [page layout template](layout/page.html) that is used as the layout + for all pages in the static website. This layout file uses the + `{{ subtitle }}` syntax to denote that it is a placeholder that + should be populated while rendering the template. + + Another interesting thing to note is that a content file can + override these parameters by defining its own parameters in the + content header. For example, take a look at the content file for + the [home page](content/_index.html). In its content header, i.e., + the HTML comments at the top with key-value pairs, it defines a new + parameter named `title` and overrides the `subtitle` parameter. + + We will discuss the syntax for placeholders and content headers + later. It is quite simple. + + 4. It then loads all the layout templates. There are 6 of them in this + project. + + - [layout/page.html](layout/page.html): It contains the base + template that applies to all pages. It begins with + `` and ``, and ends with ``. The + `{{ content }}` placeholder in this template is replaced with + the actual content of the page. For example, for the about page, + the `{{ content }}` placeholder is replaced with the the entire + content from [content/about.html](content/about.html). This is + done with the `make_pages()` calls further down in the code. + + - [layout/post.html](layout/post.html): It contains the template + for the blog posts. Note that it does not begin with `` and does not contain the `` and `` tags. + This is not a complete standalone template. This template + defines only a small portion of the blog post pages that are + specific to blog posts. It contains the HTML code and the + placeholders to display the title, publication date, and author + of blog posts. + + This template must be combined with the + [page layout template](layout/page.html) to create the final + standalone template. To do so, we replace the `{{ content }}` + placeholder in the [page layout template](layout/page.html) with + the HTML code in the [post layout template](layout/post.html) to + get a final standalone template. This is done with the + `render()` calls further down in the code. + + The resulting standalone template still has a `{{ content }}` + placeholder from the [post layout template](layout/post.html) + template. This `{{ content }}` placeholder is then replaced + with the actual content from the [blog posts](content/blog). + + - [layout/list.html](layout/list.html): It contains the template + for the blog listing page, the page that lists all the posts in + a blog in reverse chronological order. This template does not do + much except provide a title at the top and an RSS link at the + bottom. The `{{ content }}` placeholder is populated with the + list of blog posts in reverse chronological order. + + Just like the [post layout template](layout/post.html) , this + template must be combined with the + [page layout template](layout/page.html) to arrive at the final + standalone template. + + - [layout/item.html](layout/item.html): It contains the template + for each blog post item in the blog listing page. The + `make_list()` function renders each blog post item with this + template and inserts them into the + [list layout template](layout/list.html) to create the blog + listing page. + + - [layout/feed.xml](layout/feed.xml): It contains the XML template + for RSS feeds. The `{{ content }}` placeholder is populated with + the list of feed items. + + - [layout/item.xml](layout/item.xml): It contains the XML template for + each blog post item to be included in the RSS feed. The + `make_list()` function renders each blog post item with this + template and inserts them into the + [layout/feed.xml](layout/feed.xml) template to create the + complete RSS feed. + + 5. After loading all the layout templates, it makes a `render()` call + to combine the [post layout template](layout/post.html) with the + [page layout template](layout/page.html) to form the final + standalone post template. + + Similarly, it combines the [list layout template](layout/list.html) + template with the [page layout template](layout/page.html) to form + the final list template. + + 6. Then it makes two `make_pages()` calls to render the home page and a + couple of other site pages: the [contact page](content/contact.html) + and the [about page](content/about.html). + + 7. Then it makes two more `make_pages()` calls to render two blogs: one + that is named simply [blog](content/blog) and another that is named + [news](content/news). + + Note that the `make_pages()` call accepts three positional + arguments: + + - Path to content source files provided as a glob pattern. + - Output path template as a string. + - Layout template code as a string. + + These three positional arguments are then followed by keyword + arguments. These keyword arguments are used as template parameters + in the output path template and the layout template to replace the + placeholders with their corresponding values. + + As described in point 2 above, a content file can override these + parameters in its content header. + + 8. Then it makes two `make_list()` calls to render the blog listing + pages for the two blogs. These calls are very similar to the + `make_pages()` calls. There are only two things that are different + about the `make_list()` calls: + + - There is no point in reading the same blog posts again that were + read by `make_pages()`, so instead of passing the path to + content source files, we feed a chronologically reverse-sorted + index of blog posts returned by `make_pages()` to `make_list()`. + - There is an additional argument to pass the + [item layout template](layout/item.html) as a string. + + 9. Finally it makes two more `make_list()` calls to generate the RSS + feeds for the two blogs. There is nothing different about these + calls than the previous ones except that we use the feed XML + templates here to generate RSS feeds. + +To recap quickly, we create a `_site` directory to write the static site +generated, define some default parameters, load all the layout +templates, and then call `make_pages()` to render pages and blog posts +with these templates, call `make_list()` to render blog listing pages +and RSS feeds. That's all! + +Take a look at how the `make_pages()` and `make_list()` functions are +implemented. They are very simple with less than 20 lines of code each. +Once you are comfortable with this code, you can begin modifying it to +add more blogs or reduce them. For example, you probably don't need a +news blog, so you may delete the `make_pages()` and `make_list()` calls +for `'news'` along with its content at [content/news](content/news). + + +Layout +------ +In this project, the layout template files are located in the [layout +directory](layout). But they don't necessarily have to be there. You can +place the layout files wherever you want and update +[makesite.py](makesite.py) accordingly. + +The source code of [makesite.py](makesite.py) that comes with this +project understands the notion of placeholders in the layout templates. +The template placeholders have the following syntax: + + {{ }} + +Any whitespace before `{{`, around ``, and after `}}` is ignored. +The `` should be a valid Python identifier. Here is an example of +template placeholder: + + {{ title }} + +This is a very simple template mechanism that is implemented already in +the [makesite.py](makesite.py). For a simple website or blog, this +should be sufficient. If you need a more sophisticated template engine +such as [Jinja2](http://jinja.pocoo.org/) or +[Cheetah](https://pythonhosted.org/Cheetah/), you need to modify +[makesite.py](makesite.py) to add support for it. + + +Content +------- +In this project, the content files are located in the [content +directory](content). Most of the content files are written in HTML. +However, the content files for the blog named [blog](content/blog) are +written in Markdown. + +The notion of headers in the content files is supported by +[makesite.py](makesite.py). Each content file may begin with one or more +consecutive HTML comments that contain headers. Each header has the +following syntax: + + + +Any whitespace before, after, and around the `` tokens are ignored. Here are some example headers: + + + + + +It looks for the headers at the top of every content file. As soon as +some non-header text is encountered, the rest of the content from that +point is not checked for headers. + +By default, placeholders in content files are not populated during +rendering. This behaviour is chosen so that you can write content freely +without having to worry about makesite interfering with the content, +i.e., you can write something like `{{ title }}` in the content and +makesite would leave it intact by default. + +However if you do want to populate the placeholders in a content file, +you need to specify a parameter named `render` with value of `yes`. This +can be done in two ways: + + - Specify the parameter in a header in the content file in the + following manner: + + + + - Specify the parameter as a keyword argument in `make_pages` call. + For example: + + blog_posts = make_pages('content/blog/*.md', + '_site/blog/{{ slug }}/index.html', + post_layout, blog='blog', render='yes', + **params) + +Credits +------- +Thanks to: + + - [Susam Pal](https://github.com/susam) for the initial documentation + and the initial unit tests. + - [Keith Gaughan](https://github.com/kgaughan) for an improved + single-pass rendering of templates. + + +License +------- +This is free and open source software. You can use, copy, modify, +merge, publish, distribute, sublicense, and/or sell copies of it, +under the terms of the [MIT License](LICENSE.md). + +This software is provided "AS IS", WITHOUT WARRANTY OF ANY KIND, +express or implied. See the [MIT License](LICENSE.md) for details. + + +Support +------- +To report bugs, suggest improvements, or ask questions, please visit +. diff --git a/content/_index.html b/content/_index.html new file mode 100644 index 0000000..8cc489a --- /dev/null +++ b/content/_index.html @@ -0,0 +1,28 @@ + + +

Lorem Ipsum

+

+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. +

diff --git a/content/about.html b/content/about.html new file mode 100644 index 0000000..f51d17d --- /dev/null +++ b/content/about.html @@ -0,0 +1,23 @@ + +

About

+

+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. +

diff --git a/content/blog/2009/2009-06-12-premier-billet.md b/content/blog/2009/2009-06-12-premier-billet.md new file mode 100755 index 0000000..883657a --- /dev/null +++ b/content/blog/2009/2009-06-12-premier-billet.md @@ -0,0 +1,10 @@ +--- +layout: post +title: Premier billet +category: Humeur +--- + +Bien que je navigue quotidiennement sur la Toile depuis des années je n'avais +jamais envisagé de démarrer un blog. Mais la récession m'ayant donné un coup +de pouce, je devrais avoir du temps ; aussi j'ai ouvert cet espace sur un coup +de tête. Il ne me reste plus qu'à définir ce que je veux en faire ;-) diff --git a/content/blog/2009/2009-07-12-mobilite-quand-tu-nous-tiens.md b/content/blog/2009/2009-07-12-mobilite-quand-tu-nous-tiens.md new file mode 100755 index 0000000..743b7b5 --- /dev/null +++ b/content/blog/2009/2009-07-12-mobilite-quand-tu-nous-tiens.md @@ -0,0 +1,40 @@ +--- +layout: post +title: Mobilité quand tu nous tiens +category: Mobilité +--- + +Poussé par un engouement certain pour les netbooks et une lecture enthousiaste +de l'actualité de ce marché (merci [Blogeee](http://www.blogeee.net/) pour la +qualité de vos articles) je me suis lancé et j'ai acheté un Asus 1000HE blanc : + très très bel objet.... Maryse ;-) Il est très bien fini, le touchpad est +le plus agréable que j'ai pu tester sur un portable, le clavier est +suffisamment espacé (j'ai d'ailleurs retrouvé ma vitesse de frappe habituelle +sans problème) et il est agréable à la frappe. Bref je n'ai que des +compliments sur la qualité du matériel. + +Il me restait à valider si je pourrais en avoir une utilisation polyvalente et +ne pas être bloqué par la petite taille d'écran ou de faibles performances. +Hé bien après deux semaines d'utilisation, je suis toujours enthousiaste :-) +L'autonomie annoncée tient ses promesses : plus de 5 heures 30 à fond les +manettes et c'est la première fois que j'utilise réellement un portable en +nomade toute une journée sans loucher sur l'indicateur de batterie. Du coup, +cela booste son utilisation, on l'emmène un peu partout car il est léger et +autonome. + +C'est vrai qu'on scrolle beaucoup dès qu'il faut lire des PDF, des docs +OpenOffice ou naviguer sur Internet (merci Firefox pour le plein écran avec F11 +cela arrange la sauce) mais c'est supportable. Ma première impulsion a été de +virer Windows XP et d'installer Ubuntu Netbook Remix et c'est un vrai bonheur. +L'interface a été bien pensée, le bureau devient un méga-lanceur de toutes +les applications regroupées par catégorie. C'est beau, bien pensé et sous le +capot c'est mon système fétiche. Néanmoins, à refaire je conserverais XP et +je partirais sur un dual-boot. Il y a suffisamment de disque pour se le +permettre et on a de temps en temps besoin d'un Windows pour des applications +spécifiques (upgrader un TomTom par exemple). Je reverrais cela dans la durée. +Mais pour l'instant mon Ubuntu est pleinement opérationnel, bien configuré et +toutes les fonctions de l'asus sont correctement gérées. J'ai même installé +une JVM et Eclipse pour voir ce que cela pouvait donner sur ce genre de machine : + ben c'est pas pire qu'avec un Celeron 2 années en arrière :-) + +Que du bonheur on vous dit :-) \ No newline at end of file diff --git a/content/blog/2009/2009-10-28-karmic-koala.md b/content/blog/2009/2009-10-28-karmic-koala.md new file mode 100755 index 0000000..8581a8f --- /dev/null +++ b/content/blog/2009/2009-10-28-karmic-koala.md @@ -0,0 +1,9 @@ +--- +layout: post +title: Karmic Koala +category: GNU/Linux +--- + +J-1 avant la sortie de [Ubuntu 9.10](http://www.ubuntu.com/). Comme beaucoup de +monde je l'attends avec impatience pour ses nouveautés et pour résoudre +quelques problèmes de la 9.04. diff --git a/content/blog/2009/2009-11-02-karmic-est-dans-la-place.md b/content/blog/2009/2009-11-02-karmic-est-dans-la-place.md new file mode 100755 index 0000000..d585ba4 --- /dev/null +++ b/content/blog/2009/2009-11-02-karmic-est-dans-la-place.md @@ -0,0 +1,23 @@ +--- +layout: post +title: Karmic est dans la place +category: GNU/Linux +--- + +J'ai installé Karmic Koala Desktop 64 bits sur mon Toshiba Portégé M800 en +dual-boot avec Vista 32 bits. J'ai d'abord restauré le MBR avec le "Vista +Recovery Disk'" afin de bénéficier de l'installation de Grub 2. Puis j'ai +supprimé ma partition ext3 et j'ai créé une nouvelle partition ext4 pour +Karmic. + +L'installation n'a pas posé de problème. Par contre, le démarrage prenait +plus d'une minute et le réseau ne fonctionnait pas : ni le port réseau ni le +Wifi ne sont reconnus. C'est d'autant plus bizarre que tout fonctionnait avec la +9.04. Heureusement la communauté Ubuntu est large et très active : le +problème vient du kernel 2.6.31-14 et d'une incompatibilité avec +[ACPI](http://fr.wikipedia.org/wiki/ACPI) ; une modification des paramètres de +boot dans Grub (rajout de acpi=off) contourne le problème : ça boote en moins +de 30 secondes et le réseau fonctionne. Le revers de la médaille est la perte +de la gestion de l'énergie ; donc aucun indicateur du niveau de la batterie. +C'est embêtant pour un laptop ;-) Mais je suis sûr qu'une mise à jour rapide +du kernel va résoudre le problème. \ No newline at end of file diff --git a/content/blog/2009/2009-11-04-ubuntu-9-10-kernel.md b/content/blog/2009/2009-11-04-ubuntu-9-10-kernel.md new file mode 100755 index 0000000..61633e1 --- /dev/null +++ b/content/blog/2009/2009-11-04-ubuntu-9-10-kernel.md @@ -0,0 +1,19 @@ +--- +layout: post +title: Ubuntu 9.10 Kernel +category: GNU/Linux +--- + +L'incompatibilité du kernel 2.6.31-14 avec ACPI est un problème connu depuis +août mais sa résolution n'a pas pu être intégrée à la version finale de +Ubuntu 9.10. Le bug peut-être suivi sur [https://bugs.launchpad.net/ubuntu/+sou +rce/linux/+bug/418933](https://bugs.launchpad.net/ubuntu/+source/linux/+bug/4189 +33) + +Une solution éprouvée consiste à revenir un peu en arrière et installer le +kernel 2.6.31-12 disponible ici : [http://people.canonical.com/~apw/lp386468-kar +mic/](http://people.canonical.com/%7Eapw/lp386468-karmic/). + +C'est ce que j'ai fait : j'ai installé la version 64 bits et cela résoud tous +mes soucis : la gestion de l'énergie est de retour (en enlevant le param +acpi=off de Grub bien sûr) et le réseau fonctionne. \ No newline at end of file diff --git a/content/blog/2009/2009-11-24-mon-bureau.md b/content/blog/2009/2009-11-24-mon-bureau.md new file mode 100755 index 0000000..96234b2 --- /dev/null +++ b/content/blog/2009/2009-11-24-mon-bureau.md @@ -0,0 +1,9 @@ +--- +layout: post +title: Mon bureau +category: GNU/Linux +--- + +Juste pour le fun, un snapshot de mon bureau. + +![Mon bureau](/images/00x/mydesktop.jpg) diff --git a/content/blog/2009/2009-12-02-sfr-3g-et-ubuntu-9-10-karmic.md b/content/blog/2009/2009-12-02-sfr-3g-et-ubuntu-9-10-karmic.md new file mode 100755 index 0000000..33909e6 --- /dev/null +++ b/content/blog/2009/2009-12-02-sfr-3g-et-ubuntu-9-10-karmic.md @@ -0,0 +1,42 @@ +--- +layout: post +title: SFR 3G et Ubuntu 9.10 Karmic +categories: GNU/Linux Mobilité +--- + +J'ai une clef 3G SFR obtenue pour 1 euro grâce au Pacte SFR (merci à eux) et +j'ai voulu valider qu'elle pouvait fonctionner avec Ubuntu pour le jour où ce +serait nécessaire. J'ai donc fait le tour de Google et sélectionné parmi ce +qui a été discuté par beaucoup de gens compétents ayant fait la manip avec +des versions précédentes ou d'autres distrib les bonnes étapes pour Karmic. + +D'abord il faut installer le paquet usb-modeswitch fourni dans les dépôts +standards (version actuelle 1.0.2-1) : + +``` shell +sudo apt-get install usb-modeswitch +``` + +Ensuite, on branche la clef 3G et on constate qu'elle monte comme un +périphérique de stockage et non pas comme un périphérique de communication. +C'est là  que la usb-modeswitch intervient... Cette commande doit être +lancée à chaque branchement de la clef : + +``` shell +sudo usb_modeswitch --default-vendor 0x19d2 --default-product 0x2000 + --target-vendor 0X19d2 --target-product 0x0052 -s 8 --message-endpoint 0x01 + --message-content 55534243123456782000000080000c85010101180101010101000000000000 +``` + +On peut créer notre connexion mobile à large bande en n'oubliant pas +spécifier le point d'accès slsfr au lieu de websfr et de spécifier +manuellement le DNS 172.20.2.39. + +Sur ma configuration c'est suffisant pour se connecter sur le réseau 3G de SFR :-) + +Voici les threads du forum Ubuntu où j'ai pioché les infos : + +- [http://forum.ubuntu-fr.org/viewtopic.php?id=316220](http://forum.ubuntu- +fr.org/viewtopic.php?id=316220) +- [http://forum.ubuntu-fr.org/viewtopic.php?id=193486](http://forum.ubuntu- +fr.org/viewtopic.php?id=193486) diff --git a/content/blog/2009/2009-12-26-voix-sur-ip-avec-sip.md b/content/blog/2009/2009-12-26-voix-sur-ip-avec-sip.md new file mode 100755 index 0000000..c4fd046 --- /dev/null +++ b/content/blog/2009/2009-12-26-voix-sur-ip-avec-sip.md @@ -0,0 +1,26 @@ +--- +layout: post +title: Voix sur IP avec SIP +categories: Mobilité +--- + +J'utilise Skype occasionnellement depuis 2 ans pour des appels de PC à PC mais +aussi de PC à téléphone fixe ainsi qu'en mode conférence et bon jour... +mauvais jour ça marche pas mal. + +Néanmoins j'ai eu envie de tester le standard SIP et j'ai choisi l'opérateur +IPPI. J'ai opté pour une formule sans abonnement avec un crédit que je +recharge au fur et à mesure des besoins par Paypal. Le processus d'inscription +est limpide et l'interface du site très sympathique à mon goût. Dans la même +veine, la page "Mon compte" est très claire et rappelle la configuration, les +appels reçus et passés, le crédit restant et j'en passe. + +En une petite heure, j'avais créé mon compte, configuré le client SIP de mon téléphone Nokia E61i, configuré le +client Ekiga sous Ubuntu et testé les appels dans les 2 sens en me référant +essentiellement à la documentation fournie sur le site IPPI. + +Bilan : concernant la qualité, les coupures et tout ce qui fait le sel de la +voix sur IP il me faudra quelques semaines de tests pour me faire une opinion +mais les premiers tests sont très concluants. J'ai beaucoup apprécié la +présentation du numéro quand j'appelle, c'est quelque chose qui n'existe pas +avec Skype (sauf erreur de ma part). diff --git a/content/blog/2010/2010-01-09-nouvelle-annee-nouvelle-distrib.md b/content/blog/2010/2010-01-09-nouvelle-annee-nouvelle-distrib.md new file mode 100755 index 0000000..3f14fed --- /dev/null +++ b/content/blog/2010/2010-01-09-nouvelle-annee-nouvelle-distrib.md @@ -0,0 +1,79 @@ +--- +layout: post +title: Nouvelle année, nouvelle distrib +category: Archlinux +--- + +Comme j'ai toujours beaucoup de temps libre, je l'ai passé sur la planète +Linux ces dernières semaines : quelques révisions de base, des lectures de +blogs (issus de [Planet Libre](http://www.planet-libre.org/) en autre). + +La lecture de l'excellent blog de [Frédéric +Bezier](http://frederic.bezies.free.fr/blog) et de certains articles tendance +comme " [Ubuntu which directions are you +heading?](http://www.dedoimedo.com/computers/ubuntu-direction.html) " m'ont +donné envie de m'orienter vers une "rolling release" distrib pour : + +* rajouter du fun : Ubuntu marche trop bien "out of the box" +* mettre les mains dans le cambouis +* vérifier sur la durée si le concept est valide : on reste à jour et on ne +réinstalle pas tous les 6 mois. Pour ce dernier point il est un peu tôt pour +répondre :-) + +Ma machine est un portable Toshiba Portégé M800, core 2 Duo, chipset vidéo et +Wifi signés Intel, disque de 250 Go en dual boot avec Windows 7. + +![Gentoo](https://assets.gentoo.org/tyrian/site-logo.svg) + +J'ai commencé une install de Gentoo sous VirtuaBox sous +Ubuntu pendant 1/2 journée pour appréhender les concepts puis je me suis +lancé : suppression des partitions et installation grandeur nature. En 2 +grosses journées j'avais un environnement Gnome fonctionnel et une grande +fierté (c'est moi qui l'ai compilé). + +Ce que j'ai apprécié : + +* ça fait cliché forcément mais... c'est la force de la Gentoo : les options de +compilations fines pour mon processeur, la richesse des fameuses options USE +pour désactiver certaines fonctionalités / dépendances des paquets. +* me traîner dans le cambouis : ça m'a permis de me remettre à jour sur la +config d'un serveur X post-an 2000 (ben oui j'avais pas fait ça depuis des +années), d'un serveur Pulse Audio, de recompiler 10 fois mon kernel pour +affiner / rajouter des options. + +Ce que je n'ai pas trouvé génial : + +* là aussi c'est cliché : les temps de compilation (attends tu vas voir, +j'installes... attends reviens ça compile). +* la fraîcheur relative des paquets : bien sûr il y a les overlays, ces extra- +repository mais ça mène souvent à des conflits. + + Je pense que la gentoo est géniale pour faire vivre une install stable +(serveur ou desktop) mais pas adaptée à un forcené comme moi qui installe un +truc nouveau tous les jours et le vire 3 jours après. + +![Arch](http://www.archlinux.fr/commun/images/titlelogo.png) + +J'ai donc basculé après quelques jours de Gentoo sur +Archlinux : toujours le concept de la "rolling release" qu'on n'installe qu'une +fois mais avec paquets binaires. De plus la communauté anglophone et française +semble très active. + +Ce que j'ai apprécié : + +* la facilité d'installation : 1 petite journée pour installer, rapatrier mes +données, et configurer le système au poil. Tout fonctionne : virtual box, +bluetooth, dropbox... +* la grande cohérence de l'environnement Gnome installé (j'avais eu des soucis +de polkit avec la Gentoo) +* les gestionnaires de paquets ont des noms rigolos (pacman et yaourt) mais g +èrent-ils vraiment bien les dépendances et la cohérence du système. Et bien +pour l'instant la réponse est OUI. +* la gestion très fine des dépendances : c'est la 1ère distrib ou j'installe +tout gnome et je peux ensuite désinstaller epiphany / evolution sans tout +casser. +* la vitesse de démarrage : très similaire à Ubuntu. + +Ce que je n'ai pas trouvé génial : + +* pour le moment je suis sous le charme :-) diff --git a/content/blog/2010/2010-01-10-tchao-mano.md b/content/blog/2010/2010-01-10-tchao-mano.md new file mode 100755 index 0000000..8c76723 --- /dev/null +++ b/content/blog/2010/2010-01-10-tchao-mano.md @@ -0,0 +1,8 @@ +--- +layout: post +title: Tchao Mano +category: Humeur +--- + +Mano Solo nous a quitté ! Cela me touche beaucoup c'était un artiste que +j'admirais pour son courage et dont j'aimais la musique. diff --git a/content/blog/2010/2010-01-12-transports-en-commun-et-developpement-personnel.md b/content/blog/2010/2010-01-12-transports-en-commun-et-developpement-personnel.md new file mode 100755 index 0000000..dcd0c71 --- /dev/null +++ b/content/blog/2010/2010-01-12-transports-en-commun-et-developpement-personnel.md @@ -0,0 +1,47 @@ +--- +layout: post +title: Transports en commun et développement personnel +category: Mobilité +--- + +La semaine prochaine sera un gros changement de rythme, je commence un nouveau +job à Marseille. Et, chose qui ne m'est pas arrivé depuis mes années +d'étudiant, je n'utiliserais pas ma voiture mais le train... parce que c'est +enfin possible. Je m'en réjouis car après des années à passer le trajet en +écoutant seulement la radio, j'ai enfin l'opportunité de mettre ce temps à +profit au lieu de le subir. Je pense flux RSS, Podcasts et eBooks. + +Pour les flux RSS, c'est rôdé depuis longtemps, j'ai un peu étoffé mes +abonnements et je consommerais depuis mon Nokia E61i avec Opera Mini / Google +Reader. + +Pour la musique et les podcasts j'ai d'abord eu le stigmate du consommateur en +période de soldes : j'ai envisagé investir dans un lecteur mp3/mp4. A la +réflexion, ce sont des frais en plus, un 2ème appareil à recharger le soir, +une synchronisation avec l'ordinateur quotidienne, un certain nombre +d'inconvénients. J'ai alors regardé ce Nokia E61i sous Symbian 3 acheté +d'occasion l'année dernière : il n'est certes pas tendance au regard de la +marée iPhone / Android qui déferle, mais il répond à 100% de mes besoins : + +- gérer les couriels de mon compte Gmail en Imap (avec Profimail qui fournit un +logiciel de grande qualité pour un prix raisonnable), +- naviguer sur des sites pas trop complexes (merci Opera Mini ), +- envoyer des SMS avec un vrai clavier AZERTY. + +Et je me suis dit que je ne l'avais pas encore poussé dans ses retranchements. +Après quelques heures de recherche, j'ai rajouté : + +* un excellent lecteur audio sous licence GPL qui lit les formats mp3 et ogg : +OggPlay +* une grande découverte pour moi malgré que ce soit sorti depuis un bout de +temps : un vrai logiciel de gestion de podcasts, Nokia Podcasting, capable de +gérer les abonnements et les téléchargements par Wifi de manière autonome.. +un vrai bijou. +* le classique des lecteurs d'eBooks MobiReader qui fait bien son travail : on +peut jouer sur la taille des polices, lire en plein écran (important vu sa +taille modeste). Ce que je cherche maintenant c'est une manière de convertir +quelques PDF au format LRC depuis GNU/Linux bien sûr :-) si quelqu'un a une +bonne technique merci de me laisser un commentaire :-) + +Je pense être paré, il me reste à alimenter mes nouveaux logiciels avec du +bon contenu pour transformer ces temps de transport en temps profitable. \ No newline at end of file diff --git a/content/blog/2010/2010-01-15-grub-gfx-jaurais-aime-etre-un-artiste.md b/content/blog/2010/2010-01-15-grub-gfx-jaurais-aime-etre-un-artiste.md new file mode 100755 index 0000000..fee1a85 --- /dev/null +++ b/content/blog/2010/2010-01-15-grub-gfx-jaurais-aime-etre-un-artiste.md @@ -0,0 +1,29 @@ +--- +layout: post +title: Grub Gfx … j'aurais aimé être un artiste +category: GNU/Linux +--- + +Je ne suis pas un graphiste, loin de là et me familiariser avec The Gimp et Inkscape fait partie de ma TODO +liste. Un exercice pratique a consisté à personnaliser un splash screen pour +Grub. J'ai d'abord installé [grub-gfx](http://wiki.archlinux.org/index.php +/Grub-gfx) puis j'ai récupéré ce splash screen minimaliste et sympathique sur +le site [schultz-net](http://www.schultz-net.dk/grub.html). + +![Grub](http://www.schultz-net.dk/images/grub/black.gif) + +Le but que je me suis fixé est d'ajouter le logo Toshiba en bas à droite. Je suis parti du [logo +Toshiba](http://fr.wikipedia.org/wiki/Fichier:Toshiba_logo.svg) disponible au +format [SVG](http://fr.wikipedia.org/wiki/Svg) sur Wikipedia. Je l'ai chargé +dans Inkscape et je l'ai exporté en bitmap à la taille désirée. Puis j'ai +fait mon assemblage sous Gimp. Enfin j'ai réduit le nombre de couleurs à 14 +comme l'impose Gfx par le menu "Image" / "Mode" / "Couleurs indexées" avant de +sauvegarder en XPM. + +![My Grub image](/images/01x/my_grub_image.jpg) + +Rien de bien sorcier mais je pars de très loin sur le sujet "graphisme"  :-) +Je suis assez content du résultat et surtout je me suis bien amusé. + +Pour les possesseurs d'un Toshiba interessés par ce splash screen il est +téléchargeable [ici](/documents/my_grub_image.xpm). diff --git a/content/blog/2010/2010-01-27-les-trajets-premier-bilan.md b/content/blog/2010/2010-01-27-les-trajets-premier-bilan.md new file mode 100755 index 0000000..1df21d0 --- /dev/null +++ b/content/blog/2010/2010-01-27-les-trajets-premier-bilan.md @@ -0,0 +1,29 @@ +--- +layout: post +title: Les trajets, premier bilan +category: Mobilité +--- + +Après une semaine à utiliser le train pour mes trajets professionnels il est +temps de faire un premier bilan. + +Sur le plan personnel, c'est très agréable ; j'enchaîne des bonnes journées +mais je ne ressens pas la fatigue nerveuse liée aux embouteillages marseillais +; je pratique la marche rapide (pour attraper les correspondances) et mon corps +me dit merci :-) + +Sur le plan technique, j'ai fait le bon choix. Un netbook aurait été trop +encombrant et pas toujours utilisable ; un lecteur MP4 n'aurait pas fait plus +que mon vieux Nokia E61i. Le matin, j'écoute plutôt les podcasts... en fin de +parcours, je gère mes emails perso. Le soir, je fais un premier tri des news +grâce à Google Reader, j'active le suivi pour les articles qui vont +déclencher une action (bookmark delicious, recherche approfondie) plus tard +dans la soirée et je lis un peu de l'eBook. + +J'ai dû renoncer à Nokia Podcasting, c'est fonctionnel mais la mise à jour +par Wifi prend trop de temps et vide la batterie alors qu'un soir sur deux je +dois plutôt la recharger. Je suis donc revenu à une solution plus classique de +synchronisation avec mon laptop par le biais de [gPodder](http://gpodder.org/) +sur ma distrib Archlinux. Gpodder peut mémoriser la destination de la synchro, +en l'occurrence la carte SD du téléphone quand je connecte par USB. Ca ne +prend donc que quelques secondes, rien de pénible. diff --git a/content/blog/2010/2010-02-07-grosse-mise-a-jour-de-archlinux.md b/content/blog/2010/2010-02-07-grosse-mise-a-jour-de-archlinux.md new file mode 100755 index 0000000..7fe510b --- /dev/null +++ b/content/blog/2010/2010-02-07-grosse-mise-a-jour-de-archlinux.md @@ -0,0 +1,19 @@ +--- +layout: post +title: Grosse mise à jour de ArchLinux +category: Archlinux +--- + +Je viens de faire la plus grosse mise à jour de +[ArchLinux](http://archlinux.fr/) depuis ma récente installation : 105 paquets +et pas des moindres, puisqu'on trouve le serveur Xorg, une partie de Gnome, +beaucoup de librairies et de daemons, le dernier Firefox. + +Ca s'est téléchargé (476 Mo compressés) et installé tranquillement ; j'ai +redémarré et tout fonctionne au poil. Je suis conforté dans le choix d'une +rolling-release qui permet de rester à jour rapidement, sans attendre un +changement de version semestrielle. Ce n'est pas un choix adéquat pour tout un +chacun car il faut aimer metttre les mains dans le cambouis de temps en temps, +ce n'est pas adapté au monde de l'entreprise où l'on veut maîtriser les mise +à jour mais ça reste un terrain de jeu fabuleux pour les linuxiens qui ne +veulent pas du clef en main. diff --git a/content/blog/2010/2010-02-20-clonage-ntfs.md b/content/blog/2010/2010-02-20-clonage-ntfs.md new file mode 100755 index 0000000..1328c7a --- /dev/null +++ b/content/blog/2010/2010-02-20-clonage-ntfs.md @@ -0,0 +1,29 @@ +--- +layout: post +title: Clonage NTFS +category: GNU/Linux +--- + +La vie est pleine d'imprévus :-) Je change de job après un mois et je vais +rebasculer sur Ms Windows du moins professionnellement (sic!). Je vais utiliser +pour un temps mon laptop Toshiba avec son Windows 7 en dual boot avec ArchLinux. +Je ne mets plus les pieds côté Ms Windows depuis 6 mois excepté pour jouer à +quelques [FPS](http://fr.wikipedia.org/wiki/First-person_shooter) avec mon fils. +Mais il y aura un certain nombre de logiciels d'entreprise à installer Je me +suis donc posé le problème de faire une sauvegarde de ma partition Windows 7 +en vue de la restaurer dans quelques semaines dans son état initial. + +Mon premier réflexe à été celui d'un Ouinedozien de base,comme penserait +[Eglantine](http://eelo.lgm.free.fr/) : j'ai appelé un copain IT et je lui ai +demandé quelle version de Norton Ghost gère Windows 7. Mon second réflexe a +été de chercher des alternatives gratuites sur Google. J'ai repéré deux +logiciels freeware pour Windows qui nécessitaient d'utiliser bartPE pour créer +un CD-Room bootable. Pourquoi pas même si c'est pas super simple... puis j'ai +orienté mes recherches sur des alternatives du monde Libre. J'ai quand même un +Linux en dual boot cela devrait faciliter les choses. + +Quelques clics plus tard je tombais sur cet [article](http://guides- +info.org/linux/admin/cloner.php) détaillant les méthodes d'archivage / clonage +/ restauration depuis Linux. NTFSClone semble tout indiqué pour ce que je veux +faire et il fait partie du repository Extra d'ArchLinux. A l'heure où j'écris +ce billet, ntfsclone sauvegarde ma partition NTFS sur un disque externe USB. \ No newline at end of file diff --git a/content/blog/2010/2010-02-28-apple-store-london.md b/content/blog/2010/2010-02-28-apple-store-london.md new file mode 100755 index 0000000..c6c8d12 --- /dev/null +++ b/content/blog/2010/2010-02-28-apple-store-london.md @@ -0,0 +1,31 @@ +--- +layout: post +title: Apple Store, London +category: Humeur +--- + +J'ai l'opportunité de  découvrir Londres ce week-end après une semaine où +le tourisme s'est limité à quelques pubs et quelques restaurants. J'ai bien +sûr une liste de "famous places" à découvrir (Picadilly, Westminster, +Buckingham, London Bridge) et une destination plus "computing oriented" : l' +[Apple Store de Regent Street](http://www.apple.com/uk/retail/regentstreet/). + +En effet, je suis un big fan de Linux mais j'ai aussi un iMac qui est la machine +familiale pour tous les aspects multimédia. Excepté iTunes que je trouve +complexe, j'adore iPhoto et iMovie... mon utilisation personnelle de Mac OSX se +cantonne d'ailleurs principalement à ces deux applications... je sais on peut +faire beaucoup plus ;-) Mais c'est la machine chouchou du reste de la maison, +simple à utiliser, jamais de surprise du style *"Attends je recompile la +dernière version du lecteur DVD et on pourra mettre le film"*. + +Bref, Apple fait de beaux produits et je  voulais voir ce temple dédié. Je +n'ai pas été déçu plutôt estomaqué même : 2 niveaux d'une grande beauté +où le verre prédomine, des dizaines de mac à disposition, et des clients qui +font la queue pour les essayer, des vendeurs qui butinent un peu partout pour +dispenser des explications. Tout un côté est dédié aux tests des casques de +qualité et aux stations d'accueil pour iPods et iPhones et il est aussi pris +d'assaut. Au fond un auditoire suivait la démonstration sur grand écran du +fonctionnement de base de Snow Leopard. + +On est loin du logiciel libre mais voir l'emphase de toute une communauté de +passionnés ça fait plaisir à voir. \ No newline at end of file diff --git a/content/blog/2010/2010-03-03-ubuntu-est-au-detour-du-chemin.md b/content/blog/2010/2010-03-03-ubuntu-est-au-detour-du-chemin.md new file mode 100755 index 0000000..3d24299 --- /dev/null +++ b/content/blog/2010/2010-03-03-ubuntu-est-au-detour-du-chemin.md @@ -0,0 +1,32 @@ +--- +layout: post +title: Ubuntu est au détour du chemin +category: GNU/Linux +--- + +Aujourd'hui grande victoire : je pensais ne pas couper à un retour sous XP +professionnellement mais deux voies se sont ouvertes : + +- Virtualiser GNU/Linux dans Ms Windows +- Virtualiser Ms Windows dans GNU/Linux + +La solution 1 est la la plus prisée : Ms Windows est l'environnement de +développement et de déploiement et GNU/Linux est une autre cible de +déploiement. + +La solution 2 est moins répandue car il faut trouver des alternatives / +solutions à certains logiciels propriétaires obligatoires imposés. Je suis +néanmoins parti dans cette voie car la vie n'est rien sans le *fun* ;-) + +Au niveau du choix, deux distributions étaient plus évidentes : **Fedora** et +**Ubuntu.** Car elles reconnaissent le matériel *out-of-the-box*, +l'environnement est pré-configuré et parce que les problèmes cités sont +connus pour avoir été résolus. C'est à dire que que c'est probablement +possible sur d'autres distributions mais vu le temps qui m'est imparti, il vaut +mieux tirer parti de l'expérience d'une communauté. J'ai donc choisi +**Ubuntu** car j'ai pratiqué quelques mois. + +Il me faudra résoudre sous quelques jours le support de Juniper Connect sous +Linux 64 bits, l'émulation de XP 64 bits et la connexion à messagerie +instantanée d'entreprise de Microsoft (mais non pas MSN... l'autre... la +sérieuse). Cela sera l'occasion d'un autre billet. diff --git a/content/blog/2010/2010-03-15-renaissance-de-pc-et-switch-dutilisatrice.md b/content/blog/2010/2010-03-15-renaissance-de-pc-et-switch-dutilisatrice.md new file mode 100755 index 0000000..db67a0f --- /dev/null +++ b/content/blog/2010/2010-03-15-renaissance-de-pc-et-switch-dutilisatrice.md @@ -0,0 +1,62 @@ +--- +layout: post +title: Renaissance de PC et switch d'utilisatrice +category: GNU/Linux +--- + +J'ai été amené récemment à dépanner ma voisine qui avait des problèmes +avec du vieux matériel : un Pentium II à 266 Mhz avec 256 Mo de mémoire et 40 +Go de disque dur et une version de Windows Me. Certains sites Web ne +s'affichaient pas correctement, ma voisine désirait configurer Outlook pour +s'abstenir du WebMail et se plaignait de ne pouvoir installer aucun nouveau +logiciel car la version minimale supportée est XP. Nous avons effectué les +mises à jour du système et il y en avait un certain nombre, concernant +essentiellement Internet Explorer, ce qui est tout à l'honneur de Microsoft. +Mais aucune chance d'installer un navigateur plus récent qu'IE 6 sur un +système obsolète depuis longtemps. Nous avons essayé d'installer Firefox mais +pas de version pour Windows Me... système en fin de vie, plus de nouveaux +logiciels. Nous étions dans l'impasse ! + +J'ai fait une présentation de ma distribution Arch Linux sur mon portable en +apportant toutes les réserves possibles : une version existait forcément pour +son matériel mais graphiquement ce serait différent... probablement moins +beau. Et il faudrait s'adapter mais on retrouverait les mêmes concepts et on +pourrait avoir un navigateur aux normes actuelles pour surfer sur les sites +actuels en sécurité, un logiciel de mail et des équivalents aux applications +bureautiques. C'est la première fois à vrai dire que je prêche GNU/Linux pour +quelqu'un qui n'a jamais connu que Ms Windows ; c'est un pari risqué mais je +sentais beaucoup de curiosité de la part de mon interlocutrice, ses questions +étaient pertinentes et elle m'avait prouvé par le passé qu'elle abordait les +problèmes avec son ordinateur de manière très rationnelle. Nous nous sommes +donc lancés ; nous avons fait toutes les sauvegardes de données nécessaires +et j'ai embarqué la machine pour le week-end. + +Néanmoins, trouver une distribution francisée qui fonctionne sur ce genre de +matériel n'est pas une mince affaire. Bon nombre de versions légères de +distributions majeures s'avèrent ne plus fonctionner sur un PII : enfin elles +tournent mais ce n'est pas exploitable... trop lent. Après plusieurs tests +infructueux je suis tombé sur la pépite : [Slitaz](http://www.slitaz.org/) + +Une distribution suisse super légère mais sans compromis au niveau de la +couverture des applications fournies. Le logiciel de mail +[Sylpheed](http://sylpheed.sraoss.jp/en/) ne dépayse pas et il gère le +protocol IMAP. Pour la lecture des documents Word, +[Abiword](http://www.abisource.com/) est parfait, et +[GNUmeric](http://projects.gnome.org/gnumeric/) a pu relire sans problèmes les +documents Excel 97 sauvegardés. En renfort et au cas où, j'ai installé +[OpenOffice](http://fr.openoffice.org/) mais le lancement est vraiment lent. Il +sera utilisé occasionnellement pour visualiser les documents PowerPoint +humoristiques envoyées par les copines :-) Pour le Web, Slitaz est fourni avec +une mouture 3.x de Firefox ; c'est un peu lent au démarrage mais cela reste +très correct. + +Le premier ressenti de ma voisine au lancement fut "Oh c'est beau !". Et c'est +vrai que la distrib a un look sympa et cohérent. Et puis quand on passe de +Windows Me à Slitaz, on a gagné 10 ans d'ergonomie sans changer de matériel. +Quand à la machine c'est une nouvelle naissance, elle démarre vite, toutes les +applications se lancent sans pop-up d'erreur. Après 1 heure de revue du +système j'ai laissé ma voisine découvrir par elle-même. Depuis, j'ai eu +quelques courriels de questions auxquelles il a été aisé de répondre... tout +fonctionne de son point de vue à elle. Nous referons un point dans quelques +temps et nous en profiterons pour finaliser certains détails : gravure, +installation des pilotes pour une imprimante HP Deskjet. diff --git a/content/blog/2010/2010-04-14-renaissance-et-longevite.md b/content/blog/2010/2010-04-14-renaissance-et-longevite.md new file mode 100755 index 0000000..e9b39c2 --- /dev/null +++ b/content/blog/2010/2010-04-14-renaissance-et-longevite.md @@ -0,0 +1,25 @@ +--- +layout: post +title: Renaissance et longévité +category: GNU/Linux +--- + +Presque un mois plus tard nous avons fait un bilan de l'utilisation de Slitaz. +Le ressenti de l'utilisateur est bon, elle trouve la machine plus réactive, +effectue toutes les tâches habituelles : emails, bureautique, musique. Je +m'attelle à l'installation de l'imprimante HP Deskjet 610 : installation de +CUPS. Je fais un  détour par +[google](http://forum.slitaz.org/index.php/discussion/comment/1986/) car le port +LPT1 n'est pas détecté par défaut. Et je remplace la version de PDF Viewer +par celle qui gère l'impression (Slitaz propose les deux paquets). L'impression +depuis AbiWord et Open Office fonctionne sans surprise. La gestion de +l'impression n'est pas présente dans le paquet Firefox pour alléger le binaire +je présume. Qu'à cela ne tienne Opera sera la solution de repli pour les fois +où elle désirera imprimer des pages Web. Le bilan est très positif. + + [Slitaz](http://www.slitaz.org/) est une belle distribution basée sur LXDE, +très légère avec un choix de paquets en accord avec l'objectif de performance +mais sans concession à l'ergonomie ; elle redonne une seconde jeunesse aux +vénérables PC. Elle est passée en version 3.0 récemment. Les derniers +articles que j'ai pu lire la classent régulièrement dans le top 3 des +distributions GNU/Linux légères. diff --git a/content/blog/2010/2010-05-06-cygwin-et-console-un-duo-de-choc.md b/content/blog/2010/2010-05-06-cygwin-et-console-un-duo-de-choc.md new file mode 100755 index 0000000..9c5666e --- /dev/null +++ b/content/blog/2010/2010-05-06-cygwin-et-console-un-duo-de-choc.md @@ -0,0 +1,27 @@ +--- +layout: post +title: Cygwin et Console, un duo de choc +category: GNU/Linux +--- + +Pour ceux qui ont besoin d'un shell avancé ou moins polémiquement parlant ;-) +qui passent la journée à se connecter sur des machines UNIX depuis leur +machine de développement, on finit par se mélanger les pinceaux entre dir et +ls, type et cat ou find et grep. Vous me direz que je n'ai qu'à coder sur Linux +ou sur MacOS ;-) mais on n'a pas toujours le choix dans le milieu professionnel. + +Alors la solution passe par l'excellent projet +[Cygwin](http://fr.wikipedia.org/wiki/Cygwin) qui apporte +une implémentation POSIX pour Ms Windows permettant d'installer tous les +outils que nous aimons utiliser. Ils est même possible d'installer un serveur +X ; néanmoins je ne suis pas allé jusque là, un mode console me suffit. +Par contre, le Cygwin/Shell ne permet pas d'ouvrir d'onglets et on est vite +submergé de consoles. Une solution consiste à installer le projet +[Console2](http://sourceforge.net/projects/console/) lui aussi sous license GPL +qui apporte le support des onglets à Ms Windows.  Les programmeurs ont eu +du génie en offrant la possibilité de configurer le shell à lancer par +Console : un rapide remplacement par cygwin.bat et on a une gestion par onglets +de Cygwin/Shell... et beaucoup plus que cela une gestion uniforme des consoles +locales ou distantes par SSH. + +Un bon point pour la productivité ! diff --git a/content/blog/2010/2010-05-09-nouvel-hebergeur.md b/content/blog/2010/2010-05-09-nouvel-hebergeur.md new file mode 100755 index 0000000..59a1ab0 --- /dev/null +++ b/content/blog/2010/2010-05-09-nouvel-hebergeur.md @@ -0,0 +1,43 @@ +--- +layout: post +title: Nouvel hébergeur +category: Hébergement +--- + +Bien que je ne sois pas très prolixe, j'aime beaucoup ce blog, c'est un espace +qui m'aide à fixer mes idées, à détailler certaines manips et je l'espère, +à communiquer mon engouement pour la Technologie, le logiciel Libre et +GNU/Linux en particulier. Au départ, je ne voulais pas y consacrer trop +d'énergie et pouvoir tout stopper quand l'engouement serait passé ; c'est +pourquoi [Blogger](http://www.blogger.com) était une bonne solution clef en +main : pas d'investissement en temps ou en argent. Mais l'engouement n'est pas +passé et je me suis encore plus immergé dans certains cercles qui m'ont +sensibilisé à des sujets sensibles comme la liberté des utilisateurs et le +respect de la vie privé, des sujets que je prenais plutôt à la légère +auparavant misant sur la bonne nature des hommes et des entreprises et l'idée +assez  naïve que ce Web que j'ai vu naître ne craignait rien, que +l'équilibre des puissances en jeu garantissait à jamais une indépendance et +une **L**iberté. + +Mais le monde a changé comme dirait le +[Pistolero](http://fr.wikipedia.org/wiki/Le_Pistolero) et aujourd'hui des +sociétés comme [Facebook piétinent ces +libertés](http://blog.hugoroy.eu/2010/04/24/pourquoi-je-nutiliserai-plus- +facebook/) et pourraient devenir le seul Web possible demain. Il faut donc +prendre conscience et se poser la question : *à qui est-ce que je confie mes +données ?* J'ai encore une bonne dose de confiance dans Google qui ne change +pas les règles tous les 6 mois ; c'est peut-être aussi un peu de naïveté et +beaucoup d'admiration pour tout ce qu'ils ont apportés à l'Internet. L'avenir +dira si je me gourre...  En tout cas, je n'avais pas de problème avec Blogger +mais l'idée de maîtriser toute la chaîne à fait son chemin et j'étais +prêt.J'ai donc cherché... et trouvé un hébergeur 100% français : +[O2Switch](http://www.o2switch.fr/). Ce n'est pas du nationalisme forcené (pour +ceux qui me connaissent je suis loin de ça :-) )  mais ça s'inscrit dans une +logique de contrôle et de protection de ses données. La deuxième étape fût +d'installer et de configurer [WordPress](http://wordpress.org/) sur lequel +j'écris ce premier billet. Je n'ai aucune connaissance de WordPress c'est donc +un apprentissage interessant pour moi: l'import des données de Blogger s'est +bien passé, tout est en place. + + +Yaka comme dirait quelqu'un que je connais. diff --git a/content/blog/2010/2010-05-18-soutenir-firefox.md b/content/blog/2010/2010-05-18-soutenir-firefox.md new file mode 100755 index 0000000..53828b6 --- /dev/null +++ b/content/blog/2010/2010-05-18-soutenir-firefox.md @@ -0,0 +1,31 @@ +--- +layout: post +title: Soutenir Firefox +category: Mozilla +--- + +J'utilise Firefox depuis la version 0.5. Je me souviens de la version 1.5 comme +d'une victoire, voir un projet qu'on soutient humblement comme utilisateur +arriver à maturité et devenir de plus en plus populaire et reconnu pour ses +qualités est très agréable. Comme beaucoup, j'ai essayé Chrome à sa sortie +fin 2008, me suis extasié sur sa rapidité puis je suis retourné vers mon +renard préféré. Depuis Chrome a mis les bouchées doubles et c'est un acteur +incontournable du monde des navigateurs. Il est tentant de faire la bascule pour +gagner un peu de vitesse. Mais ce qui est en jeu c'est peut-être l'avenir de +Firefox... lire l'excellent article de Framasoft  " [Chrome m'a +tuer"](http://www.framablog.org/index.php/post/2010/05/16/google-chrome-vs- +mozilla-firefox). Cela peut sembler alarmiste mais c'est un futur possible :-(. +Et la Fondation Mozilla ce n'est pas Google même si Chromium est open-source. +Le vrai choix des  utilisateurs de FireFox est donc le suivant : **écouter les +sirènes et basculer à Chrome pour des perfs** ou **s'accrocher à Firefox donc +militer** en acceptant de perdre un peu de confort **** mais en misant sur +l'avenir. Firefox a prouvé qu'il savait s'adapter et évoluer pour rendre le +meilleur service. Son point faible aujourd'hui est la vitesse d'exécution mais +il est certain que sa communauté travaille d'arrache-pied pour renverser la +vapeur ! + +En attendant, voici quelques trucs tirer le meilleur parti de Firefox 3.6 :-) : + +- améliorer la vitesse en tripatouillant quelques réglages +- gagner de l'espace (quand on a  un écran  1280x800) : extension Hide MenuBar +- fusionner la barre d'addresse et la zone de recherche : extension OmniBar diff --git a/content/blog/2010/2010-06-02-le-logiciel-libre-comment-ca-marche.md b/content/blog/2010/2010-06-02-le-logiciel-libre-comment-ca-marche.md new file mode 100755 index 0000000..92b3a7d --- /dev/null +++ b/content/blog/2010/2010-06-02-le-logiciel-libre-comment-ca-marche.md @@ -0,0 +1,15 @@ +--- +layout: post +title: Le logiciel libre, comment ça marche ? +category: Humeur +--- + +L'[APRIL](http://www.april.org/) a produit un fabuleux poster qui explique +simplement ce qu'est le Logiciel Libre (le cycle de vie et les intervenants). +C'est un bon support pour l'expliquer aussi bien à des programmeurs qu'à des +utilisateurs. Il est fourni sous triple license [licence Art +libre](http://artlibre.org/licence/lal), [Creative Commons By +Sa](http://creativecommons.org/licenses/by-sa/2.0/fr/) et +[GFDL](http://www.gnu.org/copyleft/fdl.html) et dans différents formats. + +![Logiciel libre](/images/02x/logiciel_libre_comment_ca_marche.png) diff --git a/content/blog/2010/2010-06-06-decouvrir-latex.md b/content/blog/2010/2010-06-06-decouvrir-latex.md new file mode 100755 index 0000000..16c10eb --- /dev/null +++ b/content/blog/2010/2010-06-06-decouvrir-latex.md @@ -0,0 +1,35 @@ +--- +layout: post +title: Découvrir LaTeX +category: GNU/Linux +--- + +Dans la série *"Apprenons quelque chose de neuf",* j'ai investi quelques heures +à me familiariser avec [LaTeX](http://fr.wikipedia.org/wiki/LaTeX). J'avoue +avoir toujours été intimidé par sa complexité apparente et je ne voyais pas +l'intérêt par rapport à n'importe quel traitement de texte +[WYSIWYG](http://fr.wikipedia.org/wiki/WYSIWYG). Pratiquement, je me suis +attelé à la réécriture de mon CV : c'est un document d'une seule page, un +peu court pour tirer gros avantage du temps passé à définir la forme du +document mais intéressant pour sa complexité. + +Pour apprendre la syntaxe, je suis parti de la documentation du site +[lestuteurs](http://www.tuteurs.ens.fr/logiciels/latex/) où j'ai trouvé +l'essentiel. Pour quelques problème mineurs j'ai trouvé la solution sur +[StackOverFlow](http://stackoverflow.com/) en googlant :-) Au niveau des outils +je suis resté simple : pas d'éditeur dédié à la composition LaTeX, GEdit +avec le greffon LaTeX pour lancer la compilation et la visualisation DVI / PDF +en un clic fait l'affaire. Au préalable il faut bien sûr [installer les +paquets LaTeX](http://wiki.archlinux.org/index.php/LaTeX) sous ArchLinux. + +En 2 demi-journées je suis arrivé à migrer mon CV depuis OpenOffice. Le +résultat est très plaisant : + +- la mise en forme est plus aérée grâce à la mise en forme au pixel près quel'on peut appliquer au document, +- la fonte par défaut est très agréable, +- la génération en PDF est parfaite. + +Rajouter du contenu est rapide car la mise en forme est en place ; c'est le gros +atout de LaTeX et j'imagine facilement le temps gagné sur des rapport quand le +travail de mise en forme est effectué. Le terme *"système logiciel de +composition de documents"* prend tout son sens. \ No newline at end of file diff --git a/content/blog/2010/2010-06-30-rythme-estival.md b/content/blog/2010/2010-06-30-rythme-estival.md new file mode 100755 index 0000000..e99c35f --- /dev/null +++ b/content/blog/2010/2010-06-30-rythme-estival.md @@ -0,0 +1,22 @@ +--- +layout: post +title: Rythme estival +category: Hébergement +--- + +Cela fait quelques semaines que je n'ai rien publié, la faute à une surcharge +de travail et à l'arrivée de l'été qui ne donne pas tellement envie d'être +connecté en soirée ;-) + +Néanmoins, à temps perdu, j'essaie de faire des petites choses intéressantes : + +* installation d'une Debian Lenny virtualisée pour peaufiner l'installation s'un +serveur Postfix / Dovecot, +* authentification avec CAcert, +* enregistrement d'un nom de domaine sur CO.CC + +Vous l'aurez deviné je me prépare à devenir auto-hébergeur :-)  Ce qui me +manque encore c'est une machine physique peu gourmande et économe qui pourra +rester allumé 24/24. Je m'oriente du côté des nettops mais c'est plutôt +cher. Peut-être qu'un netbook d'occasion en 7 ou 8 pouces ferait l'affaire... +En tout cas c'est très fun ! diff --git a/content/blog/2010/2010-07-30-auto-hebergement-le-grand-saut.md b/content/blog/2010/2010-07-30-auto-hebergement-le-grand-saut.md new file mode 100755 index 0000000..aa4cbe0 --- /dev/null +++ b/content/blog/2010/2010-07-30-auto-hebergement-le-grand-saut.md @@ -0,0 +1,55 @@ +--- +layout: post +title: Auto-hébergement, le grand saut +category: Hébergement +--- + +Cela fait bien deux mois que ça me trottait en tête :-) Et bien c'est +opérationnel. Si j'avais des dizaines de visites par heure ça ne tiendrait pas +la route mais ce n'est pas le cas et cela ne devrait pas se produire. Je ne fais +pas de publicité et je reste discret sur les sites autour du Libre. Ce blog est +devenu un compagnon où je peux coucher par écrit ce qui me passe dans la tête +et parler de mes dernières réalisations. + + **Le matériel** + +J'ai acquis sur [PriceMinister](http://www.priceminister.com/) un modeste +netbook MSI U100X basé sur un processeur Atom N270  à 1,66 Ghz avec 1 Go de +mémoire et 80 Go de disque dur. La batterie est défectueuse ce qui n'est pas +un souci pour l'utilisation en poste fixe et cela m'a servi d'argument pour +négocier le prix :D Il est pré-installé avec Suse Enterprise Linux que j'ai +remplacé par une Debian Lenny : installation minimale sans couche graphique +depuis une clef USB. Je ne m'étalerais pas sur l'install de Debian qui s'est +déroulée sans surprise. J'ai rajouté [OpenSSH](http://www.openssh.com/) pour +permettre l'administration à distance et j'ai pu placer le netbook dans son +placard... euh je veux dire son rack climatisé bien sûr ;-) Je n'ai pas +d'écho négatif sur ce genre de matériel pour une utilisation 24/24, j'espère +que ça ne lâchera pas au bout de quelques mois, je me suis dit que la faible +dissipation de chaleur de l'Atom était un atout. + + **La configuration réseau** + +J'ai réservé le nom de domaine madyanne.co.cc sur [CO.CC](http://www.co.cc/). +C'est gratuit pour un usage personnel. Depuis son compte CO.CC on peut définir +des alias (des enregistrements CNAME) pour faire correspondre à un sous-domaine +un autre nom DNS. C'est par ce moyen que geek.madyanne.co.cc est balancé sur le +nom [DynDNS](http://fr.wikipedia.org/wiki/DynDNS) de la SFR box. Il ne reste +plus qu'à définir les règles NAT pour ouvrir le port HTTP et le rediriger +vers le serveur Debian. Le fait de ne pas avoir d'adresse IP fixe n'est +absolument pas bloquant pour s'auto-héberger :) + + **La configuration logicielle** + +J'aurais pu installer le serveur Web [hyper-léger et hyper-performant à la +mode](http://nginx.org/) mais je suis resté classique avec +[Apache](http://httpd.apache.org/). L'installation de +[WordPress](http://wordpress.org/) 3.0 est simple, il ne faut pas oublier +d'installer [mySQL](http://fr.wikipedia.org/wiki/MySQL) auparavant et de créer +une base de donnée. Concernant l'import du blog je ne sais pas si je l'ai fait +dans les règles de l'art. Je suis passé par l'export en XML puis par la +fonction d'import sur le WordPress cible qui nécessite d'installer un plug-in. +Cela semble ok pour le contenu, le thème a été installé séparément. En +quelques heures on installe un serveur de blog opérationnel. + +Ce qui m'a pris beaucoup plus de temps c'est l'installation de mon serveur de +mail :-) mais ce sera l'occasion d'un autre billet. diff --git a/content/blog/2010/2010-08-01-piwik-une-alternative-a-google-analytics.md b/content/blog/2010/2010-08-01-piwik-une-alternative-a-google-analytics.md new file mode 100755 index 0000000..73edd40 --- /dev/null +++ b/content/blog/2010/2010-08-01-piwik-une-alternative-a-google-analytics.md @@ -0,0 +1,37 @@ +--- +layout: post +title: Piwik, une alternative à Google Analytics +category: Hébergement +--- + +[Piwik](http://piwik.org/) est une alternative crédible sous licence GPL à +Google Analytics. Cerise sur le gateau, il requiert [LAMP](http://www.google.fr/ +url?sa=t&source=web&cd=1&ved=0CBUQFjAA&url=http%3A%2F%2Ffr.wikipedia.org%2Fwiki% +2FLAMP&ei=U3xVTK-PL9_Q4wbZnYmnBQ&usg=AFQjCNHmQzZpoG3qGXQq9bp6HXe09cNoOA&sig2=ZbX +bao85XawqcsmE_cIWiQ) ce qui permet de l'héberger sans effort sur la même +machine que  WordPress et il s'inscrit parfaitement dans ma démarche de +contrôler l'accès à mes données. Le projet est  jeune et actif, une version +majeure 0.8 est sortie cette semaine et la version 1.0  est [planifiée en +détail](http://dev.piwik.org/trac/wiki/Piwik-Vision-Roadmap) pour le deuxième +semestre. + +L'installation prend vraiment 5 minutes. On extrait l'archive à l'endroit +souhaité de son *public HTML* (/var/www pour Apache 2 sous Debian) et on se +connecte à son URL. Un installeur pas à pas va créer la base de donnée +nécessaire et recueillir en quelques écrans les informations nécessaires sur +le site à surveiller. En finalité on a quelques lignes de JSP à insérer dans +son site. Il faut un endroit stratégique ;-) partagé par toutes pages. Pour +WordPress ce sera dans le fichier footer.php sous wp-content (c'est très bien +décrit dans la documentation). Piwik est traduit en plusieurs langues dont le +français, ce qui a son importance. + +A l'usage on retrouve un tableau de bord personnalisable avec des widgets pour +afficher les statistiques des visites (nombre, provenance géographique, +navigateur utilisé). Il y a tellement de possibilités que je n'ai pas encore +tout exploré. On peut créer des rapports de synthèse et depuis la version 0.8 +exporter en PDF. De l'utilisation personnelle et simpliste que j'en ai, on peut +aller beaucoup plus loin dans le cadre d'une utilisation professionnelle où on +doit fournir du reporting multi-sites régulièrement. + + [ ](/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 :-) + +![Image TT-RSS](/images/04x/CAP201012251832.jpg) 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. + +![Auth](/images/04x/CAP201012281347.jpg) +![L'authentification](/images/04x/CAP2010122813471.jpg) +![La synchro Gmail](/images/04x/CAP201012281348.jpg) + +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. + + [déplacer les apps systray
+vers le panel +](/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. + +![Cyborg](/images/05x/cyborg-rat5.jpg) \ 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). + +![Chat sans filet](/images/05x/chat-sans-filet.jpg) + +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. + +![Adventure update](/images/05x/adventure_update.tb.png) 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. + +![Surveullance](/images/05x/horse-monitoring.tb.jpg) + +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. + +![Avertissement](/images/06x/signal_sncf_avertissement.tb.jpg) 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 +--- + +Jenkins CI 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)*. + +![Sécurité](/images/06x/jenkins-security.png) + +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 : + +``` + + +``` + +Ensuite redémarrez Tomcat pour prendre en compte la création de l'utilisateur +et identifiez-vous à Jenkins en tant qu'administrateur. Attention, +l'utilisateur anonyme a encore accès à tout. Si votre intégration continue +tourne sur un serveur publique, vous voudrez probablement que l'utilisateur +anonyme n'ait aucune visibilité sur les projets. Modifions à nouveau la +sécurité ; on choisit la sécurité basée sur une matrice de droits, et on +rajoute l'utilisateur **jenkins** avec tous les droits cochés. + +![Matrice de sécurité](/images/06x/jenkins-matrix.png) + +Si vous avez joué de malchance et que vous n'avez pas affecté de droit à +l'administrateur avant de sauver, vous ne pouvez plus accéder à Jenkins :-) +Heureusement les développeurs ont prévu le coup et il faut réinitialiser la +sécurité en suivant [cette procédure du Wiki](https://wiki.jenkins- +ci.org/display/JENKINS/Disable+security). + +A ce stade Jenkins est opérationnel avec une sécurité basique qui suffira +dans beaucoup de cas, prêt à gérer des projets, ce qui fera l'occasion d'un +prochain article. diff --git a/content/blog/2012/2012-01-22-quelle-distribution-gnome-2-choisir-en-2012.md b/content/blog/2012/2012-01-22-quelle-distribution-gnome-2-choisir-en-2012.md new file mode 100755 index 0000000..ac37b74 --- /dev/null +++ b/content/blog/2012/2012-01-22-quelle-distribution-gnome-2-choisir-en-2012.md @@ -0,0 +1,83 @@ +--- +layout: post +title: Quelle distribution 'Gnome 2' choisir en 2012 ? +category: Humeur +tag: planet +--- + +Le titre est un peu provoc mais c'est une vraie question [que je me posais +déjà en Novembre +dernier](http://blogduyax.madyanne.fr/index.php?article60/gnome-3-pour-un-usage- +professionnel). Comment retrouver un niveau de productivité correct après +l'ouragan Gnome 3 / Unity dans le cadre professionnel avec du matos récent (en +l'occurrence un core i7 avec de la RAM à gogo et une carte NVIDIA Optimus +achetés en décembre) ? J'ai posé deux contraintes : **une stabilité des +paquets sur 1 an** (hors mise à jour de Mozilla et patchs de sécurité bien +sûr) et **une distribution proche de Debian**. Pour ces raisons j'ai écarté +Archlinux, bien ce que soit mon coup de coeur depuis 2 ans. + + Gnome logo 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). + + Munin 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= + -page=infosys_main -v 2>/dev/null | html2text >/adsl_stats.txt +``` + +Je sauve les données dans un fichier texte car 3 plugins Munin vont les +consommer : + +* un plugin qui graphe la bande passante descendante (download) en kb/s +* un plugin qui graphe la bande passante montante (upload) en kb/s +* un plugin qui graphe le bruit montant / descendant ainsi que l'atténuation +montante / descendante en dB. + +Un plugin est un exécutable (Bash, Perl, Python, ce que vous préférez) qui +doit répondre à deux types de requêtes : + +- avec l'argument 'config' il renvoie la configuration du graphe : titre, les +unités, le libellé de chaque variable graphée + +- sans argument il renvoie une nouvelle valeur pour chaque variable du graphe. + +Voici shell script du plugin adsl_download qui collecte la valeur de la bande +passante descendante : + +``` shell +if [ $# = 1 ]; then + echo "graph_title Bandwidth - Download" + echo "graph_category ADSL" + echo "graph_vlabel kb/s" + echo "down.label download" +else + grep "bit descendant maximum" adsl_stats.txt | cut -s -d: -f2 + | sed 's/\s*\([0-9]\+\).*/down.value \1/' +fi +``` + +L'enregistrement du plugin auprès de Munin est très simple : + +- on rajoute l'exécutable ou un lien symbolique dans /etc/munin/plugins +- on configure les droits d'exécutions dans /etc/munin/plugin-conf.d/munin-node + +Mes plugins s'appellent adsl_download, adsl_upload et adsl_noise, j'ai donc +rajouté la section suivante à /etc/munin/plugin-conf.d/munin-node : + +``` +[adsl*] +user root +``` + +Le séquenceur de Munin appelle chaque plugin toutes les 5 minutes. + +Voici le genre de graphe qu'on obtient : + +![ADSL Download](/images/06x/download.png) + +L'ensemble des fichiers qui composent les plugins sont disponibles [dans cette +archive](/documents/munin.zip). diff --git a/content/blog/2012/2012-03-25-gerer-un-projet-de-developpement-avec-jenkins-ci.md b/content/blog/2012/2012-03-25-gerer-un-projet-de-developpement-avec-jenkins-ci.md new file mode 100755 index 0000000..4083217 --- /dev/null +++ b/content/blog/2012/2012-03-25-gerer-un-projet-de-developpement-avec-jenkins-ci.md @@ -0,0 +1,128 @@ +--- +layout: post +title: Gérer un projet de développement avec Jenkins CI +category: Développement +tag: planet +excerpt: Faisant suite à l'article décrivant l'installation de Jenkins CI, nous allons voir comment gérer un projet +--- + +Jenkins CI  logo 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 : + +![Configure Maven tool](/images/06x/configure-maven-tool.png) + +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 : + +![New Project](/images/06x/new-project.png) + +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. + +![Configure SVN](/images/06x/configure-repository.png) + +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. + +![Maven Goals](/images/06x/maven-goals.png) + +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). + +![Trigger Build](/images/06x/trigger-build.png) + +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. + +![Notification](/images/06x/notify-build-errors.png) + +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 ;-) + + CV
+de Jean Code 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. + +![Juno](/images/07x/eclipse-ui.png) + +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). + +![CSS](/images/07x/css-editor.png) + +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](/images/07x/css-diff.png) 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 : + +![maquette](/images/2013/maquette-cluster.png) + +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 + + SetHandler server-status + Order deny,allow + Deny from all + Allow from 127.0.0.1 + +``` + +Comme on a construit la configuration pas à pas, **crm_mon** remonte peut-être des erreurs sur certaines +ressources car elle n'étaient pas opérationnelles. Il y a un compteur d'échec qui lève un message d'avertissement. +on peut remettre ce compteur à zéro comme ceci pour la ressource http : + + crm resource cleanup httpd + +A ce stade on a une adresse de cluster et une ressource HTTP, mais pas forcément sur le même noeud. +la ressource **vip** va basculer si le noeud tombe. La ressource **httpd** va basculer si le noeud tombe +ou si le service apache tombe (surveillance par l'URL /server-status). + +C'est sympa mais pas très utile :-) On va aller plus loin et forcer les deux ressources à tourner sur le +même noeud C'est faisable grâce au concept de la colocation : + + colocation httpd-with-vip inf: httpd vip + +Et on voudrait que dans le cas normal, les ressources tournent sur vm-node1, notre noeud primaire : + + location preferred-node vip 100: vm-node1 + +Enfin, on rajoute une condition de bascule. Si le noeud ne joint plus la passerelle Internet, on veut basculer les +ressources sur l'autre noeud Pour cela on définit une ressource de type *ping* qui tourne sur tous les noeuds + (grâce au concept de ressource clonée). Puis on rajoute une règle de location pour basculer si le noeud actif +ne voit plus la passerelle. + + primitive ping-gateway ocf:pacemaker:ping params host_list="192.168.1.1" multiplier="1000" op monitor interval="10s" + clone cloned-ping-gateway ping-gateway + location vip-needs-gateway vip rule -inf: not_defined pingd or pingd lte 0 + +Voilà notre maquette est opérationnelle. diff --git a/content/blog/2013/2013-06-16-le-silence.md b/content/blog/2013/2013-06-16-le-silence.md new file mode 100755 index 0000000..fd24dd7 --- /dev/null +++ b/content/blog/2013/2013-06-16-le-silence.md @@ -0,0 +1,99 @@ +--- +layout: post +title: Enfin le silence +category: GNU/Linux +tag: planet +--- + +J'ai effectué la mise à jour de mon *véloce serveur* +(un Dell latitude D610 sous Céléron) vers Debian Wheezy. Ca s'est plutôt bien passé +en suivant [les conseils de Nicolargo](http://blog.nicolargo.com/2013/05/de-squeeze-a-wheezy.html). +J'ai seulement eu quelques problèmes avec l'interpréteur PERL, je me suis retrouvé +avec un mix : l'interpréteur 5.16.3 de Wheezy et d'anciens modules PERL. +Peut-être que j'avais installé ces librairies manuellement, je ne me souviens +pas trop. Ca c'est résolu avec un ménage à la mano des modules obsolètes et une +réinstallation propre avec CPAN. Désormais, tout est fonctionnel ! + +Jusqu'à aujourd'hui je limitais la charge processeur la nuit en stoppant +certains services pour éviter la nuisance sonore, typiquement, le serveur +Minecraft en JAVA qui consomme 3% de CPU quand personne n'est connecté. +J'utilise depuis longtemps le paquet **cpufrequtils** qui permet de moduler la +fréquence du processeur par un module du noyau selon une politique **on demand** +qui fait varier la fréquence du Celeron entre 800 Mhz et 1,6 Ghz. Mais j'ai +réalisé que malgré une charge minimale, la machine était souvent bruyante à cause du +ventilateur. Il devrait être régulé en fonction de la fréquence du +processeur, or ce n'est pas le cas. + +En faisant des recherches sur le sujet, on +apprend que la partie régulation du processeur est souvent réalisée par ACPI, +une norme répandue de contrôle de la gestion de l'énergie par l'OS grâce à un +support ACPI dans le BIOS mais que la gestion du ventilateur n'est pas souvent +incluse. Cela va dépendre de l'implémentation ACPI d'un constructeur à l'autre. +[La documentation +ArchLinux](https://wiki.archlinux.org/index.php/Fan_Speed_Control) décrit +certaines méthodes qui vont dépendre du matériel et j'ai découvert **i8kmon** pour +mon petit Dell. Ca tourne en daemon dans le système et ça régule la vitesse du +ventilateur proportiennellement à la vitesse du processeur. Pour la +configuration, j'ai utilisé les seuils proposés dans le [post de ce +forum](http://forum.tinycorelinux.net/index.php?topic=10736.0) : + +Fichier **/etc/i8kmon** : + +``` +# Kernel I8K status file +set config(proc_i8k) /proc/i8k + +# Kernel APM status file +set config(proc_apm) /proc/apm + +# Kernel ACPI status file +set config(proc_acpi) /proc/acpi/ac_adapter/0/status + +# External program to control the fans +set config(i8kfan) /usr/bin/i8kfan + +# Applet geometry, override with --geometry option +set config(geometry) {} + +# Run as daemon, override with --daemon option +set config(daemon) 1 + +# Automatic fan control, override with --auto option +set config(auto) 1 + +# Report status on stdout, override with --verbose option +set config(verbose) 0 + +# Status check timeout (seconds), override with --timeout option +set config(timeout) 5 + +# Temperature display unit (C/F), override with --unit option +set config(unit) C + +# Temperature threshold at which the temperature is displayed in red +set config(t_high) 80 + +# Minimum expected fan speed +set config(min_speed) 1800 + +# Temperature thresholds: {fan_speeds low_ac high_ac low_batt high_batt} +# These were tested on the I8000. If you have a different Dell laptop model +# you should check the BIOS temperature monitoring and set the appropriate +# thresholds here. In doubt start with low values and gradually rise them +# until the fans are not always on when the cpu is idle. +set config(0) { {- 0} -1 52 -1 52} +set config(1) { {- 1} 44 60 44 60} +set config(2) { {- 2} 60 80 60 80} +set config(3) { {- 2} 70 128 75 128} +``` + +Fichier **/etc/default/i8kmon** + +``` +# Change to one to enable i8kmon +ENABLED = 1 +``` + +Le résultat est au rendez-vous. Quand la CPU est basse, le volume sonore de la +machine est inaudible. Il reste à vérifier que les seuils sont adaptés et que +le processeur ne fond pas dans les prochaines semaines diff --git a/content/blog/2013/2013-06-28-sysadmin-1.md b/content/blog/2013/2013-06-28-sysadmin-1.md new file mode 100755 index 0000000..1b00efb --- /dev/null +++ b/content/blog/2013/2013-06-28-sysadmin-1.md @@ -0,0 +1,74 @@ +--- +layout: post +title: Ma vie de sysadmin en semi-pro (1) +category: GNU/Linux +tag: planet +--- + +Par goût personnel et par nécessité professionnelle, je rajoute progressivement le rôle +d'administrateur système à mon métier de base qui est le développement de logiciels. Doté de +bonnes bases UNIX et réseau, je découvre petit à petit les bon outils et les bonnes pratiques +pour faire le job, le simplifier voire l'automatiser. Et parfois j'enverrais volontiers une +caisse de bières à l'auteur d'un outil qui m'a sauvé plusieurs heures fastidieuses :-) + +Dans cette série d'articles *ma vie de sysadmin en semi-pro* je parlerais épisodiquement de mes +avancées et de mes découvertes dans le domaine de l'administration système. + +Tout d'abord la console est ta seule amie. Sur ton PC de bureau, la console est un choix. Dans +le monde des serveurs c'est un passage obligé car ils sont rarement installés avec une interface +graphique et on les accède généralement par SSH. Les outils de base sont connus mais il faut +apprendre à les maîtriser. + +Ce qui propulse la console c'est un shell UNIX compatible Bourne Shell. Il y a plusieurs variantes : +le Bourne Shell d'origine (sh), le Bourne Again Shell (bash), Korn Shell (ksh), Z Shell (zsh). Des +experts sont capables de discuter de tel avantage de zsh par rapport à ksh. A mon niveau, maîtriser +**sh** et **Bash** qui est le choix par défaut d'un grand nombre de systèmes GNU/Linux est le choix +de la raison. On trouve beaucoup de littérature sur le sujet (le Bourne Shell existe depuis 1978 et +le Bourne Again Shell depuis 1989 ), ma référence est le guide **Advanced Bash-Scripting Guide** sur +[le site du Linux Document Project](http://www.tldp.org/guides.html). Ensuite il est bien sûr +important de connaître les programmes en ligne de commande nécessaires pour les tâches de tous les +jours : grep, find, locate, chmod, chown, cp, mv, mkdir, rm, rmdir, touch, top, kill, ps ... la +liste est loin d'être exhaustive. + +Un autre élément important est éditeur de texte en mode console. Il doit être polyvalent, léger, +capable de traiter des fichiers de centaines de milliers de lignes. Deux candidats se détachent du +peloton : **Vim** et **Emacs**. Les deux sont beaucoup plus que de simples éditeurs de texte. Ayant +des rudiments de **Vi** depuis 20 ans, je me suis lancé à corps perdu dans l'apprentissage des +fonctions avancées de **Vim** Que du bonheur ! Voici quelques liens : + +* [Vim FAQ](https://github.com/chrisbra/vim_faq) +* [Vimcasts - Vim podcasts](http://vimcasts.org) +* [Vundle - Vim Plugin manager](https://github.com/gmarik/vundle) + +Quand on passe beaucoup de temps sur la console, on est à l'affut des manières de la rendre plus +attractive et plus puissante + +* Le prompt du shell par défaut est minimaliste. Pourquoi ne pas l'enrichir avec des informations + utiles comme la charge processeur ou les infos de gestion de version (SVN, GIT) du répertoire + courant ? C'est ce que propose [le projet + LiquidPrompt](https://github.com/nojhan/liquidprompt). +* Le choix des couleurs est important quand on passe beaucoup d'heures devant une console. Je ne + parle pas de choisir une palette *cool* mais bien de préserver sa vue. J'ai fait le choix [du + schéma de couleur Solarized](https://github.com/altercation/solarized). Ca peut sembler un peu + pâlot au début mais je me suis vité habitué et je l'utilise dans chaque programme où c'est + possible. Dans le même registre, j'utilise [le projet RedShift](https://launchpad.net/redshift) + pour gérer la température des couleurs en fonction de l'heure de la journée et de votre + emplacement géographique. Les deux premiers jours, on a l'impression que la luminosité est trop + basse, ensuite on trouve cela normal. Et on se sent agressé quand on utilise une autre machine + que la sienne. +* On se retrouve vite à ouvrir quantité de terminaux et à jongler entre eux. J'ai utilisé + [Terminator](http://www.tenshu.net/p/terminator.html) un temps puis j'ai pris confiance et j'ai + eu besoin de multiplier les terminaux depuis une même session SSH et de lancer des traitements + qui tournent en tâche de fond. Du coup, j'ai pris le temps d'apprendre + [Tmux](http://tmux.sourceforge.net) et c'est un très bon investissement ! Un bon article pour + démarrer est [accessible + ici](http://blog.hawkhost.com/2010/06/28/tmux-the-terminal-multiplexer). +* Quand on *provisionne* des serveurs régulièrement, il est intéressant de déployer sa + configuration du shell, de l'éditeur de texte, ses outils afin de retrouver son environnement et + ses habitudes. On peut installer ses fichiers manuellement depuis un point central [comme son + GitHub](https://github.com/kianby/dotfiles), ou mieux on peut carrément automatiser cette partie + en utilisant un outil comme [Fabric](https://github.com/fabric/fabric). + +Le choix des outils présentés dans cet articles est personnel. Ce qui est intéressant, c'est la +puissance de la console dans une utilisation quotidienne, la pléthore d'outils et le sentiment de +maîtrise de ce qu'on fait. diff --git a/content/blog/2013/2013-09-22-rentree-2013.md b/content/blog/2013/2013-09-22-rentree-2013.md new file mode 100755 index 0000000..9e18f0a --- /dev/null +++ b/content/blog/2013/2013-09-22-rentree-2013.md @@ -0,0 +1,55 @@ +--- +layout: post +title: La rentrée 2013 +category: Humeur +tag: planet +--- + +Le blog n'est pas abandonné ! C'est drôle, j'ai annoncé la même chose il y a +un an après la période d'inactivité qui accompagne l'été. Ce n'est pas un blog +d'humeurs ou d'actualité mais plutôt un bloc-note de mes expérimentations autour +de GNU/Linux et du Libre. Donc pour écrire, il me faut un sujet que j'ai approfondi, +mis en oeuvre, à raconter. J'ai écrit très peu de billets depuis l'année dernière +mais je suis satisfait de leur qualité : distribution Fedora, migration du blog +sous Pelican, administration système. On va tenter de rester sur la même voie +cette année... + +Pour ceux qui lisent le blog directement depuis le site, vous avez peut-être +constaté de légers changements dans le thème graphique du blog. Quand [j'ai +migré le blog depuis PluXml vers Pelican](migration-du-blog-sous-pelican.html), +j'ai utilisé Bootstrap pour rapidement refaire un thème similaire à ce que +j'avais. Dernièrement j'ai réalisé que les pages HTML du blog sont plutôt +lourdes. Bootstrap est une librairie CSS / JS qui fait beaucoup de choses mais +qui pèse avec, en plus, une dépendance à JQuery. Ca ne cadre pas avec la philosophie +d'un blog statique qui se résume, pour moi, en plusieurs critères : + +* possibilité de gérer les sources avec un gestionnaire de version : GIT + dans mon cas +* possibilité d'éditer les articles simplement. C'est le cas avec un + langage de markup qui simplifie HTML. Pelican propose RST et Markdown + pour lequel j'ai une préférence même s'il est plus limité. +* ouverture vers n'importe quel éditeur de texte : j'utilise VIM, GEdit, le + bloc-note de mon téléphone. +* contrôle fin du code HTML généré : c'est le cas par un contrôle totale des + CSS et des templates Jinja utilisés par Pelican pour générer les pages. + + +Donc l'idée d'avoir un thème CSS léger avec le minimum de JavaScript a fait son +chemin. La dernière contrainte c'était d'avoir un zeste de *responsive design* +pour basculer la barre latérale de droite en fin de page quand la largeur de l'écran +n'est pas suffisante (sur téléphone ou tablette). J'aurais pu l'écrire *from +scratch* en passant vraiment beaucoup de temps ou en ayant un vrai talent de Web +designer comme mon confrère [Badele](http://blog.jesuislibre.org) mais j'ai préféré +chercher une alternative à Bootstrap qui réponde à ces critères. Et j'ai trouvé la +perle rare : [Pure](http://purecss.io), un module CSS qui se concentre sur +l'essentiel tout en étant **HTML5-ready** et **responsive design**. C'est très +récent, développé par Yahoo (l'équipe qui s'occupe du fameux framework +Yui). La documentation est de très bonne qualité, le positionnement est clair : +ne pas *refaire* Bootstrap, rester léger. La documentation sur les bonnes +pratiques pour étendre la CSS est exemplaire. Ah j'oubliais... c'est sous licence +BSD :-) + +Enfin, la dernière évolution sur le blog, c'est la migration des commentaires de l'époque PluXml +et à nouveau un formulaire pour soumettre des commentaires sur les articles. + +Bonne rentrée. diff --git a/content/blog/2013/2013-11-18-serveur-dedie.md b/content/blog/2013/2013-11-18-serveur-dedie.md new file mode 100755 index 0000000..5fde162 --- /dev/null +++ b/content/blog/2013/2013-11-18-serveur-dedie.md @@ -0,0 +1,47 @@ +--- +layout: post +title: De l'auto-hébergement au serveur dédié +category: Hébergement +tag: planet +--- + +Après deux ans en auto-hébergement j'envisage de louer un serveur dédié +physique ou virtuel (les fameux VPS) pour plusieurs raisons : + +- l'augmentation du prix de l'électricité : mon antique portable consomme quand même 90W, +- la baisse du prix des serveurs dédiés, +- l'avantage d'avoir une bande passante non limitée par son upload ADSL pour les services proposés à l'extérieur. + +J'ai regardé du côté de Dédibox et de OVH, on peut +avoir son propre petit serveur qui consommera moins de 10W, c'est +toujours ça pour l'environnement. Au niveau des besoins, il y a d'un côté +l'hébergement du blog et de mes outils collaboratifs et de l'autre le +serveur Minecraft. Le serveur Minecraft, c'est pas green IT du tout : du +JAVA, de la CPU à fond, beaucoup de RAM. Prendre un serveur couvrant les deux +besoins m'obligerait à choisir une machine puissante et assez coûteuse +alors que la mode Minecraft peut passer d'ici quelques mois. J'ai donc +décidé de séparer les hébergements : + +- un serveur dédié (physique ou virtuel) peu puissant pour le blog et tout ce qui me passe par la tête : un pied à terre sur la Toile, +- un serveur Minecraft mutualisé loué au mois chez un hébergeur spécialisé dans + le serveur de jeux. + +Étonnamment je ne devrais pas éclater mon budget que je me suis fixé en dessous +de 10 euros TTC par mois car j'ai découvert, gràce à mon fils tout un monde que +je ne connaissais pas : celui des hébergeurs à prix cassé de serveurs de jeux +clef en main où l'on choisit la capacité en nombre de joueurs simultanés (slots), +où tout s'administre en 3 clics avec une interface d'administration Web, sans +engagement de longue durée. Sans volonté de faire de la pub, il s'agit des +hébergeurs du style de Myriapulse, Verygames, OMGServ. Pour quatre joueurs on +peut louer quelque chose entre 1 et 4 euros par mois. C'est un domaine où la +compétition semble encore plus rude que dans l'hébergement classique. + +Pour l'autre serveur (le mien), j'attends de voir les nouvelles offres que OVH +devrait dévoiler cette semaine avant de fixer mon choix. J'ai raté le coche du +Kimsufi 2013 à 5 euros et des brouettes sorti cet été je crois. Depuis OVH a +gelé les locations et revoit en profondeur toutes ses offres pour mieux +adresser les différents marchés de sa clientèle (du particulier fauché au grand +compte) en étant rentable et en situation de monter en charge. Si le serveur +physique est inaccessible, je me rabattrais sur une offre VPS chez OVH ou +ailleurs, ce qui compte c'est d'avoir la latitude d'installer tout ce qu'on +veut dessus. diff --git a/content/blog/2013/2013-12-02-sysadmin-2.md b/content/blog/2013/2013-12-02-sysadmin-2.md new file mode 100755 index 0000000..5fd5039 --- /dev/null +++ b/content/blog/2013/2013-12-02-sysadmin-2.md @@ -0,0 +1,84 @@ +--- +layout: post +title: Ma vie de sysadmin en semi-pro (2) +categories: GNU/Linux BSD +tag: planet +--- + +Il y a deux logiciels que j'utilise quotidiennent dans mon activité de sysadmin +à temps partiel : + +* [Nas4Free](http://www.nas4free.org) +* [Proxmox](http://www.proxmox.com) + +Le premier est une distribution NAS sous FreeBSD qui permet de mettre en place +facilement un serveur de stockage. Si on l'installe sur un vrai serveur avec +plusieurs disques dur, il pourra gérer du Raid 0 (agrégation des disques), +du Raid 1 (miroir d'un disque sur l'autre) voire du Raid 5 avec au moins 4 disques +pour améliorer la tolérance aux pannes. Ce qu'il apporte ensuite, c'est une +facilité de configuration par une interface Web et le support d'un large nombre +de protocoles : Samba, NFS, FTP, Rsync et d'autres plus rares. Comme tout bon logiciel, +on l'installe, on prend le temps de le configurer puis on l'oublie car ça fait le job ! + +Je l'ai mis en place pour sauvegarder quelques machines en nocturne par Rsync. +C'est de la sauvegarde miroir (pas assez de capacité disque pour faire des sauvegardes tournantes) +avec une copie différentielle de ce qui a changé depuis la veille. Pour GNU/Linux, le programme +rsync de toute distribution qui se respecte combiné avec un CRON fait l'affaire. + +Pour Ms Windows, il a fallu tester quelques clients rsync avant de trouver celui qui n'est pas +bogué et qui supporte les noms de fichiers avec accents : +c'est [cwRsync](https://www.itefix.no/i2/content/cwrsync-free-edition). Une tâche programmée +avec Ms Windows permet de lancer la sauvegarde en nocturne. Il est de bon ton de prévoir l'envoi +d'un email avec un compte-rendu de la sauvegarde, pour se rassurer sur le bon fonctionnement et +avoir une trace des fichiers synchronisés. J'ai dégoté le programme [blat](http://www.blat.net) +pour l'envoi d'email facile depuis un batch, il y en a sûrement plein d'autres. Voici un +script batch assez proche de celui que j'utilise : + +``` bat +REM ================================================================ +REM Synchroniser les changements +REM ================================================================ +SET SOURCE=(REPERTOIRE SOURCE) +SET IPNAS=(IP DU NAS4FREE) +SET NOMRSYNC=(NOM DU PARTAGE RSYNC) +rsync --recursive --stats --verbose --size-only --chmod=ugo=rwX --compress --delete + --delete-excluded --force --links --backup --backup-dir=backup + --exclude-from=exclude.txt "%SOURCE%" %IPNAS%::%NOMRSYNC% >rsync.log 2>rsync.err +copy rsync.err+mail.txt+rsync.log rsync.mail + +REM ================================================================ +REM Envoi de l'email +REM ================================================================ +SET FROM=(EXPEDITEUR DE L'EMAIL) +SET TO=(DESTINATAIRE DE L'EMAIL) +SET SMTP=(SERVEUR SMTP) +SET USER=(COMPTE UTILISATEUR) +SET PWD=(MOT DE PASSE) +blat rsync.mail -f %FROM% -to %TO% -server %SMTP% -u %USER% -pw %PWD% -subject "Nightly backup" +``` + +Une autre utilisation de mon instance Nas4Free est de servir un volume réseau iScsi qui sert +de stockage partagé à un cluster Ms Windows virtualisé qui sert à des tests. Ce qui m'amène au +second logiciel : **Proxmox**. Il s'agit d'une solution de virtualisation du style de VMware ESX +qui tourne sur un serveur dédié, s'administre par une interface Web. En fonction des besoins, +on peut créer des machines virtuelles car Proxmox est un hyperviseur KVM ou bien créer des +containers openvz. + +* Les containers sont indépendants comme une machine virtuelle mais c'est réalisé par isolation + des processus et isolation de la mémoire, une sorte de *super Chroot*. Ca ne s'applique donc + qu'aux système GNU/Linux avec la contrainte de ne pas pouvoir choisir le kernel ni le + modifier en rajoutant des modules. Si on n'a pas ces contraintes, les containers sont la + solution privilégiée car ils sont très légers. +* La création de machines virtuelles GNU/Linux ou Ms Windows est la solution pour tous les + autres cas. + +Grâce à cette gestion mixte Containers / KVM, un hyperviseur Proxmox qui tourne sur un serveur +récent peut réellement monter en charge. Les formats de VM sont ceux de KVM, il est aisé de convertir +une machine virtuelle VMware ou VirtualBox vers Proxmox. L'interface d'administration est sobre +et fonctionnelle. Elle permet la gestion des machines, leur configuration, la visualisation de +la charge (processeur, mémoire, réseau) par machine ou globale. Une console (qui nécessite le +support de JAVA dans le navigateur Web) peut être démarrée pour prendre le contrôle d'une machine. +Proxmox est sous licence AGPL et une société propose un support pour une souscription annuelle +raisonnable. Je ne l'ai pas expérimenté mais il est possible de mettre en cluster plusieurs instances +de Proxmox ce qui apporte la possibilité de migrer facilement des machines virtuelle ou des containers +d'une instance Proxmox vers une autre. diff --git a/content/blog/2013/2013-12-23-bilan-hebergement.md b/content/blog/2013/2013-12-23-bilan-hebergement.md new file mode 100755 index 0000000..b4f0f25 --- /dev/null +++ b/content/blog/2013/2013-12-23-bilan-hebergement.md @@ -0,0 +1,39 @@ +--- +layout: post +title: Bilan de l'hébergement +category: Hébergement +tag: planet +--- + +C'est fait ! j'ai lâché l'auto-hébergement pour un hébergement chez OVH avec +l'offre VPS (Virtual Private Server) de base, un container OpenVz dédié, +hébergé à Roubaix sur lequel j'ai choisi d'installer Debian Wheezy. Je gagne de +la bande passante et une bonne qualité de service. L'objectif reste le même, +avoir un serveur dédié à bidouiller qui me fournit quelques services : + +- l'hébergement de ce blog, +- une instance de Shaarli pour les favoris [merci SEB Sauvage](http://sebsauvage.net/wiki/doku.php?id=php:shaarli), +- un lecteur de flux RSS : [Tiny Tiny RSS](http://tt-rss.org) + +C'est le minimum vital que j'ai réinstallé depuis la migration de mon ancien +serveur auto-hébergé. J'ai encore beaucoup à faire pour automatiser certaines +tâches d'administration, puis pour étoffer les services : faire mon évaluation +annuelle de OwnCloud par exemple. + +Au niveau budget je suis en dessous des 100 euros par an : 72 euros pour la +location du VPS, 14 euros pour le domaine et les boites email chez Gandi et 12 +euros pour la location du modeste serveur Minecraft chez Nitroserv. Soit un +budget de **8 euros par mois**. + +C'est une passion qui reste raisonnable :-) + +Au niveau des distributions GNU/Linux, j'ai stabilisé mes usages : + +- ArchLinux, ma distrib de coeur à la maison pour sa fraîcheur de paquets, sa + logithèque énorme, sa stabilité qui peut en remontrer à beaucoup d'autres + distributions classiques (qui ne fonctionnent pas en mode *rolling-release*), +- Debian (parfois CentOS) sur les serveurs personnels et professionnels que je + suis amené à installer, +- Fedora sur mon poste professionnel, la distribution *incubateur* de RedHat : + une bonne distribution, pas trop mouvante pour un poste de développement + diff --git a/content/blog/2013/2013-12-27-extensions-firefox.md b/content/blog/2013/2013-12-27-extensions-firefox.md new file mode 100755 index 0000000..92f7acc --- /dev/null +++ b/content/blog/2013/2013-12-27-extensions-firefox.md @@ -0,0 +1,50 @@ +--- +layout: post +title: Mes extensions Firefox +category: Mozilla +tag: planet +--- + +Malgré quelques tests de la concurrence, je reste fidèle à Firefox depuis la +version 0.5. Il y a eu des hauts et des bas, je pense notamment à l'époque où +sa consommation mémoire était excessive. Aujourd'hui, c'est, pour moi, le +meilleur navigateur avec une feuille de route claire pour assoir et préserver +les standards ouverts du Web. + +**Recherche** + +- [Add to Search + Bar](https://addons.mozilla.org/en-US/firefox/addon/add-to-search-bar) : + ajouter facilement le formulaire de recherche d'un site aux moteurs de + recherche. +- [Quick Search + Bar](https://addons.mozilla.org/en-us/firefox/addon/quicksearch) : présenter + la barre de recherche sous forme de liste d'icônes pour changer facilement de + moteur. + +**Lecture** + +- [Reader](https://addons.mozilla.org/en-US/firefox/addon/reader) : formater la + page en cours pour la lecture avec une visibilité optimale. + +**Protection de la vie privée** + +- [Ghostery](https://addons.mozilla.org/en-US/firefox/addon/ghostery) : bloquer + les mouchards Web. +- [HTTPS Everywhere](https://www.eff.org/https-everywhere) : forcer + l'utilisation de HTTPS au lieu de HTTP. +- [ProfilePassword](https://freeshell.de/~kaosmos/profilepassword-en.html) : protéger l'accès au profile par un mot de passe au lancement de Firefox. + Utile en environnement professionnel où son navigateur est synchronisé avec son Firefox personnel. +- [Self-Destructing Cookies](https://addons.mozilla.org/en-US/firefox/addon/self-destructing-cookies) : suppression des cookies à la fermeture des onglets. + +**Développement Web** + +- [FireBreak](https://addons.mozilla.org/en-US/firefox/addon/firebreak) : + tester les *responsive design* avec différentes résolutions. +- [More Display Resolutions](https://addons.mozilla.org/ja/firefox/addon/more-display-resolutions) : idem que le précédent. +- [FireBug](https://getfirebug.com) : l'outil de référence pour le + développement Web, débogueur JavaScript, inspecteur CSS / HTML. +- [YSlow](https://addons.mozilla.org/en-US/firefox/addon/yslow) : un plugin pour FireBug orienté analyse de performance des pages Web. +- [View Dependencies](https://addons.mozilla.org/en-US/firefox/addon/view-dependencies) : ajout d'un onglet aux propriétés d'un site Web pour lister les dépendances + CSS / JS de la page. +- [Dust-me selectors](https://addons.mozilla.org/en-US/firefox/addon/dust-me-selectors) : analyse des sélecteurs CSS utilisés sur la page. diff --git a/content/blog/2014/2014-01-02-horde-debian.md b/content/blog/2014/2014-01-02-horde-debian.md new file mode 100755 index 0000000..e5aa175 --- /dev/null +++ b/content/blog/2014/2014-01-02-horde-debian.md @@ -0,0 +1,199 @@ +--- +layout: post +title: Installation de Horde Groupware +categories: Hébergement Mobilité Debian +tag: planet +--- + +Je remets en place progressivement les outils nécessaires sur mon serveur +Debian. Je me suis posé à nouveau la problématique de la synchronisation des +contacts et du calendrier entre mes appareils, c'est à dire mon ordinateur +portable sous ArchLinux avec le logiciel de courrier *Thunderbird* et son +module de gestion de calendrier *Lightning*, mon antique téléphone BlackBerry +Bold 9780. Un accès Web à mon calendrier et mes contacts depuis n'importe +quelle machine quand je suis en déplacement serait un plus. + +Le téléphone supporte la synchronisation Google de facto et SyncML en +installant le client [Funambol](http://www.funambol.com). Je n'ai trouvé aucune +possibilité gratuite pour faire de la synchronisation CardDAV, CalDAV ou +ActiveSync. SyncML reste ma meilleure option. On peut installer le client +Funambol du BlackBerry Store mais il fait plus que nécessaire car il +s'interface avec le serveur Funambol ou bien on peut installer une version plus +ancienne qui suffit pour la synchro des contacts, du calendrier et des tâches +depuis [ce lien](http://www.memotoo.com/how-to-sync-your-blackberry-phone.php). +Côté ordinateur, Lightning supporte nativement le protocole CalDav et le carnet +d'adresse peut être synchronisé avec CardDAV en installant le [module +complémentaire pour Sogo](http://www.sogo.nu/english/downloads/frontends.html). + +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 + +Pour tester on relance qmail : + + qmailctl stop + qmailctl start + +Et on tente l'envoi d'un email avec la commande mail : + + mail -s "Hello" someone@somewhere.fr + Ceci est un test + ^D + +Le fichier de log **/var/log/qmail/current** permet de vérifier l'état de l'envoi. diff --git a/content/blog/2014/2014-04-15-redis-ha.md b/content/blog/2014/2014-04-15-redis-ha.md new file mode 100755 index 0000000..2763c11 --- /dev/null +++ b/content/blog/2014/2014-04-15-redis-ha.md @@ -0,0 +1,165 @@ +--- +layout: post +title: Haute Disponibilité avec Redis +category: Cluster +tag: planet +--- + +[Redis](http://redis.io/) est une base de donnée de type clef-valeur. On la +range dans la grande famille plutôt hétérogène des bases **NoSQL** qui, pour +rappel, signifie plutôt *Not Only SQL* que *No SQL*. Ceci dit, dans le cas de +Redis, on est vraiment dans le *No SQL at all*. La base permet de stocker par +clef des chaînes, des listes de chaînes, des *hashtable*. Elle permet de +stocker des valeurs avec une date d'expiration au delà de laquelle la donnée +disparaît. Idéal pour gérer des données cache et c'est d'ailleurs +l'utilisation principale de Redis. On peut aussi facilement implémenter +producteur / consommateur entre plusieurs clients d'une base Redis. L'ensemble +des commandes supportées par Redis est parfaitement documenté +[ici](http://redis.io/commands). + +La base est orientée performance et évolutivité : + +- écrite en C, facilement portable car le code n'a pas de dépendance particulière, +- stockage des données en mémoire avec différents mécanismes optionnels pour conserver une copie sur disque, +- réplication possible d'une base maître vers un grand nombre de bases esclaves. On peut écrire dans la base maître et seulement lire dans les bases esclaves. + +Ce qui fait (aussi) le succès de Redis, c'est que le coeur est en C et qu'il +existe des [clients pour la plupart des langages](http://redis.io/clients). +Pour l'instant, j'ai utilisé Jedis pour JAVA et redis-py pour Python. Enfin, +un client en ligne de commande permet d'interagir avec la base sans écrire de +code. + +La dernière version stable est Redis 2.8.8. Quant à la version 3.0 à venir, +encore en phase de bêta, elle embarque des fonctionnalités de répartition des +données dans des configuration de type cluster, ce qu'on appelle en langue de +Shakespeare le **sharding**. Dans le futur, elle embarquera aussi des +fonctionnalités de Haute Disponibilité pour basculer les données lorsqu'un +noeud du cluster s'écroule. + +En attendant ce futur, la version actuelle apporte une solution de cluster +actif/passif basée sur la réplication maître / esclave surveillée par des +sentinelles chargées de promouvoir un Redis esclave en maître en cas de +défaillance. + +Je me suis intéressé à monter une configuration avec seulement 2 machines sous +Debian qui peut fonctionner si l'une des machines tombe et automatiquement +réintégrer le cluster quand elle redevient opérationnelle, sans impact pour +les clients Redis. Ce n'est pas si trivial et je me suis heurté à quelques +difficultés avant d'arriver à une configuration opérationnelle. + +Comme dans la plupart des architectures clusterisées, un quorum (nombre +minimal de votants) est nécessaire pour élire un nouveau maître. La valeur +minimum possible est 1, signifiant qu'une sentinelle a besoin qu'au moins 1 +autre sentinelle soit d'accord avec elle pour déclarer qu'un Redis maître est +défaillant. Il faut au minimum 2 sentinelles opérationnelles quel que soit +l'état du cluster donc sur chaque machine on va installer un Redis et 2 +sentinelles. + +Au début de mes expérimentations, j'attribuais un port différent aux +sentinelles pour les exécuter sans conflit sur la même machine mais j'avais +des problème d'indécision des sentinelles pour élire un nouveau noeud. Je +crois que toutes les sentinelles ne communiquaient pas. La situation s'est +arrangée quand j'ai configuré toutes mes sentinelles pour écouter sur le port +standard 26379. Pour que ce soit possible, j'ai attaché mes sentinelles à des +adresses IP différentes en déclarant une sous-interface sur chaque machine. + + +–––––––––––––––+––––––––––––––+ +–––––––––––––––+––––––––––––––+ + | Sentinelle 1 | | | Sentinelle 1 | | + +–––––––––––––––+ | +–––––––––––––––+ | + | REDIS | Sentinelle 2 | | REDIS | Sentinelle 2 | + +––––––––––––––––––––––––––––––+ +––––––––––––––––––––––––––––––+ + | Eth0 | Eth0:1 | | Eth0 | Eth0:1 | + | 192.168.0.51 | 10.25.14.1 | | 192.168.0.52 | 10.25.14.2 | + +–––––––––––––––+––––––––––––––+ +–––––––––––––––+––––––––––––––+ + Machine A Machine B + + +Voici la configuration réseau de la machine A (/etc/network/interfaces) : + + iface eth0 inet static + address 192.168.0.51 + netmask 255.255.255.0 + + iface eth0:1 inet static + address 10.25.14.1 + netmask 255.255.255.0 + + +La configuration des serveurs Redis est identique sur chaque machine : + + port 6379 + + loglevel warning + logfile "/var/log/redis.log" + + maxmemory-policy noeviction + + appendonly yes + appendfsync always + + auto-aof-rewrite-percentage 100 + auto-aof-rewrite-min-size 64mb + aof-rewrite-incremental-fsync yes + +Ce n'est pas le sujet de l'article mais je vous conseille de jeter un oeil à +la documentation pour les paramètres liés à l'AOF et au APPEND qui vont +réduire les risques de perte de données en configurant des écritures sur +disque. C'est peut-être inintéressant dans le cas d'une utilisation de Redis +comme cache mais ça le devient dans le cas d'une utilisation plus classique +comme base de données. + +Quand les deux serveurs Redis sont démarrés, on peut initier le rôle initial +d'esclave de la machine B depuis le client Redis avec la commande : + + slaveof 192.168.0.51 6379 + +Par la suite, les sentinelles se chargent de décider quel rôle est joué en +fonction de la disponibilité des machines. + +Voici la configuration de la sentinelle 1 sur la machine A : + + port 26379 + bind 192.168.0.51 + + # master configuration + sentinel monitor master 192.168.0.51 6379 1 + sentinel down-after-milliseconds master 3000 + sentinel failover-timeout master 10000 + sentinel parallel-syncs master 4 + + +Et celle de la sentinelle 2, également sur la machine A : + + port 26379 + bind 10.25.14.1 + + # master configuration + sentinel monitor master 192.168.0.51 6379 1 + sentinel down-after-milliseconds master 3000 + sentinel failover-timeout master 10000 + sentinel parallel-syncs master 4 + +La configuration des sentinelles de la machine B est identique à part les +directives **bind** pour attacher les services aux adresses 192.168.0.52 et +10.25.14.2. + +Avec cette configuration, on a suffisamment de sentinelles pour basculer le +rôle d'une machine à l'autre dans cas extrème où la machine A est +injoignable par le réseau ou bien mise hors tension. + +Je n'ai pas détaillé le code client mais il y a une étape avant de récupérer +une connexion valide à la base Redis : s'adresser au *pool* de sentinelles +pour obtenir l'adresse du maître et ensuite ouvrir une connexion vers celui- +ci. Dans le cas d'une bascule du cluster, la connexion est cassée et il faut à +nouveau s'adresser aux sentinelles pour récupérer l'adresse du Redis maître. + +Voici un exemple typique de code en Python : + +``` python +from redis.sentinel import Sentinel +sentinel = Sentinel( + [('192.168.0.51', 26379), ('192.168.0.52', 6379)], socket_timeout=0.1) +print("Master %s %d" % sentinel.discover_master('master')) +``` + +Je suis le projet Redis depuis un bout de temps avec intérêt car il offre beaucoup d'applications possibles dans des architectures distribuées multi-langages. diff --git a/content/blog/2014/2014-04-28-gnome3-attendez-moi.md b/content/blog/2014/2014-04-28-gnome3-attendez-moi.md new file mode 100755 index 0000000..413e43a --- /dev/null +++ b/content/blog/2014/2014-04-28-gnome3-attendez-moi.md @@ -0,0 +1,43 @@ +--- +layout: post +title: Gnome 3, attendez moi les jeunes ! +category: GNU/Linux +tag: planet +--- + +Ma dernière tentative d'utiliser Gnome en environnement professionnel date de +[fin 2011](gnome-3-pour-un-usage-professionnel.html). Le changement avait été +trop brutal et déclenché [mon passage à XFCE](quelle-distribution-gnome-2 +-choisir-en-2012.html) où je suis resté depuis, que ce soit sous Arch à la +maison ou au bureau sous Fedora. En 2 ans, les développeurs de Gnome ont +sacrément amélioré leur bijou : + +- meilleures performances, cohésion de l'interface, raffinements +- ergonomiques et esthétiques à tous les étages, ouverture grâce aux +- extensions pour rajouter les fonctionnalités manquantes (ou écartées). + +Par curiosité, j'ai testé quelques jours la version 3.12 à la +maison sous Arch en mixant les usages et j'ai réalisé que je m'y faisais très +bien. L'absence de barre de tâches ne me choque plus et je m'en sors même dans +des usages *professionnels* avec beaucoup d'application ouvertes. Alors qu'est +-ce qui a changé ? Certes l'interface est cohérente et agréable, la recherche +d'applications est plus rapide qu'à l'époque, on configure sans problème +l'utilisation multi-moniteur, c'est plus stable ... Cool mais rien de vraiment +déterminant ! En fait, ce qui a réellement changé c'est que *le vieil +utilisateur* que je suis a enfin digéré la rupture Gnome 2 / Gnome 3 et sauté +le pas vers cette nouvelle interface. Il est possible que la confrontation aux +interfaces pour mobile (Android, BB 10) ait accéléré l'acceptation d'un +nouveau type d'interface sur le bureau. + +J'ai aussi basculé ma Fedora XFCE Spin vers Gnome au bureau et les quelques +jours d'utilisation sont positifs. Mon image d'utilisateur Linux avec une +interface archaïque et des terminaux plein les écrans s'écorne... J'ai +toujours des terminaux mais avec une interface moderne et sexy à faire saliver +les utilisateurs de Windows 7 et tousser ceux de Windows 8 +(**troll inside**). + +Plus sérieusement, comme d'autres j'ai douté de la +révolution Gnome en 2011 et c'est un beau projet que je retrouve 2 ans après. +Je ne renie pas XFCE, idéal pour les configurations plus légères que je suis +amené à installer mais je suis **enfin reconcilié** avec Gnome. + diff --git a/content/blog/2014/2014-05-25-supervisor.md b/content/blog/2014/2014-05-25-supervisor.md new file mode 100755 index 0000000..233ba2d --- /dev/null +++ b/content/blog/2014/2014-05-25-supervisor.md @@ -0,0 +1,208 @@ +--- +layout: post +title: Supervisor, gestion de processus +category: GNU/Linux +tag: planet +excerpt: "Quand il s'agit de déployer des programmes de son cru sur un serveur +GNU/Linux, on réalise généralement deux actions : l'écriture d'un script de démarrage et arrêt du programme, la *démon-isation* du programme" +--- + +Quand il s'agit de déployer des programmes de son cru sur un serveur +GNU/Linux, on réalise généralement deux actions : + +- l'écriture d'un script de démarrage et arrêt du programme +- la *démon-isation* du programme + +Le premier point n'est pas complexe mais il peut être contraignant. Si on +envisage de déployer sur Debian, Ubuntu et Fedora, il faut prévoir trois +scripts différents : un pour les scripts à la saucce Sys V, un pour Upstart +et un autre pour systemd. L'avantage c'est qu'on peut gérer finement les +dépendances à d'autres services. + +Le second point consiste à veiller à ne pas bloquer le script d'init en +lançant le programme. On peut le gérer dans le code de notre programme en +prévoyant deux modes de lancement de notre programme : *daemon* et +interactif. Python, par exemple, propose [la librairie +daemonize](https://pypi.python.org/pypi/daemonize) pour réaliser cela. JAVA +propose des outils comme JAVA Service Wrapper pour gérer le lancement et +garantir l'arrêt du processus. On peut aussi le gérer de manière externe au +code, de manière rustique avec un +[nohup](https://en.wikipedia.org/wiki/Nohup), auquel cas il faut gérer +l'arrêt fiable du processus en manipulant son PID. + +Voici un exemple de script d'init à la sauce Debian pour un programme +JAVA : + +``` shell +### BEGIN INIT INFO +# Provides: monprog +# Required-Start: $local_fs $remote_fs $network $syslog +# Required-Stop: $local_fs $remote_fs $network $syslog +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# X-Interactive: true +# Short-Description: Start/stop monprog +### END INIT INFO +BOOT_LOG=/var/log/monprog-boot.log +PID_FILE=/opt/monprog/pid +start_java () { + nohup java -cp "/opt/monprog/lib/*" fr.yax.monprog.Main >$BOOT_LOG 2>&1 & + echo $! > $PID_FILE + echo "Monprog started ..." +} +do_start () { + echo "Starting Monprog ..." + if [ ! -f $PID_FILE ]; then + start_java + else + PID=$(cat $PID_FILE) + if [ -d /proc/$PID ]; then + echo "Monprog is already running ..." + else + start_java + fi + fi +} +do_stop() { + echo "Stopping Monprog ..." + if [ -f $PID_FILE ]; then + PID =$(cat $PID_FILE); + kill $PID 2>/dev/null + echo "Monprog stopped ..." + rm -f $PID_FILE + else + echo "Monprog seems not running ..." + fi +} +case $1 in + start) + do_start + ;; + stop) + do_stop + ;; + restart) + do_stop + sleep 1 + do_start + ;; +esac +``` + +C'est perfectible. Il faudrait tenter l'arrêt avec un signal moins violent +que SIGKILL de façon à l'intercepter dans le code et faire un arrêt propre. +Si cette méthode ne fonctionne pas au bout de plusieurs secondes, le script d'init pourrait alors opter pour un arrêt radical. + +Cette méthode fonctionne bien mais elle nécessite une connaissance système +pour écrire et maintenir les scripts en fonction des déploiements cible. Si +on veut donner la possibilité à un utilisateur standard (non *root*) de +démarrer ou arrêter un programme, il faut aussi maîtriser un peu la gestion +des droits UNIX (avec sudo par exemple). + +Une alternative simple pour la plupart des systèmes UNIX (GNU/Linux, FreeBSD, +Solaris et Mac OS X) est le [programme Supervisor](http://supervisord.org). +C'est écrit en Python (comme la plupart des programmes de qualité ! **Troll +inside** ) et de même que MongoDB permet au développeur de reprendre la main +au DBA sur l'administration de base de donnée, Supervisor permet au +développeur de reprendre un peu la main à l'admin sys sur le déploiement de +ses applications. + +Supervisor est fourni sur la plupart des distributions. On peut l'installer +avec le système de paquet de sa distribution ou bien opter pour une +installation à partir de PIP, l'installeur de programmes Python. Ce dernier +permet d'obtenir la version la plus récente de Supervisor. + +Supervisor est composé de deux parties : + +- un service **Supervisord** +- un client en mode console : **Supervisorctl** + +Le client permet d'interagir avec les programmes gérés : démarrer, stopper. +Une interface RPC permet aussi de piloter Supervisord programmatiquement ; je +n'ai pas encore testé cet aspect. + +La configuration principale est dans un fichier supervisord.conf qui décrit la +connexion du client supervisorctl (section unix_http_server), la config RPC +(section rpcinterface) et le répertoire des configuration des programmes à +gérer (section includes). + +Voici une configuration type : + +#### /etc/supervisor/supervisord.conf + + [unix_http_server] + file=/var/run//supervisor.sock ; (the path to the socket file) + chmod=0770 ; sockef file mode (default 0700) + chown=root:supervisor + + [supervisord] + logfile=/var/log/supervisor/supervisord.log + pidfile=/var/run/supervisord.pid + childlogdir=/var/log/supervisor + + [rpcinterface:supervisor] + supervisor.rpcinterface_factory = supervisorrpcinterface:make_main_rpcinterface + + [supervisorctl] + serverurl=unix:///var/run//supervisor.sock + + [include] + files = /etc/supervisor/conf.d/*.conf + +Les droits sur la socket UNIX sont important. En donnant l'accès à ROOT et au +groupe supervisor, on peut facilement donner l'accès à supervisorctl en +ajoutant un utilisateur dans le groupe supervisor. Attention donner l'accès à +supervisorctl c'est donner le droit de stopper n'importe quel programme géré +par supervisor. C'est un privilège important. + +Le reste de la configuration consiste à créer des configurations +additionnelles décrivant des programmes à lancer simplement : + +- par défaut un programme démarre en même temps que le service donc au +démarrage du serveur. C'est configurable. +- on peut définir si un programme doit être relancé automatiquement et définir sous quelle condition, par exemple en fonction du code de sortie du programme. +- on peut opter pour l'envoi d'un signal au programme afin de demander au programme de s'arrêter proprement plutôt que de forcer un arrêt brutal. +- on peut regrouper des programmes pour manipuler des +groupes, faire des démarrages groupés et des arrêts groupés. C'est utile si on a beaucoup de programmes. +- au sein d'un groupe on peut définir des +priorités pour ordonner le lancement des programmes du groupe. + +Voici un exemple qui définit un groupe mesprogrammes composé de 2 programmes correspondant au même binaire. + +#### /etc/supervisor/conf.d/mesprogrammes.conf + + [group:mesprogrammes] + programs=monprog1,monprog2 + + [program:monprog1] + directory=/opt/monprogram + command=/usr/bin/java -DrunDir=/opt/monprog -cp "lib/*" fr.yax.monprog.Main --port 1234 + stopsignal=INT + priority=500 + + [program:monprog2] + directory=/opt/monprogram + command=/usr/bin/java -DrunDir=/opt/monprog -cp "lib/*" fr.yax.monprog.Main --port 1235 + stopsignal=INT + priority=501 + +Dans cet exemple, on envoie un signal SIGINT à monprog pour lui demander un arrêt propre. Voici un snippet de code JAVA pour intercepter le signal : + +#### Interception d'un signal SIGINT en JAVA + +``` java +// register a shutdown hook +Runtime.getRuntime().addShutdownHook(new Thread() { + @Override + public void run() { + logger.info("Shutting down has been requested"); + stopCleanly(); + } +}); +``` + +En conclusion, **Supervisor** est un bon outil de gestion de programmes : +fiable, facile à installer et à configurer. En complément d'un outil de +déploiement comme [Fabric](http://www.fabfile.org) un développeur peut +facilement automatiser le déploiement de son programme sur une ou plusieurs +machines cibles. diff --git a/content/blog/2014/2014-08-05-vacances.md b/content/blog/2014/2014-08-05-vacances.md new file mode 100755 index 0000000..1b909b2 --- /dev/null +++ b/content/blog/2014/2014-08-05-vacances.md @@ -0,0 +1,26 @@ +--- +layout: post +title: En vacances +category: Humeur +tag: planet +--- + +Bon, il ne faut pas se mentir, la saison chaude en Provence ça ne booste pas la +productivité. On assure l'essentiel mais l'activité de blogging en a fait les +frais. C'est une demi excuse. L'autre moitié de l'excuse c'est que j'ai +*mollement* codé ces dernières semaines un petit projet de gestion des +commentaires d'un blog statique, un projet qui me tient à coeur depuis plus +d'un an. C'est un petit projet mais j'ai pris le temps de la réflexion et +savouré le codage dans mon [langage fétiche](https://www.python.org). Je +termine la documentation pour pouvoir le publier décemment sous GitHub et je +consacrerais bientôt un article dessus. + +Pour me relaxer, j'ai travaillé un peu la cosmétique du site : + +- mise à jour de [Pelican](http://docs.getpelican.com/en/3.4.0) en version 3.4 +- mise à jour des librairies CSS: [Pure](http://purecss.io) en version 0.5.0, [Font Awesome](http://fortawesome.github.io/Font-Awesome) en version 4.1.0 +- *subtiles retouches* de quelques détails visuels + +Bon été à tous + + \ 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" +--- + +Raspberry logoJe 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://:7767 + +### les objets supervisés + +Nagios introduit la notion de *host* et de *service* pour désigner les +machines et les services s'exécutant sur ces machines. La configuration de +Shinken après installation est minimale : + +- les notifications par email sont activées et seront utilisées si [votre serveur peut envoyer des emails](http://blogduyax.madyanne.fr/smtp-relay-avec-qmail-sur-debian-wheezy.html) +- la machine locale est elle-même supervisée de manière générique, je crois que le seul indicateur c'est le Ping pour vérifier qu'elle est accessible. + +On va enrichir tout cela en installant un agent SNMP sur le serveur Shinken ce qui permet de surveiller, entre autre, l'utilisation CPU, RAM, occupation des disques. + +On installe un agent SNMP sur la machine locale avec le paquet **snmpd** qui, par défaut, n'est accessible que par localhost : + + $ apt-get install snmpd + +On rajoute le greffon linux-snmp dans Shinken : + + $ shinken install linux-snmp + +On corrige deux soucis de l'installation sous Debian : + +le script **check_icmp** doit avoir les droits setuid : + + $ chmod u+s /usr/lib/nagios/plugins/check_icmp + +Le module PERL **utils.pm** est mal référencé par les greffons Nagios ; on le +fait pointer sur celui de notre installation de PERL dans */usr/share/perl5* + + /usr/share/perl5$ ln -s /usr/lib/nagios/plugins/utils.pm + +On peut modifier la configuration du *host* **localhost** en éditant le fichier */etc/shinken/hosts/localhost.cfg* : + + define host{ + use linux-snmp + contact_groups admins + host_name localhost + address 127.0.0.1 + } + +On vérifie la configuration et on redémarre Shinken : + + $ service shinken check + $ service shinken restart + +Si la configuration est correcte, la machine locale avec ses services CPU, +Mémoire apparaît désormais dans Webui. La fréquence du *polling*, les +notifications, tout est configurable finement par *host* , par groupe de +*host*, par service. La documentation est riche et bien détaillée. + +Dans le cas de GNU/Linux, la supervision par SNMP apporte les indicateurs de +base d'un serveur. Pour avoir plus, on peut donner l'accès SSH au superviseur +Shinken sur les serveurs ou on peut installer NRPE (Nagios Remote Plugin +Executer). Je préfère NRPE car on ne demande pas l'accès total au serveur à +superviser. L'installation de [NRPE est bien décrite dans cet +article](http://xmodulo.com/2014/03/nagios-remote-plugin-executor-nrpe- +linux.html). Pour finir, beaucoup de resources Nagios sont disponibles sur +le site [Nagios Exchange](http://exchange.nagios.org). diff --git a/content/blog/2014/2014-10-23-pecosys-v2.md b/content/blog/2014/2014-10-23-pecosys-v2.md new file mode 100755 index 0000000..ece30c5 --- /dev/null +++ b/content/blog/2014/2014-10-23-pecosys-v2.md @@ -0,0 +1,39 @@ +--- +layout: post +title: Du nouveau sur Pecosys +categories: Hébergement Blog +tag: planet +--- + +Pecosys est le gestionnaire de commentaires pour les blog statiques créés avec +[Pelican](http://docs.getpelican.com/en/3.4.0) présenté [dans ce +billet](http://blogduyax.madyanne.fr/pecosys-les-commentaires-avec-pelican.html) en +août dernier. Pour rappel, il s'agit de proposer une alternative aux systèmes +décentralisés sur des sites tiers comme Disqus et de conserver ces données qui +font partie de l'Histoire d'un blog dans les sources du blog. + +La présentation du projet a eu un petit succès d'estime. Je suis conscient que +le public ciblé est réduit : du barbu (ou pas) qui écrit ses articles en +Markdown, le construit en HTML statique gràce à Pelican et versionne les +sources dans GIT. Sachant que Pecosys demande quelques connaissances système +pour s'installer et qu'il est écrit en Python, on touche les gens qui ont un +serveur dédié (physique ou virtuel) à la maison ou chez un hébergeur et qui +aiment se faire plaisir (ou mal selon le point de vue).. + +Pecosys est en fonction sur ce blog depuis 3 mois. Il y a eu beaucoup de +corrections de bugs (désolé pour les commentaires perdus, ça ne devrait plus +arriver grâce aux logs étendus de NginX) et quelques nouveautés livrées et +installées tout récemment : + +- Le support multi-langue dans la communication entre Pecosys et + l'administrateur du blog. Pour l'instant, le français et l'anglais sont + proposés. +- Une communication plus humaine entre Pecosys et l'administrateur du blog + avec des emails moins télégraphiques. +- La possibilité pour les lecteurs de s'abonner par email au flux de + commentaire d'un article et de se désabonner quand ils le souhaitent. +- La possibilité de relancer la *génération Pelican* du blog à chaque publication d'un + commentaire. + +L'ensemble des sources et une documentation plus technique est publié [sur mon +GitHub.](https://github.com/kianby/pecosys) diff --git a/content/blog/2014/2014-11-02-diaspora.md b/content/blog/2014/2014-11-02-diaspora.md new file mode 100755 index 0000000..53749bd --- /dev/null +++ b/content/blog/2014/2014-11-02-diaspora.md @@ -0,0 +1,101 @@ +--- +layout: post +title: Premiers pas avec Diaspora +category: Humeur +tag: planet +--- + +Comme pour beaucoup d'autres personnes, [l'initiative de +Framasoft](https://framasphere.org) a été l'occasion de découvrir le réseau +social **Diaspora** et son contrat respectueux des données de l'utilisateur. + +Mon expérience passée des réseaux sociaux est assez classique je pense dans +notre milieu : + +- J'ai un compte Twitter depuis 2007 que j'ai utilisé 1 ou 2 ans. Je postais un +peu, puis à un moment je me suis senti plus concerné par mon e-Réputation et +j'ai supprimé toutes mes photos de chats dont j'inondais la toile ;-) Je me +suis encore servi du réseau pour suivre des sujets et des gens jusqu'à ce que +je décroche et le compte est devenu dormant. +- A la même époque j'ai ouvert un compte Facebook. L'histoire est plus courte ; +je m'étais inscrit pour rester en contacts avec des gens géographiquement +éloignées. Quelques mois plus tard, devant mon manque d'intérêt et fatigué de +vérifier mes paramètres de diffusion suite à des changements réguliers des +conditions d'utilisation, j'ai enlevé le peu que j'avais posté et j'ai supprimé +mon compte officiellement. + +De ces deux courtes expériences je me suis fait une idée, peut-être inexacte, +des usages et des usagers de chacun des réseaux. + +Facebook permet de rester en contact avec sa tribu, un peu comme [ce fameux +objet connecté des années 90 précurseur du téléphone +portable](http://www.nosannees90.com/dans-les-90s-le-tam-tam-et-le-tatoo-pour-garder-le-contact-avec-sa-tribu) : +sa famille, les amis réels, les connaissances qu'on se noue autour de centres +d'intérêt communs. Je pense que Google+ s'adresse aux même usages mais c'est +une supposition, je n'ai pas eu l'occasion de tester. Ces usages concernent le +plus grand nombre: rester en contact avec Tonton Jeannot et poster la photo du +petit dernier, échanger des vidéos débiles avec des potes partis dans une autre +région. C'est probablement sur ces réseaux qu'on va trouver le plus de +futilités mais **c'est ça le social** : que fait-on dans un apéro à part +échanger des anecdotes, se donner des nouvelles et raconter des blagues ? La +même chose je pense et en cela ces réseaux jouent leur rôle. Et dans des pays +où l'Internet à la maison et l'ordinateur personnel est un rêve, ces +réseaux permettent de garder du lien entre les familles et les amis éloignés en +allant au Cyber-Café quand on a 3 sous pour prendre des nouvelles et en donner. +En cela, Facebook fait carton plein pour toucher le plus personnes et proposer +une alternative Libre était crucial. + +Twitter est assez différent. C'est plus un outil de communication pour diffuser +de l'information de façon ciblée grâce aux fameux hashtags : un bel outil pour +les Community Manager professionnels et en herbe. + +### Mon premier bilan + +Quand je me suis connecté à Diaspora et que j'ai lu un peu la FAQ, j'ai adoré +le concept du tag *à la Twitter* mixé au réseau social plus classique *à la +Facebook* où on peut poster ses photos. J'ai vu le meilleur des 2 mondes, la +possibilité de créer des cercles (désolé Google y'a pas de brevet sur ce mot je +pense) de connaissances et aussi de s'abonner à des tags pour suivre des sujets +précis et découvrir de nouvelles personnes à suivre. Je suis quelques tag et +cela m'a permis de découvrir quelques personnes intéressantes et retrouver ceux +que je lis déjà en RSS et qui gravitent autour du Planet. Le concept de tag de +Diaspora va même plus loin car on suit un tag donc la découverte s'enrichit en +permanence par rapport à Twitter où il faut de temps lancer une recherche pour +découvrir les nouveaux venus sur un thème donné. + +Quatre semaines plus tard, le bilan est positif. Le réseau est sympathique à +utiliser, les gens (du moins ceux que je suis) sont cordiaux, la version mobile +du site permet de se connecter de son téléphone sans application spécique. Mais +ce qui pèche, c'est le peu de contenu de mon flux alors que je suis des tag +assez généraux. + +### Comment faire grossir Diaspora ? + +Si on utilise le réseau pour rester en contact avec sa tribu, la migration se +fera par petites grappes. Untel part sur Diaspora et va attirer petit à petit +(et sûrement difficilement) le noyau dur de ses connaissances. Difficilement +car la majorité des gens ont un smartphone sous Android et des applications +lourdes pour Facebook ou Twitter qui facilitent l'instantanéité: un clic pour +partager une photo. Seul un barbu dégainera son valeureux téléphone Firefox +pour ouvrir un navigateur sur Diaspora et ensuite naviguer sur son système de +fichier pour trouver la photo à publier. Des bonnes applications mobiles sont +nécessaires pour faire décoller le réseau. + +Pour les pays émergents, Diaspora pourrait s'imposer par de la pub vers les +utilisateurs finaux. Il faut aussi que les temps d'accès soient corrects, ce +qui demande une multiplication des Pods et l'installation de Pods au plus près +des utilisateurs. + +Si on utilise le réseau pour faire de la veille technologique il faut trouver +des arguments pour convaincre les poids lourds qui postent essentiellement sur +Twitter et Google+ de poster aussi du Diaspora. Ces acteurs ne viendront pas +pour la philosophie du réseau mais pour l'audience potentielle. Par exemple, +Parleys publie des conférences techniques sur l'éco-système JAVA. Si on savait +combien de personnes suivent le tag #java sur Diaspora ce serait un argument +tangible pour convaincre ce site de publier aussi ses annonces sur Diaspora. +C'est pareil pour le tag #python que je suis. Très peu de contenu alors que de +gros agrégateurs de contenu publient sur Twitter. Peut-être que la possibilité +de collecter des statistiques anonymes sur les utilisateurs du réseau Diaspora +existe déjà ? Sans contenu, Diaspora restera un réseau de niche, une +alternative à Facebook pour échanger des photos avec tata Jeanine mais pas un +réseau qui fera venir les foules. diff --git a/content/blog/2014/2014-11-14-my-phone.md b/content/blog/2014/2014-11-14-my-phone.md new file mode 100755 index 0000000..ccff007 --- /dev/null +++ b/content/blog/2014/2014-11-14-my-phone.md @@ -0,0 +1,83 @@ +--- +layout: post +title: Au fait... mon téléphone +categories: Humeur Mobilité +tag: planet +--- + +Cela fait longtemps que je n'ai pas parlé de mon téléphone. J'ai connu les +années très hétérogènes où chaque constructeur proposait son système +d'exploitation. Puis est arrivée l'ère de la consolidation avec iOS sur iPhone +et surtout Android. C'était logique et attendu par le marché. Et nous a permis +d'avoir les smartphones hyper puissants et... hyper-couteux d'aujourd'hui. Moi +j'ai toujours la nostalgie de cette époque pour sa diversité que ce soit des +équipements ou des systèmes d'exploitation mobiles. C'est aussi mon goût du +chaos qui parle et le fait avéré que je suis vieux. + +Aujourd'hui tout téléphone est rectangulaire, le plus plat possible et le constructeur se +démarque par deux éléments : + +- la noblesse des matériaux utilisés (donc le positionnement en prix), +- une décision cornélienne : le style des coins : carrés ou arrondis ? + +Quelle prise de risque ;-) Mais où sont enterrés les téléphones à clapet et les +systèmes exotiques ? Au fait, qui a eu un téléphone Bosch avec une fonction +thermomètre (d'ambiance hein pas médical, le téléphone n'était pas IP6x) dans +les années 2000 ? Moi : +1 + +Mon premier smartphone fut un [Nokia +E61i](http://fr.wikipedia.org/wiki/Nokia_E61i). Il m'a beaucoup marqué, le +système Symbian c'était cool et facilement bidouillable. Puis j'ai rêvé d'avoir +un N900 avec Maemo, un système *GNU inside* avec un système Debian-like. le +Libre allait étendre son emprise sur le monde de la mobilité. J'ai raté le +cocher pour l'acheter, Nokia a jeté Maemo (leur plus grosse erreur), fin du +rêve. Du coup j'ai rejoint le train Android avec un Motorola Milestone +(coulissant avec clavier). Un bilan a été mitigé : toutes les applications du +monde mais un système alors peu stable (c'était la 2.0) puis j'ai eu un ras le +bol croissant de voir des téléphones semblables sortir chaque semaine avec le +même OS. Je parle des années 2009-2011 quand Android a littéralement inondé le +marché. Et pendant cette période, il m'apparaissait de plus en plus clairement +que Android basé sur Linux c'est cool, mais Google, icône du Web à mes yeux +depuis 15 ans, c'était de moins en moins cool pour la protection de sa vie +privée. + +Une envie de voir autre chose et une fixation sur les claviers physiques car +je suis une quiche en tactile m'a amené chez BlackBerry pour un modèle Bold +9780. Là j'ai retrouvé un OS beaucoup plus rustique, non tactile mais avec +une richesse fonctionnelle qui mettait loin derrière Apple et Google en 2012. +J'ai poussé ce téléphone dans ses retranchements et il ne m'a jamais trahi dans +ma période de grand voyageur. Il est encore en état mais la batterie est +fatiguée. Il a donc été décidé de le changer au printemps dernier. + +J'étais tenté par Firefox OS mais il n'y avait pas encore de téléphone +disponible en France. Mon inquiétude concernait les fonctionnalités. Mon mobile +me sert aussi professionnellement donc un niveau minimum de fonctionnalité +m'est nécessaire : point d'accès 3G, GPS (hors ligne et en ligne), calendrier +partagé, accès à des bases de données de mots de passe Keepass , copier-coller +intensif entre les applications. C'était encore un peu tôt pour Firefox OS. + +Hors de question de partir sur Android et de jouer à degoogler l'appareil. +L'iPhone est trop bridé. J'ai pensé à Windows Phone... marrant car Microsoft ce +devrait être le mal pour un linuxien ;-) Mais le fait est que leur système est +fluide, bien optimisé sur du matériel d'entrée/moyenne gamme. Certes il faut un +ID Windows pour accéder au Store mais on n'a pas tout un écosystème imposé. Je +me suis dit "pourquoi pas" puis je me suis intéressé au nouveau système +BlackBerry 10 de RIM et j'ai replongé pour un téléphone 4G à clavier physique +et écran tactile à moins de 200 euros, [le +Q5](http://en.wikipedia.org/wiki/BlackBerry_Q5). Mon propos n'est pas d'en +faire l'article mais de souligner que c'est un bon rapport qualité / prix et +que le système BlackBerry 10 est intéressant et très bien conçu en reprenant +les bonnes idées du passé, en repensant ingénieusement les *gestures tactiles* +au lieu de copier ses concurrents: le système est basé sur le rachat de QNX +et il a été développé en moins de 3 ans pendant une période où la société était +à deux doigts de mettre la clef sous la porte. C'est une belle réussite +technologique et humaine. + +Ce téléphone répond à toutes mes attentes donc je suis paré pour un moment. Et +je continue à suivre de près l'actualité de Firefox OS, les sorties de nouveaux +modèles et les expérimentations (quelle application pour faire ceci, comment +compiler la nouvelle version du sytème) dans la zone [Entraide +Libre](http://www.blog-libre.org/ask/) de Blog Libre. Dans 2 ou 3 ans, je ne +doute pas que le choix des téléphones Firefox OS sera étoffé, que le système +sera plus riche et Firefox OS sera une option évidente pour moi, en accord avec +mes convictions. diff --git a/content/blog/2014/2014-12-05-oracle-xe.md b/content/blog/2014/2014-12-05-oracle-xe.md new file mode 100755 index 0000000..60773ea --- /dev/null +++ b/content/blog/2014/2014-12-05-oracle-xe.md @@ -0,0 +1,123 @@ +--- +layout: post +title: Installer Oracle Express sur Centos +category: GNU/Linux +tag: planet +--- + +Oracle est la base de données phare de l'éditeur du même nom, utilisée pour des +grosses applications et des gros volumes de données. Toute une suite de +produits de l'éditeur existe autour de la base pour administrer, optimiser, +déployer... Oracle fournit aussi une version limitée de son produit pour les +développeurs, il s'agit de **Oracle Express**. C'est une base qu'on va utiliser +pour développer et distribuer de modestes applications ou pour mettre au point +du code déployé sur des *vraies bases* Oracle en production. Les limitations +sont les suivantes : un seul processeur exploité, 1 Go de RAM max utilisé et +stockage de 11 Go de données maximum. + +Oracle Express est proposée pour Ms Windows et **GNU/Linux en 64 bits** en +paquet RPM. J'ai décrit ci-après l'installation type sur un serveur Centos. La +procédure n'est pas complexe mais il y a quelques écueils qui justifient cet +article. + +J'ai effectué l'installation de base d'un Centos 6.6 en 64 bits. Un pré-requis +à respecter, sinon Oracle refuse de s'installer, est la création d'une partition +de swap au moins égale à 2x la quantité de RAM de la machine. + +On télécharge Oracle Express depuis [le site +officiel](http://www.oracle.com/technetwork/database/database-technologies/express-edition/downloads/index.html). +On récupère un fichier ZIP qui contient le paquet RPM. On installe *unzip* sur +Centos et le paquet *bc* nécessaire à l'installeur Oracle. + + $ yum install unzip bc + +Oracle a besoin que le nom du serveur (aka hostname) soit associé à une adresse +IP. La solution simple est d'éditer le fichier */etc/hosts* du serveur et +ajouter une entrée avec le nom du serveur et son adresse IP. Désormais, nous +sommes prêt à démarrer l'installation. On dézippe l'archive et on installe +paquet *rpm* : + + $ unzip oracle-xe-11.2.0-1.0.x86_64.rpm + $ rpm -ivh oracle-xe-11.2.0-1.0.x86_64.rpm + +Quand le paquet *oracle-xe* est installé, il reste à configurer la base avec la +commande *configure* du service *oracle-xe* : + + $ /etc/init.d/oracle-xe configure + + Oracle Database 11g Express Edition Configuration + ------------------------------------------------- + This will configure on-boot properties of Oracle Database 11g Express + Edition. The following questions will determine whether the database should + be starting upon system boot, the ports it will use, and the passwords that + will be used for database accounts. Press to accept the defaults. + Ctrl-C will abort. + + Specify the HTTP port that will be used for Oracle Application Express [8080]: + + Specify a port that will be used for the database listener [1521]: + + Specify a password to be used for database accounts. Note that the same + password will be used for SYS and SYSTEM. Oracle recommends the use of + different passwords for each database account. This can be done after + initial configuration: + Confirm the password: + + Do you want Oracle Database 11g Express Edition to be started on boot (y/n) [y]:y + + Starting Oracle Net Listener...Done + Configuring database...Done + Starting Oracle Database 11g Express Edition instance...Done + Installation completed successfully. + +En laissant les choix par défaut, on confime le port HTTP, le port du Listener, +on choisit un mot de passe pour les comptes SYS et SYSTEM et on confirme le +démarrage de la base au boot du serveur. + +A ce stade, la base est démarrée et accessible localement. Le pare-feu de +Centos est installé par défaut donc il faut ajouter des règles pour ouvrir l'accès +distant ou plus brutalement désactiver le pare-feu avec la commande : + + $ lokkit --disabled + +L'accès local par SQLPlus nécessite de modifier l'environnement du Shell. On +peut s'éviter de le faire à chaque coup en rajoutant ce qui suit à la fin du +fichier */etc/profile* : + + export ORACLE_SID=XE + export ORACLE_BASE=/u01/app/oracle + export ORACLE_HOME=$ORACLE_BASE/product/11.2.0/xe + export ORACLE_TERM=xterm + export NLS_LANG=FRENCH_FRANCE.utf8 + export TNS_ADMIN=$ORACLE_HOME/network/admin + export ORA_NLS33=$ORACLE_HOME/ocommon/nls/admin/data + export LD_LIBRARY_PATH=$ORACLE_HOME/lib + export PATH=$ORACLE_HOME/bin:$PATH + +Finalement, on peut créer un utilisateur *normal* que l'on +utilisera dans notre développement depuis SQLPlus : + + SQL> connect + SQL> create user joelafrite idenfied by ; + SQL> grant CREATE SESSION, ALTER SESSION, CREATE DATABASE LINK, - + CREATE MATERIALIZED VIEW, CREATE PROCEDURE, CREATE PUBLIC SYNONYM, - + CREATE ROLE, CREATE SEQUENCE, CREATE SYNONYM, CREATE TABLE, - + CREATE TRIGGER, CREATE TYPE, CREATE VIEW, UNLIMITED TABLESPACE - + to joelafrite; + +L'interface Web appelée "Application Express" permet d'effectuer les tâches +courantes d'administration. Je ne peux pas en dire grand chose, je ne l'ai pas +utilisé. Je me cantonne à SQLPlus et JDBC. Mais cette interface est accessible +depuis un navigateur à l'adresse +[http://localhost:8080/apex](http://localhost:8080/apex) avec les informations +de connexion suivantes : + +- Workspace: *ce que vous voulez* +- Username: ADMIN +- Pasword: *celui de l'utilisateur SYS et SYSTEM* + +Les références pour écrire cet article : + +- [http://www.davidghedini.com/pg/entry/install_oracle_11g_xe_on](http://www.davidghedini.com/pg/entry/install_oracle_11g_xe_on) +- [https://stackoverflow.com/questions/18028942/oracle-xe-database-configuration-failed](https://stackoverflow.com/questions/18028942/oracle-xe-database-configuration-failed) +- [http://blog.warp11.nl/2011/05/fully-freeware-apex-environment-i-centos-oracle-xe-11g](http://blog.warp11.nl/2011/05/fully-freeware-apex-environment-i-centos-oracle-xe-11g) diff --git a/content/blog/2014/2014-12-14-protectionnisme.md b/content/blog/2014/2014-12-14-protectionnisme.md new file mode 100755 index 0000000..37e6d5f --- /dev/null +++ b/content/blog/2014/2014-12-14-protectionnisme.md @@ -0,0 +1,101 @@ +--- +layout: post +title: Deviens-t-on protectionniste avec l'âge ? +category: Humeur +tag: planet +--- + +Le titre est un peu provocateur bien que je l'ai adouci en remplaçant +"nationaliste" par "protectionniste". Le nationalisme m'a toujours fait +peur, je l'assimile à l'égoïsme, le repli sur soi, la peur de l'Autre. +L'Histoire est jonchée d'horreurs perpétrées en son nom. C'est un +peu injuste car la fierté du sentiment d'appartenance à un groupe n'est pas +malsaine : supporter un club de sport, faire partie de la communauté des +développeurs du langage Blurg ou des gamers du jeu Zygoom, je trouve ça naturel +car les gens partagent une passion. Se sentir partie intégrante d'une +communauté à l'échelle d'un village je comprends aussi. Au delà, à l'échelle +d'une région ou d'un pays je ne suis plus. Qu'est-ce que je partage avec +quelqu'un né à l'autre bout de la France ? Est-il plus proche de moi que +l'italien à 3h de voiture de chez moi ? Pourquoi ? parce qu'on parle la même +langue ? Parce qu'on est circonscrit par les mêmes frontières ? + +A une époque où on noue plus de liens en ligne qu'IRL (In Real Life comme +disent les jeunes) ces frontières semblent abstraites. Elles délimitent un +espace avec des lois communes, soumis à une certaine fiscalité, protégé par des +militaires et des policiers qui risquent leur vie (hommage à leur dévouement). +Mais qu'est-ce qu'on partage réellement à l'intérieur de cet espace ? + +Pendant des années j'aurais dit pas grand chose. Tourné vers le monde extérieur +j'ai été engouffré consentant dans la spirale de la Mondialisation avec ses +bons côtés : rencontrer des gens d'autres cultures, voyager, travailler avec 3 +fuseaux horaires. Et avec ses mauvais côtés : gagner plus sur le dos +d'économies plus faibles donc de gens aussi capables que vous mais qui seront +payés moins parce qu'un système économique a fixé les règles, travailler pour +des sociétés dont le but est d'amasser pour reverser à des actionnaires. A +cette époque je me sentais plus citoyen du monde que français. + +Tout s'est calmé en 2008 quand une certaine crise a mis certains de nos clients +devant les caméras, pointés du doigt à raison comme responsables de +l'écroulement d'un système sous respiration artificielle depuis des années. Ma +société a rassemblé ses forces, en se repliant, donc en laissant des gens sur +le carreau, l'occasion pour moi de préparer un nouveau départ (merci Pôle +Emploi j'ai réalisé à cette époque qu'on était bien couvert en France) et de +faire un auto-bilan. Je suis reparti avec quelques idées phares : rester dans +l'informatique et le logiciel, faire du logiciel plus utile, et renouer avec le +Libre et GNU, une passion mise en sommeil 10 ans auparavant. + +Quant à la fameuse crise, les gouvernements (donc les citoyens) ont payé la +note, les casseurs du système ont fait leur mea culpa (plus jamais ça, moins de +dérégulation, nécessité de transparence, plus de contrôle). Six ans plus tard, +même en étant optimiste, il est évident que les mauvaises habitudes ont repris, +que les lynchés d'hier ont pris du pouvoir, dans la vie politique européenne +notamment. D'ailleurs, pour échapper à information atone et sans sous-titre des +journaux télévisuels, je vous engage à lire [le blog de Paul +Jorion](http://www.pauljorion.com/blog) => suivez le lapin blanc. + +Pour ma part, depuis six ans je me fais plaisir et pas que professionnellement. +Les fins de mois sont plus dures, comme pour le français moyen, ce français +auquel je m'identifie désormais totalement mais je suis en accord entre ce que +je fais et pour qui je le fais. + +Pourquoi toute cette tirade et quel rapport entre le Libre et la Mondialisation ? + +On critique beaucoup les américains mais leur sentiment national est une force +pour protéger leur économie. Ils sont prêts à payer un peu plus cher pour +acheter américain. L'initiative [Dégooglisons +Internet](http://degooglisons-internet.org) a démarré comme un refus de vendre +sa vie privée à des sociétés commerciales. Depuis quelques temps, je lis aussi +des volontés individuelles de se passer d'Amazon afin de supporter les petites +librairies, même si ça coûte quelques euros de plus. A titre personnel, je me +force à limiter mes achats sur Internet et à faire le tour des enseignes +locales auparavant pour leur donner leur chance. Je serais peiné que la FNAC +disparaisse par exemple. Je privilégie [O2Switch](http://www.o2switch.fr) et +[OVH](https://www.ovh.com/fr) pour mes hébergements et pas seulement par +protection de mes données personnelles : je ne veux pas que mon pays devienne +un désert. + +20 ans en arrière l'open source c'était du code C dans un kernel et il fallait +parler finlandais pour y comprendre quelque chose ;-) Aujourd'hui l'open source +s'étend progressivemet à d'autres domaines : l'électronique (Arduino, les +imprimantes 3D), l'art, l'architecture, l'agriculture (pour se protéger des +brevets sur les semences). L'open source sert la contestation et le +protectionnisme : pas celui du repli mais celui de la résistance. Quand on +regarde les gens qui débarquent sur [Framasphere](https://framasphere.org) (au +passage : fabuleuse idée que celle du tag #nouveauici et #nouvelleici), +certains fuient la société de surveillance (Google, Facebook) mais beaucoup +affichent aussi de l'intéret pour l'écologie, [les +AMAP](https://fr.wikipedia.org/wiki/Association_pour_le_maintien_d%27une_agriculture_paysanne), +les médecines alternatives (je n'ai pas parlé du système économique qui a pris +le controle de la Santé et règle tout problème de façon médicamenteuse d'ailleurs). + +Tous ces sujets se rejoignent et annoncent l'émergence d'une prise de +conscience citoyenne mondiale : trouver des solutions localement avec moins +d'impact sur l'environnement, préserver, gagner en autonomie et en liberté, +répliquer ce qui marche ailleurs. Ca se passe ici mais aussi là bas dans les +pays émergents grace à Internet comme vecteur de communication. Et le mouvement +Open Source et le Libre ne sont rien de moins que les outils pour résister, se +libérer, trouver des alternatives plus propres et moins chères dans de plus en +plus de domaine. Le [DIY](https://en.wikipedia.org/wiki/Do_it_yourself) a +beaucoup d'avenir et on n'a pas encore pris la mesure de l'impact de l'Internet +sur le collectif mondial, de sa capacité à connecter les gens autrement et à +propager les bonnes solutions. diff --git a/content/blog/2014/2014-12-20-bilan-herbergement.md b/content/blog/2014/2014-12-20-bilan-herbergement.md new file mode 100755 index 0000000..a2172f5 --- /dev/null +++ b/content/blog/2014/2014-12-20-bilan-herbergement.md @@ -0,0 +1,35 @@ +--- +layout: post +title: Bilan 2014 de l'hébergement +category: Hébergement +tag: planet +--- + +Déjà une année que j'ai migré l'hébergement de mes services d'un serveur à la +maison vers un hébergeur, en l'occurence OVH et son VPS Classic 2, sur un +container OpenVz dédié. + +Les services hébergés sont à peu près les mêmes avec quelques nouveautés : + +- ce blog statique et [son serveur de commentaires](http://blogduyax.madyanne.fr/du-nouveau-sur-pecosys.html), +- une instance de Shaarli pour les favoris [merci SEB Sauvage](http://sebsauvage.net/wiki/doku.php?id=php:shaarli), +- un lecteur de flux RSS : [Tiny Tiny RSS](http://tt-rss.org), +- l'analyseur du trafic du blog : [Piwik](http://piwik.org), +- mon cloud personnel [ownCloud](http://owncloud.org) auquel j'ai confié récemment le partage de quelques fichiers et de mon calendrier, +- l'interface Web de consultation des e-mails [Roundcube](http://roundcube.net) mais les e-mails restent chez Gandi. + +Dans le choix des distributions GNU/Linux, je reste fidèle : + +- ArchLinux, ma distrib de coeur à la maison, +- Debian sur mes serveurs personnels (Debian ou CentOS sur mes serveurs pro), +- Fedora sur mon poste professionnel. + +J'ai commencé à utilisé [Wallabag](https://www.wallabag.org) depuis quelques +semaines, c'est la pièce qui me manquait dans mon processus de veille, entre le +lien récupéré en vitesse et avant l'ajout du lien dans mes favoris Shaarli s'il +en vaut la peine. Je l'utilise dans le cadre du projet +[Framabag](https://www.framabag.org) mais je prévois d'installer ma propre +instance d'ici peu. + +Au niveau budget je suis en dessous de 7 euros par mois entre la location du +VPS et le nom de domaine chez Gandi. diff --git a/content/blog/2015/2015-03-27-fin-hivernation.md b/content/blog/2015/2015-03-27-fin-hivernation.md new file mode 100755 index 0000000..aea097c --- /dev/null +++ b/content/blog/2015/2015-03-27-fin-hivernation.md @@ -0,0 +1,61 @@ +--- +layout: post +title: Fin d'hivernation +category: Humeur +tag: planet +--- + +Trois mois sans écrire un billet, mon rythme anémique d'un billet par mois est +brisé. Plus d'inspiration, ni trop d'envie... J'essaie d'analyser la cause de +cette panne sèche et j'entrevois quelques raisons. + +D'abord l'évènement "Charlie Hebdo" m'a perturbé. En déplacement professionnel, +j'étais sur Reims le jour de la fusillade et sur Paris le lendemain pour +reprendre le TGV vers ma Provence d'adoption ; j'ai vu le déploiement de force +dans la capitale, je me suis indigné contre les barbares, j'ai compatis avec +les familles des victimes. Puis le matraquage médiatique, la récupération +politique puis la pseudo-canonisation des dessinateurs, ce qui les aurait fait +bien marrer de leur vivant, m'a écoeuré. Suite à cela je me suis un peu +recroquevillé sur mon quotidien ; j'ai arrêté de lire la presse écrite et au +niveau de la radio, en voiture le matin, je zappe entre Nova, Jazz radio et +Rires & Chansons. C'est très apaisant pour l'esprit, je vous le recommande ;-) + +Ce repli aurait pu être prolifique pour le blog mais à contrario, j'ai réalisé +peu d'expérimentations méritant un article, pas mal fraggé (gaming quand tu +nous tiens), lu de la BD et gratté un certain nombre de sujets lié au dév +logiciel. Rare linuxerie, le recyclage de mon premier portable (un Toshiba +Portegee M800 core duo) en PC de déplacement malgré sa batterie quasi fichue. +J'ai installé dessus une [Funtoo](http://www.funtoo.org). Ça ne mérite pas un +article mais je suis ravi du résultat même si à première vue une +rolling-release à base de sources paraît irraisonnable sur un petit processeur. +Ah oui, j'ai aussi testé toutes les BSD... [Fredéric ! sors de ce +corps](http://frederic.bezies.free.fr/blog) pour élargir ma culture Unix. Et je +fais [quelques apparitions sur Diaspora](https://framasphere.org/u/yax) pour +suivre les sujets qui me tiennent à coeur. + +Sur cette période ma blogsphère a subi quelques coups de Trafalgar : +dissolution du Blog Libre, départ de Tristan Nitot. Mais tout se modifie, rien +ne disparaît vraiment... Les acteurs du Blog Libre continuent à alimenter la +communauté d'articles de qualité et Tristan Nitot a rejoint [Cozy +Cloud](http://cozy.io) pour une nouvelle aventure, ce qui m'a décidé à tester +Cozy d'ailleurs. En tant que développeur, j'ai apprécié l'architecture +technique modulaire et le choix très *hype* du langage NodeJS (ça change du PHP +à Papa) auquel je m'intéresse dans mes projets personnels. J'ai installé Cozy +sur mon VPS (2 vCore, 2Go RAM) et mon impression est mitigée. J'ai apprécié +l'aspect soigné des applications, la cohérence visuelle. Certes des +fonctionnalités manquent si on compare avec OwnCloud mais le produit évolue, +s'enrichit régulièrement. Ce qui m'a gêné ce sont les performances, notamment +les bursts de CPU à l'installation des applications. Il faut que je l'utilise +plus pour voir si c'est aussi le cas dans le cadre d'une utilisation standard +mais je me suis posé la question de la pertinence de NodeJS si des traitements +lourds sont réalisés en backend pour un produit dont la cible est +principalement les Raspberry *like* hébergeant des clouds personnels. En tout +cas je ferais vivre l'installation pour suivre l'évolution du travail de Cozy +Cloud dont l'équipe semble bien sympathique. + +Finalement, ce qui me branche le plus en ce moment c'est le code et +l'architecture logicielle. J'ai un certain nombre de technos en cours +d'acquisition et quelques projets en tête. Je ferais peut-être un plus de +sujets sur le code que sur le système cette année. + +Bon printemps à tous. diff --git a/content/blog/2015/2015-04-30-back-to-roots-bash.md b/content/blog/2015/2015-04-30-back-to-roots-bash.md new file mode 100755 index 0000000..1af90d5 --- /dev/null +++ b/content/blog/2015/2015-04-30-back-to-roots-bash.md @@ -0,0 +1,219 @@ +--- +layout: post +title: Back to roots, BASH +category: GNU/Linux +tag: planet +--- + +Quand on utilise un système GNU/Linux ou BSD quotidiennement, même si on n'est +pas un accro de la ligne de commande, on n'échappe pas à l'utilisation du +terminal pour certaines tâches non graphiques. Le choix du shell, comme le +choix d'une distribution est question de goût personnel : les deux principaux +shell, BASH et ZSH ont chacun leurs supporters. Si vous utilisez un terminal +occasionnellement (qui a dit sous la contrainte) il y a fort à parier que vous +utilisez le shell proposé par la distribution, probablement **BASH** dans une +configuration standard qui vous convient tout à fait. Néanmoins, il est +intéressant de personnaliser la configuration de son shell pour se l'approprier. +C'est *fun à réaliser* et cela donne envie de faire plus de choses depuis le +terminal. + +Un barbu 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. + +![Rabbit](/images/2015/rabbit_hole.jpg) 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] : started on `uname -n` + From: <> + To: \n + Hi,\n + The jail has been started successfully.\n + Regards,\n + Fail2Ban" | /usr/sbin/sendmail -f + + # Option: actionstop + # Notes.: command executed once at the end of Fail2Ban + # Values: CMD + # + actionstop = if [ -f ]; then + printf %%b "Subject: [Fail2Ban] Report from `uname -n` + From: <> + To: \n + Hi,\n + These hosts have been banned by Fail2Ban.\n + `cat ` + \n,Regards,\n + Fail2Ban" | /usr/sbin/sendmail -f + rm + fi + printf %%b "Subject: [Fail2Ban] : stopped on `uname -n` + From: Fail2Ban <> + To: \n + Hi,\n + The jail has been stopped.\n + Regards,\n + Fail2Ban" | /usr/sbin/sendmail -f + + # Option: actioncheck + # Notes.: command executed once before each actionban command + # Values: CMD + # + actioncheck = + + # Option: actionban + # Notes.: command executed when banning an IP. Take care that the + # command is executed with Fail2Ban user rights. + # Tags: See jail.conf(5) man page + # Values: CMD + # + actionban = printf %%b "`date`: ban after failure(s)\n" >> + if [ -f ]; then + printf %%b "Subject: [Fail2Ban] Report from `uname -n` + From: <> + To: \n + Hi,\n + These hosts have been banned by Fail2Ban.\n + `cat ` + \n,Regards,\n + Fail2Ban" | /usr/sbin/sendmail -f + rm + rm + fi + + # Option: actionunban + # Notes.: command executed when unbanning an IP. Take care that the + # command is executed with Fail2Ban user rights. + # Tags: See jail.conf(5) man page + # Values: CMD + # + actionunban = + + [Init] + + # Default name of the chain + # + name = default + + # Default temporary file + # + tmpfile = /var/run/fail2ban/tmp-mail.txt + + # Default flag file + # + mailflag = /var/run/fail2ban/mail.flag +``` + +Dans mon cas, la tâche CRON est journalière : + +``` shell +# fail2ban report +@daily touch /var/run/fail2ban/mail.flag +``` + +Ceux qui suivent ont remarqué que mon rapport ne sera envoyé que sur un +bannissement donc potentiellement longtemps après que la tâche CRON ait créé le +fichier *mail.flag*. Je fais confiance à mes intrus et à leurs tentatives +soutenues pour que ce rapport soit bien envoyé à une fréquence journalière ;-) + +Il reste à configurer fail2ban pour utiliser cette nouvelle action. J'ai +redéfini dans ma configuration *jail.local* les actions à appliquer sur +détection d'attaque : d'abord on bloque, ensuite on informe : + + action_mwlc = %(banaction)s[name=%(__name__)s, port="%(port)s", + protocol="%(protocol)s", chain="%(chain)s"]%(mta)s-cron[name=%(__name__)s, + dest="%(destemail)s", logpath=%(logpath)s, chain="%(chain)s", sendername="%(sendername)s"] + action = %(action_mwlc)s + +Il reste à redémarrer Fail2Ban et à attendre l'envoi du prochain rapport. + +Au fait, je reviens à peine de vacances où j'ai rencontré un postulant au rôle de mascotte de ce blog :D + +![poulet](/images/2015/poulet.jpg) diff --git a/content/blog/2015/2015-08-23-telephone-respectable.md b/content/blog/2015/2015-08-23-telephone-respectable.md new file mode 100755 index 0000000..fc93369 --- /dev/null +++ b/content/blog/2015/2015-08-23-telephone-respectable.md @@ -0,0 +1,69 @@ +--- +layout: post +title: Le linuxien, le libriste et l'eco-citoyen cherchent un téléphone respectable +category: Mobilité +tag: planet +--- + +Ces trois tendances se mélangent, à des teneurs différentes, chez la +plupart d'entre nous. + +- linuxien car on l'aime beaucoup notre système (tout en se tenant au courant +des cousins BSD). On aime sa bidouillabilité, sa stabilité, la +logithèque illimitée, la foison des distributions et les débats sans fin qui en +decoulent. +- libriste : de même que les antibiotiques ne sont pas automatiques, le +linuxien n'est pas forcément un gladiateur du Libre. Libriste c'est un idéal +trop exigeant dans notre monde imparfait, on ne l'atteint pas mais on essaie de +s'en rapprocher et c'est déjà bien. +- éco-citoyen (cherchez l'intrus) : rien à voir avec les deux tendances +précédentes mais c'est un trait commun des linuxien que je connais. Sensibilisé +à l'écologie, au recyclage, aux énergies propres, on espère que l'Open Source +s'étende à tous les domaines pour favoriser l'émergence de solutions +désintéressées. + +Le terme *respectable* va beaucoup varier d'une personne à l'autre. + +Pour un linuxien, le téléphone *évident* est un Android. Si on rajoute une dose +plus ou moins forte de librisme à l'individu (une bonne injection d'hormone +RML), Android n'est plus acceptable ou alors nu, débarrassé des applications +Google avec F-Droid en remplacement du Play Store. D'autres alternatives +existent : la plus libriste (pour ceux qui ont eu une double injection de RML), +c'est Firefox OS. Le système mâture assez vite. Je suis intéressé, quand il y +aura la fonction hotspot 3G, Firefox OS ce sera une option viable pour moi. + +Encore plus discret que Firefox OS, les premiers téléphones Ubuntu pointent +leur nez. L'attrait pour un linuxien c'est d'avoir un vrai GNU sous le capot et +l'annonce par Canonical de la Convergence (vers le mois d'octobre) est +alléchante : cela s'apparente au concept initial d'Ubuntu Edge, la possibilité +de transformer son téléphone en ordinateur. On peut voir quelques vidéos *buzz* +ou la connexion d'une souris bluetooth au téléphone passe les applications en +mode fenêtré. BQ a lancé deux téléphones à un tarif très abordable, de bonne +facture mais le système serait un peu lent (cela rapelle les premières versions +d'Android sur le G1). A voir si des optimisations à court terme du système +arrangeront le problème. + +Une autre alternative de niche, c'est l'entreprise Jolla, fondée par des +anciens de Nokia. Jolla a poursuivi le projet Maemo pour en faire Sailfish OS, +un système esthétiquement très beau, basé sur un vrai GNU/Linux. Le hic c'était +les applications car s'il est, paraît-il, simple de porter des applications +existantes, comment motiver des développeurs à le faire ? Firefox OS, sorti +plus tard, et ses Web Apps est probablement plus connu par les développeurs. En +réponse, Jolla a joué la carte de la compatibilité avec les applications +Android (comme Blackberry OS 10) pour grossir le catalogue des applications. + +Et l'eco-citoyen qui sommeille, que veux-t-il ? + +- un téléphone avec une durée de vie plus longue : Firefox OS et ses builds +communautaires vont dans ce sens, ainsi que Ubuntu qui déploie ses mise à jour +régulièrement et en direct (sans validation de l'opérateur). Le projet ARA de +Google est une réponse matérielle ; un téléphone modulaire avec une durée de +vie plus longue. +- un téléphone équitable (fabriqué sans exploitation des travailleurs) : le +projet [FairPhone](https://www.fairphone.com) est une solution mais le prix de +l'équitable reste *prohibitif*. + +Difficile de concilier toutes ces tendances, le mouton à 5 pattes n'existant +pas, on va forcément choisir un compromis acceptable qui satisfait notre +conscience de linuxien / libriste / éco-citoyen. + diff --git a/content/blog/2015/2015-08-29-rovio-va-mal.md b/content/blog/2015/2015-08-29-rovio-va-mal.md new file mode 100755 index 0000000..9ab5c85 --- /dev/null +++ b/content/blog/2015/2015-08-29-rovio-va-mal.md @@ -0,0 +1,97 @@ +--- +layout: post +title: Rovio va mal et c'est mérité +categories: Humeur Android +tag: planet +--- + +En 2010 j'achetais [un Motorola Milestone sous Android 2.1 +*Eclair*](http://blogduyax.madyanne.fr/hello-moto-droid.html). C'était mon +premier (et dernier à ce jour) téléphone sous ce système et aussi mon premier +tactile. Un bel object de type *slider* avec un clavier physique qu'on pouvait +sortir en mode paysage. J'ai utilisé beaucoup d'applications sur ce téléphone +et aussi testé quelques jeux. Etant plutôt un joueur PC, les quelques jeux qui +me plaisaient étaient ceux réellement pensé pour le tactile et pas les +portages appauvris de jeux PC ou console existants, peu jouable en tactile sur +un écran de 4''. + +**Angry Birds**, de l'éditeur Rovio faisait partie des réussites : simple, +coloré, humoristique et une gestuelle tactive intuitive (tendre un lance- +pierre et viser) qu'un enfant de 6 ans pouvait s'approprier en quelques +minutes. On devait lancer détruire un certain nombre de cibles avec un nombre +d'oiseux limité pour réussir un niveau. Si les munitions étaient épuisées, on +recommençait le niveau entièrement. Les programmeurs se rénuméraient en +faisant défiler des bandeaux de publicité en bas de l'écran et pour quelques +euros on pouvait acheter une version sans publicité. je trouve le système de +monétisation équitable. + +Au Noël dernier, on m'a offert un bel object : une tablette Lenovo Yoga 8''. +Moi qui dépannait de temps en les téléphones ou tablettes des autres, +installant un Cyanogen par ci par là, je me suis retrouvé à redécouvrir le +système Android et constater les avancées de la version 5.0. La puissance du +matériel est sans commune mesure avec les équipements de 2010, les chipsets +graphiques ont des capacités 3D et le système s'est amélioré : plus stable, +plus abouti. On a évolué mais il n'y a vraiment pas de quoi se perdre : il y a +toujours une boutique d'applications, on pioche dedans en regardant d'un oeil +suspicieux les permissions demandées par l'application qu'on veut installer et +on refuse le cas échéant : il est exagéré de demander l'accès aux contacts +pour une application de Météo ? ;-) + +Bref cette tablette a progressivement supplanté mon téléphone pour accéder à +Internet, lire mes flux RSS, me tenir au courant, voir des vidéos. Puis j'ai +testé quelques jeux et là c'est la désillusion. Beaucoup de jeux exigent un +compte Facebook ou Google+ pour sauvegarder ses parties sous couvert de +sociabilisation. Est-ce que je ne peux pas me faire une partie sans que le +reste de la planète soit au courant et sans comparer mon score avec mes *amis* +(une variation sur le thème de *qui pisse le plus loin*) ? Je n'ai pas de +compte Facebook ni de compte Google+ (et aucun projet d'en ouvrir un ce +siècle-ci) donc ces jeux ont été désinstallés directement. + +J'ai lu que **Angry Birds 2** battait des records de téléchargement, la +nostalgie m'a étreint et j'ai vite téléchargé la version pour voir ce que la +licence est devenue. Je n'aurais pas dû me précipiter... Après avoir cliqué 2 +fois sur annuler, j'ai pu esquiver la création du compte Google+ et démarrer +le jeu. Un tutorial explique comment tendre le lance-pierre et affiche la +trajectoire optimale des tirs en pointillé sur l'écran (on s'adresse +visiblement aux enfants de 3 ans). Au troisième niveau, les pointillés sont +toujours là. Peut-être que je suis en mode *très assisté* ou peut-être que le +tutorial est très long. Je n'aurais pas la réponse car je bute en essayant des +trajectoires de lancer loufoques et j'épuise mes munitions. J'ai échoué mais +je ne recommence pas le niveau, on me propose de regarder une vidéo pour +regagner un oiseau. Bon 30 secondes de publicité c'est long et ça coupe bien +la partie mais allons-y et supportons ! Pour tester, je gâche volontairement +ma munition. On me propose d'acheter des points parmi un choix de packs de 1 +euro pour 80 points à 100 euros pour 11300 points. Ah ok, je vient de +découvrir **les achats In Apps** :-( + +Je décline et je recommence au début avec 3 pauvres oiseaux. C'est insuffisant +pour réussir donc le plan B pour obtenir des munitions supplémentaires +c'est... attendre. Bonne idée, ça ne frustre pas du tout le joueur qui avait +juste 15 minutes pour... jouer justement ! Au passage vous aurez remarqué +qu'on ne peut plus jouer *offline*. Donc on ne joue plus quand on veut ; Rovio +décide de vous enlever la manette et vous envoie promener (à moins de sortir +le porte-monnaie). Je sais que les achats In Apps sont devenus la principale +source de revenus des éditeurs. Mais soyons sérieux : dans un jeu de style RPG +en *Free To Play*, qu'on puisse améliorer son personnage en mettant la main à +la poche car on est pressé ou pas très bon (rayez la mention inutile), je +comprends. Mais qu'on saucissonne les temps de jeu d'un Angry Birds, c'est un +mépris total des joueurs qu'on prend pour une pompe à fric. Et qu'on essaie de +se rattraper en abaissant la difficulté du jeu aggrave le sentiment d'être +pris pour une truffe. + +Je me suis fait plaisir sur le titre **Rovio va mal et c'est mérité** mais le +problème ne concerne pas que Rovio, loin s'en faut. Le paysage du jeu vidéo +sur mobile a beaucoup changé en 5 ans. Au lieu d'avoir une relation équitable +avec des jeux de qualité, des développeurs correctement rénumérés et des +joueurs fidèles à une licence, des gros éditeurs ont décidé d'inonder le +marché avec des nouveaux titres en permanence mais peu d'innovation, et +beaucoup de monétisation qui gâche le plaisir du joueur. Au final, le joueur a +changé de comportement : il débourse peu et il zappe entre les nouveautés sans +réellement s'amuser. On peut lire [dans cet +article](http://www.frandroid.com/android/applications/jeux-android- +applications/305619_rovio-annonce-telechargements-record-angry- +birds-2-licenciements) que malgré les 50 millions de téléchargement du titre +Angry Birds 2, Rovio se porte mal et va licencier 260 personnes. Ils ont joué +la carte de grossir démesurément mais ils ont oublié que les joueurs sont +leurs clients. Et quand on méprise ses clients on mérite de mettre la clef +sous la porte. diff --git a/content/blog/2015/2015-09-03-xfce-double-ecran.md b/content/blog/2015/2015-09-03-xfce-double-ecran.md new file mode 100755 index 0000000..bf29622 --- /dev/null +++ b/content/blog/2015/2015-09-03-xfce-double-ecran.md @@ -0,0 +1,92 @@ +--- +layout: post +title: Configuration de XFCE avec deux écrans +category: GNU/Linux +tag: planet +--- + +J'ai un portable fraîchement installé sous Debian Jessie avec l'environnement +de bureau XFCE que j'utilise soit en itinérance, soit en poste fixe avec un +moniteur externe en configuration *double écran*. La configuration brute des +écrans sous GNU/Linux passe par l'utilisation de la commande **xrandr** pour +définir leur nombre, la résolution de chacun et leur position respective. Pour +se faciliter la vie, on peut installer **arand** qui fournit une interface +pour définir ces réglages et les sauvegarder sous forme de shell script dans +un fichier. + +Voici une capture d'écran de arandr : + +![alt text](/images/2015/arandr.png "Arandr") + +Et un exemple de script généré pour une configuration en double écran avec le +moniteur externe à droite de l'écran LCD du portable : + + xrandr --output HDMI1 --off --output LVDS1 --mode 1366x768 --pos 0x0 --rotate normal + --output DP1 --off --output VGA1 --mode 1920x1080 --pos 1366x0 --rotate normal + +En utilisant arand je vais facilement générer les deux scripts dont j'ai besoin : + +- une configuration simple avec l'écran du portable +- une configuration en double écran + +Pour savoir lequel appliquer, on va tester si le moniteur externe est connecté +en analysant le résultat de la commande xrandr. Au démarrage du portable, le +gestionnaire de connexions **lightdm** clone l'affichage des deux moniteurs +connectés. On peut corriger cela en appliquant notre joli script qui teste si +le moniteur externe est connecté et applique la bonne commande xrandr. Pour +cela, on édite le fichier de configuration **/etc/lightdm/lightdm.conf** et on +ajoute la directive *display-setup-script* dans la section SeatDefaults : + + [SeatDefaults] + ... + display-setup-script=/usr/local/bin/lightdm-monitor.sh + +et voici le script **lightdm-monitor.sh** : + +``` shell +if (xrandr | grep "VGA1 disconnected"); then + xrandr --output HDMI1 --off --output LVDS1 --mode 1366x768 --pos 0x0 \ + --rotate normal --output DP1 --off --output VGA1 --off +else + xrandr --output HDMI1 --off --output LVDS1 --mode 1366x768 --pos 0x0 \ + --rotate normal --output DP1 --off --output VGA1 \ + --mode 1920x1080 --pos 1366x0 --rotate normal +fi +``` + +Le réglage est valable pour lightdm mais quand on ouvre une session XFCE, il +est perdu et on revient à la configuration par défaut à savoir l'affichage +cloné sur les deux écrans. On pourrait appliquer le même script pour la +session, en utilisant la directive *session-setup-script* prévu par ligthdm ou +en mettant le script en démarrage automatique dans la configuration **Session +et démarrage** de XFCE. Dans mon cas, je souhaite ajouter quelque chose au +script de session : déplacer le tableau de bord XFCE sur le moniteur externe, +quand il connecté. C'est possible grâce à la commande **xfconf-query** (le +programme en ligne de commande de configurationde XFCE) adéquate. + +Finalement, cela donne le script **xfce-monitor.sh** au démarrage de la session: + +``` shell +sleep 3 +if (xrandr | grep "VGA1 disconnected"); then + xrandr --output HDMI1 --off --output LVDS1 --mode 1366x768 --pos 0x0 \ + --rotate normal --output DP1 --off --output VGA1 --off + xfconf-query -c xfce4-panel -p /panels/panel-1/output-name -s LVDS1 +else + xrandr --output HDMI1 --off --output LVDS1 --mode 1366x768 --pos 0x0 \ + --rotate normal --output DP1 --off --output VGA1 \ + --mode 1920x1080 --pos 1366x0 --rotate normal + xfconf-query -c xfce4-panel -p /panels/panel-1/output-name -s VGA1 +fi +``` + +Le *sleep* en début de script n'est pas élégant. Sans lui, l'exécution du +script intervient avant que la session XFCE soit initialisée et les commandes +xfconf-query ne sont pas appliquées. Si quelqu'un a une solution plus +élégante, je suis intéressé. + +Si la connexion / déconnection des écrans a lieu pendant qu'une session est +ouverte, il suffit de relancer le script depuis un terminal pour reconfigurer +l'affichage. + +![XFCE](/images/2015/xfce.png) diff --git a/content/blog/2015/2015-09-14-owncloud-reminder.md b/content/blog/2015/2015-09-14-owncloud-reminder.md new file mode 100755 index 0000000..2d60b0f --- /dev/null +++ b/content/blog/2015/2015-09-14-owncloud-reminder.md @@ -0,0 +1,221 @@ +--- +layout: post +title: Jouons avec Awk, Bash et Owncloud +category: GNU/Linux +tag: planet +--- + +Un souci de synchronisation du calendrier entre Owncloud et mon téléphone a +été le prétexte à bidouiller une fonctionnalité de rappel des événements par +e-mail. Pourquoi des e-mail ? Parce que je suis un fana de ce moyen de +communication, la preuve [ici](http://blogduyax.madyanne.fr/du-nouveau-sur- +pecosys.html) et [là](http://blogduyax.madyanne.fr/srmail.html). + +Donc ce que je veux c'est un joli e-mail le lundi matin qui résume mes rendez- +vous de la semaine (description, date et heure) et puis chaque matin au réveil +un e-mail par événement avec le fichier ICS en pièce jointe. [ICS +késako](https://fr.wikipedia.org/wiki/ICalendar) ? Un vieux mais très actuel +standard de description d'un événement reconnu par la plupart des calendriers. +L'intérêt d'avoir le fichier ICS c'est de pouvoir l'ajouter au calendrier +local du téléphone en un clic et de paramétrer le rappel en connaissance de +cause (le matin on a une petite idée de comment va se profiler sa journée). + +Plutôt que de coder dans un langage évolué, je me suis amusé à réaliser cela +avec les outils présent en standard sur GNU/Linux (**Awk** et **Bash**) pour +le backend MySQL d'Owncloud. C'est didactique car il est toujours préférable +de privilégier l'accès aux données par une API qui sera plus ou moins bien +maintenue dans le temps par les développeurs que d'attaquer directement la +base de données. D'abord jetons un oeil à structure de la base de donnée +Owncloud. + +La table *oc_clndr_calendars* permet de retrouver l'id de calendrier de notre +utilisateur. + + mysql> SELECT * FROM oc_clndr_calendars; + +----+------------+-------------+-----------+--------+------+---------------+---------------+----------+-----------------------+ + | id | userid | displayname | uri | active | ctag | calendarorder | calendarcolor | timezone | components | + +----+------------+-------------+-----------+--------+------+---------------+---------------+----------+-----------------------+ + | 1 | yax | Personnel | personnel | 1 | 196 | 0 | NULL | NULL | VEVENT,VTODO,VJOURNAL | + +----+------------+-------------+-----------+--------+------+---------------+---------------+----------+-----------------------+ + +Et la table *oc_clndr_objects* contient les évènements : + + mysql> DESC oc_clndr_objects; + +--------------+------------------+------+-----+---------------------+----------------+ + | Field | Type | Null | Key | Default | Extra | + +--------------+------------------+------+-----+---------------------+----------------+ + | id | int(10) unsigned | NO | PRI | NULL | auto_increment | + | calendarid | int(10) unsigned | NO | | 0 | | + | objecttype | varchar(40) | NO | | | | + | startdate | datetime | YES | | 1970-01-01 00:00:00 | | + | enddate | datetime | YES | | 1970-01-01 00:00:00 | | + | repeating | int(11) | YES | | 0 | | + | summary | varchar(255) | YES | | NULL | | + | calendardata | longtext | YES | | NULL | | + | uri | varchar(255) | YES | | NULL | | + | lastmodified | int(11) | YES | | 0 | | + +--------------+------------------+------+-----+---------------------+----------------+ + +On peut récupérer les évènements du jour courant avec la requête suivante : + + mysql> SELECT startdate,summary,calendardata FROM oc_clndr_objects WHERE calendarid = 1 AND DATE(startdate) = DATE(NOW()) ORDER by startdate \G; + *************************** 1. row *************************** + startdate: 2015-09-14 10:30:00 + summary: Déjeuner avec M. + calendardata: BEGIN:VCALENDAR + VERSION:2.0 + PRODID:ownCloud Calendar + CALSCALE:GREGORIAN + BEGIN:VEVENT + UID:95d9221d97 + DTSTAMP:20150914T103206Z + CREATED:20150913T170426Z + LAST-MODIFIED:20150914T103206Z + SUMMARY:Déjeuner avec M. + DTSTART;TZID=Europe/Paris:20150914T123000 + DTEND;TZID=Europe/Paris:20150914T140000 + LOCATION: + DESCRIPTION: + CATEGORIES: + CLASS:PUBLIC + END:VEVENT + END:VCALENDAR + *************************** 2. row *************************** + startdate: 2015-09-14 16:15:00 + summary: RV dentiste + calendardata: BEGIN:VCALENDAR + VERSION:2.0 + PRODID:ownCloud Calendar + CALSCALE:GREGORIAN + BEGIN:VEVENT + UID:1958bfe4a9 + DTSTAMP:20150914T103134Z + CREATED:20150914T103134Z + LAST-MODIFIED:20150914T103134Z + SUMMARY:RV dentiste + DTSTART;TZID=Europe/Paris:20150914T181500 + DTEND;TZID=Europe/Paris:20150914T183000 + LOCATION: + DESCRIPTION: + CATEGORIES: + END:VEVENT + END:VCALENDAR + +Les colonnes intéressantes sont : + +- *calendarid* pour filtrer les évènements de notre utilisateur Owncloud +- *summary* : le libellé de l'évènement +- *startdate* : la date de début de l'évènement +- *calendardata* : l'évènement au format iCalendar + +Ce qu'on veut c'est générer un shell script qui récupère les informations du +jour et envoie un e-mail par évènement avec le fichier ICS en pièce jointe. +L'envoi est réalisé par l'utilitaire **mpack**. Le résultat final espéré pour +notre exemple est ce script : + +``` shell +# +STARTDATE="`date -d '2015-09-14 10:30:00-000' '+%a %e %b %R'`" +SUMMARY="Déjeuner avec M." +echo "BEGIN:VCALENDAR" >event.ics +echo "VERSION:2.0" >> event.ics +echo "PRODID:ownCloud Calendar" >> event.ics +echo "CALSCALE:GREGORIAN" >> event.ics +echo "BEGIN:VEVENT" >> event.ics +echo "UID:95d9221d97" >> event.ics +echo "DTSTAMP:20150914T103206Z" >> event.ics +echo "CREATED:20150913T170426Z" >> event.ics +echo "LAST-MODIFIED:20150914T103206Z" >> event.ics +echo "SUMMARY:Déjeuner avec M." >> event.ics +echo "DTSTART;TZID=Europe/Paris:20150914T123000" >> event.ics +echo "DTEND;TZID=Europe/Paris:20150914T140000" >> event.ics +echo "LOCATION:" >> event.ics +echo "DESCRIPTION:" >> event.ics +echo "CATEGORIES:" >> event.ics +echo "CLASS:PUBLIC" >> event.ics +echo "END:VEVENT" >> event.ics +echo "END:VCALENDAR" >>event.ics +mpack -s "$SUMMARY - $STARTDATE" event.ics $1 +# +STARTDATE="`date -d '2015-09-14 16:15:00-000' '+%a %e %b %R'`" +SUMMARY="RV dentiste" +echo "BEGIN:VCALENDAR" >event.ics +echo "VERSION:2.0" >> event.ics +echo "PRODID:ownCloud Calendar" >> event.ics +echo "CALSCALE:GREGORIAN" >> event.ics +echo "BEGIN:VEVENT" >> event.ics +echo "UID:1958bfe4a9" >> event.ics +echo "DTSTAMP:20150914T103134Z" >> event.ics +echo "CREATED:20150914T103134Z" >> event.ics +echo "LAST-MODIFIED:20150914T103134Z" >> event.ics +echo "SUMMARY:RV dentiste" >> event.ics +echo "DTSTART;TZID=Europe/Paris:20150914T181500" >> event.ics +echo "DTEND;TZID=Europe/Paris:20150914T183000" >> event.ics +echo "LOCATION:" >> event.ics +echo "DESCRIPTION:" >> event.ics +echo "CATEGORIES:" >> event.ics +echo "END:VEVENT" >> event.ics +echo "END:VCALENDAR" >>event.ics +mpack -s "$SUMMARY - $STARTDATE" event.ics $1 +``` + +Comment fait-on ? On exécute la requête SQL et on la donne à manger à un +script **awk** qui a pour objectif de générer le shell script ci-dessus. Awk a +été inventé pour ce genre de tâche : prendre un fichier en entrée et le +modifier pour créer un fichier en sortie. Le script est assez opaque si on n'a +jamais pratiqué mais l'idée c'est de décrire la structure du document en +entrée (comment distinguer les enregistrements) et de faire correspondre des +traitements à certains enregistrements qu'on identifie par une expression +régulière. + +Voci le script awk complet : + +``` awk +BEGIN { + FS="\n" + OFS="" + ORS="\n" + print "#!/bin/sh" + print " " +} +# blank lines +/^$/ { next } +# record header +$1 ~ /^\*\*\*\*/ { + next +} +# summary field +$1 ~ /^[ ]*summary\:/ { + idx = match($1, /summary\:(.*)/) + print "SUMMARY=\"" substr($1, idx + 9) "\"" + next +} +# startdate field +$1 ~ /^[ ]*startdate\: / { + match($1, /startdate\: /) + print "STARTDATE=\"`date -d '" substr($1, RSTART + RLENGTH) "-000' '+%a %e %b %R'`\"" + next +} +# vcalendar start tag +$1 ~ /^[ ]*calendardata\: / { + match($1, /calendardata\: /) + print "echo \"" substr($1, RSTART + RLENGTH) "\" >event.ics" + next +} +# vcalendar end tag +$1 ~ /^END\:VCALENDAR/ { + print "echo \"" $1 "\" >>event.ics" + print "mpack -s \"$SUMMARY - $STARTDATE\" event.ics $1" + print "" + next +} +# vcalendar body +{ + print "echo \"" $0 "\" >> event.ics" +} +``` + +Il ne reste plus qu'à orchestrer tout cela dans un shell script et de +l'appeler par une tâche **cron**. Le script complet gère les rappels du jour +et les rappels pour la semaine à venir. Il est disponible [sur mon compte +GitHub](https://github.com/kianby/owncloud_calremind). diff --git a/content/blog/2015/2015-09-23-obsolescence-repoussee.md b/content/blog/2015/2015-09-23-obsolescence-repoussee.md new file mode 100755 index 0000000..1a2680e --- /dev/null +++ b/content/blog/2015/2015-09-23-obsolescence-repoussee.md @@ -0,0 +1,53 @@ +--- +layout: post +title: L'obsolescence repoussée +categories: Matériel Humeur +tag: planet +--- + +J'ai modifié ma façon de consommer depuis déjà quelques années : beaucoup moins +d'achats compulsifs, une réflexion plus longue pour acheter en adéquation avec +le besoin réel, tout en ignorant les sirènes du Marketing et des modes +éphémères. Mon banquier m'en remercie. + +Pour différer le recyclage, on peut privilégier l'occasion (à l'achat ou à la +vente) qui donne une seconde vie à un matériel. Je l'ai pratiqué pour plusieurs +smartphones avec succès ; je veux dire sans déception, du matériel en bon état +acquis à un prix correct. Dans mon cas, un smartphone est en dessous de la +barre des 200 euros et associé à un forfait sans engagement, ce qui permet de +zapper entre les offres les plus intéressantes régulièment. Pour un smartphone, +ce n'est pas toujours l'état du matériel qui va décider son propriétaire à s'en +débarrasser mais son obsolescence logicielle. Un système qui n'est plus +maintenu donne l'impression de rater le train des nouveautés. Dans le monde +Android, les ROMS Cyanogen sont une réponse à l'abandon d'un modèle par un +constructeur. Pour Firefox, les builds communautaires permettent de prolonger +la durée de vie du téléphone. L'équipe Ubuntu promet une mise à jour des +téléphones sans intermédiaire tant que le matériel sera suffisamment puissant +pour supporter les évolutions d'Ubuntu Touch. + +poussiere 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. + +![France qui pleure](/images/2015/benjamin_regnier.jpg "France qui pleure") + +*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. + +A proposCa 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 :** + +ubuntu unlock + +ubuntu unlock + +**L'écran principal avec ses applications en rang d'oignons:** + +ubuntu application + +ubuntu application + +**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 :** + +ubuntu unity + +ubuntu tasks + +**Les paramètres système et un aperçu du magasin d'applications :** + + +ubuntu settings + +ubuntu store + +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 :** + +![Shared Folders](/images/2015/virtualbox-shared-folder.png "Shared Folders") + +**Navigation du partage depuis la VM Ms Windows :** + +![Windows Share](/images/2015/virtualbox-windows-explorer.png "Windows Share") + +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. + +![Port forwarding](/images/2015/virtualbox-port-forwarding.png "Port forwarding") + +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. + +![VirtualBox](/images/2016/virtualbox-creation.png "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. + +![Mon Bold](/images/2016/bold.jpg "Mon Bold") 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. + +termuxJ'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. + +![la vie, l'amour, les vaches](/images/2017/lesvaches.jpg "la vie, l'amour, les vaches") 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 : + +![Nombre de commentaires sur la page](/images/2017/page-comments.png) + +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 ! + +![Speedy](/images/2017/speedy.png) + +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 : + +![Architecture Stacosys cache](/images/2017/diag-sanic-cache.png) + +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 : + +![Architecture Golang HTTP/Cache](/images/2017/diag-go-http.png) + +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 ", os.Args[0]) + } + // read config File + file, e := ioutil.ReadFile(*pathname) + if e != nil { + die("File error: %v", e) + } + json.Unmarshal(file, &config) + fmt.Printf("config: %s\n", string(file)) + + http.HandleFunc("/comments/count", commentsCount) + http.ListenAndServe(config.HostPort, nil) + } +``` + +La démonstration ne vise pas à conclure qu'il faut tout réécrire en Golang car +Python est trop lent ! + +Hier, je lisais un article à propos de [Discord](https://discordapp.com/), une +application concurrente de Teamspeak avec de la VoIP, des gros besoins de +concurrence de traitement (5 millions de messages échangés en permanence), du +Web et de l'application mobile. Leur solution mixe 4 langages différents : +Python, NodeJS, Golang et Elixir (Erlang) ; chacun a son rôle et son champ +d'application dédié. Plus on acquiert une culture large de l'informatique et +plus on sera capable de choisir le bon langage / paradigme de +programmation / framework en fonction de la tâche à accomplir, ce qui rejoint ce +dicton anglo-saxon que j'aime bien même s'il est un peu galvaudé : *if all +you have is a hammer, everything looks like a nail*. diff --git a/content/blog/2017/2017-08-09--email-important.md b/content/blog/2017/2017-08-09--email-important.md new file mode 100755 index 0000000..f88ea62 --- /dev/null +++ b/content/blog/2017/2017-08-09--email-important.md @@ -0,0 +1,55 @@ +--- +layout: post +title: L'e-mail n'a jamais été aussi important +category: Humeur +tag: planet +--- + +En lisant les réactions enflammées des utilisateurs de OpenMailBox qui ont, à +juste titre, l'impression d'avoir été pris pour des jambons, on réalise que cet +e-mail, dont on annonce régulièrement la mort prochaine mais sans avoir de +remplaçant, est encore plus important qu'auparavant. + +Pour beaucoup de la nouvelle génération, c'est un moyen de communication dépassé +et ils ont tendance à créer des e-mails en pagaille pour s'inscrire sur des +sites mais pas spécialement pour communiquer. Cela change rapidement à +l'approche de l'entrée dans le monde du travail et la nécessité d'avoir un +e-mail stable, qui ne soit pas *kikou48*, afin d'envoyer des CV à des recruteurs. + +L'adresse e-mail représente **une identité** par : + +- sa composition : utiliser le classique prenom.nom ou bien inventer un jeu de mot mnemotechnique avec son nom ou son prénom +- le choix de son domaine : le choix d'un GAFAM (gmail, yahoo, outlook) ou un domaine à soi (qu'on vous fera souvent répéter car c'est rare) + +Avec la généralisation de l'e-mail comme identifiant pour s'inscrire à n'importe +quel site ou forum, **la pérennité** de l'e-mail est devenue vitale. Quelques +années plus tôt, on envoyait un e-mail aux personnes de son carnet d'adresse +avec sa nouvelle adresse et c'était bon. Aujourd'hui on est inscrit sur quantité +de sites et un changement est long, pénible et peut tourner à la galère si vous +n'avez plus accès à la boite de votre ancienne adresse. + +Cela conforte l'idée de ne pas confier son e-mail à des fournisseurs +(commerciaux ou associatifs) qui ne seront pas capables de garantir cette +pérennité. Ca fait mal de l'écrire, mais il est aujourd'hui plus pérenne de +confier son e-mail à un GAFAM qu'à une startup qui joue la carte de la +protection de la vie privée et peut changer ses conditions de services ou +déposer le bilan. + +Néanmoins, ce n'est pas ce que je recommande car : + +- l'e-mail GAFAM est pérenne mais il n'est pas sécurisé. Clairement on échange un service contre sa vie privée qui sera scrutée et modélisée à des fins de profilage. +- l'e-mail GAFAM peut être clôturé sur un malentendu et sans recours possible ; on a vu des précédents. + +Avec la déclaration obligatoire des impôts sur le revenu en ligne à partir de +2018, la situation ne vas pas s'arranger. Une partie de la population (je pense +aux seniors notamment mais pas seulement) qui n'est peut-être pas initiée à l'informatique va +devoir déclarer en ligne et fournir un e-mail de contact qui sera son principal +lien avec l'administration. Est-ce qu'on a prévu de former ces gens ? Est-ce +qu'il y a un plan national de fournir un e-mail *à la française*, sécurisé, +pérenne dans le temps ou bien va-t-on les donner en patûre aux GAFAM ? + +C'est une question semi-ouverte, je ne suis pas très confiant de l'issue :-( + +Aujourd'hui ceux qui protègent leur vie privée ont été sensibilisés au problème +et ils ont une culture de base en informatique. Cela laisse encore du monde sur +le bas-côté de la route. diff --git a/content/blog/2017/2017-09-04-nextcloud-securite.md b/content/blog/2017/2017-09-04-nextcloud-securite.md new file mode 100755 index 0000000..1f4e0bd --- /dev/null +++ b/content/blog/2017/2017-09-04-nextcloud-securite.md @@ -0,0 +1,166 @@ +--- +layout: post +title: Sécurité des données, focus sur Nextcloud +categories: Hébergement BSD +tag: planet +--- + +En 2007, j'ai ouvert un compte Dropbox avec l'offre gratuite de 2 Go. J'avais +parrainé des collègues et des amis pour gagner de l'espace de stockage. Oui je +le reconnais, j'avais vendu des amis au +[GAFAM](https://fr.wikipedia.org/wiki/GAFAM) contre quelques octets : mes +~~parrainages~~ compromissions m'avaient permis d'atteindre 6 Go de stockage... +Vertigineux ;-) A cette époque, ma fibre libriste était encore latente, j'étais +fier d'avoir autant d'espace et je m'en servais pour partager des photos avec la +famille. Je ne me suis jamais senti assez en confiance pour partager des +documents importants. + +En 2010, j'ai commencé à héberger mes services et en 2014 je démarrais avec +[Owncloud](https://owncloud.org) principalement pour la synchronisation des +contacts et du calendrier. Puis j'ai commencé à partager quelques fichiers, mais +rien d'important. En 2015, j'ai remplacé Owncloud par [Cozy](https://cozy.io), +de la fameuse startup française qui oeuvre pour que l'utilisateur reprenne le +contrôle de sa vie numérique et ne la brade plus aux GAFAM. Cozy va plus loin +que le partage de fichiers et c'est vraiment un projet à suivre de près. C'est +avec eux que j'ai commencé à prendre confiance et partager des documents +importants. Et en 2016, je suis revenu vers Owncloud ou plus exactement vers son +fork né des guéguerres internes : [Nextcloud](https://nextcloud.com). + +Bref mon compte Dropbox ne me servait plus depuis un bail mais j'avais du mal à +décider sa fermeture... mince c'était quand même gratuit ;-) Aujourd'hui il est +officiellement clôturé. + +Donc j'ai quelques Giga octets de données sur Nextcloud, notamment des documents +administratifs, et je suis responsable de la sécurité de mes données. Alors la +sécurité c'est un vaste sujet. Cela commence par une protection physique des +données. Si mon serveur était à la maison, j'aurais probablement chiffré le +disque dur en cas de vol. Là il est chez un fournisseur de confiance, dans un +datacenter sécurisé donc l'accès direct à mon disque dur est le moins probable. + +![Mr Robot dans le data center](/images/2017/mrrobothack.jpg) + +La pierre angulaire de la sécurité c'est le système d'exploitation et ses +capacités intrinsèques à résister aux attaques. Ensuite c'est de la +configuration : le parefeu, le routage réseau, la virtualisation, des outils de +détection d'attaques qui vont permettre d'améliorer la sécurité du système. Mais +si le système d'exploitation est gâté à la base, tout ce qui suit est un +emplâtre sur une jambe de bois ! Enfin on se comprend :-) + +![Tux et BSD grillent XP](/images/2017/tux-bsd-windows.jpg) + +Depuis quelques mois, mon serveur est propulsé par OpenBSD (et je ne suis pas +prêt de revenir en arrière). Avec de la lecture et des conseils, je l'ai +sécurisé du mieux que j'ai pu. Je n'entrerai pas dans les détails, je ne suis +pas assez qualifié pour donner des cours sur le sujet mais le résultat n'est pas +mal du tout. + +Pour la sécurité de mes données, ce qui m'inquiète le plus ce sont les failles +potentielles des applications hébergées qui pourraient servir de porte d'entrée +royale pour accéder aux données. La parano venant, j'ai décidé d'attaquer le +sujet par étapes et aujourd'hui j'ai focalisé sur mon instance **Nextcloud**. +C'est une application Web avec son propre sous-domaine qui donne directement sur +ce bel écran de connexion : + +![Nextcloud login](/images/2017/nextcloud-login.png) + +J'accède à mes données en mobilité donc il n'est pas possible de restreindre +l'accès par adresse IP. Donc je suis dépendant du système d'authentification de +Nextcloud. Première étape, je dois savoir ce qui se passe. Nextcloud fournit un +rapport d'audit et on peut configurer les actions qui doivent y figurer. + +![Nextcloud audit](/images/2017/nextcloud-audit.png) + +C'est une fonction nécessaire mais pas suffisante. Le rapport est envoyé chaque +heure si des données ont changé, un peu tard si on s'est fait ~~ni~~ha-cker. + +Exemple de rapport : + + Bonjour, + + Vous recevez cet email car l'activité suivante a eu lieu sur https://nextcloud.mondomaine.fr/ + + * Vous avez partagé Partage/Blog/documents avec un lien public - Aujourd’hui 16:54:04 + * Partage/Blog/documents/moderncv.zip téléchargé par lien public - Aujourd’hui 16:54:48 + * Vous avez créé Notes/todo.txt - Aujourd’hui 17:04:49 + +Ce que j'aimerais aussi avoir, c'est un moyen de bloquer les gars qui font du +[brute-force](https://fr.wikipedia.org/wiki/Attaque_par_force_brute) sur l'écran +de connexion pour trouver mon mot de passe. C'est faisable si l'application a la +bonne idée de noter dans un log quand une tentative de connexion échoue : + +- Sous Linux, l'excellent outil fail2ban (ben oui c'est du Python) permet d'analyser un +log à la recherche de messages spécifiques, d'extraire l'adresse IP concernée et +de créer une règle de blocage dans le parefeu (iptables) pour une durée +déterminée. +- Sous OpenBSD, Thuban s'est inspiré de fail2ban pour créer [Vilain](https://yeuxdelibad.net/Blog/?d=2017/02/05/09/53/19-vilain-setoffe) qui +fonctionne de concert avec l'incroyable parefeu [pf](https://man.openbsd.org/pf.conf). + +Ce qui suit est donc réalisé avec Vilain sous OpenBSD mais c'est facilement transposable sous Linux. + +Je bloque les fâcheux pendant une heure avec cette règle pour Vilain qui +fonctionne aussi bien pour l'écran de connexion à l'interface Web que pour +l'accès aux fichiers avec WebDAV. + + [nextcloud] + logfile = /var/www/htdocs/datacloud/nextcloud.log + regex = .*Bruteforce attempt from \\"(.*)\\" detected + +Quid des partages par lien public ? En effet, Nextcloud permet aussi de partager +un fichier ou un dossier à quelqu'un qui n'a pas de compte avec un lien public. +La création d'un partage est aussi simple que ceci : + +![Nextcloud partage](/images/2017/nextcloud-partage.png) + +La sécurité repose essentiellement sur l'URL générée *au hasard* donc le partage +d'un document important sans spécifier de mot de passe est à proscrire. +D'ailleurs l'interface d'administration de Nextcloud permet d'interdire la +création de tels liens par les utilisateurs. J'utilise assez souvent ces liens +publics et je ne m'étais jamais posé la question de leur sécurité. Alors +mauvaise nouvelle, si on crée un lien avec mot de passe et que l'URL tombe dans +les mains d'un malfaisant (ou réussit à être devinée), il peut tranquillement +faire du brute-force sur le lien car Nextcloud n'écrit aucune info dans ses logs +sur ces erreurs d'authentification. Pas cool ça hein + + +La solution va venir du logs d'accès du serveur HTTP qui trace toutes les +requêtes HTTP et leur code retour. Pour un accès avec le bon mot de passe, +on aura un log comme celui-ci : + + 80.214.223.96 - - [02/Sep/2017:12:36:58 +0200] "POST /s/wKDvKK8vt6ZSU5E/authenticate HTTP/1.1" 303 5 "-" "Mozilla/5.0 (BB10; Kbd) AppleWebKit/537.35+ (KHTML, like Gecko) Version/10.3.3.2163 Mobile Safari/537.35+" + +Alors que pour un accès refusé car le mot de passe est incorrect on aura ceci : + + 80.214.223.96 - - [02/Sep/2017:12:36:27 +0200] "POST /s/wKDvKK8vt6ZSU5E/authenticate HTTP/1.1" 200 16186 "-" "Mozilla/5.0 (BB10; Kbd) AppleWebKit/537.35+ (KHTML, like Gecko) Version/10.3.3.2163 Mobile Safari/537.35+" + +Alors au premier abord, ça semble bizarre car l'erreur de mot de passe renvoie +un code HTTP 200 qui correspond à OK. C'est parce qu'en cas d'erreur, on reste +sur la page qui redemande le mot de passe, alors qu'en cas de succès le code de +retour est une redirection HTTP 303 vers la page qui affiche les documents du +partage. Le formatage de mes logs d'accès dépend de la configuration de mon +serveur HTTP (en l'occurence NginX) donc l'expression régulière qui permet +d'identifier les erreurs de mot de passe doit en tenir compte. Sur cette base je +peux rajouter la règle suivante à Vilain : + + [nextcloud-share] + logfile = /var/www/logs/access-nextcloud.log + regex = (\d+\.\d+\.\d+\.\d+) \-.*POST /s/\w+/authenticate HTTP/1.1\" 200 + +Voilà, nous avons deux règles efficaces qui vont bloquer les attaquants à chaque +double échec d'authentification. C'est cool mais je voudrais aussi connaître le +nombre de mes ennemis, car si je suis soumis à des centaines d'attaques par jour +je réviserai peut-être ma façon de me protéger. Je vais donc m'envoyer un rapport +journalier de l'activité de Vilain : + +- je modifie la configuration de Vilain pour qu'il écrive dans un log dédié et non plus dans */var/log/daemon* +- je configure un recyclage journalier pour ce log à minuit +- j'ajoute une tâche CRON à minuit moins 2 brouettes pour m'envoyer par e-mail le log de la journée + +Quelque chose comme ça : + + # /etc/newsyslog.conf + /var/log/vilain 640 5 * $D0 Z "rcctl restart vilain" + + # crontab + 55 23 * * * cat /var/log/vilain | mail -s "Vilain Rapport" yax + +Oui je l'ai appelé le **Vilain Rapport**, au niveau de l'humour on ne se refait pas :-) diff --git a/content/blog/2017/2017-10-01-protegeons-vie-privee.md b/content/blog/2017/2017-10-01-protegeons-vie-privee.md new file mode 100755 index 0000000..3e7cfb4 --- /dev/null +++ b/content/blog/2017/2017-10-01-protegeons-vie-privee.md @@ -0,0 +1,151 @@ +--- +layout: post +title: Protégeons notre vie privée +category: Humeur +tag: planet +--- + +Framasoft [fête les 3 +ans](https://framablog.org/2017/09/25/degooglisons-internet-cest-la-fin-du-debut) +de sa campagne [Dégooglisons Internet](https://degooglisons-internet.org). Le +nombre de services alternatifs aux GAFAM, libres et respectueux de la vie +privée, a grossi ainsi que le nombre d'utilisateurs. Comme ils l'expliquent +eux-mêmes, le but n'est pas de devenir un hébergeur professionnel mais plutôt de +servir de catalyseur pour que les gens prennent conscience qu'il y a une autre +voie, décident de se libérer et auto-hébergent leurs services s'ils le peuvent +ou aient recours au tissu associatif à travers [le collectif des +Chatons](https://chatons.org) par exemple. + +Chaque fin d'année je fais un don financier à un ou deux acteurs qui me semblent +cruciaux dans le monde du Libre ; c'est d'ailleurs généralement la période de +relance, chacun essayant de boucler son budget de fonctionnement pour l'année à +venir. Beaucoup ont besoin d'aide et ils sont à la fois nos bras armés et nos +boucliers. Je pense à Framasoft, à la Quadrature du Net, à l'APRIL, à Wikipedia, à +des équipes de développement, des distributions Linux. Bref il y a beaucoup à +soutenir et il faut faire des choix. Cette année je serais exclusif et ce sera +Framasoft pour rétribuer mon usage de [Framasphere](https://framasphere.org) et +soutenir la suite de la campagne. + +Pour ma part, j'ai dégooglisé progressivement depuis un bout de temps les +services vitaux : contacts, agenda, mails. Ca ne veut pas dire qu'on peut +m'appeler [Richard](https://fr.wikipedia.org/wiki/Richard_Stallman) et que je +n'utilise aucun service GAFAM : + +- j'utilise Youtube, mais je n'ai pas envie qu'on me profile à travers mes recherches, +- la navigation Waze me sort régulièrement des soucis à Marseille, +- j'ai un compte Twitter pour participer à des concours et suivre quelques stars du Net (comme [Korben](https://korben.info) que je lis depuis des années et apprécie pour sa constance et sa franchise) + +Comme en religion, chacun met la barre à son niveau et voit jusqu'où il veut / +peut aller... et on trouve aussi des extrémistes dans ce domaine. + +Donc en plus d'ordinateurs sous Linux et OpenBSD, d'un téléphone génial utilisé +par 0,1% du marché, j'ai aussi une belle tablette Android déjà évoquée dans mes +articles autour de [Termux](https://termux.com) : bootloader verrouillé, ROM +Android du constructeur. Je surfe avec Firefox, j'utilise mes propres services +pour le mail, l'agenda, les contacts, le cloud. Mais je suis quand même sur un +système non maîtrisé qui : + +- me propose tous les jours des mises à jour d'applications que je n'utilise pas : Gmail et consorts, +- m'a imposé une mise à jour Android qui a cassé la possibilité de me connecter au hotspot Wi-Fi de mon télphone donc adieu Internet quand je suis en vadrouille, +- rame de plus en plus, sans que je trouve d'explication, jusqu'à rendre la tablette inutilisable plusieurs minutes à chaque sortie de veille Wi-Fi, +- mange certains jours 1/4 de batterie alors qu'il est censé être en veille. + +Bref, la coupe était pleine. La garantie de la tablette étant expirée, je me +suis décide à regarder ce qui est faisable : idéalement changer la ROM, à défaut +revenir à une version précédente du constructeur. Je passe les détails +techniques affligeants mais parti sur l'option 2, j'ai failli transformer la +tablette en brique et j'en suis sorti à force de parcourir le forum XDA à la +recherche d'infos. Pour les connaisseurs j'étais bloqué au BIOS dans l'EFI (car +oui ma tablette a un processeur Intel) et j'ai réussi à réinjecter ma ROM +d'origine (celle du constructeur) avec une manipulation tordue. Ce que j'ai +retenu c'est que monde Android c'est le monde Ms Windows tel que je lai quitté +il y a des années : la plupart des gens sur les forums ne connaissent pas grand +chose et préconisent d'appliquer des recettes de cuisine : installe tel soft, +fais telle manip. Ce n'est pas leur faute, on est sur un sytème fermé (pour ce +qui est du bootloader en tout cas) donc à part quelques initiés qui ont la +connaissance acquise par la sueur à force de *reverse-engineering*, la masse ne +fait que propager de l'information erronée et recopier des topics de forums. + +Revenu donc au point de départ, j'ai tenté le *rootage* de la tablette ; c'est +moins risqué qu'un changement de ROM. Je l'ai réalisé et j'ai pu désinstaller +les applications Google de ma tablette gràce à un utilitaire nommé **/system/app +mover** trouvé sur le magasin d'applications [F-Droid](https://f-droid.org). +J'ai commencé petit, en virant les applications Google, puis j'ai carrément viré +le Playstore et surtout ses services. J'ai récupéré 300 Mo de mémoire (pas +négligeable sur une tablette de 2 Go) et je n'ai plus aucun ralentissement +depuis 3 semaines. Je me suis prouvé, au passage, que toutes les applications +dont j'ai besoin pour ma tablette sont sur F-Droid. + +![Tablette](/images/2017/tablette-root.jpg) + +Est-ce que c'est parfait ? Non pas du tout car j'ai enlevé les applications +Google et quelques services du système, mais je ne maîtrise pas ce qui reste : +il peut rester un service de pistage qui bouffe mes données et les envoie à +Google. + +Une dégooglisation complète passe par plusieurs étapes : + +1. se libérer des services GAFAM et mettre en place soi-même ou utiliser des alternatives. +2. utiliser un système d'exploitation libre ou *de confiance* : + - un système GNU/Linux (pas n'importe lequel) ou un système BSD + - en mobilité, sur Android : + - *rooter* l'appareil pour pouvoir faire le ménage, c'est mieux que rien. + - installer une ROM commmunautaire (pas n'importe laquelle) sans les Google Apps, c'est mieux. +3. utiliser du matériel libre grâce à l'Open Hardware + +Je considérais, jusqu'à récemment, le 3ème point exagéré pour des équipements +domestiques mais j'ai largement changé d'avis. + +Le ciblage publicitaire est de plus en plus précis. Ma moitié a reçu dans la +semaine un e-mail d'encouragement pour s'inscrire sur le site de la Française +des Jeux, probablement car elle est passée sur leur site pour consulter les +résultats. Elle navigue sur un Samsung A5 avec Chrome donc qu'ils aient obtenu +l'e-mail ne m'étonne pas, mais qu'ils connaissent mon prénom un peu plus. En bas +de l'e-mail, [la société tierce responsable de ce +profilage](http://www.eperflex.com/lg/fr/fonctionnalites) propose de se +désabonner de leurs services. J'aime me désabonner quand je n'ai jamais été +invité à m'abonner... Bref ma moitié navigue essentiellement en 4G donc cela +exclut le recoupement avec notre adresse IP domestique. Je penche plutôt pour un +recoupement entre son e-mail et d'autres données glanées à droite à gauche (???) +pour parvenir à lier nos identités. + +La semaine d'avant nous avons été confrontés, toujours sur le Samsung, au +mini-scandale de l'enregistrement des visages, une sympathique fonctionnalité, +[découverte par Seb Sauvage](http://sebsauvage.net/links/?0vFdFg), destinée à +enrichir la base de reconnaissance faciale de Google. [Dans son dernier +article](http://standblog.org/blog/post/2017/09/29/Payer-son-smartphone-avec-ses-donn%C3%A9es-personnelles), +Tristan Nitot clarifie bien ce *deal* entre Google et les constructeurs de +téléphone. + +Pour les appareils mobiles, le matériel est bien le souci principal. Et on peut +se demander jusqu'à quand certains constructeurs pourront continuer à fournir +des bootloader déverrouillés pour faire plaisir à quelques clients, sans que +Google durcisse sa position et l'interdise. De plus, installer une ROM +communautaire résoud partiellement le problème : il reste des bouts de code +propriétaires dans les composants électroniques du téléphone dont on ne connait +pas le fonctionnement. La solution ultime est un téléphone **Libre de A à Z** : +logiciel (Open Source / Libre) et matériel (Open Hardware). + +On a assisté une succession de projets de téléphones plus ou moins libres depuis +quelques années : [OpenMoko](https://fr.wikipedia.org/wiki/OpenMoko), +[Maemo](https://fr.wikipedia.org/wiki/Maemo) et plus récemment, FirefoxOS et +Ubuntu Phone. + +Ne nous voilons pas la face, ils ont tous échoué, mais ils ont apporté leur +pierre à l'édifice et participé à la prise de conscience du problème des GAFAM +et du marchandage de notre vie privée qui dépasse largement le cercle des geeks +aujourd'hui. + +Le ~~buzz du moment~~ prochain téléphone libre serait [le +Librem](https://puri.sm/). Encore faut-il y croire suffisamment et avoir +confiance dans la société Purism pour mettre la main à la poche et subventionner +sa création. + +En tout cas, avoir pris conscience du problème c'est déjà un grand pas et le +début de l'action pour reprendre sa vie numérique en main. + +La route est longue mais la voie est libre ! + +![Phagocitage](/images/2017/phone-boss.jpg) + +Source de l'image : [maymay](https://framasphere.org/people/f01a0d1e920196e5) diff --git a/content/blog/2017/2017-10-14-attrapons-les-vilains.md b/content/blog/2017/2017-10-14-attrapons-les-vilains.md new file mode 100755 index 0000000..aa05017 --- /dev/null +++ b/content/blog/2017/2017-10-14-attrapons-les-vilains.md @@ -0,0 +1,101 @@ +--- +layout: post +title: Attrapons les vilains +categories: Hébergement BSD +--- + +A la fin de [mon article sur le blocage des attaques de brute +force](/2017/nextcloud-securite/), j'étais resté sur l'envoi quotidien d'un +e-mail avec le log des attaques de la journée, histoire d'avoir une idée de ce +qui s'est passé. Pour rappel, mon serveur tourne sous OpenBSD et l'outil de +protection contre les attaques est Vilain, un équivalent de Fail2ban sous Linux. +Le log de la journée est fastidieux à lire et j'ai eu envie de construire un +rapport avec les informations suivantes : + +- liste des adresses IP bloquées +- répartition horaire des attaques +- top des adresses IP les plus agressives + +Après un échange avec [Thuban](http://yeuxdelibad.net), le créateur de Vilain, +nous convenons que Vilain doit rester +[KISS](https://fr.wikipedia.org/wiki/Principe_KISS), qu'il n'est pas souhaitable +de compliquer son code pour générer un rapport. Il est préférable de réaliser le +travail en externe en analysant les logs. C'est ainsi que j'ai écrit +**vilainreport** (une centaine de lignes en Python), qu'on peut lancer +quotidiennement avec une tâche CRON pour recevoir le rapport du jour : + + cat /var/log/vilain | vilainreport | mail -s "Vilain rapport du jour" admin + +**vilainreport** est intégré au [dépôt de Vilain sur Framagit](https://framagit.org/Thuban/vilain). + +Voici un exemple de rapport généré par *vilainreport*: + + ### Date 2017-10-12 + 00:17:00 blacklist IP 156.196.136.52 (ssh) + 01:26:17 blacklist IP 115.249.139.206 (ssh) + 02:31:08 blacklist IP 218.62.64.179 (ssh) + 02:35:16 blacklist IP 91.223.167.69 (ssh) + 02:46:54 blacklist IP 27.102.203.180 (ssh) + ... + + Probe 'ssh' : 137 attacks + + ### Attacks per probe + Probe 'ssh': 137 attacks + + ### Hourly repartition + Hour 00 - 01: 1 + Hour 01 - 02: 1 + Hour 02 - 03: 4 + Hour 03 - 04: 4 + ... + + ### Top attackers + IP 195.184.191.147 : 6 + IP 81.4.110.104 : 5 + IP 90.63.248.112 : 5 + IP 176.31.126.176 : 5 + ... + +Ma configuration personnelle de Vilain est la suivante : je bannis pendant 1 +heure toute adresse après sa deuxième tentative erronée de connexion à un de mes +services. Donc un *Top attacker* qui a été banni 6 fois dans la même journée n'a +pas fait d'erreur de connexion. Il a vraiment l'intention de s'introduire dans +mon serveur. Je pourrais durcir ma configuration pour bannir beaucoup plus d'une +heure mais ça ne m'arrange pas car je partage des documents avec des gens qui +peuvent se tromper une fois ou deux en saisissant leurs identifiants Nextcloud. +J'ai donc décidé de mettre en place une sanction plus dure pour les récidivistes : +les jeter dans un puits sans fond, concrètement, une blackliste définitive au +niveau du pare-feu OpenBSD. + +![Prison de Bane](/images/2017/darkknight-prison.jpg) + +J'ai appliqué une logique similaire à *vilainreport*. Je réinjecte le rapport +dans un petit shell script **supervilain** qui identifie les récidivistes et les +jette dans le puits, où il resteront... jusqu'au prochain redémarrage du serveur. + +Voici le script en Korn Shell : + +``` shell +#!/bin/ksh + +if [ $# != 1 ]; then + echo "Usage: $0 logfile" + exit 1 +fi + +file=${1--} +while read line +do + line=`echo $line | tr -d '\r'` + if [[ $line = IP* ]]; then + ipend="${line##+(IP )}" + ip="${ipend%%+( ):*}" + count="${ipend##*\: }" + if [ "$count" -gt "2" ]; then + echo "Ban supervilain ${ip} (${count})" + `pfctl -t supervilain -T add ${ip}` + fi + fi +done <"$file" +``` diff --git a/content/blog/2017/2017-11-17-un-blog-plus-statique.md b/content/blog/2017/2017-11-17-un-blog-plus-statique.md new file mode 100755 index 0000000..1c556f2 --- /dev/null +++ b/content/blog/2017/2017-11-17-un-blog-plus-statique.md @@ -0,0 +1,124 @@ +--- +layout: post +title: Un blog plus statique +categories: Hébergement Blog +tag: planet +--- + +Un échange avec [Bruno Adelé](http://bruno.adele.im), qui fut l'initiateur du +projet CaCause à une époque (déjà 5 ans) où les blogs statiques n'avaient pas +d'autre alternative que Disqus, a titillé mon intellect. Bruno envisage de +migrer son blog vers [Hugo](https://gohugo.io) et d'utiliser le gestionnaire +de commentaires [staticman](https://staticman.net) dont la particularité est +de soumettre les commentaires par des pull-request GIT. + +Cela m'a rappelé [le projet Pecosys](https://blogduyax.madyanne.fr/2014 +/pecosys-les-commentaires-avec-pelican) qui avait une approche similaire : les +commentaires étaient partie intégrante du blog, publiés dans GIT sous forme de +fichiers au format Markdown et convertis en HTML par le moteur de blog +Pelican. La complexité de mise en oeuvre de Pecosys (un dépôt GIT privé, un +e-mail dédié, un plugin spécifique pour Pelican) ont eu raison du projet. Deux +ans plus tard, je codais Stacosys en simplifiant un peu les pré-requis +système. Entre temps, des alternatives crédibles à Disqus avaient vu le jour +comme [Isso](https://posativ.org/isso) notamment. Stacosys est donc resté un +projet personnel et depuis, il gère les commentaires de ce blog. + +Dans Stacosys, les commentaires ne font plus partie des sources du blog. le +navigateur Web du lecteur communique directement avec Stacosys via une API +REST et une instance de Stacosys peut être partagée entre plusieurs sites par +[des requêtes CORS](https://fr.wikipedia.org/wiki/Cross- +origin_resource_sharing). Stacosys stocke les commentaires dans sa base de +données et il ne fait plus de GIT. Contrairement à Pecosys (PElican COmment +SYStem), Stacosys n'est pas lié à un moteur de blog particulier, il est +facilement intégrable dans une page HTML par un peu de JavaScript. + +![Architecture actuelle Stacosys](/images/2017/schema-stacosys-avant.jpg) + +Au vu de mon utilisation mono-site de Stacosys je me suis demandé si je ne +pourrais pas revenir à une génération des commentaires en pages statiques. +Cela apporte plusieurs avantages : + +- une plus grande rapidité de navigation : au lieu d'ajouter les commentaires à la page en asynchrone par JavaScript, ils font partie de la page +- la capacité à supporter plus d'utilisateurs simultanés car le serveur HTTP ne sert que des ressources statiques +- plus de sécurité sur mon serveur grâce une surface d'attaque réduite : plus besoin d'une application HTTP REST accessible sur Internet + +L'idée n'est pas réécrire Stacosys mais de pouvoir l'utiliser dans les deux cas +de figure : mono-site et multi-site. + +Le moteur de blog Hugo fournit une solution technique élégante à travers [les +data templates](https://gohugo.io/templates/data-templates). Il s'agit de +récupérer de l'information pendant la construction du blog pour enrichir les +pages avec une information dynamique (qui peut changer à chaque build). On +peut lire des fichiers JSON sur disque, ou mieux, faire des requêtes HTTP pour +récupérer du JSON. + +Ca tombe bien, Stacosys fournit une API REST qui renvoie du JSON :-) Ni une ni +deux, j'ai adapté mes modèles pour que Hugo interroge Stacosys pendant sa +phase de build et génère les articles en incluant les commentaires en fin de +page. + +Voici le *template* Hugo des commentaires qui utilise la fonction **getJSON** pour récupérer les commentaires +de la page en cours : + +``` html +{% raw %} +
+ {{ $restParam := (printf "/comments?token=%v&url=%v" .Site.Params.widgets.stacosys_token .URL) }} + {{ $resp := getJSON .Site.Params.widgets.stacosys_url $restParam }} + {{ range $resp.data }} +
+
+ {{ if isset . "site" }} + + {{ end }} + + {{ if isset . "site" }} + + {{ end }} + {{ .author }} + - {{ .date }} +
+

+ {{ .content | markdownify }} +

+ {{ end }} +
+{% endraw %} +``` + +et un exemple de données renvoyée par Stacosys : + +``` json +{% raw %} + { + "data": [ + { + "author": "Bruno", + "avatar": "b97a3605714350fdad083394c974a9b4", + "content": "Ça donne effectivement envie de se laisser convaincre par un Librem. Le seul problème c'est que c'est déjà limite si j'ai un téléphone mobile et payer un tel prix alors que je pourrais pratiquement avoir un nouvel ordinateur au même montant, ça ne donne pas trop envie. Quand mon téléphone actuel cessera de fonctionner, peut-être que je choisirai plutôt de ne pas en racheter.", + "date": "2017-10-01 20:03:46" + }, + { + "author": "Yax", + "avatar": "308a3596152a79231f3feedc49afa4ef", + "content": "Je comprends c'est pas mon budget téléphone non plus. Une alternative acceptable c'est le reconditionné de téléphones éprouvés et connus pour être bien supportés par les ROMs communautaires. Ça fait un peu d'écologie en prime.", + "date": "2017-10-01 22:20:37" + } + ] + } +{% endraw %} +``` + +Il reste une interaction entre le serveur HTTP et Stacosys pour poster des +commentaires via le formulaire mais on n'a plus besoin que Stacosys ait son nom +FQDN propre et soit exposé sur Internet. + +Le nouveau système ressemble à ceci : + +![Nouvelle architecture Stacosys](/images/2017/schema-stacosys-apres.jpg) + +Les sources complets sont sur [mon Github](https://github.com/kianby). + +C'est en place depuis le début de la semaine et je suis ravi du résultat. +Combiné avec un Firefox Quantum pour la navigation ça roxe du poney ! + diff --git a/content/blog/2017/2017-12-14-kif-microservices.md b/content/blog/2017/2017-12-14-kif-microservices.md new file mode 100755 index 0000000..7b5df33 --- /dev/null +++ b/content/blog/2017/2017-12-14-kif-microservices.md @@ -0,0 +1,86 @@ +--- +layout: post +title: Mon kif pour les microservices +category: Développement +tag: planet +--- + +Je m'intéresse aux microservices depuis un bout de temps. Comme pour beaucoup +de sujets de fond, je suis à maturation lente : j'engrange les concepts, je +lis les retours d'expérience, je pèse les avantages et les inconvénients. +Quand on a commencé à parler d'architecture microservices, l'engouement était +tel qu'on confrontait souvent l'architecture orientés services (SOA) et on +présentait les microservices comme la réponse adéquate pour tout type +d'application. Aujourd'hui, les esprits sont plus calmes, l'opinion commune +décrit l'architecture à base de microservices comme une version plus +granulaire que le SOA, qui suit les mêmes principes (séparation des +responsabilités, interface de communication formalisée entre les composants) +afin d'atteindre les mêmes objectifs : maintenabilite du code, indépendance +entre le code et le déploiement (localisation, redondance). + +J'espère ne pas m'attirer des foudres avec les deux paragraphes suivants. + +La SOA est surtout mise en oeuvre dans le SI (système d'information) de +l'entreprise, avec des services s'exécutant sur des serveur d'applications +(bienvenue dans le monde de la JVM). La terminologie est précise (service +métier, service d'intégration, annuaire de services), des protocoles sont +préconisés et la mise en oeuvre est balisée (urbanisme, lotissement). La SOA +est mature et normalisée, elle a été pensée par des architectes logiciels +comme un ensemble de bonnes pratiques pour concevoir des applications non +monolithiques et évolutives. + +A l'opposé, les microservices sont nés sur [le front +nuageux](https://fr.wikipedia.org/wiki/Cloud_computing), dans un environnement +plus dynamique (ajout à chaud d'instances de services pour supporter la +charge), très hétérogène (mix de plusieurs langages de programmation) avec des +contraintes fortes sur les temps de réponse (cas des sites de réservation ou +d'achat, réseau social). Nés un peu à l'arrache, c'est en grandissant qu'on +conceptualise progressivement leurs modèles de conception : +[http://microservices.io](http://microservices.io). Les microservices +remettent en question les façons de tester, déboguer, déployer, surveiller car +une application est constituée de très nombreux microservices, certains étant +prévus pour être répliqués afin d'absorber des pics de charges ; il ne +partagent souvent aucun socle commun (pas de serveur d'application) et ils +sont distribués sur des serveurs, des machines virtuelles ou des containers +Docker... + +*"Marrant ton truc, ça rappelle un peu [la cathédrale et le bazar](https://fr.wikipedia.org/wiki/La_Cath%C3%A9drale_et_le_Bazar) non ?"* + +- C'est pas faux ! D'ailleurs j'ai toujours eu un goût prononcé pour le bazar, à ne pas confondre avec le chaos. Et ce bazar fonctionne ; des grosses sociétés ont misé dessus : Facebook, Amazon, Netflix, Twitter... + +Pour un développeur / architecte... Java EE (au hasard), s'intéresser aux +microservices c'est un peu comme être exfiltré du rayon condiments de +Carrefour et parachuté dans le marché aux épices d'Istanbul : un étiquetage +moins formel, pas de conditionnement normalisé mais beaucoup de couleurs et de +senteurs. + +![Marché aux épices](/images/2017/epices.jpg) + +Il n'est pas évident de s'y retrouver, aisé de faire des choix inappropriés +mais c'est plutôt excitant. Concrètement, on va utiliser le langage de +programmation le plus approprié pour chaque tâche (du Node.js, du Python, du +Golang ou autre), communiquer avec un modèle adapté au besoin (du RPC, de la +communication par message), choisir des protocoles adaptés à la taille des +informations échangés et aux contraintes (LAN, WAN, réseaux mobiles), fournir +une persistence locale à chaque microservice (quitte à redonder de +l'information) et surtout gérer finement le mode déconnecté (pas d'accès +réseau, inaccessibilité d'un service distant), autant que possible rendre un +service dégradé en cas de perturbation (faire mieux qu'une erreur *404 Not +Found*). + +Ce projet GitHub recense les briques existantes pour construire des +microservices : [https://github.com/mfornos/awesome- +microservices](https://github.com/mfornos/awesome-microservices). Mon goût +prononcé pour Python m'a amené à jouer avec +[Nameko](https://nameko.readthedocs.io), puis à développer [un mini- +framework](https://github.com/kianby/microsvax) qui permet de communiquer par +message et RPC à travers une base mémoire [Redis](https://redis.io). Ca n'ira +jamais en production mais c'était amusant à faire. Je me suis intéressé au bus +de message ultra-rapide [NSQ](https://github.com/nsqio/nsq) écrit en Golang, +et dernièrement, je revois mon projet de service d'e-mail +[SRMail](https://github.com/kianby/srmail) dans une optique microservices. + +Bref c'est un terrain de jeu illimité en connexion avec les révolutions +amenées par le développement dans les nuages, les objets connectés et le +DevOps : des domaines encore jeunes mais prometteurs qui réveillent les +~~papilles~~ neurones :-) diff --git a/content/blog/2017/2017-12-25-un-blog-plus-respectueux.md b/content/blog/2017/2017-12-25-un-blog-plus-respectueux.md new file mode 100755 index 0000000..0438253 --- /dev/null +++ b/content/blog/2017/2017-12-25-un-blog-plus-respectueux.md @@ -0,0 +1,40 @@ +--- +layout: post +title: Un blog plus respectueux +category: Blog +tag: planet +--- + +Je suis allé plus loin dans le respect de la vie privée sur le blog. + +Quand on laisse un commentaire, l'adresse e-mail a toujours été optionnelle. +Elle sert à retrouver un avatar sur [Gravatar](https://fr.gravatar.com) et à +informer les abonnés de la parution d'un nouveau commentaire pour un article. +J'ai ajouté à [mon gestionnaire de +commentaires](https://github.com/kianby/stacosys) un mode *privé* qui +désactive la fonction d'abonnement et se passe de l'e-mail. En fait, l'e-mail +est résolu en avatar dans le navigateur avec quelques lignes de JavaScript et +il n'est pas pas envoyé au serveur, donc jamais stocké. + +Le nouveau formulaire de ressemble à ceci : + +![Commentaire en JS](/images/2017/commentaire-js.jpg) + +L'autre nouveauté, dans la même veine, c'est le support des navigateurs avec +le JavaScript désactivé. Mon article précédent [*un blog plus statique*](/2017/un- +blog-plus-statique/) a fait la moitié du travail en générant en pur HTML les +commentaires déjà postés. Il restait à donner la possibilité de laisser un +commentaire sans JavaScript, c'est chose faite avec un mode dégradé : + +- sans gestion de l'avatar +- sans prévisualisation en Markdown + +Le formulaire sans JavaScript ressemble à ceci : + +![Commentaire sans JS](/images/2017/commentaire-nojs.jpg) + +Il me semble normal de ne pas empêcher les lecteurs les plus soucieux de leur +vie privée d'accéder aux commentaires, c'est en phase avec les valeurs que je +prône ici. + + diff --git a/content/blog/2018/2018-01-27-notes-rabbitmq.md b/content/blog/2018/2018-01-27-notes-rabbitmq.md new file mode 100755 index 0000000..725ad42 --- /dev/null +++ b/content/blog/2018/2018-01-27-notes-rabbitmq.md @@ -0,0 +1,182 @@ +--- +layout: post +title: Mes notes sur RabbitMQ +category: Développement +--- + +[RabbitMQ](https://www.rabbitmq.com) est un bus de messages Open Source qui +implémente le protocole Advanced Message Queuing (AMQP). Sa fonction est de +faire communiquer entre eux des programmes différents, potentiellement écrits +dans différents langages. Le serveur RabbitMQ est lui-même écrit dans le +langage de programmation Erlang, ce qui est plutôt atypique. Aucune +connaissance de Erlang n'est nécessaire pour l'utiliser. C'est un produit +édité par Pivotal, un spin-off de VMWare et EMC, connu de tous les +développeurs JAVA pour son fabuleux framework +[Spring](https://en.wikipedia.org/wiki/Spring_Framework). + +RabbitMQ demande une complexité de configuration proportionnelle aux exigences +demandées : queues de messages persistantes, dead letters, haute +disponibilité, optimisation des performances... Pour les configurations +compliquées et le support technique avancé dans des mises en oeuvre +d'entreprises, il y a des experts (j'ai une adresse pour ceux intéressés). +Pour une utilisation basique, dans un cadre de développement pépère à la +maison, RabbitMQ est très accessible, bien documenté et permet d'avoir +rapidement un bus de message pour faire communiquer ses applications. + +Je m'en sers actuellement pour faire discuter mon petit éco-système hébergé. Dans ce cadre j'ai pris quelques notes sur sa mise en place, de l'installation à la configuration de base. + +### Installation + +Choix de l'OS : CentOS 7 + +Page d'aide de référence pour l'installation : https://www.rabbitmq.com/install-rpm.html + +Pivotal fournit une installation d'une version allégée de Erlang avec les dépendances nécessaires à RabbitMQ : https://github.com/rabbitmq/erlang-rpm + +Et bien sûr, il fournissent aussi un RPM de RabbitMQ (actuellement en version 3.7.2-1) : https://dl.bintray.com/rabbitmq/all/rabbitmq-server/3.7.2/rabbitmq-server-3.7.2-1.el7.noarch.rpm + +Gestion du service à la sauce CentOS : + + # démarrer le service + /sbin/service rabbitmq-server start + + # stopper le service + /sbin/service rabbitmq-server stop + + # démarrage automatique du service + chkconfig rabbitmq-server on + +Après avoir mis le service en démarrage automatique, on n'utilisa plus que l'outil *rabbitmqctl* : + + # démarrer le serveur rabbitmq + rabbitmqctl start_app + + # stopper le serveur rabbitmq + rabbitmqctl stop_app + +### Droits et permissions + +Par défaut, un utilisateur *guest* (mot de passe idem) est créé et il est +attaché à l'interface réseau locale (localhost). Pour se connecter depuis une +autre machine, en distant, il faut créer un nouvel utilisateur. + + rabbitmqctl add_user admin + rabbitmqctl set_user_tags admin administrator + rabbitmqctl set_permissions -p / admin ".*" ".*" ".*" + +### Interface Web d'administration + +Une belle interface permet de gérer la configuration et de visualiser des +indicateurs de fonctionnement. C'est un plugin qu'on active en ligne de +commande avec *rabbitmq- plugins* + + rabbitmq-plugins enable rabbitmq_management + +L'interface Web répond à l'adresse *http://server-name:15672/cli/* + +L'utilisateur *guest* n'a accès à l'interface que par localhost. Le nouveau compte admin est nécessaire pour se connecter en distant. + +Si l'interface Web est derrière un proxy NginX et qu'elle répond à une sous-URL du domaine, la config pour pour une sous-url */rabbitwebmin* est la suivante : + + location /rabbitwebmin/ { + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + rewrite ^/rabbitwebmin/(.*)$ /$1 break; + proxy_pass http://192.168.2.1:15672; + } + +Optionnellement, on peut installer [le CLI de rabbitmqadmin](https://www.rabbitmq.com +/management-cli.html) en téléchargeant le programme (Python) depuis +https://raw.githubusercontent.com/rabbitmq/rabbitmq- +management/v3.7.2/bin/rabbitmqadmin et en le plaçant dans */usr/local/bin*. + +### Mise en oeuvre + +On crée un utilisateur technique pour nos applications dans un virtual host spécifique. + + rabbitmqctl add_vhost devhub + rabbitmqctl add_user techuser tech + rabbitmqctl set_permissions -p devhub techuser ".*" ".*" ".*" + +A ce niveau, on peut essayer de faire communiquer deux applications à travers Rabbit avec un classique producteur-consommateur écrit en Python, utilisant [la librairie Pika](https://pika.readthedocs.io), dérivé du tutorial de RabbitMQ. + +Code du producteur : + +``` python +#!/usr/bin/env python +import pika +import sys + +credentials = pika.PlainCredentials('techuser', 'tech') +connection = pika.BlockingConnection(pika.ConnectionParameters(host='192.168.2.1',credentials=credentials, virtual_host="devhub")) +channel = connection.channel() + +channel.exchange_declare(exchange='hub.topic', + exchange_type='topic') + +routing_key = sys.argv[1] if len(sys.argv) > 2 else 'anonymous.info' +message = ' '.join(sys.argv[2:]) or 'Hello World!' +channel.basic_publish(exchange='hub.topic', + routing_key=routing_key, + body=message) +print(" [x] Sent %r:%r" % (routing_key, message)) +connection.close() +``` + +Code du consommateur : + +``` python +#!/usr/bin/env python +import pika +import sys + +credentials = pika.PlainCredentials('techuser', 'tech') +connection = pika.BlockingConnection(pika.ConnectionParameters(host='192.168.2.1',credentials=credentials, virtual_host="devhub")) +channel = connection.channel() + +channel.exchange_declare(exchange='hub.topic', + exchange_type='topic') + +result = channel.queue_declare(exclusive=True) +queue_name = result.method.queue +print("Queue => " + queue_name) + +# on s'abonne aux topics : +binding_keys = ['mail.message', 'mail.command.*'] + +for binding_key in binding_keys: + channel.queue_bind(exchange='hub.topic', + queue=queue_name, + routing_key=binding_key) + +print(' [*] Waiting for logs. To exit press CTRL+C') + +def callback(channel, method, properties, body): + print("=> %r:%r" % (method.routing_key, body)) + +channel.basic_consume(callback, + queue=queue_name, + no_ack=True) + +channel.start_consuming() +``` + +Quelques tests : + + # le consommateur lancé dans un shell s'abonne aux topics mail.message et mail.command.* + $ python3 consumer.py + +le consommateur doit recevoir le message suivant : + + # le producteur produit dans le topic 'mail.message' + $ python3 producer.py "mail.message" + +le consommateur doit recevoir le message suivant : + + # le producteur produit dans le topic 'mail.command.test' + $ python3 producer.py "mail.command.test" + +le consommateur ne doit pas recevoir le message suivant : + + # le producteur produit dans le topic 'mail.rate' + $ python3 producer.py "mail.rate" diff --git a/content/blog/2018/2018-02-07-quel-systeme-serveur.md b/content/blog/2018/2018-02-07-quel-systeme-serveur.md new file mode 100755 index 0000000..b20ab80 --- /dev/null +++ b/content/blog/2018/2018-02-07-quel-systeme-serveur.md @@ -0,0 +1,125 @@ +--- +layout: post +title: Choix du système pour s'auto-héberger +category: Hébergement +tag: planet +--- + +Suite à un échange intéressant sur le choix d’une distribution dans Diaspora, +j'ai eu envie de developper le sujet dans un article. je restreins au choix +d'un système d'exploitation pour de l'auto-hébergement (à la maison ou chez un +hébergeur avec une offre de serveur physique dédié) car je ne me sens plus +assez qualifié pour parler de choix d'entreprise, m'étant recentré sur le +développement ; bon je glisserai quand même quelques avis et les adminsys en +activité commenteront. + +En une quinzaine d’années, le choix d’un système a traversé trois phases +successives : de **"le meilleur système c'est Gloup"** (remplacez Gloup par +votre système d'exploitation préféré), à **"le meilleur système c'est TOUS"**, +nous sommes arrivés à **"le meilleur système c'est AUCUN"**. + +### Phase 1 : le monolithe + +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. + +![Cachet Admin](/images/2018/cachet-admin.png) + +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. + +![Ouverture coffre-fort](/images/2018/bitwarden-ouverture.png) + +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. + +![Remplissage de formulaire](/images/2018/bitwarden-remplissage.png) + +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. + +![Tableau de bord Proxmox](/images/2018/proxmox-dashboard.png) + +# 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 : + +![Architecture Proxmox](/images/2018/archi-proxmox.jpg) + +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 : + +![Configuration pare-feu](/images/2018/proxmox-firewall-rules.png) + +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. + +![Architecture Docker blog](/images/2018/docker-blog.png) + +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. + +![gadget bridge](/images/2018/gadgetbridge.png) + +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. + +![watch face](/images/2018/amazfitwatchfaces.png) + +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 ! + +![furet](/images/2018/furet.jpg) + +*[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. + +![Docker](/images/2018/docker.jpg) + +**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 : + +![Sélection paquets Cygwin](/images/2019/cygwin-selectpackage.jpg) + +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. + +![sshto](/images/2019/sshto.png) + +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. + +![Sea Bird]({{site.baseurl}}/images/2019/sea-bird-night-water-9012.jpeg) + + + + + + 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 :-) + +![Ancien Blog du Yax]({{site.baseurl}}/images/2019/blogduyax.png) 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. + +![Glances]({{site.baseurl}}/images/2019/glances.png) + 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: + +![Rendu Mermaid]({{site.baseurl}}/images/2019/mermaid.png) + +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 + +![Bruce et Alfred]({{site.baseurl}}/images/2019/bruce-alfred.jpg) + +*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

+

+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. +

diff --git a/content/news/2018-01-02-vivamus-purus.html b/content/news/2018-01-02-vivamus-purus.html new file mode 100644 index 0000000..42845b1 --- /dev/null +++ b/content/news/2018-01-02-vivamus-purus.html @@ -0,0 +1,30 @@ + +

+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. +

diff --git a/content/news/2018-01-04-mauris-tempor.html b/content/news/2018-01-04-mauris-tempor.html new file mode 100644 index 0000000..b7dd769 --- /dev/null +++ b/content/news/2018-01-04-mauris-tempor.html @@ -0,0 +1,37 @@ + +

+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. +

diff --git a/layout/feed.xml b/layout/feed.xml new file mode 100644 index 0000000..388c39e --- /dev/null +++ b/layout/feed.xml @@ -0,0 +1,12 @@ + + + + +{{ title }} +{{ site_url }}/ +Grow with Technology + +{{ content }} + + + diff --git a/layout/item.html b/layout/item.html new file mode 100644 index 0000000..0a1b712 --- /dev/null +++ b/layout/item.html @@ -0,0 +1,10 @@ + diff --git a/layout/item.xml b/layout/item.xml new file mode 100644 index 0000000..8403e00 --- /dev/null +++ b/layout/item.xml @@ -0,0 +1,13 @@ + +{{ title }} +{{ site_url }}/{{ blog }}/{{ slug }}/ + + +{{ summary }} ... +

+

Read More

+]]> +
+{{ rfc_2822_date }} +
diff --git a/layout/list.html b/layout/list.html new file mode 100644 index 0000000..79a6aab --- /dev/null +++ b/layout/list.html @@ -0,0 +1,5 @@ +

{{ title }}

+{{ content }} +
+RSS +
diff --git a/layout/page.html b/layout/page.html new file mode 100644 index 0000000..1912997 --- /dev/null +++ b/layout/page.html @@ -0,0 +1,42 @@ + + + + {{ title }} - {{ subtitle }} + + + + + + + + + +
+{{ content }} +
+ + + + + diff --git a/layout/post.html b/layout/post.html new file mode 100644 index 0000000..f0a42be --- /dev/null +++ b/layout/post.html @@ -0,0 +1,5 @@ +
+

{{ title }}

+

Published on {{ date }} by {{ author }}

+{{ content }} +
diff --git a/makesite.py b/makesite.py new file mode 100755 index 0000000..bb97abc --- /dev/null +++ b/makesite.py @@ -0,0 +1,232 @@ +#!/usr/bin/env python + +# 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. + + +"""Make static website/blog with Python.""" + + +import os +import shutil +import re +import glob +import sys +import json +import datetime + + +def fread(filename): + """Read file and close the file.""" + with open(filename, 'r') as f: + return f.read() + + +def fwrite(filename, text): + """Write content to file and close the file.""" + basedir = os.path.dirname(filename) + if not os.path.isdir(basedir): + os.makedirs(basedir) + + with open(filename, 'w') as f: + f.write(text) + + +def log(msg, *args): + """Log message with specified arguments.""" + sys.stderr.write(msg.format(*args) + '\n') + + +def truncate(text, words=25): + """Remove tags and truncate text to the specified number of words.""" + return ' '.join(re.sub('(?s)<.*?>', ' ', text).split()[:words]) + + +def read_headers(text): + """Parse headers in text and yield (key, value, end-index) tuples.""" + for match in re.finditer(r'\s*\s*|.+', text): + if not match.group(1): + break + yield match.group(1), match.group(2), match.end() + + +def rfc_2822_format(date_str): + """Convert yyyy-mm-dd date string to RFC 2822 format date string.""" + d = datetime.datetime.strptime(date_str, '%Y-%m-%d') + return d.strftime('%a, %d %b %Y %H:%M:%S +0000') + + +def read_content(filename): + """Read content and metadata from file into a dictionary.""" + # Read file content. + text = fread(filename) + + # Read metadata and save it in a dictionary. + date_slug = os.path.basename(filename).split('.')[0] + match = re.search(r'^(?:(\d\d\d\d-\d\d-\d\d)-)?(.+)$', date_slug) + content = { + 'date': match.group(1) or '1970-01-01', + 'slug': match.group(2), + } + + # Read headers. + end = 0 + for key, val, end in read_headers(text): + content[key] = val + + # Separate content from headers. + text = text[end:] + + # Convert Markdown content to HTML. + if filename.endswith(('.md', '.mkd', '.mkdn', '.mdown', '.markdown')): + try: + if _test == 'ImportError': + raise ImportError('Error forced by test') + import commonmark + text = commonmark.commonmark(text) + except ImportError as e: + log('WARNING: Cannot render Markdown in {}: {}', filename, str(e)) + + # Update the dictionary with content and RFC 2822 date. + content.update({ + 'content': text, + 'rfc_2822_date': rfc_2822_format(content['date']) + }) + + return content + + +def render(template, **params): + """Replace placeholders in template with values from params.""" + return re.sub(r'{{\s*([^}\s]+)\s*}}', + lambda match: str(params.get(match.group(1), match.group(0))), + template) + + +def make_pages(src, dst, layout, **params): + """Generate pages from page content.""" + items = [] + + for src_path in glob.glob(src): + content = read_content(src_path) + + page_params = dict(params, **content) + + # Populate placeholders in content if content-rendering is enabled. + if page_params.get('render') == 'yes': + rendered_content = render(page_params['content'], **page_params) + page_params['content'] = rendered_content + content['content'] = rendered_content + + items.append(content) + + dst_path = render(dst, **page_params) + output = render(layout, **page_params) + + log('Rendering {} => {} ...', src_path, dst_path) + fwrite(dst_path, output) + + return sorted(items, key=lambda x: x['date'], reverse=True) + + +def make_list(posts, dst, list_layout, item_layout, **params): + """Generate list page for a blog.""" + items = [] + for post in posts: + item_params = dict(params, **post) + item_params['summary'] = truncate(post['content']) + item = render(item_layout, **item_params) + items.append(item) + + params['content'] = ''.join(items) + dst_path = render(dst, **params) + output = render(list_layout, **params) + + log('Rendering list => {} ...', dst_path) + fwrite(dst_path, output) + + +def main(): + # Create a new _site directory from scratch. + if os.path.isdir('_site'): + shutil.rmtree('_site') + shutil.copytree('static', '_site') + + # Default parameters. + params = { + 'base_path': '', + 'subtitle': 'Lorem Ipsum', + 'author': 'Admin', + 'site_url': 'http://localhost:8000', + 'current_year': datetime.datetime.now().year + } + + # If params.json exists, load it. + if os.path.isfile('params.json'): + params.update(json.loads(fread('params.json'))) + + # Load layouts. + page_layout = fread('layout/page.html') + post_layout = fread('layout/post.html') + list_layout = fread('layout/list.html') + item_layout = fread('layout/item.html') + feed_xml = fread('layout/feed.xml') + item_xml = fread('layout/item.xml') + + # Combine layouts to form final layouts. + post_layout = render(page_layout, content=post_layout) + list_layout = render(page_layout, content=list_layout) + + # Create site pages. + make_pages('content/_index.html', '_site/index.html', + page_layout, **params) + make_pages('content/[!_]*.html', '_site/{{ slug }}/index.html', + page_layout, **params) + + # Create blogs. + blog_posts = make_pages('content/blog/*.md', + '_site/blog/{{ slug }}/index.html', + post_layout, blog='blog', **params) + news_posts = make_pages('content/news/*.html', + '_site/news/{{ slug }}/index.html', + post_layout, blog='news', **params) + + # Create blog list pages. + make_list(blog_posts, '_site/blog/index.html', + list_layout, item_layout, blog='blog', title='Blog', **params) + make_list(news_posts, '_site/news/index.html', + list_layout, item_layout, blog='news', title='News', **params) + + # Create RSS feeds. + make_list(blog_posts, '_site/blog/rss.xml', + feed_xml, item_xml, blog='blog', title='Blog', **params) + make_list(news_posts, '_site/news/rss.xml', + feed_xml, item_xml, blog='news', title='News', **params) + + +# Test parameter to be set temporarily by unit tests. +_test = None + + +if __name__ == '__main__': + main() diff --git a/static/css/style.css b/static/css/style.css new file mode 100644 index 0000000..6426d6f --- /dev/null +++ b/static/css/style.css @@ -0,0 +1,140 @@ +/* General */ +body { + margin: 0; + line-height: 1.5em; + color: #333333; + font-family: helvetica, arial, sans-serif; +} + +h1, h2, h3, h4, h5, h6 { + margin-bottom: 0; + line-height: 1.2em; + margin-top: 1em; +} + +a:link, a:visited { + color: #0000e0; + text-decoration: none +} + +a:hover, a:active { + color: #0000ff; + text-decoration: underline +} + + +/* Single column layout */ +nav section, header section, main, footer section { + max-width: 40em; + margin-left: auto; + margin-right: auto; + padding: 0 0.5em; +} + + +/* Navigation panel */ +nav { + background: #333333; + border-bottom: thin solid #111111; + line-height: 3em; +} + +nav a { + margin-right: 1em; +} + +nav a:link, nav a:visited { + color: #cccccc; +} + +nav a:hover, nav a:active { + color: #ffffff; + text-decoration: none; +} + +@media screen and (min-width: 600px) { + nav .links { + float: right; + } +} + + +/* Footer */ +footer { + background: #f0f0f0; + border-top: thin solid #e0e0e0; + margin-top: 2em; + padding: 1em 0; + box-shadow: 0 100vh 0 100vh #f0f0f0; + text-align: center; +} + +footer section p { + font-size: 0.8em; +} + +footer a { + margin-right: 1em; +} + +footer a:last-child { + margin-right: 0; +} + + +/* Posts */ +article { + margin-top: 1em; + margin-bottom: 1em; +} + +article h2 a:link, article h2 a:visited, +article h1 a:link, article h1 a:visited, +.more:link, .more:visited { + color: #333333; +} + +article h2 a:hover, article h2 a:active, +article h1 a:hover, article h1 a:active, +.more:hover, .more:active { + color: #777777; +} + +p.meta { + margin-top: 0; + font-size: 0.8em; + color: #777777; + font-style: italic; +} + +p.summary { + margin-top: 0.25em; + margin-bottom: 0.25em; +} + +div .more { + margin-top: 0; + font-weight: bold; +} + + +/* RSS */ +.rss { + padding: 0.3em 0.35em; + border-radius: 0.25em; + font-size: 0.75em; + font-weight: bold; +} + +.rss:link, .rss:visited, .rss:hover, .rss:active { + color: #ffffff; + text-decoration: none; +} + +.rss:link, .rss:visited { + background: #ff6600; +} + +.rss:hover, .rss:active { + background: #ff8822; +} diff --git a/test/__init__.py b/test/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/test/path.py b/test/path.py new file mode 100644 index 0000000..38c0991 --- /dev/null +++ b/test/path.py @@ -0,0 +1,16 @@ +import os +import tempfile +import shutil + + +def temppath(*paths): + return os.path.join(tempfile.gettempdir(), *paths) + + +def move(src, dst): + if os.path.isfile(dst): + os.remove(dst) + elif os.path.isdir(dst): + shutil.rmtree(dst) + if os.path.exists(src): + os.rename(src, dst) diff --git a/test/test_content.py b/test/test_content.py new file mode 100644 index 0000000..66342d9 --- /dev/null +++ b/test/test_content.py @@ -0,0 +1,104 @@ +import unittest +import shutil +import os + +import makesite +from test import path + + +class ContentTest(unittest.TestCase): + def setUp(self): + self.blog_path = path.temppath('blog') + self.undated_path = os.path.join(self.blog_path, 'foo.txt') + self.dated_path = os.path.join(self.blog_path, '2018-01-01-foo.txt') + self.normal_post_path = os.path.join(self.blog_path, 'baz.txt') + self.md_post_path = os.path.join(self.blog_path, 'qux.md') + self.no_md_post_path = os.path.join(self.blog_path, 'qux.txt') + + os.makedirs(self.blog_path) + + with open(self.undated_path, 'w') as f: + f.write('hello world') + + with open(self.dated_path, 'w') as f: + f.write('hello world') + + with open(self.normal_post_path, 'w') as f: + f.write('\n\nFoo') + + with open(self.md_post_path, 'w') as f: + f.write('*Foo*') + + with open(self.no_md_post_path, 'w') as f: + f.write('*Foo*') + + def tearDown(self): + shutil.rmtree(self.blog_path) + + # Rudimentary mock because unittest.mock is unavailable in Python 2.7. + def mock(self, *args): + self.mock_args = args + + def test_content_content(self): + content = makesite.read_content(self.undated_path) + self.assertEqual(content['content'], 'hello world') + + def test_content_date(self): + content = makesite.read_content(self.dated_path) + self.assertEqual(content['date'], '2018-01-01') + + def test_content_date_missing(self): + content = makesite.read_content(self.undated_path) + self.assertEqual(content['date'], '1970-01-01') + + def test_content_slug_dated(self): + content = makesite.read_content(self.dated_path) + self.assertEqual(content['slug'], 'foo') + + def test_content_slug_undated(self): + content = makesite.read_content(self.undated_path) + self.assertEqual(content['slug'], 'foo') + + def test_content_headers(self): + content = makesite.read_content(self.normal_post_path) + self.assertEqual(content['a'], '1') + self.assertEqual(content['b'], '2') + self.assertEqual(content['content'], 'Foo') + + def test_markdown_rendering(self): + content = makesite.read_content(self.md_post_path) + self.assertEqual(content['content'], '

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 }}
' + item_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

') + + def test_list_params(self): + posts = [{'content': 'Foo', 'title': 'foo'}, + {'content': 'Bar', 'title': 'bar'}] + dst = os.path.join(self.site_path, 'list.txt') + list_layout = '
{{ key }}:{{ title }}:{{ content }}
' + item_layout = '

{{ 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:lorem:

val:foo:Foo

val:bar:Bar

') + + def test_dst_params(self): + posts = [{'content': 'Foo'}, {'content': 'Bar'}] + dst = os.path.join(self.site_path, '{{ key }}.txt') + list_layout = '
{{ content }}
' + item_layout = '

{{ 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

') diff --git a/test/test_main.py b/test/test_main.py new file mode 100644 index 0000000..50f1cc5 --- /dev/null +++ b/test/test_main.py @@ -0,0 +1,73 @@ +import unittest +import makesite +import os +import shutil +import json + +from test import path + + +class MainTest(unittest.TestCase): + def setUp(self): + path.move('_site', '_site.backup') + path.move('params.json', 'params.json.backup') + + def tearDown(self): + path.move('_site.backup', '_site') + path.move('params.json.backup', 'params') + + def test_site_missing(self): + makesite.main() + + def test_site_exists(self): + os.mkdir('_site') + with open('_site/foo.txt', 'w') as f: + f.write('foo') + + self.assertTrue(os.path.isfile('_site/foo.txt')) + makesite.main() + self.assertFalse(os.path.isfile('_site/foo.txt')) + + def test_default_params(self): + makesite.main() + + with open('_site/blog/proin-quam/index.html') as f: + s1 = f.read() + + with open('_site/blog/rss.xml') as f: + s2 = f.read() + + shutil.rmtree('_site') + + self.assertIn('Home', s1) + self.assertIn('Proin Quam - Lorem Ipsum', s1) + self.assertIn('Published on 2018-01-01 by Admin', s1) + + self.assertIn('http://localhost:8000/', s2) + self.assertIn('http://localhost:8000/blog/proin-quam/', s2) + + def test_json_params(self): + params = { + 'base_path': '/base', + 'subtitle': 'Foo', + 'author': 'Bar', + 'site_url': 'http://localhost/base' + } + with open('params.json', 'w') as f: + json.dump(params, f) + makesite.main() + + with open('_site/blog/proin-quam/index.html') as f: + s1 = f.read() + + with open('_site/blog/rss.xml') as f: + s2 = f.read() + + shutil.rmtree('_site') + + self.assertIn('Home', s1) + self.assertIn('Proin Quam - Foo', s1) + self.assertIn('Published on 2018-01-01 by Bar', s1) + + self.assertIn('http://localhost/base/', s2) + self.assertIn('http://localhost/base/blog/proin-quam/', s2) diff --git a/test/test_pages.py b/test/test_pages.py new file mode 100644 index 0000000..0fefdaa --- /dev/null +++ b/test/test_pages.py @@ -0,0 +1,127 @@ +import unittest +import os +import shutil +import makesite +from test import path + +class PagesTest(unittest.TestCase): + def setUp(self): + self.blog_path = path.temppath('blog') + self.site_path = path.temppath('site') + os.makedirs(self.blog_path) + + with open(os.path.join(self.blog_path, 'foo.txt'), 'w') as f: + f.write('Foo') + with open(os.path.join(self.blog_path, 'bar.txt'), 'w') as f: + f.write('Bar') + with open(os.path.join(self.blog_path, '2018-01-01-foo.txt'), 'w') as f: + f.write('Foo') + with open(os.path.join(self.blog_path, '2018-01-02-bar.txt'), 'w') as f: + f.write('Bar') + with open(os.path.join(self.blog_path, 'header-foo.txt'), 'w') as f: + f.write('Foo') + with open(os.path.join(self.blog_path, 'header-bar.txt'), 'w') as f: + f.write('Bar') + with open(os.path.join(self.blog_path, 'placeholder-foo.txt'), 'w') as f: + f.write('{{ title }}:{{ author }}:Foo') + with open(os.path.join(self.blog_path, 'placeholder-bar.txt'), 'w') as f: + f.write('{{ title }}:{{ author }}:Bar') + + def tearDown(self): + shutil.rmtree(self.blog_path) + shutil.rmtree(self.site_path) + + def test_pages_undated(self): + src = os.path.join(self.blog_path, '[fb]*.txt') + dst = os.path.join(self.site_path, '{{ slug }}.txt') + tpl = '
{{ content }}
' + makesite.make_pages(src, dst, tpl) + with open(os.path.join(self.site_path, 'foo.txt')) as f: + self.assertEqual(f.read(), '
Foo
') + with open(os.path.join(self.site_path, 'bar.txt')) as f: + self.assertEqual(f.read(), '
Bar
') + + def test_pages_dated(self): + src = os.path.join(self.blog_path, '2*.txt') + dst = os.path.join(self.site_path, '{{ slug }}.txt') + tpl = '
{{ content }}
' + makesite.make_pages(src, dst, tpl) + with open(os.path.join(self.site_path, 'foo.txt')) as f: + self.assertEqual(f.read(), '
Foo
') + with open(os.path.join(self.site_path, 'bar.txt')) as f: + self.assertEqual(f.read(), '
Bar
') + + def test_pages_layout_params(self): + src = os.path.join(self.blog_path, '2*.txt') + dst = os.path.join(self.site_path, '{{ slug }}.txt') + tpl = '
{{ slug }}:{{ title }}:{{ date }}:{{ content }}
' + makesite.make_pages(src, dst, tpl, title='Lorem') + with open(os.path.join(self.site_path, 'foo.txt')) as f: + self.assertEqual(f.read(), '
foo:Lorem:2018-01-01:Foo
') + with open(os.path.join(self.site_path, 'bar.txt')) as f: + self.assertEqual(f.read(), '
bar:Lorem:2018-01-02:Bar
') + + def test_pages_return_value(self): + src = os.path.join(self.blog_path, '2*.txt') + dst = os.path.join(self.site_path, '{{ slug }}.txt') + tpl = '
{{ content }}
' + posts = makesite.make_pages(src, dst, tpl) + self.assertEqual(len(posts), 2) + self.assertEqual(posts[0]['date'], '2018-01-02') + self.assertEqual(posts[1]['date'], '2018-01-01') + + def test_content_header_params(self): + # Test that header params from one post is not used in another + # post. + src = os.path.join(self.blog_path, 'header*.txt') + dst = os.path.join(self.site_path, '{{ slug }}.txt') + tpl = '{{ title }}:{{ tag }}:{{ content }}' + makesite.make_pages(src, dst, tpl) + with open(os.path.join(self.site_path, 'header-foo.txt')) as f: + self.assertEqual(f.read(), '{{ title }}:foo:Foo') + with open(os.path.join(self.site_path, 'header-bar.txt')) as f: + self.assertEqual(f.read(), 'bar:{{ tag }}:Bar') + + def test_content_no_rendering(self): + # Test that placeholders are not populated in content rendering + # by default. + src = os.path.join(self.blog_path, 'placeholder-foo.txt') + dst = os.path.join(self.site_path, '{{ slug }}.txt') + tpl = '
{{ content }}
' + makesite.make_pages(src, dst, tpl, author='Admin') + with open(os.path.join(self.site_path, 'placeholder-foo.txt')) as f: + self.assertEqual(f.read(), '
{{ title }}:{{ author }}:Foo
') + + def test_content_rendering_via_kwargs(self): + # Test that placeholders are populated in content rendering when + # requested in make_pages. + src = os.path.join(self.blog_path, 'placeholder-foo.txt') + dst = os.path.join(self.site_path, '{{ slug }}.txt') + tpl = '
{{ content }}
' + makesite.make_pages(src, dst, tpl, author='Admin', render='yes') + with open(os.path.join(self.site_path, 'placeholder-foo.txt')) as f: + self.assertEqual(f.read(), '
foo:Admin:Foo
') + + def test_content_rendering_via_header(self): + # Test that placeholders are populated in content rendering when + # requested in content header. + src = os.path.join(self.blog_path, 'placeholder-bar.txt') + dst = os.path.join(self.site_path, '{{ slug }}.txt') + tpl = '
{{ content }}
' + makesite.make_pages(src, dst, tpl, author='Admin') + with open(os.path.join(self.site_path, 'placeholder-bar.txt')) as f: + self.assertEqual(f.read(), '
bar:Admin:Bar
') + + def test_rendered_content_in_summary(self): + # Test that placeholders are populated in summary if and only if + # content rendering is enabled. + src = os.path.join(self.blog_path, 'placeholder*.txt') + post_dst = os.path.join(self.site_path, '{{ slug }}.txt') + list_dst = os.path.join(self.site_path, 'list.txt') + post_layout = '' + list_layout = '
{{ content }}
' + item_layout = '

{{ 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

') diff --git a/test/test_path.py b/test/test_path.py new file mode 100644 index 0000000..91e76e8 --- /dev/null +++ b/test/test_path.py @@ -0,0 +1,78 @@ +import unittest +import os +import shutil + +from test import path + +class PathTest(unittest.TestCase): + def test_temppath(self): + self.assertTrue(path.temppath()) + + def test_move_existing_file(self): + src = os.path.join(path.temppath(), 'foo.txt') + dst = os.path.join(path.temppath(), 'bar.txt') + with open(src, 'w') as f: + f.write('foo') + + path.move(src, dst) + self.assertFalse(os.path.isfile(src)) + self.assertTrue(os.path.isfile(dst)) + + with open(dst) as f: + text = f.read() + + os.remove(dst) + + self.assertEqual(text, 'foo') + + def test_move_missing_file(self): + src = os.path.join(path.temppath(), 'foo.txt') + dst = os.path.join(path.temppath(), 'bar.txt') + path.move(src, dst) + self.assertFalse(os.path.isfile(src)) + self.assertFalse(os.path.isfile(dst)) + + def test_move_file_cleanup(self): + src = os.path.join(path.temppath(), 'foo.txt') + dst = os.path.join(path.temppath(), 'bar.txt') + with open(dst, 'w') as f: + f.write('foo') + path.move(src, dst) + self.assertFalse(os.path.isfile(src)) + self.assertFalse(os.path.isfile(dst)) + + def test_move_existing_dir(self): + src = os.path.join(path.temppath(), 'foo') + srcf = os.path.join(src, 'foo.txt') + dst = os.path.join(path.temppath(), 'bar') + dstf = os.path.join(dst, 'foo.txt') + + os.makedirs(src) + with open(srcf, 'w') as f: + f.write('foo') + + path.move(src, dst) + self.assertFalse(os.path.isdir(src)) + self.assertTrue(os.path.isdir(dst)) + + with open(dstf) as f: + text = f.read() + + shutil.rmtree(dst) + + self.assertEqual(text, 'foo') + + def test_move_missing_dir(self): + src = os.path.join(path.temppath(), 'foo') + dst = os.path.join(path.temppath(), 'bar') + path.move(src, dst) + self.assertFalse(os.path.isdir(src)) + self.assertFalse(os.path.isdir(dst)) + + def test_move_dir_cleanup(self): + src = os.path.join(path.temppath(), 'foo') + dst = os.path.join(path.temppath(), 'bar') + os.makedirs(dst) + path.move(src, dst) + self.assertFalse(os.path.isdir(src)) + self.assertFalse(os.path.isdir(dst)) diff --git a/test/test_render.py b/test/test_render.py new file mode 100644 index 0000000..e036b70 --- /dev/null +++ b/test/test_render.py @@ -0,0 +1,25 @@ +import unittest +import makesite + +class RenderTest(unittest.TestCase): + """Tests for render() function.""" + + def test_oneline_template(self): + tpl = 'foo {{ key1 }} baz {{ key2 }}' + out = makesite.render(tpl, key1='bar', key2='qux') + self.assertEqual(out, 'foo bar baz qux') + + def test_multiline_template(self): + tpl = 'foo {{ key1 }}\nbaz {{ key1 }}' + out = makesite.render(tpl, key1='bar') + self.assertEqual(out, 'foo bar\nbaz bar') + + def test_repeated_key(self): + tpl = 'foo {{ key1 }} baz {{ key1 }}' + out = makesite.render(tpl, key1='bar') + self.assertEqual(out, 'foo bar baz bar') + + def test_multiline_placeholder(self): + tpl = 'foo {{\nkey1\n}} baz {{\nkey2\n}}' + out = makesite.render(tpl, key1='bar', key2='qux') + self.assertEqual(out, 'foo bar baz qux') diff --git a/test/test_rfc_2822_date.py b/test/test_rfc_2822_date.py new file mode 100644 index 0000000..db9970f --- /dev/null +++ b/test/test_rfc_2822_date.py @@ -0,0 +1,13 @@ +import unittest +import makesite + + +class RFC822DateTest(unittest.TestCase): + + def test_epoch(self): + self.assertEqual(makesite.rfc_2822_format('1970-01-01'), + 'Thu, 01 Jan 1970 00:00:00 +0000') + + def test_2018_06_16(self): + self.assertEqual(makesite.rfc_2822_format('2018-06-16'), + 'Sat, 16 Jun 2018 00:00:00 +0000') diff --git a/test/test_truncate.py b/test/test_truncate.py new file mode 100644 index 0000000..3486d71 --- /dev/null +++ b/test/test_truncate.py @@ -0,0 +1,9 @@ +import unittest +import makesite + + +class TruncateTest(unittest.TestCase): + def test_truncate(self): + long_text = ' \n'.join('word' + str(i) for i in range(50)) + expected_text = ' '.join('word' + str(i) for i in range(25)) + self.assertEqual(makesite.truncate(long_text), expected_text)