Caractère EOF des fichiers textes : \n pour Unix et \r\n pour Windows

Caractère de fin de ligne EOF (« End Of Line »)

J’ai une précision technique à apporter au sujet du caractère EOF. En effet, dans l’article concernant les aspects logiciels de la machine à blague Chuck Norris, j’indiquais que :

« Ici, le seul moyen que j’ai trouvé pour créer un fichier source valide, c’est par le biais d’un copier-coller de l’ensemble du texte à travers l’utilitaire PuTTY. »

C’est vrai que cette technique peu élégante fonctionne. Néanmoins, je n’ai compris que récemment pourquoi la commande strfile ne générait pas de fichier .dat valide depuis le fichier .txt copié depuis mon PC Windows… explications techniques. Revenons tout d’abord à ce qui se produit lorsqu’on applique la commande strfile sur un fichier .txt crée sur un environnement Microsoft. Voici « l’erreur » qui se produit :

Erreur de la commande strfile sur un fichier utilisant le caractère \r\n comme EOF
Erreur de la commande strfile sur un fichier utilisant le caractère \r\n comme EOF

Le retour de la commande indique qu’il n’y a qu’un seul string dans le fichier .dat généré. Ce qui est faux puisque le gisement de blagues Chuck Norris en contient près de 10 000 ! Quoi qu’il en soit, le fichier ainsi généré ne permettra pas à la commande fortune de fonctionner.

Caractère EOF différent selon l’environnement

Ceci s’explique par le caractère EOF. En effet, les fichiers textes n’utilisent pas le même caractère de fin de ligne selon qu’ils sont créés sur un système Windows (\r\n) ou Unix (\n).

Pour s’en convaincre, on pourra lancer la commande :

permet d’afficher le contenu du fichier en octal en faisant apparaître le caractère EOL. La solution consiste donc à supprimer les caractères \r du fichier créé sous Windows pour qu’il soit exploitable sur le Raspberry.

Pour cela, on pourra utiliser la commande sed (Stream Editor) :

qui permet de substituer le caractère \r par rien (en prenant soin auparavant de faire une sauvegarde chucky.txt.old du fichier original avec l’option –i.old). On remarquera ici qu’on remplace ‘\r’ par rien. On aurait pu essayer de remplacer ‘\r\n’ par ‘\n’… mais cela ne fonctionne pas. Pourquoi ? Ceci est lié au fonctionnement de la commande sed qui travaille ligne par ligne :

  1. elle parcourt le Stream jusqu’au caractère ‘\n’ ;
  2. charge tous les caractères avant le caractère ‘\n’ dans une zone de travail, le caractère EOF exclus ;
  3. effectue le traitement de substitution ;
  4. si l’option -i n’est pas précisée, la commande affiche le résultat sur stdout (l’écran) et aucune modification n’est faite sur le fichier passé en paramètre.

Une fois la commande exécutée, si on relance la commande :

on s’aperçoit que la substitution a fonctionner et que le caractère EOL est désormais \n. La commande strfile génère désormais un fichier .dat correct :

Commande strfile sur un fichier utilisant le caractère \n comme caractère EOF
Commande strfile sur un fichier utilisant le caractère \n comme caractère EOF

Le fichier .dat ainsi généré contient cette fois-ci 9692 strings ! En effet, les fichiers textes n’utilisent pas le même caractère de fin de ligne selon qu’ils sont créés sur un système Windows (\r\n) ou Unix (\n). Un simple copier-coller de l’ensemble du texte à travers l’utilitaire PuTTY réalisera la conversion automatiquement.

SQLite : moteur BDR embarqué

Généralités sur les bases de données

SQLite est un moteur de base de données. Une base de données (BDD) est un outil permettant de stocker de nombreuses données dans un ensemble structuré. Plutôt que d’éparpiller l’enregistrement de l’information dans plusieurs fichiers différents, la bases de données relationnelle centralise l’information pour y accèder simplement.

Les Systèmes de Gestion de Base de Données Relationnelles (SGBDR) sont les outils permettant de gérer des ensembles de données complexes. Parmi les solutions payantes : IBM DB2, Oracle, Microsoft SQL Server,… et les solutions gratuites : PostGreSQL, SQLite, MySQL,… Un tel système permet donc de simplifier la mise à jour et/ou la suppression des données mais aussi d’éviter les incohérences (doublons).

Quel que soit le serveur cible, la formulation des requêtes est standardisée dans un langage commun : le langage SQL (Structured Query Language).

Le modèle client/serveur

Chacun des systèmes cités ci-dessus fonctionne selon le modèle client/serveur :

  • le coeur de l’application (BDD + moteur) est installé sur un serveur ;
  • l’application cliente est installé sur des postes de travail, les clients.

Chaque client accède, selon les autorisations définies par l’administrateur de BDD, aux données de la base par un protocole d’échange. Les échanges entre le client et le serveur sont fait de requêtes et de réponses. Une fois connecté au serveur, le client peut interroger le serveur à l’aide de requête (extraction, ajout, suppresion, mise à jour de données,…). Le serveur exécute la requête et retourne les résultats au client.

