Logiciel libre
Analyser efficacement un fichier CSV
Je travaille régulièrement sur des traitements de fichiers CSV. J'apprécie beaucoup ce format de fichier car il se génère et se lit facilement, qu'on soit informaticien ou non. J'ai d'ailleur écrit 2 librairies PHP pour lire, générer et valider des CSV : deblan/csv et deblan/csv-validator.
Lors des mes analyses, je me confronte parfois à des fichiers qui comportent beaucoup de colonnes et c'est un enfer d'utiliser un tableur pour visualiser et filtrer ces tableaux très larges.
Après quelques recherches, j'ai découvert deux projets qui se complètent à merveille ! Le premier est un outil qui transforme un fichier CSV en une base de données SQLite : csvs-to-sqlite. Le second génère une interface web (avec un serveur web intégré) pour faire des requêtes SQL sur une base de données SQLite : datasette.
Ce sont des outils écrits en Python qui s'installent et s'utilisent en une poignée de secondes.
$ sudo pip3 install csvs-to-sqlite datasette
Pour illustrer, je vais traiter le fichier CSV de la base officielle des codes postaux disponible sur data.gouv.fr.
$ wget -O codes_postaux.csv https://datanova.legroupe.laposte.fr/explore/dataset/laposte_hexasmal/download/\?format\=csv\&timezone\=Europe/Berlin\&use_labels_for_header\=true
$ csvs-to-sqlite -s ";" codes_postaux.csv codes_postaux.db
$ datasette serve codes_postaux.db
Serve! files=('codes_postaux.db',) (immutables=()) on port 8001
INFO: Started server process [8550]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Uvicorn running on http://127.0.0.1:8001 (Press CTRL+C to quit)
On peut maintenant accéder à http://127.0.0.1:8001 depuis un navigateur et commencer à analyer et traiter les données :
Et le plus intéressant pour moi, c'est de pouvoir écrire des requêtes SQL affiner vraiment les données affichées :
Enfin, on peut générer un nouveau fichier CSV (ou JSON) avec les données filtrées.
Simple, rapide et efficace !
Bilan de l’année 2019
On est arrivé en 2020 depuis plusieurs jours et j’avais envie de faire le bilan de 2019. Cette année a été assez productive du coté des logiciels libres. J’ai pu contribuer avec la réalisation de quelques projets :
- Un outil pour récapituler les dates d’expirations de nom de domaines et sa mise à jour pour récapituler les dates d’expirations de certificats SSL
- Une refonte et la publication du code pour générer des rapports serveur
- Une API pour récupérer les informations OpenGraph et les données générées par Graby
- Un générateur de configuration de vhost pour Apache
J’ai également publié d’autres projets sans en parler sur mon blog :
- Un script pour envoyer des SMS depuis un shell en s’appuyant sur KDEConnect
- Un outil de publication sur Mattermost de liens provenants de flux RSS
En enfin, j’ai maintenu des projets existants comme Gist et l’outil pour s’identifier sur Office 365 (je cherche d’ailleurs des contributions pour implémenter la double authentification). Du côté de l’auto-hébergement, j’ai ajouté quelques services comme wallabag et cyberchef. Au 31 décembre, 15 services étaient proposés gratuitement avec un accès libre ou sur inscription et 36 personnes m’ont fait une demande d’accès à un service restreint (hébergement web, service mail, Nextcloud, …).
Cela fait maintenant plus de 10 ans que je m’auto-héberge et j’héberge maintenant pas mal de monde. Ça tourne super bien et je suis très content que de plus en plus de gens s'y intéressent. Je suis sollicité par des associations qui veulent d'affranchir des GAFAM et c'est bien !
Tout cela demande de l'investissement mais c’est essentiel pour ne pas laisser ses données n’importe où.
On verra comment 2020 va se passer 😉
Outil de création d’un espace web Apache et PHP
Dans mon activité personnelle et professionnelle, je suis amené à créer des espaces d’hébergement de sites web principalement écrits en PHP.
Il y a quelques années, j’ai écris un script en shell qui posait des questions et générait des fichiers de configuration pour Apache et PHP puis relançait ces services. Il a ensuite évolué et générait également les utilisateurs unix et affinait les permissions. Le principal problème du script est que d’un serveur à l’autre, il fallait mettre des coups de hache dans le code pour l’adapter.
Cette semaine, j’ai entamé une refonte complète du code. Au fur et à mesure du développement, j’ai rendu pas mal de choses configurables et je pense qu’il est fonctionnel sur des environnements relativement différents des miens.
Je vous présente donc vhost-manager
, c'est un projet libre et est toujours orienté
vers la génération de vhost Apache et de pools PHP FPM. Il faut make
, gcc
,
wget
pour l'installer et sh
, whiptail
et php
sont nécessaires à
son utilisation.
Le code source est disponible ici. Le projet se configure via un fichier de variables et j'ai conservé le principe des questions/réponses pour générer les fichiers.
Mes scripts i3blocks pour générer les éléments de ma barre i3-wm
i3-wm est le gestionnaire de fenêtres que j'utilise depuis quelques d'années maintenant. Au fur et à mesure du temps, j'ai fais évoluer mon interface et j'ai écris des scripts pour générer les informations affichées dans la barre du dessus.
Parce que je suis plus à l'aise avec ce langage, l'ensemble des scripts est écrit en PHP 7. Ces scripts sont exécutés au travers de i3blocks, l'utilitaire qui gère les exécutions et les rendus des blocs.
Le fichier de configuration a cette forme et voici les détails techniques des blocs. Ils incluent tous base/block.php et le code source est libre. Le code n'est pas toujours élégant mais ça fonctionne pas trop mal 😀
Dépendance globale des scripts : interpréteur PHP 7.
Bande passante
Affiche la bande passante UP et DOWN d'une interface réseau.
- Code source
- Dépendances :
ip
,grep
,awk
,cut
,ifstat
ettail
- 1er paramètre : l'interface réseau (défault :
eth0
) - 2ème paramètre :
inet
pour l'IPV4 (par défaut) ouinet6
pour l'IPV6
IP locale
Affiche l'adresse IP d'une interface réseau. Au clic, l'IP est copiée dans le presse-papier.
- Code source
- Dépendances :
ip
,grep
,awk
,cut
,xclip
- 1er paramètre : l'interface réseau (défault :
eth0
) - 2ème paramètre :
inet
pour l'IPV4 (par défaut) ouinet6
pour l'IPV6
IP publique
Affiche votre adresse IP publique via une requête DNS à opendns.com. Au clic, l'IP est copiée dans le presse-papier.
- Code source
- Dépendances :
dig
etxclip
- 1er paramètre :
0
pour l'IPV4 (par défaut) ou1
pour l'IPV6
Espace libre
Affiche le pourcentage d'espace libre d'un point de montage. Au clic, le gestionnaire de fichiers affiche le répertoire du point de montage.
- Code source
- Dépendances :
df
,tail
etxdg-open
- 1er paramètre : le nom du point de montage (défault :
root
) - 2ème paramètre : le chemin vers le point de montage (défault :
/
) - 3ème paramètre : pourcentage du niveau d'alerte "moyen" (défault :
70
) - 4ème paramètre : pourcentage du niveau d'alerte "critique" (défault :
90
)
Spotify
Affiche l'artiste et le titre de la musique jouée. J'affiche le workspace
6. MEDIA
lors d'un clic.
- Code source
- Dépendance :
playerctl
Affiche un bouton pour lancer ou mettre en pause le titre en court.
- Code source
- Dépendances :
playerctl
etdbus-send
Volume
Affiche le volume du son.
- Code source
- Dépendances :
amixer
etgrep
Météo
Affiche la météo du lieu détecté par fr.wttr.in. Au clic, le site est affiché dans le navigateur web.
- Code source
- Dépendance :
curl
etxdg-open
Application
Affiche une lettre colorée et lance un script quand on clique dessus. Dans ma configuration, ça affiche des sites web dans le navigateur web.
- Code source
- 1er paramètre : la lettre à afficher
- 2ème paramètre : le script à exécuter au clic
- 3ème paramètre : la couleur de fond (défaut :
#333
) - 4ème paramètre : la couleur du texte (défaut :
#fff
)
Heure et date
Affiche l'heure et la date.
- Code source
- 1er paramètre : le format (documentation). Par défault :
H:i:s
.
Flux RSS
Affiche le nombre d'articles non lus. Au clic, le navigateur affiche le client web du votre lecture RSS (tt-rss chez moi).
- Code source
- Dépendance :
xdg-open
- 1er paramètre : URL du flux RSS
- 2ème paramètre : adresse du lecture RSS (optionnel)
Batterie
Affiche l'état de charge de la batterie.
- Code source
- Dépendance :
acpi
Le communautaire fonctionne mieux que le propriétaire
Au moment où j'écris cet article, ça fait un an que j'ai rejoint le groupe Zenitude avec comme nouveau métier pour moi, la responsabilité du parc informatique au sens large (support logiciel, support matériel, développement, administration système).
Aujourd'hui, ma conclusion est très radicale : les solutions logicielles open-source/libres fonctionnent mieux que les solutions propriétaires et le support communautaire est largement plus efficace que le support fournit par les sociétés commerciales. La majorité des problèmes que je rencontre est liée aux solutions propriétaires.
Le simple fait de pouvoir regarder le code source d'une application pour en comprendre son fonctionnement, voire même de le modifier est un gain considérable de temps et d'argent. Ne pas avoir la faculté d'appliquer un patch correctif temporaire avant une correction en upstream est un vrai problème qui coûte beaucoup de temps (et donc d'argent).
Je pense que beaucoup d'entreprises perdent du temps, de l'argent et beaucoup d'énergie en s'entêtant à éviter les solutions open-sources ou libres.