• Ha chevron_right

      Une Flask de Django

      motius · pubsub.gugod.fr / hashtagueule · Sunday, 24 September, 2017 - 22:00 · 17 minutes

    Bonjour à tous ! Pour ceux qui ont déjà fait du développement web avec Django le titre est évident, pour les autres, bienvenue sur mon introduction à Django ! Django est un excellent framework Python qui permet de développer rapidement des applications web, et qui est très complet. Il est plus long ...

    Bonjour à tous !

    Pour ceux qui ont déjà fait du développement web avec Django le titre est évident, pour les autres, bienvenue sur mon introduction à Django !

    Django est un excellent framework Python qui permet de développer rapidement des applications web, et qui est très complet. Il est plus long à prendre en main que Flask, un autre microframework Python que je vais utiliser comme exemple afin d'introduire quelques concepts de Django, et de montrer que ces idées bizarres ne sortent pas de nulle part.

    Parés ? C'est parti !

    Prérequis

    Ce tutoriel va référencer des tags du dépôt git à cette adresse. Je vous conseille aussi cet excellent tutoriel qui pourra compléter ce que j'écris ci-dessous. Enfin, la documentation de Django est complète et facile à utiliser.

    Je vous conseille donc de cloner le dépôt ci-dessus :

    git clone https://git.hashtagueule.fr/motius/django-tutorial.git

    et de suivre les tags que j'ai indiqués au fur et à mesure de l'avancement du tutoriel grâce à la commande :

    git checkout <tagname>

    Je préfixe les noms de tous les tags git de ce tutoriel par un "_", afin que ceux-ci ne polluent pas le projet si vous en réutilisez le dépôt git par la suite (git tag admet l'option -d pour ceux qui veulent vraiment se débarasser de mes tags).

    La quasi-totalité de ce tutoriel n'impose pas d'accès root sur le système de développement, je suppose tout de même que vous avez python3 et pip3 d'installés, un accès au réseau pour les packages Python supplémentaires, ainsi que le gestionnaire de versions de code git.

    J'utilise une debian GNU/Linux 9.1 Stretch pour le développement, mais ce tutoriel doit facilement être adaptable à d'autres distributions.

    Commençons en douceur avec Flask.

    Flask, en deux mots

    Je vais me faire battre, je vais parler de Flask alors que je l'ai utilisé en tout et pour tout 7 minutes 24 secondes dans ma courte vie.

    Installation

    Prenons l'exemple le plus basique avec Flask. La documentation du projet se trouve ici.

    Elle indique qu'il suffit de taper la commande suivante pour installer Flask :

    pip3 install --user Flask

    Le projet fil d'ariane

    Si vous avez suivi l'étape précédente, vous savez qu'il faut revenir à la version du tag "_v0_flask" comme ceci :

    git checkout _v0_flask

    pour cette partie du tutoriel. Vous pouvez alors faire tourner le serveur de test à l'aide de la commande :

    make

    Je vais faire une utilisation intensive des Makefiles, que j'affectionne, mais je vous encourage à les parcourir pour voir ce qu'ils exécutent.

    Ici, la commande est simplement :

    python3 ma_flasque.py

    Vous pouvez alors vous rendre à l'url suivante : http://localhost:5000 dans mon cas.

    Le pourquoi du comment

    La partie intéressante que je voulais mettre en avant avec cet exemple concerne la structure du code Flask : j'ai divisé le source en trois parties, les imports, les routes Flask, et le code pour faire tourner l'application. La deuxième partie concernant les routes et le code métier est celle qui nous intéresse.

    Les routes sont indiquées par un :

    @app.route('/', methods=["GET"])

    tandis que le code à exécuter dans le cas où l'utilisateur demande ('GET') la page par défaut de l'application ('/') se situe dans le code de la fonction Python index, qui dans notre cas retourne la chaîne de caractères "Hello World!" (tradition oblige) :

    def index():
        return "Hello World!"

    Ainsi, Flask pose les bases de la programmation avec le motif MVC, que Django utilise : on décrit de manière séparée le code de routage des URL et le code permettant d'obtenir le résultat demandé.

    Django utilisera des fichiers séparés pour le routage (Vues) et pour les fonctions Python du Contrôleur, mais le principe est le même.

    Il va falloir un peu de travail pour arriver au même résultat avec Django, mais n'aillez pas peur, on y arrivera. L'essentiel est de garder les yeux sur l'objectif : avoir une séparation entre le code de routage et le code métier.

    Django va un peu plus loin car il permet de s'interfacer très facilement avec une base de données et en propose une abstraction très propre, il possède un moteur de template pour prémâcher du HTML, permet d'installer des modules, mais tout ça viendra plus tard, je vous mets l'eau à la bouche...

    gâteau au chocolat

    Un gâteau au chocolat pour vous mettre l'eau à la bouche si ma description des fonctionnalités de Django n'a pas suffi.

    Même résultat avec Django

    Installation

    La page de téléchargement de Django indique, à l'heure actuelle, qu'il suffit de taper la commande suivante pour installer la dernière version de Django :

    pip3 install Django==1.11.5

    Si vous utilisez Django de manière professionnelle ou amateure, il faut consulter la page de téléchargement pour mettre à jour la version de Django utilisée.

    Vous pouvez aussi installer la version de votre distribution, par exemple à l'aide de

    su -c 'apt-get install python3-django'

    si vous utilisez une debian ou dérivée (Ubuntu, Mint...)

    On utilisera Django dans un virtualenv Python pour ce projet.

    Virtualenv

    Python est un langage de programmation modulaire dont le cœur des fonctionnalités est assez réduit, mais qui reste très puissant grâce au grand écosystème disponible de bibliothèques logicielles, officielles ou tierces.

    Celles-ci peuvent être importées dans un script par une primitive import du type :

    import os, sys
    import re
    import numpy as np
    from django.http import HttpResponse

    etc.

    Les virtualenv Python servent à gérer pour chaque projet ses dépendances exactes, à l'inclusion des numéros de version des bibliothèques utilisées, et ce sans interférer avec d'autres projets.

    On utilisera donc les virtualenv pour des questions de facilité, et parce qu'ils permettent de s'assurer de la pérennité d'un développement.

    Vous pouvez installer virtualenv à l'aide de la commande :

    sudo apt-get install python3-virtualenv

    ou en tapant :

    pip3 install --user virtualenv

    Premier projet Django dans un Virtualenv

    La version "_v1_django" permet d'installer Django dans un virtualenv Python. Si vous avez installé Django et Virtualenv comme indiqué précédemment, l'installation devrait se faire sans retélécharger des bibliothèques Python depuis internet.

    Elle suppose que vous installez toutes les bibliothèques avec pip, si ce n'était pas le cas, il faut éventuellement changer la variable VENV du Makefile, ou installer une version avec pip3.

    Pour installer le virtualenv, Django, créer un projet et une application, tapez simplement la commande :

    make

    Pour l'arrêter, tapez la combinaison de touches CTRL-C.

    Détaillons les étapes du Makefile :

    • création du répertoire d'installation de l'environnement de développement, représenté par la variable INSTALL_DIR dans le Makefile ;
    • création du virtualenv Python dans l'environnement de développement ;
    • mise à jour de pip3 dans l'environnement de développement ;
    • installation de Django ;
    • création du projet, dont le nom est représenté par la variable PROJECT_NAME ;
    • création de l'application APP_NAME.

    Vous remarquerez que chacune des étapes ne modifie que le répertoire d'installation situé à l'intérieur du répertoire git, jamais des bibliothèques système.

    Utilisation de Django

    Jusqu'ici, on n'a toujours pas écrit de code correspondant à notre application, seulement décrit une manière générale d'obtenir un projet Django d'équerre pour commencer. Il reste quelques étapes à connaître pour avancer dans le développement d'applications web avec Django sans que celui-ci se mette en travers de notre chemin.

    Migrations

    Lors de la création d'un projet Django, certaines applications sont installées pour nous, par exemple l'interface d'administration. Celle-ci n'est pas migrée, opération qu'il faut réaliser pour pouvoir l'utiliser.

    On a par ailleurs créé notre propre application, qui n'est pas non plus migrée.

    Il est nécessaire d'effectuer les migrations des applications, car celles-ci peuvent entraîner une modification du modèle en base de données.

    Obtenez le code de la version _v2_migration du projet git pour pouvoir migrer les applications du projet, et lancer le serveur Django de développement.

    La commande :

    make

    permet d'effectuer toutes les étapes décrites jusqu'ici :

    • installation de virtualenv, mise à jour de pip3, installation de django, etc. ;
    • création d'un projet django ;
    • création d'une application django ;
    • migrations du projet et de l'application ;
    • lancement du serveur de développement.

    Rendez-vous  à l'URL suivante pour la page par défaut de Django : http://localhost:8000

    Organisation du dépôt

    Le dépôt est organisé de la manière suivante :

    .
    +-- doc
    │   \-- README.md
    +-- exec\_django.sh
    +-- LICENSE
    +-- Makefile
    +-- mon\_django
    │   +-- Makefile
    │   +-- mon\_app
    │   \-- mon\_django
    +-- README.md
    \-- sandbox
        +-- bin
        +-- db.sqlite3
        +-- include
        +-- lib
        +-- Makefile -> ../mon\_django/Makefile
        +-- manage.py
        +-- mon\_app -> ../mon\_django/mon\_app
        +-- mon\_django -> ../mon\_django/mon\_django
        +-- pip-selfcheck.json
        +-- static
        \-- templates -> ../mon\_django/templates
    • les sources sont dans le répertoire mon_django (nom du projet) ;
    • la production est dans le répertoire sandbox ;
    • les sources ont des liens sympboliques vers la production ;
    • à la racine du projet se retrouvent éventuellement :
      • la documentation ;
      • la licence ;
      • les tests (unitaires, intégration).

    Cette organisation a pour but de simplifier le développement :

    • le Makefile (et les scripts qu'il appelle) permet de construire et reconstruire le projet à l'aide d'une seule commande ;
    • à chaque enregistrement d'une modification d'un fichier source sur disque, le serveur de développement Django redémarre avec la mise à jour, grâce aux liens symboliques vers les sources ;
    • la production est séparée des sources ;
    • le dépôt git peut être organisé en suivant les bonnes pratiques de développement Python :
      • disposition de la documentation ;
      • disposition des tests unitaires et intégration...

    Comparaison Django et Flask

    Ça y est, on a enfin tout un environnement prêt pour le développement. Vous allez me dire "était-ce bien la peine de faire tout ça pour en arriver au même point ?" Je crois que oui.

    Avantages de Django

    Pour plusieurs raisons :

    • le code de Django est plus organisé que celui de Flask, ce qui procure un avantage sur le long terme :
      • les vues et le contrôleur sont séparés ;
      • Django incite à faire du développement de petites applications réutilisables au sein de plusieurs projets
    • Django va permettre de s'interfacer facilement avec une base de données, ce qui fait qu'on a en fait de l'avance par rapport au cas où l'on serait restés avec Flask
    • j'ai mis en place un système de construction avec les Makefiles qui permet de tester son application à l'aide d'une seule commande, comme pour Flask.

    Je ne détaille pas les inconvénients de Django, il y en a un principal selon moi, la relative difficulté de le mettre en place, ce qui est fait par le système de construction logicielle avec Makefile.

    Comprendre le code de Django en comparaison avec celui de Flask

    Django fonctionne fondamentalement de la même manière que Flask pour le routage, mais il sépare les vues et le contrôleur :

    • on utilise généralement le fichier urls.py pour décrire la liste des urls proposées par une applications :
      • ces URL ne doivent pas se chevaucher, autrement une seule des URL serait prise en compte (la première rencontrée par Django) ;
      • la liste des URL de tous les fichiers urls.py de toutes les applications constitue l'API backend offerte par votre projet Django ;
    • on utilise le fichier views.py pour le code métier qui va recevoir les requêtes GET/POST HTTP ;
    • on peut éventuellement créer d'autres modules Python pour du code spécifique ;
    • on utilise le fichier models.py pour décrire les modèles des données de l'application, tels que ces données seront sauvegardées en base de données.

    Le développement avec Django

    Maintenant que vous avez vu l'installation de Django en virtualenv Python, ainsi que la théorie sur la manière dont il faut organiser le code Python, allons voir quelques exemples simples.

    Hello World!

    Obtenez la version _v3_application du dépôt. Elle contient un simple "Hello World!" si le client demande la page http://localhost:8000/, et une simple indication "Not found" pour toutes les autres pages. Comme pour chanque étape de ce tutoriel, la commande :

    make

    permet de faire le café (enfin presque). Par rapport à l'étape précédente, on dispose désormais d'une application Django dont le code Python est importé.

    café au lait

    Le café au lait que mon ordinateur ne sait toujours pas faire... Ça viendra.

    En lisant le code,on s'aperçoit que son organisation est similaire à celle de Flask : d'un côté on route les urls, on utilise un ou plusieurs fichiers urls.py pour ce faire, et dans les vues du fichier views.py de chaque application du projet, on peut écrire le code à exécuter pour chaque requête.

    urlpatterns = [
        url('^$', views.index),
        url(r'^admin/', admin.site.urls),
        url('^.*', appviews.p404),
    ]

    Le routage des URL du projet (et de chacune des applications) est défini à l'aide de regexPython. Je fait correspondre les URL suivantes :

    • http://localhost:8000/
    • http://localhost:8000

    au code ci-dessous :

    def index(request):
        return HttpResponse("Hello World!")

    à l'aide de la première règle de routage.

    La page suivante de la documentation permet une utilisation avancée des URL de routage de l'application. On peut par exemple utiliser un champ de l'URL comme paramètre.

    Je ne vous ai pas promis la lune mais presque, allons plus loin dans les fonctionnalités qui sont un des grands avantages de Django.

    Mon premier gabarit

    La version _v4_template permet d'utiliser les templates de Django. Je n'en fait qu'un usage très limité, je me limite à indiquer à Django où il doit aller chercher les fichiers de template correspondant au code HTML/CSS/JavaScript, servis par le serveur de développement, mais ce moteur de gabarits possède de nombreuses fonctionnalités, comme les variables, les tags, des boucles, des conditions...

    La page accessible à l'URL par défaut http://localhost:8000/ affiche le code du template index.html :

    def index(request):
        return render(request, "index.html", {})

    J'ai rajouté de manière explicite un paramètre optionnel : le dictionnaire vide {}. Il sert à préciser des variables Python à transmettre au moteur de gabarits.

    Toutes les autres requêtes redirigent vers la page 404.

    Un accès à la base de données

    Une grande quantité d'applications web nécessite une base de données. Django propose un moyen simple pour s'interfacer avec une base de données sans nécessairement en connaître les subtilités, fournit des garanties qui permettent éventuellement de changer de moteur de base de données, et permet au développeur de manipuler les objets en base facilement.

    La version _v5_bdd présente un exemple simple d'utilisation d'une base de données. Les URL suivantes sont valides :

    • http://localhost:8000/create/ : crée un objet en base de données ;
    • http://localhost:8000/delete/ : supprime tous les objets ;
    • http://localhost:8000/get_nb_objects/ : affiche le nombre d'objets en base de données.

    Attention, celles-ci ne le sont pas, il manque un / à la fin :

    • http://localhost:8000/create ;
    • http://localhost:8000/delete ;
    • http://localhost:8000/get_nb_objects.

    Si vous vous demandez pourquoi l'exemple marche bien que tous les objets aient le même nom et la même valeur de booléen, c'est parce qu'ils se voient attribuer un identifiant entier automatique croissant si on ne définit pas d'attribut ayant une clef primaire, cf. la documentation.

    Découpage en modules

    Vous remarquerez l'utilisation de la primitive Django include dans le code, par rapport à la version _v4_template, qui permet de découper le routage vers les URL d'une application.

    Utilisation d'un constructeur personnalisé

    Django utilise la fonction __init__ qui sert à construire des objets Python. La documentation explique comment attacher un constructeur aux objets sérialisés en base de données, plutôt que de recourir à une méthode build comme je m'y suis pris dans l'exemple _v5_bdd. L'exemple se trouve dans le code de la version  _v6_constructeur.

    Pour aller plus loin

    Je ferai peut-être une suite à ce tutoriel Django. Dans tous les cas, sachez que le point auquel nous sommes arrivés n'est pas suffisant ! En effet, on utilise toujours le serveur de développement de Django, qui n'est pas fait pour être utilisé en production, entre autres :

    "(notre métier est le développement d’environnements Web, pas de serveurs Web)."

    Mise en production

    D'autres éléments sont à considérer durant et après la phase de développement :

    • la mise en place d'un mécanisme de journalisation de l'application ;
    • la mise en place d'un chien de garde permettant de s'assurer que le serveur (nginx, apache, ou autre) sert toujours l'application que vous avez écrite ;
    • la mise en place d'une sauvegarde des données en base...

    Il s'agit d'un travail d'administration système indispensable. À ce travail s'ajoute éventuellement celui de développer une interface web ou autres, si besoin est.

    Modules

    Je n'ai pas parlé des modules de Django. Dans la version _v4_bdd, on utilise la fonction Django render, qui permet de retourner une chaîne de caractères en temps que réponse HTTP. Cela diffère de Flask, qui permet de simplement retourner une chaîne de caractères. L'explication tient au fait que Django utilise l'objet request pour le passer aux modules Django, dans la fonction render.

    Si vous êtes intéressés par le sujet, je vous conseille cette page, qui décrit les interactions possibles sur une requête, ainsi que la base de leur fonctionnement.

    Réutilisation

    Voilà un bon début de projet Django. Pour le réutiliser, n'oubliez pas :

    • de changer la clef API située dans le fichier mon_django/settings.py ;
    • de respecter la licence GPLv3.

    Vous pouvez également créer un répertoire git de zéro à partir d'un des tags du dépôt exemple. Pour cela, obtenez les sources du dépôt au tag que vous souhaitez :

    git checkout <tagname>

    Puis supprimez le dépôt git sans toucher au fichiers existant en enlevant l'arborescence sous le répertoire .git :

    rm -rf ./.git

    Enfin, créez un nouveau dépôt :

    git init

    Vous pouvez aussi garder le dépôt git en l'état, le script del_tags.sh permet de supprimer les tags commençant par "_".

    Conclusion

    Mon but ici n'est pas de prétendre que Django est meilleur que Flask, comme je l'ai indiqué au début de ce tutoriel, j'ai très peu touché à Flask. Flask est un prétexte pour moi pour montrer un des différents aspects de Django (le routage des requêtes). Par ailleurs, en lisant un peu sur le sujet, on s'aperçoit que beaucoup de modules peuvent être utilisés pour donner à Flask des capacités similaires à celles qui viennent avec Django, par exemple :

    • une interface d'administration ;
    • un module ORM pour s'interfacer avec une base de données...

    Il y a donc des arguments en faveur de Flask par rapport à Django, par exemple :

    • le code de Flask est composé de moins de lignes de code  ;
    • on peut choisir ce dont on a réellement besoin parmi des fonctionnalités offertes par la bibliothèque qu'on utilise...

    Django, a de son côté :

    • l'organisation générale d'un projet web :
      • Django encourage à structurer son code ;
      • Django suggère la division du code en applications ;
      • il permet aux développeurs de travailler sur des applications différentes, ce qui facilite la collaboration ;
    • il vient avec un moteur de templates ;
    • il vient avec un ORM...

    Cette comparaison n'est évidemment pas exhaustive, mais permet de se rendre compte des convergences et divergences de philosophie de ses deux projets.

    Vous voilà parés pour démarrer ! J'espère que ce tutoriel vous a été utile. Pour ma part, je trouve que Django est très sympathique à utiliser, sa documentation est facile à prendre en main pour un usage débutant, même si elle est touffue. Enfin sachez que raspbeguy et moi-même avons quelques projets web (parmi lesquels clickstart, et Hashtagueule Express) qui utiliseront peut-être cette technologie.

    Bonne journée et bon développement Python/Django !

    Motius

    PS : après avoir commencé cet article, je suis tombé sur celui-ci, en anglais. Je tiens à le mentionner car la majorité des articles Flask vs Django sont théoriques (souvent des descriptions fonctionnelles, assez intéressantes pour se familiariser rapidement avec les deux projets), mais je n'avais pas vu (ni vraiment cherché) d'article les comparant en mettant la main dans le code.

    • Ha chevron_right

      Less is more, partie 2 : les contenus multimédia

      raspbeguy · pubsub.gugod.fr / hashtagueule · Friday, 22 September, 2017 - 22:00 · 7 minutes

    Je me relance dans cette série d'articles que j'ai trop souvent tendance à oublier alors qu'au final, j'ai passé (et j'en passe toujours) une énorme partie de mon temps à améliorer mon environnement visuel. Pour rappel, dans cette série d'articles, j'essaye d'expliquer comment se passer le plus poss...

    Je me relance dans cette série d'articles que j'ai trop souvent tendance à oublier alors qu'au final, j'ai passé (et j'en passe toujours) une énorme partie de mon temps à améliorer mon environnement visuel. Pour rappel, dans cette série d'articles, j'essaye d'expliquer comment se passer le plus possibles d'environnement graphique et les bienfaits de la simplicité pure d'un bon vieux terminal. Ça peut même être joli, faites-moi confiance.

    Aujourd'hui je vais me concentrer sur les outils de lecture et de gestion de contenus multimédias : images, films, et surtout musique, ce dernier média étant celui que je bichonne le plus avec une bibliothèque de plusieurs mois de longueurs cumulées et presque 500 Go de taille. Ça commence à faire gros et automatiser la gestion d'un machin pareil devient assez nécessaire.

    D'aucuns pourraient se dire que visionner du contenu multimédia sur un poste qui veut se passer d'environnement graphique, c'est un peu contradictoire. Mais rassurez-vous, il n'en est rien, c'est tout à fait possible, et même conseillé dans certains cas (histoire de réserver de la ressource pour lire le média lui-même et non pour gérer un ensemble d'effets de fenêtres débile qui fait prout quand on les ferme). Je vais donc vous exposer des outils KISS, faisant le travail demandé, ni plus, ni moins.

    Images

    Pour ouvrir des images, feh fait très bien le travail. Ça ouvre les jpg, png, gif, et bien d'autres, en fait tous les formats supportés par Imlib2. Il suffit de l'invoquer de la sorte :

    feh rem\_is\_best\_waifu.png

    À l'aide d'ImageMagick, ça peut même convertir d'autres formats afin de les ouvrir, par exemple le svg. Il suffit de donner une valeur de timeout à ImageMagick :

    feh --magick-timeout 5 logo\_hashtagueule.svg

    Astuce, si vous avez des images de grande dimension et que vous souhaitez adapter automatiquement la taille à la fenêtre de feh, ajoutez l'option suivante :

    feh -. playboy\_special\_tshirt\_mouille.jpg

    On peut même s'en servir pour le fond d'écran :

    feh --bg-scale windowsXP\_wallpaper.jpg

    Cette commande va créer par la même occasion un petit script ~/.fehbg afin de faciliter l'instauration du fond d'écran. Il suffira donc de dire à X11 ou à votre gestionnaire de fenêtre préféré de lancer ce script à chaque début de session (pour i3 on avait vu que ça se faisait avec la directive exec).

    Enfin, sachez que feh peut également ouvrir des images distantes via HTTP.

    Vidéos

    La plupart des gens, si on leur dit "vidéo sur linux", ils répondront à la microseconde et le plus fort possible "VLC!!!". Sachez qu'il n'y a pas que VLC dans la vie, mes enfants. Mon avis est que, même si VLC c'est très bien pour amener de l'open-source en terrain ennemi (ça tourne partout, y compris Windows et Mac), ça a une interface intuitive (c'est du QT, portable sur toutes les plateformes) et relativement facile à mettre en œuvre grâce à là nucléarité de ses fichiers d’exploitation (La plupart des bibliothèques utilisées par VLC sont des bibliothèques maison, et il y en a très peu), ben ces avantages apparents sont en partie des inconvénients pour les utilisateurs avancés. L'interface agréable, la belle affaire quand on veut se passer d'environnement graphique. La nucléarité de VLC également est un problème : ce sont des bibliothèques que seul VLC utilise ; résultat, personne n'y comprends plus rien et ça fait doublon avec d'autres bibliothèques plus communes et à mon sens plus propre.

    Bref, pour toutes ces raisons j'ai renoncé à VLC. Quand on y réfléchit, les raisons sont presque les même que les arguments contre GNOME.

    À la place, j'utilise mpv, qui a vraiment une interface minimale (et par conséquent élégante), et qui est plus léger que VLC, et ça se voit quand on lis des vidéos sur des machines pas super récentes.

    mpv a un système de raccourcis clavier hautement configurable et possède les même fonctionnalités que VLC. Il possède également un mécanisme d'accélération graphique.

    Bon, vu que je m'y connais pas vraiment côté vidéo, je vous laisse avec une capture d'écran.

    Rem is Best Waifu Rem is best waifu

    Musique

    Bon, là c'est du sérieux. Je ne gère pas de photothèque, et mes bibliothèques de films et de séries ne nécessitent pas beaucoup d'effort pour rester rangé. Mais la musique c'est une autre paire de manche.

    Gestionnaire de musique

    Pour ranger ma musique, jusqu'il n'y a pas si longtemps, j'utilisais l'utilitaire graphique Ex Falso, livré avec le lecteur de musique Quod Libet. Ces deux programmes sont très bons, c'est ceux que j'utilisait quand j'étais encore sous Cinnamon. Ex Falso est très puissant et permettait de faire des opérations sur des fichiers audio : modification des tags manuellement, par nom de fichier, ou encore et surtout l'opération inverse, à savoir changer l'emplacement et le nom de fichier en fonction des tags. L'ennui c'est que c'est du GTK, et pas d'interface en ligne de commande donc pas scriptable du tout.

    Je me suis finalement mis à beets, un outil full CLI destiné à maintenir une bibliothèque de musique rigoureusement organisée, que j'exécute directement sur le NAS. Beets peut à peu près tout faire et répond à toutes les demandes, pour peu qu'on passe du temps à comprendre toutes ses options. Et Dieu sait qu'il y en a beaucoup.

    Beets intègre un autotaggeur, c'est à dire que par défaut, il va chercher les tags des nouveaux fichiers. Sachant qu'en général les fichiers que j'importe sont déjà correctement taggés, j'ai choisi de désactiver cette fonctionnalité (et j'ai trop peur de ce qui arriverai si beets se plantait). Par contre, je l'utilise pour qu'il intègre mes nouveaux fichiers dans l'arborescence correcte. Je tiens à ce que ma bibliothèque soit rangé ainsi (pour faire simple) : racine/artiste/album/numdisque_numpiste-titre.flac

    Voici mon fichier de configuration (il est ridiculement petit et n'exploite qu'un fragment des possibilités de beets) :

    directory: /mnt/data/multimedia/Musique
    
    import:
        copy: yes
        #incremental: yes
        log: ~/.config/beets/beets.log
        autotag: no
    
    paths:
        default: %if{$albumartist,$albumartist,%if{$artist,%artist,unknown}}/%if{$album,$album,unknown}/%if{$disc,$disc-}%if{$track,$track - }$title

    Maintenant, quand je veux importer de nouveaux fichiers, il me suffit d'invoquer beets de la sorte :

    beet import /chemin/vers/dossier/contenant/nouveaux/morceaux

    Et paf, ça fait le taf. Bon je vous laisse lire la signification des instructions sur la (très bonne) documentation de beets. Vous allez vous en sortir, je crois en vous.

    Lecteur de musique

    C'est là que le bât blesse. En fait je n'ai pas encore trouvé le lecteur qui couvre exactement % de mes besoins. Je suis partagé entre deux programmes, qui ont chacun des avantages.

    MPD

    Mon rêve c'est de ne pouvoir tourner qu'avec MPD. Je vous en ai déjà parlé sur l'article Un jukebox à partir d'un Raspberry Pi en vous disant que ça déchire, et c'est effectivement le cas. Ça ne consomme quasiment aucune ressource, ça peut lire plein de formats, ça se contrôle avec un protocole simple (même avec MPRIS2, le protocole universel de contrôle de lecteur multimédia sur Linux, grâce à l'outil mpDris2) et ça vous fout la paix. Le problème, c'est que tous les clients MPD en ligne de commande que j'ai trouvé ont à mon sens une interface peu ergonomique. Le meilleur candidat étant ncmpcpp (déjà il à un nom à coucher dehors), l'ergonomie de son interface (pourtant en très joli ncurse, et vous savez à quel point j'aime ncurse) ne m'a pas emballé. Naviguer dans sa bibliothèque est assez douloureux, la répartition des différentes vues du programme sont pour le moins folkloriques, les raccourcis clavier par défaut sont assez déroutant... Dommage.

    cmus

    On parlait d'interface, et cmus en a une très réussie et intelligemment pensée. Les utilisateurs de lecteurs de musique graphiques comme Rhythmbox, Quod Libet ou encore iTunes s'y retrouveront assez facilement. Et depuis la version 2.8, encore au stade de release candidate, on peut également le contrôler nativement par MPRIS2. Le problème est qu'il s'agit uniquement d'un lecteur local, pas prévu pour être contrôlé depuis une autre machine que celle sur laquelle il est exécuté (ou alors on le contrôle depuis une session tmux sur la machine distante, mais c'est sale, et de toute façon, on perd les avantages de MPD mentionnés). Là encore, c'est dommage.

    mcmpcpp à gauche, cmus à droite. Et pour rajouter du kikoolol, l'utilitaire cava en bas.

    L'idéal pour moi serait donc un cmus qui contrôlerait MPD, mais à en croire la réponse à une feature request, c'est loin d'être à l'ordre du jour hélas.

    Je me suis donc résolu à utiliser MPD pour le seul usage sur mon installation audio dédiée, et cmus quand j'ai besoin de travailler avec des écouteurs, au boulot comme à la maison.

    N'hésitez pas à me dire votre avis, notamment si vous avez un client MPD préféré, et nous dire qui est votre waifu. Rem c'est la mienne alors pas touche.

    • Ha chevron_right

      Mon nouveau projet d'ampleur

      raspbeguy · pubsub.gugod.fr / hashtagueule · Saturday, 16 September, 2017 - 22:00 · 7 minutes

    Une fois n'est pas coutume, je vais exceptionnellement faire mon Korben et je vais faire de la pub à mes propres projets. Parce qu'on est jamais aussi bien servi que par soi-même. Je vous présente Clickstart. Enfin, ce qui sera Clickstart. Il s'agit d'une idée qui me trotte derrière la tête depuis p...

    Une fois n'est pas coutume, je vais exceptionnellement faire mon Korben et je vais faire de la pub à mes propres projets. Parce qu'on est jamais aussi bien servi que par soi-même.

    Je vous présente Clickstart. Enfin, ce qui sera Clickstart. Il s'agit d'une idée qui me trotte derrière la tête depuis plus d'un an maintenant. J'ai pris conscience que l'extension de domaine .ART était enfin sorti de sa période landrush et que tout le monde pouvait à présent en acheter un domaine sans être obligé d’hypothéquer un de ses reins. J'ai donc acquis le domaine, ce qui a mentalement déclenché la processus de production.

    Clickstart, c'est une plateforme visant à créer une communauté d'artistes débutant et/ou en manque de moyens de gagner de la popularité, dans laquelle chacun sera libre de partager son travail et de faire son trou comme il peut. Aucune censure n'y sera mise en place (mis à part sur le contenu prohibé par la loi, tel le contenu pédopornographique) avec création de filtres pour ne pas heurter les utilisateurs les plus sensibles. Tous les arts sont concernés, pour peu qu'il ait un support : Musique, livres, cinéma, jeux-vidéos, dessin, photo... De nouvelles catégories pourront être créées au besoin.

    Voici une liste des fonctionnalités qui seront au rendez-vous, à plus ou moins grande échéance :

    Dès le jour de sortie :

    • Pages personnelles avec description, mise en avant des travaux préférés par le publique ou par l'artiste, diverses infos, liens externe, et cætera.
    • Comptes d'utilisateurs non-artistes.
    • Groupes de travail, permettant à plusieurs artistes de collaborer et présenter leur travail sur un pied d'égalité.
    • Liens de téléchargements, dans un premier temps sur des serveurs externes.
    • Travaux classés par type d'art (catégories) et par style artistique (étiquettes).
    • Commentaires de la communauté sur les œuvres et sur la page des artistes/groupes.
    • Flux de nouvelles (RSS/Atom) propres à un artiste/groupe/catégorie/étiquettes.

    À long terme :

    • Mise à disposition d'un espace d'hébergement pour les œuvres.
    • Page entièrement personnalisable pour les artistes (possibilité de créer ses propres CSS).
    • Création automatique de fichiers torrents pour proposer une alternative au téléchargement direct.
    • Création de galeries de favoris.

    Des questions ?

    C'est quoi ton argument face aux trucs qui existent déjà genre Bandcamp, Deviantart, Soundcloud, YouTube, etc ?

    Déjà, un peu de compétitivité n'a jamais fait de mal. Ensuite, ces plates-formes ont en commun de ne présenter qu'un unique type d'art. Et ne venez pas me dire que YouTube propose plusieurs types d'art : c'est peut être vrai, mais YouTube a clairement été conçu pour de la vidéo. Les morceaux de musiques qui y sont présents ne sont que des bandes sons de vidéos, en glorieux MP3 pourri (ou autre format avec pertes, je sais plus).

    Je pense qu'il est nécessaire qu'il existe un endroit où toutes les formes d'art puissent cohabiter, sachant que souvent des œuvres sont tout bonnement inclassable. Je souhaite également que la plateforme soit très à l'écoute de ses utilisateurs : Si quelque chose est impossible, on réfléchit et on trouve une solution.

    Il faut également savoir que l'intégralité du code source du site sera mis en licence libre. Bah oui, je reste un gentil du net quand même.

    D'autre part, il faut aussi prendre en compte le public visé par cette plateforme. C'est bel et bien les artistes tout frais qui seront visés. Le site sera pensé de telle sorte qu'il soit une aubaine pour tous ces nouveaux artistes et peu avantageux pour un artiste devenu populaire.

    Tu vas interdire aux gros artistes d'utiliser ta plateforme ? Même Johnny Hallyday ?

    Interdire, bien sûr que non, soyons sérieux. Sur quel critère ? Quelle limite de popularité pourrait-on se fixer ? De toute façon, je crois bien que c'est pas vraiment autorisé de refuser l'accès à quelqu'un pour de telles raisons, et c'est en plus contre toutes mes convictions. Non, absolument rien ne sera différent dans les conditions d'utilisation pour un Gérard Lagratte, plombier de métier se sentant l'âme d'un artiste, et un Johnny Hallyday ou une Lady Gaga. Toute l'astuce étant que dans ce dernier cas de figure, l'artiste n'a aucun intérêt à utiliser la plateforme (en tant qu'artiste entendons-nous bien). Pareil pour les artistes arrivés petits, mais devenant "trop" populaires : ils vont vite se sentir à l'étroit sur Clickstart et ils partiront d'eux même vers d'autres horizons. C'est pas que je veux qu'il partent, c'est juste comme ça, on ne peut offrir que ce qu'on a dans une certaine limite.

    Est-ce que les artistes pourront vendre leur œuvres sur Clickstart ?

    Absolument pas. Ce serait bien évidemment à la fois une tonne de paperasse et de contrôle fiscaux pour moi, et en opposition avec le fil rouge du site. Sur Clickstart, on gagne de la popularité et du respect de la communauté. Pas d'argent. Il existe des plate-formes très efficaces pour ça. Donc je te coupe tout de suite sur ta prochaine question : non il n'y aura pas de DRM. Autant je n'ai rien contre gagner de l'argent avec son art, ce qui est normal, autant les DRM, j'affirme haut et fort que c'est mal.

    Tu as assez de place sur tes disques pour héberger tout le contenu artistique des utilisateurs ?

    Ta question est bête, Antoinette, mais le sujet ne l'est pas, Roberta. Bien entendu que quand le site gagnera en popularité, si tout le monde dépose du contenu comme des gros porcs, je vais vite poser la clef sous la porte. Mon plan d'attaque est d'imposer des quotas, genre pas plus de 5 Go par utilisateur dans un premier temps. Il faudra que j'y réfléchisse. Ensuite, si la demande d'espace supplémentaire est forte et/ou y a vraiment plein d'utilisateurs (ce qui est une bonne chose hein), je vais devoir proposer des plans payants. Eh oui, l'espace disque, c'est pas gratuit malheureusement, si vous me croyez pas, allez lire mon tutoriel sur le RAID. Ça ne m'a jamais dérangé de mettre un peu de ma poche pour héberger des projets, mais là, ça fait un gros paquet de poches à retourner.

    Ce sera francophone ?

    Il s'agit d'un site international. Donc dans un premier temps, le site sera uniquement en anglais. Après, rien n'empêche les artistes de publier dans un autre langues, à eux de voir.

    Bon, c'est prévu pour quand la mise en ligne ?

    Pour l'instant je suis tout seul à travailler dessus. Ça dépendra du monde que j'arriverai à embrigader, mais je planche sur fin printemps 2018. Vous trouvez le temps long ? Ben alors venez m'aider ! Ça va finir par devenir un running-gag venant de moi de demander de l'aide sans arrêt. En tout cas, vu que j'aime bien le Python, le choix de la techno s'est arrêté sur Django. En plus Motius me l'a conseillé, et vous savez l'importance que j'accorde à son opinion. Y a plein de choses à faire, du dev et du design. Parce que j'ai envie que le look du site roxe du poney. Je veux un truc de ouf.

    Comment garder un œil sur l'avancée du développement ?

    Il est vrai que le syndrome Korben ça va bien 5 minutes, et je vais très peu reparler de Clickstart sur Hashtagueule. Donc vous savez où me trouver sur IRC. En plus, un canal IRC dédié a été ouvert, il s'agit de #clickstart sur freenode, ainsi qu'un salon Discord (pas taper s'il vous plaît, faut chercher le publique là où il est). Ces deux salons sont en anglais uniquement.

    Bon, ben j'ai à peu près tout dit. N'oubliez pas que vous pouvez participer à l'aventure. J'accepte également les petits mots d'encouragement, c'est bon de savoir son travail utile et désiré.

    EDIT : J'ai ouvert un blog de développement. Y a un RSS et tout ce qu'il faut.

    À la prochaine.

    • Ha chevron_right

      Ça va devenir RAID dans votre serveur

      raspbeguy · pubsub.gugod.fr / hashtagueule · Sunday, 20 August, 2017 - 22:00 · 13 minutes

    Récemment j'ai du intervenir sur ma tour parce que j'avais plus tellement de place. J'ai du vite acheter un autre disque dur pour y remédier. Ce qui me donne l'occasion de parler de cette belle technologie sur laquelle je m'étais promis de faire un petit tuto un de ces jours. En théorie RAID est l'a...

    Récemment j'ai du intervenir sur ma tour parce que j'avais plus tellement de place. J'ai du vite acheter un autre disque dur pour y remédier. Ce qui me donne l'occasion de parler de cette belle technologie sur laquelle je m'étais promis de faire un petit tuto un de ces jours.

    En théorie

    RAID est l'acronyme de Redundant Array of Independent Disks (Alignement redondant de disques indépendants), et comme son nom l'indique, il va permettre de regrouper plusieurs disques durs et d'y instaurer une politique de stockage pour faire de la redondance, de l’agrégation de taille, enfin ça répond à plein de besoins différents. En fait on ne devrait pas vraiment parler d'un seul RAID, mais bel et bien de la famille des RAIDs, car en effet il y a autant de RAIDs que de besoins différent.

    On va présenter les assemblages RAID les plus utilisés. Pour plus de détails, je vous conseille la page Wikipédia qui est très claire et qui contient des schémas très explicites.

    Dans la suite, on va beaucoup parler de bandes de stockage : il s'agit d'une quantité de stockage de valeur prédéfinie, qui correspond à une "section" contiguë du disque qui la contient. Dans ce modèle, lors de l'écriture sur le volume, une bande est d’abord remplie avant d'en entamer une suivante. Il s'agit en fait d'abstraire le stockage et de pouvoir mieux comprendre la répartition des données sur les différents disques.

    RAID 0

    Les bandes sont tout bonnement distribuées sur les disques, toujours dans le même ordre. On remplit donc une bande par disque, puis une fois qu'on a touché à tous les disques, on repart du premier disque et on recommence une couche de bandes. Tous les disques contiennent des données différentes. Ainsi, si vous avez n disques durs de capacité exploitable x, la capacité totale du montage sera nx.

    • Avantages : Ce montage permet d'utiliser le plus grand espace possible de votre assemblage. De plus, en moyenne, les accès disques parallèles seront plus rapide, pour peu que ces accès disques se fassent dans des bandes différentes et sur des disques différents.
    • Inconvénients : Il suffit de perdre un seul disque pour corrompre l'intégralité des données. Or, statistiquement, plus on a de disques, plus on a de chances d'en perdre.

    RAID 1

    Les bandes sont écrites à l’identique sur tous les disques. Tous les disques contiennent exactement les même données. Ainsi, si vous avez n disques durs de capacité exploitable x, la capacité totale du montage sera x.

    • Avantages : C'est le montage qui permet la plus grande sécurité des données faces aux pannes : tant qu'il vous reste un disque fonctionnel, vos données sont intactes et complètes. Les accès disques sont aussi nettement améliorés, avec une vitesse théorique multipliée par le nombre de disques dans le montage.
    • Inconvénients : Il est frustrant d'avoir beaucoup de disques durs pour avoir au final l'espace d'un seul disque. Évidemment les données sont très sûres mais quand même, faut pas pousser...

    RAID 5

    Les bandes sont réparties sur tous les disques sauf un, qui reçoit une bande de parité. La bande de parité est tout simplement une bande dont chaque bit est obtenu en appliquant le OU exclusif (XOR) à l'ensemble des bits correspondants dans les bandes alignées des autres disques. Cette bande de parité est attribuée à chaque disque alternativement au fil des couches de bandes remplies. Donc si un disque vient à tomber en panne, pour chaque couche de bande, si la bande du disque en panne est la bande de parité, alors les données de la couche sont intactes. Si la bande contient de la donnée, alors elle peut être recalculée à partir des autres couches de données et celle de parité. C'est du calcul logique, et c'est la force du XOR. Ainsi, si vous avez n disques durs de capacité exploitable x, la capacité totale du montage sera (n-1)x.

    • Avantages : Un bon compromis entre place exploitable et sécurité des données. On se donne le droit de perdre un disque dur dans la bataille. Pour retrouver l'usage des données, il suffit de remplacer le disque défaillant et les données sont reconstruites.
    • Inconvénients : Ça dépends des cas, mais un droit à un unique disque dur en panne, ça peu être peu. Pour certain ça peut être insuffisant.

    RAID 6

    Il s'agit d'une extension du RAID 5 dans laquelle on se permet de pouvoir perdre plus d'un disque. La solution étant d'attribuer plus de bandes de "parité" par couche, une par nombre de pannes maximum permises. Ici, j'utilise les guillemets car il ne s'agit plus vraiment de la parité simple de la logique de base, mais d'un truc chelou reposant sur un principe tout autre dont je ne pas trop vous parler parce que j'en ignore tout. Donc si vous avez n disques durs de capacité exploitable x, et si vous mettez en place k bandes de redondance par couche, la capacité totale du montage sera (n-k)x.

    • Avantages : On se sent un peu plus à l’abri des intempéries matérielles, au pris d'un peu de place de stockage.
    • Inconvénients : Le principe chelou dont je vous ai parlé, enfin dont je ne vous ai pas parlé pour être honnête, eh bien il est tellement chelou qu'il pète pas mal les performances. Et pour couronner le tout, la plupart des implémentations de ce type d'assemblage est bien moins stable que les autres.

    Il est également possible de combiner les RAIDs. Une combinaison fréquente est le RAID 10 (RAID 1 + RAID 0). Par exemple si on a 10 disques, on peu monter 2 RAID 1 de 5 disques chacun, puis assembler ces deux volumes en RAID 0. On a également aussi le RAID 50, combinaison dur RAID 5 et du RAID 0 selon le même principe.

    La gestion du RAID

    Je vous parlais de différentes implémentations du RAID. En fait, le RAID n'est pas un programme en tant que soi, juste un ensemble de spécifications. Du coup chacun y va de sa sauce : il existe des implémentations libres et propriétaires, logicielles et matérielles. Les solutions matérielles se basent sur du matériel dédié (un contrôleur RAID), le système d'exploitation n'a donc pas à s'occuper de ça et le plus souvent ces solutions marchent out of the box, sans avoir besoin de configurer quoi que ce soit. Mais elles ont l'immense inconvénient d'être propriétaire dans leur quasi-totalité, et pour le coup il n'existe aucun standard. Dans certains cas, si votre contrôleur RAID rend l'âme, il vous faudra acquérir exactement le même modèle de contrôleur, sinon, peu importe que vos disques soient tous intacts, plus rien ne pourra les lire, et vous serez alors en légitime position d'être fort contrarié. À mon humble avis, le principal argument des RAIDs matériel auparavant était les meilleures performances. Aujourd'hui cet avantage est de plus en plus obsolète, car désormais les machines sont bien plus puissantes qu'il y a 15 ans et les programmes de RAID ont été nettement optimisés et stabilisés. Cette différence de performance est aujourd'hui presque intangible.

    En pratique

    J'ai hérité par un ami d'une tour de bureau. Elle est bien cool car elle contient une grande baie de disques et pas mal de ports SATA (bien entendu, vous pouvez faire votre RAID avec des disques branchés en USB si vous le souhaitez). J'ai donc décidé d'en faire un NAS fait main.

    Choix des armes

    J'ai donc initialement acheté 3 disques de 3 To chacun (des Western Digital Red, gamme dédiée justement aux usage en RAID) et j'ai opté pour un RAID 5 logiciel. Et sur Linux, le programme de RAID par excellence est mdadm. J'ai décidé de garder branché le disque dur d'origine (500 Go) mais de ne pas l'intégrer au RAID, il sert uniquement de disque de démarrage. Notez que si j'avais voulu optimiser les performances, j'aurais pu troquer ce disque pour un petit SSD, mais bon, je suis déjà content comme ça.

    Par ailleurs, pour faire de la place dans la baie de disques, j'ai du déménager le disque de démarrage dans la baie frontale, celle destinée à accueillir les périphériques comme le lecteur optique.

    Le 4ème disque du RAID, on en parlera plus tard. Je l'ai acheté bien après.

    Pour ça j'ai utilisé un adaptateur 3,5 pouces vers 5,25 pouces bien pratique, qui m'a permis de fixer bien solidement le disque dur au lieu de le laisser se balader dans la tour.

    Partitionnement et formatage

    Du côté software, je me retrouve avec un disque sda de démarrage, et sdb, sdc et sdd des disques vierges prêts à être assemblés en RAID. Avant ça, j'ai besoin de les partitionner. J'utilise donc fdisk pour les trois disques à tour de rôle, je choisis une table de partitions GPT et j'y crée une unique partition de type "Linux RAID" (code 29 dans fdisk).

    Création de l'assemblage RAID

    C'est tout bête, ça tient en une seule ligne de commande :

    mdadm --create --verbose /dev/md0 --level=5 --raid-devices=3 /dev/sdb1 /dev/sdc1 /dev/sdd1

    Dans cette commande, j'indique que le nom du volume abstrait sera /dev/md0, que ce sera un RAID 5, qu'il comporte 3 disques et je lui précise les partitions que je veux utiliser.

    Pour suivre l'évolution de la création de l'assemblage, jetez un coup d'oeil au fichier /proc/mdstat. Ce fichier sera votre nouvel ami, c'est lui qu'il faudra consulter dès que vous ferez une opération qui touche au RAID.

    Puis j'ajoute l'assemblage à la configuration de mdadm pour que celui-ci me l'assemble au démarrage :

    mdadm --detail --scan >> /etc/mdadm.conf

    Puis il ne vous reste plus qu'à mettre votre système de fichier préféré sur le volume créé !

    mkfs.ext4 /dev/md0

    Pour que votre assemblage soit monté au démarrage, j'ajoute à mon /etc/fstab :

    /dev/md0 /mnt/data ext4 defaults 0 0

    Il ne faut pas confondre assemblage et montage, il s'agit de deux étapes lors de la connexion d'un RAID. On doit assembler un RAID afin qu'il soit reconnu comme un volume propre, puis on doit monter notre volume pour pouvoir lire et écrire dessus.

    Enfin on monte le volume :

    mkdir /mnt/data
    mount /mnt/data

    Ayé vous avez un RAID 5 qui fonctionne !

    Il est recommandé de procéder régulièrement à des reconstruction de RAID, opération qui va vérifier la cohérence de l'assemblage. Il s'agit d'une opération transparente mais qui dure plusieurs heures et qui va se traduire par une forte augmentation de l'activité des disques. Pour ça il vous faudra lancer un petit programme sans arguments, raid-check, à un intervalle raisonnable, disons, toutes les semaines. Choisissez un horaire de faible activité, comme la nuit du samedi au dimanche à 3h du matin. Pour ça, faites vous plaisir, entre la crontab et les timers de systemd, on manque pas de solutions.

    Ajout d'un nouveau disque à l'assemblage

    Mon RAID 5 était constitué de 3 disques de 3 To ce qui nous fait 6 To exploitables, si vous avez bien suivi. 6 To, c'est un grand espace, il m'a suffi pendant presque 2 ans... Puis j'ai eu besoin de plus de place. J'ai donc racheté un autre disque (même modèle, même taille) que j'ai fourré dans ma tour. Je vous avoue que sur le coup, j'étais encore puceau au niveau extension de RAID, j'ai donc flippé énormément et j'ai fait une sauvegarde de mes 6 To sur divers disques externes que j'ai pu trouver dans ma caverne. Je vous raconte pas comme c'était pénible...

    Petites observations à ce niveau :

    1. Remarquez que l'ordre des disques dans le nommage des périphériques physiques (sdX) et tout sauf fixe. En théorie, il faut être préparé à ce que vos disques changent de noms. Votre petit sdb chéri que vous avez bordé et vu s'endormir dans le creux douillet de son lit un soir peut très bien vous trahir et s'appeler sdc au petit matin dès le prochain redémarrage. Bon c'est un peu exagéré, mais une chose est sure, il ne faut jamais faire confiance au nommage des périphériques physiques (c'est pour ça entre autres qu'il faut privilégier la désignation par UUID dans la fstab).
    2. mdadm se fiche complètement du nommage de ses périphériques. Il utilise sa propre magie noire pour déterminer les membres d'un assemblages. En conclusion, ne vous tracassez pas pour retrouver le nom de vos disques de votre assemblage, mdadm, lui, s'y retrouvera toujours.

    Cependant, faites quand même gaffe lorsque vous allez ajoutez votre nouveau disque dur. Par exemple chez moi, le nouveau disque s'est vu nommé sdb, tandis que les autres s'étaient vu relégués en sdc, sdd et sde. Faut juste le savoir et traiter les disques pour ce qu'ils sont, et non pas des étiquettes à trois lettres.

    Tout ce que j'ai eu à faire, en définitive, a été de partitionner-formater mon nouveau disque ainsi que l'ont été ses aînés, puis j'ai lancé les deux commandes suivantes :

    mdadm --add /dev/md0 /dev/sdb1
    mdadm --grow --raid-devices=4 --backup-file=/root/grow\_md0.bak /dev/md0

    La première va juste indiquer à mdadm qu'on lui ajoute un disque, mais sans plus. C'est la deuxième commande qui va lancer l'opération de reconstruction (rééquilibrage de l'assemblage). Opération qui dure plusieurs heures, donc suivez son déroulement dans /proc/mdstat.

    Une fois que c'est terminé, il faut maintenant procéder à l'extension du système de fichier lui même. Et là vous priez pour avoir choisi un système de fichier pas trop stupide qui accepte ce genre d'opération. Rassurez-vous, ext4 le supporte très bien.

    Il le supporte même tellement bien que vous pouvez le faire directement à chaud, sans démonter votre volume. Pour ça, premièrement, si vous utilisez une connexion SSH, ouvrez une session tmux. Il serait bête qu'un incident réseau de rien du tout vienne corrombre tout votre système de fichire tout de même. Puis il vous faudra exécuter :

    resize2fs -p /dev/md0

    Il va vous mettre en garde et ronchonner un tantinet que votre disque est toujours monté, mais écoutez, il s'en remettra, dans la vie on fait pas toujours ce qu'on veut. Les minutes passent, vous vous rongez les ongles, vous prenez un café, vous videz un pot de glace, et normalement, si tout se passe bien, le système de fichier aura été étendu à tout l'espace disponible sur l'assemblage. Félicitations !

    Conclusion

    J'ai rencontré beaucoup de monde m'ayant dit qu'ils préféraient rester éloigner autant que possible de RAID parce que ça leur faisait peur. En réalité, il n'y a rien d'effrayant là dedans. mdadm est un outil ma foi fort bien codé et les années ont prouvé qu'il était fiable. Il ne faut pas avoir peur du RAID. Enfin un peu quand même, faut pas faire n'importe quoi.

    • Ha chevron_right

      Hashtagueule a deux ans (et quelques jours...)

      raspbeguy · pubsub.gugod.fr / hashtagueule · Friday, 18 August, 2017 - 22:00 · 2 minutes

    Ben voilà, j'ai activé le renouvellement automatique du paiement du nom de domaines chez notre registrar, résultat j'ai loupé le deuxième anniversaire du blog. Honteux je vous dis. Bon, on va passer la partie plan-plan de l'évènement. Gâteaux, confettis, tout ça. Passons d'emblée au bilan. Ah tiens,...

    Ben voilà, j'ai activé le renouvellement automatique du paiement du nom de domaines chez notre registrar, résultat j'ai loupé le deuxième anniversaire du blog. Honteux je vous dis.

    Bon, on va passer la partie plan-plan de l'évènement. Gâteaux, confettis, tout ça. Passons d'emblée au bilan.

    Ah tiens, c'est vrai qu'on avait déjà établi un plan l'année dernière, voyons si on a été bons.

    Premièrement, nous allons bien sûr continuer d’écrire.

    Bon ça, ça va. On a sûrement pas écrit autant qu'on aurait du mais bon, au moins on a tenu la barre.

    Nous aimerions également enrichir notre équipe de rédaction.

    Hum, ça coince de ce côté là. On est toujours deux à tenir le bar. Faut dire qu'avec mes piètres talents en communication, on s'est également un peu chamaillé avec d'autres personnes, tss, pour des broutilles. Enfin bon, ce qui ne vous tue pas vous rends plus fort, pas vrai ?

    On a essayé des trucs cela dit. Par exemple on est devenu partenaires avec Freemind Gentoo-nazis Alfra, un collectif qui de prime abord a un peu le même but que nous, à savoir sensibiliser les gens sur le libre, la neutralité du net et tout le toutim. Bon, ce collectif connaît à présent un petit vide d'activité en ce moment, mais bon, on lui souhaite un prompt rétablissement.

    En tout cas c'est l'occasion pour moi de renouveler mon appel à bonnes volontés, on vous offre la chance de devenir contributeur sur un projet sympa. N'hésitez pas à nous contacter.

    Nous avons aussi le projet de créer une partie dédiée au news rapides / partage de news.

    Alors ce serait quand même faux de dire qu'on a pas avancé. Disons qu'on a principalement avancé à la façon de Thomas Edison, à savoir qu'on a trouvé des manières ingénieuses de ne pas réussir un tel projet. Mais c'est pas tout, on a aussi un projet qui a l'air de tenir plus longtemps que les autres, en python, tenu par notre ami Motius à ses heures perdues. Moi j'y crois et je pense qu'il va aboutir un jour.


    Bon sinon, y a quand même des trucs qui se sont passés. Par exemple, maintenant j'ai un boulot, ce qui me permet de payer un serveur qui peut virtualiser, et donc pouvant jouir d'une administration plus flexible et agréable.

    Bon ben voilà, "Putain deux ans" comme dirait Chirac aux Guignols, avant que ça devienne une émission fade et pas drôle aux mains d'un patron un peu trop susceptible.

    Restez avec nous, restez gentils.

    • Ha chevron_right

      Quand Debian me gonfle : Stretch et OpenVPN

      raspbeguy · pubsub.gugod.fr / hashtagueule · Saturday, 1 July, 2017 - 22:00 · 5 minutes

    Comme vous le savez sûrement, la nouvelle version stable de Debian, nom de code Stretch, est sortie. Je vous conseille à tous de faire la mise à jour les yeux fermés, ça va bien se passer, aucun accrochage à déplorer, un simple apt dist-upgrade et c'est une affaire qui roule. ... Nan j'déconne. Enfi...

    Comme vous le savez sûrement, la nouvelle version stable de Debian, nom de code Stretch, est sortie. Je vous conseille à tous de faire la mise à jour les yeux fermés, ça va bien se passer, aucun accrochage à déplorer, un simple apt dist-upgrade et c'est une affaire qui roule.

    ...

    Nan j'déconne.

    Enfin je vous conseille quand même de faire la mise à jour bien entendu, pour des raisons évidentes de sécurité, prévoyez de le faire au moins à long terme. Parce que bon, la oldstable est toujours supportée à travers des mises à jour de sécurité, mais après y a plus rien, et votre serveur est livré à lui même et aux attaquants qui sauront profiter de failles non corrigées.

    Ce que je veux dire, c'est qu'en mettant à jour votre distribution, attendez-vous à des trucs qui vont péter sévère. Faites-ça quand vous n'avez rien d'autre à faire et quand un minimum de choses vitales sont attendues de votre serveur par vos utilisateurs. Va y avoir du vilain.

    Et hop c'est cassé

    Donc oui j'aime Debian, mais Debian me gonfle parfois. Notamment ce comportement très fâcheux que je viens de découvrir aujourd'hui même concernant OpenVPN.

    OpenVPN, j'en ai déjà parlé et je ne m'étendrai pas plus là dessus, est un outil permettant de construire des réseaux virtuels privés (VPN), utiles pour abstraire des réseaux entre des machines géographiquement distantes et/ou pour déporter son point de sortie pour "sembler" se connecter d'ailleurs. Il y a donc une machine qui crée le VPN, dite serveur ou tête de pont, et des machines qui s'y connectent à distance, dites clients.

    J'ai donc une tête de pont que j'ai récemment mis à jour sur Stretch. Tout se passa bien entendu parfaitement en apparence, et tout le monde il était beau. Je me retrouvai avec une jolie Debian Stretch toute mignonne dont le cœur et l'âme n'aurait en aucun cas pu être mis en doute par quiconque. Sauf que sous ses jupons, elle avait dissimulé des trucs moins fun. Et en conséquence, quelques jours après, je me rendis compte que mes clients OpenVPN ne se voyaient plus. Je ne mis pas longtemps à soupçonner la belle Stretch d'avoir des aveux à me faire.

    L'élément fautif : le service Systemd a changé bien en profondeur.  Sous Jessie, les fichiers nécessaires pour l'établissement du VPN (configurations, certificats, clefs...) se trouvaient alors modestement dans /etc/openvpn, et ne faisait pas la distinction entre configurations clients et configurations serveurs. Le service utilisé pour démarrer OpenVPN était nommé tout simplement openvpn.service, et son boulot était uniquement de lancer une instance d'OpenVPN par fichier de configuration (dont le nom se terminait par .conf) dans ce dossier. Pour lancer openvpn, il suffisait donc de la commande simple suivante :

    systemctl start openvpn

    Sous Stretch, tout a été changé. Premièrement, le service a changé de nom très salement. Par salement, je veux dire que l'ancien nom existe toujours, mais a été remplacé par un service qui ne fait absolument rien (il lance le programme /bin/true, programme dont l'utilité crève les yeux), ce qui fait que ce changement de service implique non seulement une rupture de ce service si aucune action n'est prise par la suite, mais également que c'est très difficile de s'en rendre compte, le service ancien openvpn.service étant diagnostiqué par le système comme actif et bien portant. Donc, la nouvelle forme de ce service est en fait un couple de service, openvpn-client@.service et openvpn-server@.service, le premier se chargeant de lancer OpenVPN en temps que client, et le second en temps que serveur. Mais ce n'était pas fini : les configurations VPN devaient être déplacées aux nouveaux endroits adéquats, et la ségrégation entre clients et serveurs a été instaurée : désormais, les configurations clients doivent aller dans /etc/openvpn/client et les configurations serveurs dans /etc/openvpn/server. Mais ce n'est encore pas tout : ces nouveaux services ne s'invoquent plus de la même manière. On doit maintenant spécifier le nom de la configuration dans la commande qui démarre le service. Par exemple, pour une configuration serveur qui s'appelle hashtagueule.conf (dûment placée dans /etc/openvpn/server), la commande pour démarrer le service associé est donc :

    systemctl start openvpn-server@hashtagueule

    Pour couronner le tout, un bug de configuration, oui un bug, et non une modification de comportement, s'est glissée dans le fichier de service openvpn-serveur@.service. Ce fichier comporte la ligne suivante :

    LimitNPROC=10

    Cette directive est utile pour contrôler le nombre maximum de processus exécutés par un service, pour éviter dans certain cas l'explosion du load du serveur. Sauf qu'ici, cette valeur est beaucoup trop petite. On se retrouve alors avec l'erreur suivante consignée dans les logs :

    openvpn_execve: unable to fork: Resource temporarily unavailable

    Ce qui veut dire que le système refuse la création d'un nouveau processus pour ce service. Je me résolus donc à réparer salement et de manière non safisfaisante en changeant la valeur 10 par 100 (aucune idée si c'est carrément trop), et enfin, le service a accepté de fonctionner.

    Quelle leçon tirer de cette aventure ? Premièrement, les mises à jour sont rarement simple, surtout dans le cas de Debian. Deuxièmement, même si le nouveau fonctionnement d'OpenVPN est désormais plus propre et correspond à l'usage conventionné sur les systèmes les plus récents, on peut déplorer la manière dont elle a été mise en place. Le bon usage aurait été d'instaurer une période de transition pendant laquelle les deux workflows auraient coexisté, plutôt que de casser brutalement une configuration existante et fonctionnelle. Et je ne parle même pas de la mauvaise limite du nombre de processus...

    En espérant que cette histoire aura été utile à des gens, je vous souhaite une bonne mise à jour.

    • Ha chevron_right

      Édito #9 : Les infos à 2 balles

      raspbeguy · pubsub.gugod.fr / hashtagueule · Saturday, 10 June, 2017 - 22:00 · 4 minutes

    Soufflons un peu la poussière et passons un coup de balayette. C'est bientôt l'été, j'imagine que ça ne vous a pas échappé.  Bientôt les vacances estivales pour certains, pour nous ça ne change pas grand chose, à part en terme de litre de sueur sécrétés et de kilos de glace consommés. Des choses se ...

    Soufflons un peu la poussière et passons un coup de balayette.

    C'est bientôt l'été, j'imagine que ça ne vous a pas échappé.  Bientôt les vacances estivales pour certains, pour nous ça ne change pas grand chose, à part en terme de litre de sueur sécrétés et de kilos de glace consommés.

    Des choses se passent sur le blog, certaines dont vous n'avez probablement rien à faire, mais on va les dire quand même parce que c'est quand même important pour comprendre les choses. Un peu comme quand les pubs à la télé pour yaourts nature font des jolis animations de flèches descendantes sur des corps de femmes pas tellement vêtues, ça porte à peu près aucune info exploitable pour le consommateur mais c'est joli, ça rassure et ça aide à vendre.

    Nous sommes en pleine migration des services sur un nouvel hôte (encore). Je vous entends rager, railler et demander avec inquiétude : Mais pourquoi ? Pourquoi encore changer d'hôte après même pas un an ? Eh bien on s'est rendu compte (il était temps) que gérer des services isolés et virtualisés c'était bien plus chouette que de gérer des services emmêlés façon sac de nœuds. On a par le passé déjà eu le cas de comportements mystérieux de services dus à une intervention sur un service qui n'avait rien à voir. Nous avons donc opté pour un hôte un peu plus costaud, et pas mal plus cher aussi. Heureusement que j'ai un salaire à présent, et désormais Motius aide financièrement, on fait de la collocation de serveur. Du coup on a franchit le pas de la virtualisation (enfin, surtout de la conteneurisation en l’occurrence), et au moment ou je vous parle, le blog a déjà été migré (et mis à jour par la même occasion). On s'était décidé à effectuer cette migration à l'occasion de la livraison de Debian Stretch en version stable. Bon, on a pris un peu d'avance, Stretch ne sortant que la semaine prochaine le 17 juin, mais bon, pour 2 semaines pendant lesquelles le blog aura tourné en version testing, on va pas en faire tout un plat.

    En ce qui me concerne, quelques évènements auxquels j'ai participé ces derniers mois :

    • Du 1er au 2 avril, j'étais présent aux JDLL à Lyon, pour défendre les couleurs d'un hackerspace local que je fréquente, mais également pour découvrir des associations et rencontrer des gens très sympatiques.

    Membres présents de l'association LILA lors des JDLL

    • Le 21 mai, je me suis rendu à Toulouse pour rencontrer David Revoy, le créateur du webcomic Pepper & Carrot dont on vous a déjà parlé, lors d'une séance de dédicace dans une petite librairie.

    Je ne pourrai malheureusement pas me rendre aux prochaines RMLL à Saint-Étienne En fait si, je me suis juste emmêlé les pinceaux au moment de regarder dans mon calendrier, j'y serai donc les 1er et 2 juillet prochains. D'autre part, je vais tout faire pour me rendre aux prochain Capitole du Libre à Toulouse les 18 et 19 novembre prochains (ça semble encore loin certes).

    D'autre part, je suis en train de monter avec des amis une émission de radio locale orientée autour de l'actualité numérique et du logiciel libre. Nous avons déjà enregistré le pilote, je vous en parlerais plus en détail si la programmation de l'émission est validée par l'administration de la radio. Mais il va sans dire qu'il s'agit d'un projet très excitant.

    C'est la fin de cette série d'infos inutiles. Avant de vous quitter, je tiens à vous faire connaître Erma, un webcomic que j'ai découvert récemment, et qui est mon coup de cœur artistique du moment. Vous connaissez peut-être le film d'horreur The Ring sorti en 2002, dans lequel figure Samara, un spectre féminin aux longs cheveux noirs masquant le visage, qui a notamment le pouvoir de sortir de l'écran du téléviseur (sans pour autant vous parler de yaourts vous, remarquez) à des moments contrariants et de marcher à quatre pattes au plafond. Dans ce webcomic, Samara s'est calmée, a arrêté de faire peur aux gens, s'est intégrée paisiblement parmi les humains et a même un mari, dont l'union a donné Erma, une petite fille qui tient beaucoup de sa mère, tant sur l'apparence que sur les pouvoirs surnaturels. Le décalage entre horreur et slice of life est assez comique mais mène souvent à des situations attendrissantes. Ce webcomic est tout bonnement adorable.

    Erma © Copyright 2016 Brandon Santiago

    Voilà, bon vote si ce n'est déjà fait, hydratez-vous bien, et soyez gentils.

    • Ha chevron_right

      Lettre ouverte au Président élu de la République française

      raspbeguy · pubsub.gugod.fr / hashtagueule · Sunday, 7 May, 2017 - 22:00 · 11 minutes

    Bonjour M. le Président. Au nom de l'équipe d'Hashtagueule, je tiens tout d'abord à vous adresser nos sincères félicitations (des félicitations républicaines, le terme étant très à la mode dans les médias aujourd'hui) pour votre victoire à l'élection du chef de l'État français. Nous sommes soulagés ...

    Bonjour M. le Président.

    Au nom de l'équipe d'Hashtagueule, je tiens tout d'abord à vous adresser nos sincères félicitations (des félicitations républicaines, le terme étant très à la mode dans les médias aujourd'hui) pour votre victoire à l'élection du chef de l'État français. Nous sommes soulagés en premier lieu que la France n'ait pas cédé au désespoir qui semble s'emparer du monde entier, en donnant le pouvoir à un parti extrémiste dangereux, prompt à briser les alliances amicales entre les nations européennes et mondiales, alliances qui ont demandé tant d'efforts, de réflexions et de remises en questions, et qui sont, à mon sens, l'évolution naturelle dans le cadre de l'épopée de l'humanité vers le Bien. À titre personnel, je suis même plutôt satisfait du résultat de cette élection, qui a au moins le mérite d'ouvrir des possibilités que les précédents titulaires de la Présidence ne laissaient pas apercevoir. Sur un point de vue bassement terre-à-terre, l'élection d'un Président ayant moins de 15 ans de plus de moi me remplit d'espoir quant au minimum d'ouverture d'esprit de la société. Bon, je sais très bien qu'on ne peut pas juger quelqu'un sur son âge, pas de panique, bien que je sois une personne très faible en politique et diplomatie, je garde quand même un brin de lucidité.

    J'admire également la manière dont vous ne cédez pas (au moins en apparence) au triomphalisme de bas étage et le sang-froid que vous témoignez. J'espère très sincèrement que cela va durer.

    Le but de cette lettre ouverte n'est bien sûr pas uniquement de vous féliciter, sans quoi ce blog aurait plutôt un nom du style notice-me-president.fr et on aurait d'ailleurs bien du mal à éviter de rester politiquement neutre. Le but n'est pas non plus de vous ennuyer, c'est pourquoi je renonce à la langue formelle et imbitable afin de vous délivrer l'essentiel. Vous me paraissez être une personne capable de se remettre en question et d'écouter les arguments sensés. À ce titre nous aimerions que vous preniez conscience de nos espoirs et de nos craintes concernant notre domaine de prédilection qui est l'informatique.

    Vous avez évoqué dans votre programme l'importance de la mise des administrations au numérique. En voilà une bonne nouvelle. Un bon moyen d'apporter de la sécurité au sein des institutions (pour peu que l'outil informatique soit correctement utilisé) et de l'emploi moderne. Et puis il y a un aspect écologique à ne pas négliger, même s'il n'est pas forcément aussi trivial qu'il n'y paraît. Mais attention, ce chemin, très bénéfique pour peu que l'on suive un minimum de précautions, peut très rapidement finir en eau de boudin dans le cas contraire.

    Le bon chemin, à notre sens, est de favoriser et même d'imposer aux administrations publiques l'usage de logiciels libres. Afin que vous gardiez toute votre attention et votre ouverture d'esprit pour les raisons qui font que c'est une drôlement bonne idée, examinons de plus près les arguments avancés par les lobbyistes contre le logiciel libre.

    Les mauvaises langues diront qu'on ne change pas une équipe qui gagne, et que l'administration a toujours tourné sur du logiciel privateur comme Microsoft Office, Windows, Oracle SQL, services Google, j'en passe et pas des moindres, et que ça a toujours très bien marché. Vous êtes désormais Président, vous devez donc être incollable dans le domaine de l'industrie, et vous n'ignorez donc pas le nombre de sociétés à croissance forte qui se spécialisent dans le logiciel libre. Il s'agit d'ailleurs d'un domaine dans lequel la France excelle, soit dit en passant. Ces sociétés qui ont le vent en poupe sont appelées des SS2L, sociétés de services en logiciel libre. Et croyez moi M. le Président, ça dépote grave. Vous avez donc des entreprises à la pelle, des entreprises européennes et françaises prêtes à fournir leur savoir-faire pour concevoir, déployer et maintenir des architectures libres, ainsi qu'à former le personnel pour qu'il soit autonome.

    Les mauvaises langues répliqueront : oh là là, le coût de mise en place va être exorbitant. À ces personnes visiblement expertes en mauvaise foi, je ferai remarquer que les licences d'utilisation des logiciels privateurs ont elles-même un prix à tomber par terre, tout simplement parce que les sociétés qui les proposent ont le monopole sur le produit qu'elles vendent et qu'elles sont les seules aptes et autorisées à vendre du support. Le fonctionnement du logiciel libre est simple : vous avez liberté d'utiliser le logiciel gratuitement, vous avez le droit de l'entretenir et de le faire évoluer à votre convenance, et vous avez la liberté de distribuer votre version et tout le savoir-faire que vous y avez placé. Si vous avez recours à une SS2L afin de vous aider à utiliser vos logiciels libres, vous être libre à tout moment de prendre en charge la maintenance et l'infogérance du logiciel en interne ou encore de changer de SS2L. Ce mode de fonctionnement est beaucoup plus sain au niveau industriel, favorise la concurrence nécessaire à l'économie et est un gage de qualité.

    Mais alors, rétorqueront les mauvaises langues, je préfère encore payer pour une société qui développe mes logiciels plutôt que de confier mon infrastructure à du travail "gratuit", car c'est bien connu, plus on y met d'argent, plus c'est efficace. Alors déjà, travailler dans le domaine du libre n'est pas du tout incompatible avec gagner de l'argent. Sinon les fameuses SS2L dont je vous parle tant n'existeraient pas. Comme je l'ai dit, ces entreprises vendent le savoir faire et non le logiciel en question. Les ingénieurs n'y inventent pas des technologies à partir de rien : ils font un énorme travail de "veille technologique" constant et rigoureux afin d'adapter leurs offres et d'en proposer de nouvelles. Et éventuellement, si la société en vient à modifier le code des logiciels libre qu'elle utilise, elle reverse les modifications à la communauté, elle y est tenu par la licence du logiciel libre. Le meilleur exemple de ce fonctionnement est la société américaine Red Hat qui vend la compilation de son propre système d'exploitation et qui reverse les modifications à la communauté, ce qui permet à n'importe qui ayant les compétences d'obtenir gratuitement le logiciel en question, pour peu qu'il puisse le maintenir lui-même. La mise à disposition des sources permet également à n'importe qui de vérifier le fonctionnement d'un logiciel et c'est grâce aux vérifications menées par la communauté qu'on peut s'assurer que le logiciel est de confiance. En comparaison, du côté des logiciels privateurs, absolument rien ne vous assure que le logiciel fait exactement ce qu'on lui demande et qu'on y a pas glissé une faille de sécurité, par incompétence ou par malice, vu qu'il n'y a qu'une seule société qui accède à la recette du logiciel.

    Pour être sûr que vous me compreniez, M. le Président, je vais utiliser une analogie classique, et je vais vous demander de comparer un logiciel à un gâteau au chocolat. Cette analogie est parlante car elle tend à unifier le peuple Français, non, l'humanité entière, autour du fait que les gâteaux au chocolat c'est bougrement bon. Donc, imaginez qu'un pâtissier vende des gâteaux au chocolat. S'il ne donne pas la recette de son gâteau, il encourt plusieurs risques. D'une part, en théorie, il peut remplacer le chocolat par une matière marron beaucoup moins ragoutante et le vendre tel quel, le client n'y verra que du feu jusqu'à ce qu'il le mange, et ce sera trop tard. D'autre part, si le pâtissier fait faillite, plus personne ne sera en mesure de le remplacer, condamnant ainsi l'humanité à se passer de gâteau au chocolat, ce qui, vous en conviendrez, M. le Président, serait bien triste. Cependant, s'il partage la recette du gâteau au chocolat, certes il va devoir faire preuve d'esprit pratique pour gagner autant d'argent, car n'importe qui sera en mesure de devenir pâtissier et de se lancer dans le gâteau au chocolat. Cependant, à partir de ce moment là, le pâtissier vendra son talent et non pas un produit alimentaire, car aussi claire une recette de cuisine peut être, un gâteau au chocolat demande du talent et de l'amour : on a gagné ainsi un gage de qualité. S'il est inventif, il pourra également se distinguer sur des plus-values, par exemple proposer une jolie salle de restauration où les clients peuvent savourer leurs gâteaux au chocolat dans un décor détendu, avec des jolies plantes, et du smooth-jazz en musique de fond. Et en plus, désormais, n'importe quel pâtissier peut déployer son talent en proposant des versions altérées de la recette, disons en ajoutant de la crème de marron, ce qui est succulent à mon sens, mais peut déplaire à d'autres personnes, et on a donc une recette qu'il est très aisé d'adapter en fonction du client.

    Passons désormais au reste des arguments. Adopter le libre, c'est refuser de s'enfermer dans un cercle vicieux mené par les sociétés privatrices. Par exemple, en utilisant Microsoft Office, on condamne non seulement l'utilisateur, mais également tous ses collaborateurs à utiliser Microsoft Office. En effet, le meilleur compère du logiciel privateur est le format fermé : le format des documents générés par un logiciel privateur a toutes les chances d'avoir des spécifications tenues secrètes, ce qui oblige chaque personne disposant d'un document privateur d'utiliser le logiciel privateur correspondant : c'est de l'esclavagisme numérique. À l'opposé, un format ouvert est un format dont les spécifications sont publiques : n'importe quel logiciel (en particulier un logiciel libre) sera en mesure d'implémenter la prise en charge de ce format. Les formats fermés sont donc un frein à la collaboration. Prenons un cas concret : supposons que pendant votre campagne, vous ayez mis en consultation votre programme en format Microsoft Word sur votre site internet. Surtout que votre programme, ce n'est pas la chose la plus légère informatiquement : il y a énormément d'images, de styles de texte différents, et globalement la mise en page a demandé beaucoup de travail et a utilisé beaucoup de spécificités. Il n'y a aucune chance que ce document ait pu être ouvert par autre chose que Microsoft Word. Du coup, les seules personnes à même de pouvoir lire votre programme auraient été les possesseurs de licences Microsoft, dont je ne fais pas partie. Vous conviendrez, M. le Président, que c'est un peu gênant pour se faire élire. Mais en réalité, votre programme a été exporté au format PDF, qui est un format ouvert : tout le monde disposant d'un ordinateur était en mesure de lire votre programme sans débourser un sou de plus. Vous voyez à quel point c'est important ?

    Enfin, nous pensons que le logiciel libre devrait être surtout favorisé dans les systèmes éducatifs. À l'heure de la transition vers les métiers du futur, il est nécessaire de former nos enfants et étudiants à des technologies neutres et libres plutôt que de déjà les enfermer dans des technologies orientées par des entreprises qui ne sont motivées que par l'appât du gain plutôt que par le rayonnement de la connaissance et du savoir faire. Grâce au logiciel libre, les enfants peuvent être menés à s'interroger sur le fonctionnement des choses, et peuvent reprendre des mécanismes pour créer quelque chose d'encore plus grand, de totalement nouveau, et que peut-être personne n'aurait vu venir. Le logiciel libre est une source d'inspiration et d'innovation.

    Ma longue tirade approche de sa fin, si vous m'avez lu jusque là, rassurez-vous, vous allez pouvoir retourner à vos occupations plus "présidentielles". Je veux simplement attirer votre attention sur la surveillance de masse qui sévit actuellement en France, dans le cadre de ce que certains ont appelés "l'état d'urgence". Nous avons bien connaissance des raisons qui motivent de tels dispositifs, et sans pour autant adhérer aux mesures effectives, nous les comprenons. Nous tenions juste à vous inciter à faire preuve d'une immense sagesse et de vous rappeler que la sécurité ne justifie pas la privation de liberté, sous peine de mettre la démocratie en danger, et nous ne vous cachons pas que nous avons conscience que la démocratie est depuis un certain temps en réel danger et nous nous faisons beaucoup de souci. Je suis sûr qu'en tant que Président du pays des libertés, vous saisissez complètement nos inquiétudes. Je ne vais pas m'étendre sur le sujet tout de suite, un seul sujet à la fois.

    Sur ces paroles, nous nous permettons encore une fois de vous féliciter, et nous vous rappelons que, sur les points évoqués ici, vous avez le pouvoir de faire changer les choses et que nous comptons sur vous.

    Amicalement,

    Raspbeguy, pour l'équipe d'Hashtagueule.

    • Ha chevron_right

      Un jukebox à partir d'un Raspberry Pi

      raspbeguy · pubsub.gugod.fr / hashtagueule · Wednesday, 15 March, 2017 - 23:00 · 7 minutes

    Ça y est ! Enfin un tutoriel Raspberry Pi. Depuis le temps qu'on m'en demande, vous êtes servi. Le Raspberry Pi (et les autres ordinateurs monocartes de la même farine) est remarquable du fait de la multitude d'usages qu'on peut lui attribuer. On le vois dans tous les domaines, Domotique, informatiq...

    Ça y est ! Enfin un tutoriel Raspberry Pi. Depuis le temps qu'on m'en demande, vous êtes servi.

    Le Raspberry Pi (et les autres ordinateurs monocartes de la même farine) est remarquable du fait de la multitude d'usages qu'on peut lui attribuer. On le vois dans tous les domaines, Domotique, informatique embarquée, serveur écologique, ordinateur de bureau low-cost, Internet des objets, montage électronique, cluster de calcul réparti, pour ne citer que ces exemples. Cet article va se concentrer sur l'aspect média-center du Raspberry Pi et plus précisément la lecture de bibliothèque musicale.

    Dans un premier temps, je vais vous expliquer comment vous monter un serveur MPD de base, chose que vous pourrez en grande partie trouver en quelques clics sur n'importe quel moteur de recherche. La deuxième partie présentera une manière très amusante de contrôler votre serveur de musique via un écran LCD, un projet en python qui a occupé mes soirées depuis ce dimanche (panne d'internet, vous comprenez) et dont je suis par conséquent assez fier, parce qu'il marche d'une part, et qu'en plus vous pouvez épater la galerie lorsque vous invitez des amis à l'heure de l'apéro et que vous voulez mettre un fond sonore.

    Le serveur MPD

    Si vous fréquentez des milieux barbus parlant entre autres d'usage de Linux au quotidien, de lecteurs multimédia, qui lancent des guerres sanglantes ayant pour motif par exemple le meilleur environnement graphique, qu'un environnement graphique en fait c'est pourri, que Arch Linux c'est bien mieux que Gentoo, bref, de tout ce qui relève de l'UNIX porn, vous avez très certainement déjà entendu parler de MPD (Music Player Daemon). Il s'agit d'une référence dans le domaine des lecteurs de bibliothèques musicales du type client-serveur (vous avez une machine qui lis la musique, et vous pouvez vous connecter dessus avec un client pour la contrôler).

    Ce qui fait la force de MPD, c'est sa légèreté (un Raspberry Pi peut l'exécuter sans trembler des genoux) ainsi que la flexibilité de sa configuration vis-à-vis des sorties audio, mais également et surtout la grande diversité des programmes clients, reflétant une communauté considérable, ce qui en fait en quelques sortes un standard de la lecture musicale sur UNIX.

    Nous partirons du principe que vous disposez d'un Raspberry Pi (même la première génération convient), et que vous avez installé une distribution dessus (par exemple Raspbian). Il est également conseillé de disposer d'un DAC (Digital to Analog Converter) externe, la carte son intégrée su RPi étant médiocre pour rester poli. Le DAC, pour faire court, est l'élément qui convertit le flux numérique audio en signal électrique analogique que vous pouvez brancher sur un ampli. Par exemple, la carte son de n'importe quel PC est un DAC. Je vous conseille également d'utiliser un DAC USB et non un DAC branché sur GPIO, sachant qu'ils est appréciable de pouvoir utiliser le GPIO pour autre chose (par exemple la deuxième partie du tutoriel...). Si vous cherchez une bonne affaire mais que vous pouvez quand même y mettre un certain prix, je vous conseille le Cambridge DacMagic 100, qui est d'excellente qualité, qui fonctionne sur le RPi avec une configuration de base et que j'utilise moi-même en étant satisfait.

    Niveau installation, il vous suffit d'installer MPD, présent sur la très grande majorité des distributions. Chose à noter, si vous avez des morceaux au format ALAC dans votre bibliothèque, vous devres en plus installer les plugins gstreamer adaptés. Sur Raspbian, il s'agit du paquet gstreamer1.0-plugins-bad. Puis vous êtes bon pour le décollage.

    Il est important d'ajouter le support de votre bibliothèque musicale dans le fichier /etc/fstab du RPi, cela permettra bien entendu de monter votre disque dur USB ou votre volume NFS dès le démarrage de l'appareil. Dans le cas d'un partage NFS, vous pouvez par exemple écrire :

    192.168.0.5:/chemin/vers/dossier/musique    /data   nfs    rsize=8192,wsize=8192,timeo=14,intr

    En remplaçant bien sûr l'IP de votre serveur NFS et le chemin du dossier musique sur ce serveur.

    Ensuite vous aurez besoin de configurer MPD. Direction le fichier /etc/mpd.conf pour dans un premier temps dire au lecteur où se trouve votre musique.

    music_directory "/mnt"

    Le fichier de configuration de MPD est assez bien documenté via le texte commenté. Ainsi vous pourrez personnaliser l'emplacement de vos futures playlists et de la base de donnée par exemple si ça vous chante.

    Partie également importante de ce fichier, la configuration des sorties audio. Si vous n'utilisez pas de DAC externe, vous pouvez laisser sans toucher. Si vous avec un DAC externe supportant de bonnes fréquences d'échantillonnage et que vous avez de la musique haute qualité, il sera intéressant d'y faire figurer :

    audio_output {
        type                "alsa"
        name                "My ALSA Device"
        device              "hw:CARD=C1,DEV=0"
        mixer_type          "none"
        auto_channels       "no"
        auto_format         "no"
        auto_resample       "no"
    }

    Le nom de la carte correspond pour le Cambridge DacMagic 100. Pour trouver le nom de votre DAC, vous pouvez par exemple faire usage de la commande aplay -L, qui vous listera l'ensemble des périphériques audio et leurs caractéristiques.

    Cette configuration impose à MPD de laisser le flux intouché (pas de traitement a posteriori) et de laisser le DAC révéler son potentiel en traitant du son à des fréquences échantillonnages élevées.

    Normalement c'est tout bon, vous pouvez démarrer ou redémarre MPD et initialiser la base de donnée. Pour ça,  vous allez avoir besoin d'un client, à installer sur les machines qui contrôleront le serveur. Par exemple sonata si vous voulez une interface graphique, ou l'excellent ncmpcpp si vous voulez du joli ncurses dans votre console. Astuce : il est pratique d'utiliser directement sur le RPi un client en ligle de commande minimaliste mpc, qui vous permettra rapidement de faires certaines actions, par exemple mettre la musique en pause parce que le voisin vous attend à votre porte avec une batte de baseball (mpc pause) ou bien mettre à jour la base de donnée (mpc update). Attention, la création de la base de donnée peut être très longue en fonction de la taille de votre bibliothèque. Pendant cette période, le CPU du RPi sera très solicité. Du coup vous saurez vite quand il aura fini...

    L'utilisation de MPD se base sur une liste de lecture centrale, dans laquelle vous ajoutez les morceaux dans l'ordre souhaité de lecture. Pour alimenter cette liste, vous aurez besoin de piocher dans la banque de musique qui a été créée par MPD. Je reste volontairement vague à ce sujet car la présentation de ces concepts varie en fonction du client utilisé.

    Il est également très amusant de contrôler son serveur via une interface web. Si vous désirez le faire, je vous conseille vivement de jeter un œil à ympd, une interface web propre et très légère, et dont il existe une version pour RPi justement.

    Bon, vous l'aurez compris, toute cette première partie n'était qu'un prétexte pour vous présenter le fruit de mon temps libre, mon projet du mois.

    Utiliser un écran LCD

    Il y a quelques années, je cherchais un écran LCD à contrôler par le RPi. J'ai craqué pour le Display-O-Tron 3000, qui dispose d'un rétroéclairage sous stéroïdes et multicolore, d'une série de diodes lumineuses supplémentaires à contrôler et d'un joystick de contrôle. Tout est contrôlable et personnalisable, et le fabriquant a développé une bibliothèque très facile d'usage, utilisable en Python, en C/C++ et en NodeJS. J'avais eu l'idée d'en faire un panneau de contrôle MPD mais je n'avais jamais pris le temps de le coder. C'est maintenant chose faite.

    Ce programme en python donc permet d'afficher les informations de la musique en cours sur MPD, avec les fonctionnalités suivantes :

    • Affichage du titre, de l'artiste et de l'album
    • Défilement du texte quand celui ci est trop long pour tenir sur une ligne
    • Changemment de la couleur du rétroéclairage en fonction de l'état du lecteur
    • Contrôle du lecteur grâce au joystick
    • Killer feature : affichage en temps réel de la puissance sonore via les diodes supplémentaires.

    Mieux que des paroles, voici une vidéo de démonstration

    Je vous invite à allez voir mon code commenté en détail (en anglais).

    Pour le mettre en application, il vous suffira d'installer la bibliothèque Python (voir le lien vers la page Github du fabricant) ainsi que la bibliothèque python-mpd2 utilisée pour contrôler MPD.

    Si vous trouvez des fonctionnalités à ajouter ou des améliorations possibles, n'hésitez pas à me le faire savoir, je serais heureux de prendre toutes les remarques en considération.