Le modèle embarqué

Les SGBDR client/serveur sont des candidats sérieux pour des volumes de données massifs mais impose l’installation de solutions lourdes. Ces outils ne sont pas adaptés aux applications embarquées sur un Raspberry. Alors comment embarquer ses données persistentes au sein même de l’application et les gérer de manière relationnelle ? Continuer la lecture de « SQLite : moteur BDR embarqué »

L’outil ncdu pour identifier l’origine d’une saturation disque

Espace disque saturé

Cet article décrit une méthode simple pour identifier l’origine d’une saturation disque à l’aide de l’outil ncdu. Avant d’en traquer l’origine, revenons sur l’apparition de l’incident technique qui en découlait…

Les symptômes du problème

En visionnant le film d’animation Kung Fu Panda 2 (oui, je me souviens très de la gueule du gros Panda poilu scotché à l’écran pendant le bug), l’application Kodi s’est interrompu : image figée, le Raspberry était tout simplement planté. Après un redémarrage, je vois défiler furtivement des lignes inscrites en rouge indiquant un problème mais je n’ai pas le temps de les lire. Une fois redémarré, le prompt s’affiche mais l’application Kodi ne se lance pas automatiquement comme elle devrait pourtant le faire.

J’esssaies de lancer manuellement Kodi : cela échoue. En tapant quelques commandes, je suis amené à tenter d’utiliser l’autocomplétion et là, le message d’erreur suivant apparaît :

Le message d’erreur me mets sur la piste : un manque d’espace disque.

Investigations avec ncdu

Afin d’avoir un état de l’occupation de l’espace disque, je tape la commande suivante :

On s’aperçoit que la partition monté sur / est pleine à 100%. Il y a effectivement une saturation de l’espace disque. Après quelques recherches sur Internet, je découvre un outil super intéressant nativement présent sur Raspbian : ncdu (ncurse disk usage).

Ncdu est une version récursive de la commande du et un moyen rapide pour repérer les répertoires qui occupent le plus d’espace disque.

Lançons la commande ncdu sur le répertoire / en ne comptabilisant que les fichiers et répertoires présents sur le même FileSystem que celui qui est scanné (option -x) :

Une fois l’analyse terminée (cela peut prendre quelques minutes selon la taille du FileSystem), on s’aperçoit que le répertoire /var occupe 4 Go sur les 8 Go disponibles sur la carte micro SD, ce qui est assez conséquent, la saturation est clairement liée à ce répertoire. Toujours avec l’utilitaire ncdu, on navigue à l’intérieur du répertoire /var et on obtient :

Une fois dans /var, la taille de 3,7 GiB nous interpelle, allons y :

Une fois dans /var/log, on identifie 3 fichiers particulièrement volumineux (1,2 Gib chacun) :

  1. syslog.1 ;
  2. kern.log ;
  3. messages.

Pour comprendre qu’est-ce qui pouvait bien remplir à outrance ces fichiers, j’ai rapidement regardé le contenu. J’ai pu remarquer que les lignes évoquaient une erreur de transmission réseau. J’imagine que cela est lié à quelques bugs de la carte réseau wifi qui dysfonctionne parfois. (dongle wifi en sommeil après une inutilisation prolongée). Impatient de poursuivre la visualisation de Kung Fu Panda 2, j’ai tout simplement supprimé les 3 fichiers cités ci-dessus.

Idéalement, on cherchera à comprendre pourquoi l’application écrit si fréquemment dans ces fichiers de logs (voire mettre en place les logs rotatifs) pour éviter la réapparition du problème.

Une fois les fichiers supprimés, on peut apprécier les gains obtenus :

On est ainsi passé d’un taux d’utilisation de 100% à 51%. On peut encore gagner un peu d’espace  en nettoyant le référentiel local des paquets récupérés avec la commande :

Ce nettoyage permet de passer le taux d’occupation de l’espace disque de 51% à 50%.

Remarque : Si vous ne disposez pas de l’utilitaire ncdu, une commande équivalente peut vous aider :

Il faudra soi-même relancer la commande de manière itérative sur les répertoires les plus volumineux.

Caméra de vidéosurveillance avec motion

Motion
Un système de vidéosurveillance avec motion

On a vu comment ajouter la vision au Raspberry Pi dans l’article dédié au module Pi caméra. On dispose donc d’un périphérique de capture d’images/vidéos qu’on peut utiliser à l’aide de commandes éventuellement insérées dans un script shell ou Python : c’est chouette. Mais il y a encore plus chouette : créer un système de vidéosurveillance avec motion.

Les usages sont multiples et je ne vais pas philosopher là-dessus, je suis certain que vous saurez trouver l’utilité de ce système. En tout cas, à la fin de ce tutoriel, vous serez en mesure :

  • de visualiser en temps réel le streaming vidéo de votre Raspberry Pi depuis votre smartphone ;
  • déclencher l’enregistrement vidéo et/ou être alerté par mail sur détection de mouvements.

Motion est l’outil qui va permettre de diffuser le flux vidéo en streaming, de capturer des images et des vidéos provenant d’une ou plusieurs caméras.

Installation de motion

Commençez tout d’abord par mettre à jour Raspbian avec la commande :

Maintenant, installons motion et les paquets nécessaires :

Pour demander au noyau le chargement d’un module (le drivers broadcom (bcm) vidéo for linux (v4l)) , taper la commande :

Vous devriez normalement disposer du matériel /dev/video0. Pour que le module bcm2835-v4l2 soit automatiquement chargé au démarrage par le noyau, ajoutons le au fichier /etc/modules :

Oui, c’est une commande élégante pour ajouter bcm2835-v4l2 en fin de fichier /etc/modules.

Configuration de motion

Tout d’abord, pour que motion puisse s’éxécuter en tant que processus d’arrière plan, éditez le fichier /etc/default/motion et modifiez la ligne suivante à yes :

Ce paramètre modifié, motion pourra être lancé et l’essentiel de la configuration est à réaliser dans le fichier /etc/motion/motion.conf. Editez le fichier de configuration :

Dans ce fichier, on pourra apporter les modifications suivantes

Les principales modifications portent sur les paramètres suivants :

  • Décommenter la ligne logfile /tmp/motion.log pour enregistrer les logs ;
  • Effectuer une rotation de l’image selon les besoin (0, 90, 180 et 270), ici : rotate 180 ;
  • Ajuster la largeur/hauteur en pixels de l’image : width 1280 et height 720 ;
  • Le port d’écoute du serveur web offrant le flux viédo : stream_port 8081 ;
  • Ne pas restreindre l’accès au streaming à la machine locale uniquement :  stream_localhost off ;
  • Activer l’authentification Digest : stream_auth_method 2 ;
  • Configurer les credentials (login/password) : stream_authentication username:password ;
  • Afficher un texte en bas à gauche : text_left P3TCH CAMERA %t.

Pour lancer motion, taper la commande :

Désormais, un point rouge s’allume sur le module caméra… ça tourne ! Il est possible de se connecter à l’URL : http://192.168.1.123:8081. Après authentification, on visualise le flux vidéo en tant réel.

Si vous souhaitez désativer la LED rouge qui s’allume au démarrage de motion, c’est dans le fichier /boot/config.txt que ça se passe avec le paramètre : disable_camera_led=1.

Vous pourrez découvrir que le fichier de configuration permet un paramétrage assez fin de la caméra camera les zones de détection, la luminosité, les paramètres des enregistrements,… le site officiel Motion est exhaustif sur les options du fichier de configuration.

Remarque : A ce stade, cela fonctionne mais vous devriez rencontrer une erreur au premier mouvement détecté par la caméra. En observant les logs renseignés dans le fichier /tmp/motion.log, on s’apercoit qu’il s’agit d’un problème de permission lors de l’accès au répertoire /var/lib/motion (voir extrait ci-dessous).

Pour résoudre ce problème, il faut rajouter les droits adéquats à l’utilisateur sous lequel tourne motion. Pour cela, tapez la commande :

C’est donc l’utilisateur pi qui est utilisé. La commande suivante nous renseigne sur les permissions du répertoire en question :

Ajoutez à « other » le droit en écriture avec la commande :

Désormais, motion ne s’interrompera plus suite à la détection de mouvements puisqu’il pourra écrire dans le répertoire adéquat les vidéos d’enregistrements.

 

 

Module Pi caméra

Module Pi Caméra

Pi Camera Module v1 5MP
Pi Camera Module v1 5MP

Aujourd’hui, nous allons ajouter un module caméra au Raspberry Pi. Pour une vingtaine d’euros, vous pourrez vous offrir le module v1 avec un capteur de résolution de 5 mégapixels (MP) pour capturer des photos jusqu’à 2592×1944 pixels et des vidéos jusqu’à 1080p. Pour pousser à 8 MP, c’est le module v2 (3280×2464 pour les photos et 1080p30 pour les vidéos) qu’il faudra acheter en se fendant d’à peine 30 euros.

 

Quelle que soit la version, le module existe en Infrarouge pour photographier/filmer en condition de faible obscurité.

Autant le dire tout suite : c’est du flan. J’ai testé et je n’ai pas vu de différence entre les deux types des types de capteurs : quand il fait sombre, on ne voit rien.

Continuer la lecture de « Module Pi caméra »

Créer un media center avec Kodi

Media Center Kodi

Nous avons vu comment gérer l’espace de stockage avec Logical Volume Manager en vue de créer un serveur NAS destiné à partager le système de fichier avec NFS ou au travers d’un partage Samba. On dispose donc d’un espace de stockage conséquent pour y stocker une vidéothèque que nous allons gérer avec le media center Kodi.

Menu Principal Kodi
Menu Principal Kodi

Anciennement appelé Xbmc, Kodi est un media center qui supporte de nombreux formats multimédia. En tant que lecteur multimédia, cette application permet de lire la plupart des fichiers audio et vidéo, afficher des diaporamas d’images, regarder des vidéos en streaming, écouter la radio, consulter la météo,… Continuer la lecture de « Créer un media center avec Kodi »