LPRP.fr https://www.lprp.fr La Page de Rémi Peyronnet Sat, 11 Jul 2020 20:01:11 +0000 fr-FR hourly 1 https://wordpress.org/?v=5.4.2 https://www.lprp.fr/files/2017/10/cropped-logo-lprp-favicon-2-32x32.png LPRP.fr https://www.lprp.fr 32 32 FireTV – TV Android pas chère https://www.lprp.fr/2020/07/firetv-tv-android-pas-chere/?utm_source=rss&utm_medium=rss&utm_campaign=firetv-tv-android-pas-chere https://www.lprp.fr/2020/07/firetv-tv-android-pas-chere/#respond Sat, 11 Jul 2020 14:47:26 +0000 https://www.lprp.fr/?p=4417 Normalement proposée à 39.99€, Amazon propose de plus en plus régulièrement la Fire TV Stick à 24.99 €. Utilisateur très régulier de Google Chromecast mais regrettant à ce dernier l’absence de télécommande et l’obligation d’utiliser un téléphone ou une tablette, c’est l’occasion d’essayer.

 

En standard, sans Amazon Premium ou Netflix, assez peu utile

Effet wahou garanti au déballage : l’emballage et le matériel sont très qualitatifs. La télécommande en particulier bénéficie d’une ergonomie parfaite et d’une finition sobre et élégante, avec un très bon toucher, ce qui est très appréciable car ce sera le seul contact quotidien avec le produit.

L’installation quant à elle est plus laborieuse que son concurrent Google Chromecast :

  • à peine branché l’appareil vous demandera 10 longues minutes pour optimiser les programmes ; on se retrouve bloqué et impatient devant cette opération dont on se demande vraiment pourquoi elle n’a pas été réalisée avant le déballage…
  • l’ensemble de la configuration est effectuée à la télécommande, ce qui est notamment assez peu pratique lorsque vient le temps de la saisie des mots de passe wifi et amazon avec le clavier virtuel ; la solution de Google Chromecast via une application mobile à connexion de proximité et par autoconfiguration des mots de passe est bien plus facile pour la prise en main

Une fois ce paramétrage effectué on arrive enfin sur l’interface principale du Fire TV Stick :

  • Ecran d'accueil
    Ecran d'accueil
  • Applications
    Applications
  • Séries
    Séries

La navigation est fluide et l’interface est très agréable, avec beaucoup d’animation, d’extraits vidéos. Tout le système est construit autour des contenus Amazon Premium : dans les entrées Films et Séries on voit sans arrêt le contenu Amazon Prime avec incitation à y souscrire. Le catalogue d’applications est assez limité, on y retrouve notamment Netflix, Disney+, YouTube, Twitch, AppleTV, Molotov et Plex, ainsi que quelques jeux.

Bref, sans Amazon Premium, et sauf à utiliser un des fournisseur listé, le Fire TV Stick est peu intéressant.

 

Mais une TV sous Android bien plus intéressante en bidouillant un peu

Heureusement, Amazon a eu la bonne idée de laisser le Fire TV Stick assez ouvert, très certainement essentiellement pour que les développeurs puissent développer des applications pour son écosystème, mais cela permet ainsi de pouvoir bénéficier d’une TV sous Android tout à fait intéressante.

Connecter ADB

Pour ce faire il faut activer depuis le menu Paramètres / Ma Fire TV / Options pour les développeurs  deux options :

  • l’installation d’applications de sources inconnues pour installer des applications qui ne sont pas dans le store Amazon
  • et éventuellement le débogage ADB pour pouvoir se connecter depuis un PC pour installer l’application / paramétrer la Fire TV depuis son PC

 

Nous allons ensuite installer Aptoide qui est un store alternatif  permettant d’installer des applications Android qui ne sont pas au catalogue Amazon Fire TV. Il a l’avantage d’une part d’être très pratique à utiliser depuis l’interface de la FireTV (la version normale nécessite l’usage de la souris mais il existe une version spécifique pour les TV), et d’autre part d’être assez utilisé, on peut donc imaginer lui faire un peu plus confiance qu’aux innombrables sites plus ou moins recommandables qui proposent de télécharger les apk. Même si on n’imagine pas spécialement d’usages professionnels ou avec données sensibles sur une Fire TV, cette dernière peut tout de même constituer une porte d’accès à votre réseau local. Il vaut donc mieux éviter d’y installer n’importe quoi.

La méthode la plus simple est sans doute de se rendre à l’adresse https://fr.aptoide.com/ en recherchant aptoide depuis un navigateur du store Amazon (comme Firefox), de télécharger et d’installer l’application depuis le Fire TV. Cependant comme nous aurons spécifiquement besoin d’ADB pour la configuration du launcher, je trouve plus simple d’utiliser ADB pour l’ensemble.

La première chose à faire est de prendre le contrôle de votre Fire TV depuis votre PC. Pour ce faire, il vous faut ADB (Android Debug Bridge). Il existe de multiples façons de l’installer, et notamment celle d’installer Android SDK, ce qui est peut être un peu beaucoup simplement pour ce que nous voulons faire. Sous Linux votre distribution devrait intégrer directement le package adb. Sous Windows, j’aime bien utiliser l’installeur scoop.sh qui facilite grandement les installations et mises à jour de logiciel de ce type. Une fois scoop.sh installé en suivant le guide sur leur page, il vous suffira d’une commande scoop install adb  pour installer ADB.

Une fois ADB installé, vous devez identifier l’adresse IP de la FireTV. Vous pourrez la trouver depuis l’interface de la FireTV dans Paramètres / Ma Fire TV / A propos / Réseau. Dans la suite de cet article j’utiliserai l’adresse 192.168.0.53 qu’il vous faudra remplacer par votre IP. Pour connecter votre FireTV à votre PC, il vous faudra depuis une ligne de commande avec ADB (PowerShell si vous avez installé via scoop.sh) :

adb connect 192.168.0.53

Cette commande lancera l’association de votre FireTV à votre PC. Il vous faudra aller confirmer la connexion sur l’interface de la Fire TV. Une fois la connexion établie, vous pouvez vérifier qu’elle fonctionne via la commande :

adb devices

Vous devriez voir quelque chose comme :

List of devices attached
192.168.0.53:5555       device

Si jamais cet affichage vous signale le device comme  offline  , notamment si vous souhaitez utiliser à nouveau ADB quelques jours après l’appairage initial, alors relancez le serveur ADB et la connexion avec ces commandes :

adb kill-server
adb start-server
adb devices
adb connect 192.168.0.53

 

Contrôle total depuis PC avec scrcpy

Une fois votre Fire TV Stick associée à votre PC, vous pouvez en prendre complètement le contrôle avec l’application scrcpy  à télécharger directement depuis leur page GitHub (https://github.com/Genymobile/scrcpy). Une fois téléchargée et décompressée, lancez l’application directement en double cliquant sur scrcpy.exe, vous devriez voir apparaître alors l’écran de votre Fire TV Stick comme sur votre télévision, et vous pouvez utiliser le clavier et la souris pour contrôler l’écran, ce qui devrait nettement vous faciliter la vie pour les étapes de configuration ci-dessous.

 

Installation de base : Aptoide, FTVLaunchX, MouseToggle

Après avoir téléchargé aptoide depuis https://tv.aptoide.com/howtoinstall.html ou https://fr.aptoide.com/download , installez le avec la commande, lancée depuis le répertoire contenant le fichier téléchargé :

adb install aptoide-lastest.apk

A la fin de l’opération, qui peut durer quelques minutes, vous devriez voir apparaître l’application Aptoide dans le menu Applications de votre FireTV.

Nous allons installer deux applications supplémentaires :

  • Une application pour remplacer la page d’accueil par un lanceur plus adapté pour un usage essentiellement d’applications Android : FTVLaunchX
  • Le lanceur TVLauncher (que je trouve très pratique, mais il en existe plein d’autres)
  • Un émulateur de souris pour les applications qui ne sont pas compatibles avec l’usage seul de la télécommande : Mouse Toggle Firestick

Pour le premier, il faut bien sûr l’installer comme d’habitude, mais également lui donner l’autorisation de remplacer la page d’accueil, au démarrage ou lorsque d’un appui sur la touche accueil sur la télécommande. Il a pour cela besoin d’une autorisation spéciale d’écriture. Après avoir téléchargé le fichier APK depuis leur page Github https://github.com/codefaktor/FTVLaunchX  :

adb install .\FTVLaunchX-1.0.1.apk
adb shell pm grant de.codefaktor.ftvlaunchx android.permission.WRITE_SECURE_SETTINGS

Il faut ensuite installer un lanceur, par exemple TVLauncher  (que vous pouvez installer via Aptoide directement), puis lancer depuis le Fire TV Stick le programme FTVLaunchX. il vous permettra alors de choisir depuis une liste déroulante des applications installées celle à utiliser en page d’accueil :

Vous pouvez ensuite personnaliser votre page d’accueil avec un résultat très lisible et clair :

L’émulateur de souris s’installe très simplement via l’apk téléchargeable depuis https://www.firesticktricks.com/mouse-toggle-firestick.html . La souris s’active via un double appui sur la touche Play/Pause. Vous verrez apparaitre un curseur qu’il est possible de déplacer avec les touches de direction. Lors de l’installation il est potentiellement nécessaire de lancer l’application et demander l’arrêt / démarrage du service pour qu’il devienne complètement fonctionnel.

 

Installation de vos applications

C’est maintenant à vous d’installer les applications Android que vous souhaitez utiliser sur votre FireTV.

Pour ma part j’utilise principalement myCanal, encore plus pratique à utiliser sur FireTV que sur Chromecast  et KODI  dont l’installation est décrite un peu plus en détail ci-dessous.

J’ai également installé :

  • VLC (depuis le store Amazon)  et DG UPnP Player, qui fonctionnent mieux que Kodi pour l’ UPNP / DLNA
  • YouTube (depuis le store Amazon), mais ma TV intégrant nativement YouTube je n’ai pas vraiment d’intérêt d’utiliser l’application depuis le FireTV
  • OrangeTV pour accéder au bouquet OrangeTV sur la TV sans avoir à payer le boitier ; en pratique l’abonnement mycanal fait bien mieux, et en gratuit Kodi fait aussi bien et l’interface Orange est infestée de publicité (parfois 7 publicités avant de lancer un programme !). L’application ne fonctionne pas très bien avec la télécommande donc il sera nécessaire de recourir parfois à l’émulation de la souris. Pour entrer l’utilisateur et le mot de passe il est indispensable de passer par scrcpy sur PC. Passée l’opération de configuration l’application fonctionne raisonnablement bien.
  • ES Explorateur (depuis le store Amazon)

 

Installation de Kodi

Kodi est un MediaPlayer très performant et très configurable. Disponible sur de nombreuses plateformes il fonctionne également sur Fire TV Stick. Vous pouvez l’installer depuis Aptoide : https://kodi.en.aptoide.com/app  ou via l’APK du site officiel via la procédure que vous connaissez bien maintenant.

J’ai suivi pour la configuration l’article suivant de 01net : https://www.01net.com/astuces/creez-facilement-votre-propre-box-tv-grace-au-raspberrypi-1927083.html

Pour accéder aux chaînes TV, il vous faudra ajouter les extensions :

  • Catch Up TV & More
  • PVR IPTV Simple Client  (IPTVREcorder) ; pour ce dernier deux petites subtilités sous FireTVStick par rapport à ce qui est décrit dans l’article de 01net pour raspberry :
    • Il faut activer les fichiers cachés dans le menu Parametres / Medias de Kodi (sinon le répertoire .kodi n’est pas visible)
    • L’emplacement du fichier des chaines est un peu différents ; dans les paramètres IPTVREcorder :
      • Channel : /sdcard/Android/.kodi/addons/plugin.video.catchupandmore/resources/m3u/live_tv_all.m3u
      • TVGuide : http://bit.ly/tvguidefr

Pour voir des contenus depuis des serveurs UPnP / DLNA il faudra ajouter une source vidéo upnp://  pour la découverture automatique. Une fois un serveur trouvé, vous pourrez également l’ajouter directement comme source. Le fonctionnement est parfois étrange et les premiers temps Kodi ne trouvait aucun serveur DLNA alors que VLC et DG UPnP Player arrivait bien à les trouver. Il fonctionne par contre parfaitement bien avec des partages réseau Windows, ce que j’utilise donc prioritairement.

Je trouve l’interface par défaut très agréable à utiliser, mais elle a le gros défaut de ne pas avoir un menu configurable.  Il existe pour cela un certain nombre d’autres “Habillages” (Skins) entièrement configurables, mais que je trouve pour l’instant moins aboutis que l’interface par défaut.

Il existe un nombre impressionnant d’extensions pour faire un peu tout ce à quoi vous pourriez penser, et même un peu plus. Attention cependant à la place disponible sur le Fire TV Stick dont la place mémoire n’est pas infinie 🙂

Pour aller encore plus loin…

Voici quelques autres ressources utiles autour de la personnalisation du Fire TV Stick :

  • https://forum.xda-developers.com/fire-tv
  • https://www.firesticktricks.com/

 

 

 

 

]]>
https://www.lprp.fr/2020/07/firetv-tv-android-pas-chere/feed/ 0
OctoPrint sur debian/ubuntu https://www.lprp.fr/2020/06/octoprint-sur-debian-ubuntu/?utm_source=rss&utm_medium=rss&utm_campaign=octoprint-sur-debian-ubuntu https://www.lprp.fr/2020/06/octoprint-sur-debian-ubuntu/#respond Mon, 08 Jun 2020 16:23:16 +0000 https://www.lprp.fr/?p=4390 J’aime beaucoup OctoPrint pour gérer mon imprimante 3D. Il existe beaucoup de plugins pour enrichir les fonctionnalités et il est bien intégré dans Cura. L’ensemble fait un duo parfait pour gérer les impressions 3D. il existe même un plugin OctoFusion pour l’intégrer directement dans Fusion360 (non testé encore). Seul problème, l’installation recommandée est sur raspberry pi. Je dispose du premier modèle, qui est peu puissant par rapport aux récents, et déconseillé pour OctoPi, une distribution OctoPrint prête à l’emploi. Je l’ai utilisé avec succès pendant presque deux ans, mais depuis la mise à jour vers la dernière version, il est devenu vraiment lent, au point de multiplier par deux le temps d’impression, et causer des problèmes car l’imprimante se retrouve à attendre les commandes et laisse couler du filament en attendant. Cela crée alors des boursouflures problématiques sur les impressions… Comme j’ai mon serveur sous Debian qui tourne à coté de l’imprimante, c’était dommage d’acheter un raspberry rien que pour ça, d’autant que même les anciens modèles ne sont pas bradés, j’ai donc opté pour installer OctoPrint directement sur mon serveur.

Installation d’OctoPrint

L’installation est super bien décrite sur la page setting up octoprint on a raspberry pi running raspbian , il suffit de quelques adaptations pour s’adapter à un non raspberry :

Le mode d’emploi installe OctoPrint sous l’utilisateur pi ; plutôt que de créer un utilisateur pi qui ne correspondrait à rien sur mon serveur, j’ai :

  • créé un utilisateur octoprint qui va exécuter le serveur pour qu’il ne tourne pas en root : sudo useradd octoprint
  • installé dans /opt/OctoPrint  plutôt que dans le home de l’utilisateur

Les séquences ci-dessous sont les scripts de la page octoprint adaptés avec les choix ci-dessus.

sudo su
cd /opt
apt update
apt install python-pip python-dev python-setuptools python-virtualenv git libyaml-dev build-essential
mkdir OctoPrint && cd OctoPrint
virtualenv venv
source venv/bin/activate
pip install pip --upgrade
pip install octoprint
useradd octoprint
usermod -a -G tty octoprint
usermod -a -G dialout octoprint
chown -R octoprint:octoprint /opt/OctoPrint

Puis pour le lancement automatique :

wget https://github.com/foosel/OctoPrint/raw/master/scripts/octoprint.init && sudo mv octoprint.init /etc/init.d/octoprint
wget https://github.com/foosel/OctoPrint/raw/master/scripts/octoprint.default && sudo mv octoprint.default /etc/default/octoprint
sudo chmod +x /etc/init.d/octoprint
sudo update-rc.d octoprint defaults

En ajustant dans le fichier /etc/defaults/octoprint les lignes :

OCTOPRINT_USER=octoprint
BASEDIR=/opt/OctoPrint/.octoprint
PORT=5000
DAEMON=/opt/OctoPrint/venv/bin/octoprint
START=yes

 

Customisation d’OctoPrint

Lors de la première connexion à OctoPrint, l’installation se déroule sans problème. OctoPrint répond à la vitesse de l’éclair sur un PC 🙂

Pour qu’OctoPrint sache se redémarrer tout seul il est nécessaire de lui donner les droits correspondant pour éviter d’avoir à le faire à la main, ce qui devient vite pénible. Comme il tourne sous l’utilisateur octoprint, il est nécessaire de donner à cet utilisateur des droits supplémentaires. Plutôt que de donner les droits sudoers sur n’importe quelle commande comme décrit sur la page (autant faire tourner le serveur en root !), j’ai préféré limiter aux commandes nécessaires.

Créer un fichier /etc/sudoers.d/octoprint  avec le contenu :

# Pour autoriser le redémarrage d'octoprint par lui-même
octoprint ALL = (root) NOPASSWD: /etc/init.d/octoprint
# Pour autoriser le démarrage/arrêt de la webcam (cf la suite :))
octoprint ALL = (root) NOPASSWD: /opt/OctoPrint/webcam

Puis dans la configuration d’OctoPrint, dans l’entrée “Server”, indiquer comme commande “Restart OctoPrint” sudo /etc/init.d/octoprint restart

 

Comme j’allume l’imprimante seulement lorsque j’en ai besoin, j’ai rencontré un petit souci :

  • d’une part si je laisse Cura ouvert, celui-ci va se connecter automatiquement à l’imprimante dès que je l’allume, et je ne pourrais pas connecter OctoPrint ; pour résoudre cela, il suffit de désactiver le plugin “USB Printing”

  • d’autre part  OctoPrint ne se reconnecte pas automatiquement ; pour ce faire il suffit d’ajouter le plugin PortLister !

 

J’utilise par ailleurs les plugins suivants :

  • MultiCam pour le support de plusieurs prises de vues dans l’interface  et Fullscreen pour en profiter en plein écran
  • ABL Expert Plugin et Bed Visualizer pour l’autolevel du plateau
  • Change Filament pour faciliter le changement de filament
  • Detailled Progress  pour afficher la progression de l’impression
  • DisplayZ  pour afficher la hauteur actuelle de l’impression
  • EEPROM Marlin Editor  pour éditer les paramètres du firmware enregistrés dans l’EEPROM

 

Installation de la webcam

J’utilisais beaucoup la caméra raspberry, très pratique car très fine et que j’avais fixée à l’axe des Z avec cette petite impression 3D, pour pouvoir surveiller que l’impression se passe bien. Comme je n’ai pas réussi à installer une webcam plus grosse de la même façon, je vais conserver le raspberry seulement pour streamer la camera raspberry et ajouter le flux via le plugin multicam en attendant de trouver un autre moyen, sans doute en fixant une mini caméra endoscope directement sur la tête d’impression (moins de 3€ sur AliExpress).

Mais je voulais aussi une webcam fixe pour avoir une vue d’ensemble, et potentiellement ensuite utiliser octolapse pour des jolis timelapse. Après avoir testé et positionné la webcam avec es outils classique cheese ou webcamoid, il faut installer sur la debian un outil pour streamer le flux. Dans la distribution est intégré motion, qui fonctionne très bien, mais consomme inutilement du CPU pour de la détection de mouvement. Je me suis donc résolu à ajouter mjpg-streamer manuellement comme indiqué sur le site :

sudo su
cd /opt/OctoPrint
apt install subversion libjpeg62-turbo-dev imagemagick ffmpeg libv4l-dev cmake
git clone https://github.com/jacksonliam/mjpg-streamer.git
cd mjpg-streamer/mjpg-streamer-experimental
export LD_LIBRARY_PATH=.
make
chown -R octoprint:octoprint /opt/OctoPrint

 

Il faut ensuite copier les deux scripts webcam et webcamDaemon sur la page octoprint dans /opt/OctoPrint, et adapter légèrement :

  • Dans le script webcam : adapter le répertoire /opt/OctoPrint/webcamDaemon dans le script webcam
  • Dans webcamDaemon :
    • rechercher le fichier de configuration /opt/OctoPrint/webcam.txt plutôt que /boot/octopi.txt
    • pour permettre de customiser le port de mjpg-streamer, ajouter un paramètre http_opts :
      • dans les paramètres (ou webcam.txt)
http_port=" -p 5100 "
      • dans la fonction runMjpgStreamer
echo Running ./mjpg_streamer -o "output_http.so -w ./www $http_port " -i "$input"
    LD_LIBRARY_PATH=. ./mjpg_streamer -o "output_http.so -w ./www $http_port" -i "$input"
Il y aura quelques erreurs liées à l’absence de vcgencmd qui est un outil qui permet d’interroger le raspberry, mais ce n’est pas grave puisque justement ce n’est pas un raspberry 🙂

 

La camera est alors fonctionnelle lorsqu’on lance le script webcam start, et il suffit de configurer l’url http://localhost:5110/?action=stream  dans MultiCam.

Cependant c’est dommage de streamer tout le temps alors que ce n’est utile que lorsque l’imprimante est allumée. On va pouvoir mettre en place le démarrage et l’arrêt automatique à la connexion / déconnexion de l’imprimante via les events OctoPrint. Bizarrement je n’ai pas trouvé de possibilité de régler ça par l’interface, il faut donc modifier à la main le fichier config.yaml qui est dans le répertoire .octoprint (/opt/OctoPrint/.octoprint pour mon installation), puis redémarrer OctoPrint pour qu’il soit pris en compte

events:
  enabled: True
  subscriptions:
  - event: Disconnected
    command: sudo /opt/OctoPrint/webcam stop
    type: system
  - event: Connected
    command: sudo /opt/OctoPrint/webcam start
    type: system

Vous retrouverez ici la seconde commande que nous avions ajoutée dans le fichier /etc/sudoers.d/octoprint.

L’installation est désormais complètement fonctionnelle, vous pouvez laisser octoprint et cura fonctionner en permanence. Lorsque vous allumerez l’imprimante (via une prise commandée par Domoticz pour mon cas), alors OctoPrint se connectera automatiquement, démarrera la webcam et vous pourrez imprimer directement depuis Cura.

A vos impressions 3D !

 

 

 

]]>
https://www.lprp.fr/2020/06/octoprint-sur-debian-ubuntu/feed/ 0
Ajouter un disque à LVM sur mdadm https://www.lprp.fr/2020/06/ajouter-un-disque-a-lvm-sur-mdadm/?utm_source=rss&utm_medium=rss&utm_campaign=ajouter-un-disque-a-lvm-sur-mdadm https://www.lprp.fr/2020/06/ajouter-un-disque-a-lvm-sur-mdadm/#respond Wed, 03 Jun 2020 18:12:50 +0000 https://www.lprp.fr/?p=4382 Pour mes sauvegardes et stockage long terme, j’ai un système un peu compliqué, construit au fil des années avec différents disques disparates assemblés via LVM et en Raid5 logiciel avec mdadm pour la redondance. L’avantage c’est que ça permet de mélanger les tailles de disques ce qui n’est pas supporté par raid5.

Le principe est tout simple : un premier raid de la taille du disque le plus petit. Tous les disques participeront à ce raid. Puis ensuite, un autre raid avec la plus petite taille restante, auquel participeront tous les disques sur lesquels il reste de la place, et au besoin, ainsi de suite jusqu’à utiliser tout l’espace des disques. En faisant ainsi, cela permet d’assembler au mieux des disques disparates, de tailles différentes car récupérés ou achetés au fil du temps. Et malgré tout de ne “perdre” en redondance que l’espace du disque le plus grand.  Le résultat est plusieurs arrays raid, ce qui n’est pas pratique, d’où l’assemblage avec LVM pour ne constituer qu’un seul disque logique reposant sur les x disques physiques constitués par les raid.

L’inconvénient, c’est que quand je veux ajouter un disque (c’est à dire pas très souvent),  eh bien je ne me souviens plus de comment il faut faire… Ce post me permettra au moins de m’en souvenir 🙂   mdadm, lvm, ext4 sont bien conçus et permettent donc de réaliser cette opération à chaud, avec les disques montés.

Après avoir partitionné le disque avec les tailles exactes attendues pour les raid, il faut en premier ajouter les partitions à chacun des arrays raid concernés :

mdadm /dev/md0 --add /dev/sdi1

Puis ensuite, augmenter la taille du raid. Cette opération va provoquer une reconstruction du raid avec un disque en plus. C’est l’opération la plus longue de l’ensemble. Rassurez-vous, mdadm a pensé à tout et vous ne perdrez pas vos données même en cas de coupure de courant pendant la reconstruction, ou défaillance d’un des disques pendant l’opération, qui sollicite fortement les disques.

mdadm --grow /dev/md0 --raid-devices 5

A cette étape votre raid doit indiquer la nouvelle taille, mais le reste de la chaîne n’est pas au courant. Il faut donc indiquer l’augmentation du disque physique à LVM :

pvresize /dev/md0

Puis redimensionner le disque logique et la partition en utilisant l’ensemble de l’espace nouvellement ajouté :

lvresize --resizefs -l +100%FREE /dev/lvm/main

L’option --resizefs  permet d’enchaîner le redimensionnement du système de fichier de la partition logique, mais il est possible de distinguer les deux étapes.

Tout est maintenant prêt, et un df devrait vous montrer en espace libre le nouvel espace disque ajouté !

]]>
https://www.lprp.fr/2020/06/ajouter-un-disque-a-lvm-sur-mdadm/feed/ 0
Unicode en python3 et script pour corriger les problèmes d’encoding de noms de fichiers https://www.lprp.fr/2020/05/unicode-en-python3-et-script-pour-corriger-les-problemes-dencoding-de-noms-de-fichiers/?utm_source=rss&utm_medium=rss&utm_campaign=unicode-en-python3-et-script-pour-corriger-les-problemes-dencoding-de-noms-de-fichiers https://www.lprp.fr/2020/05/unicode-en-python3-et-script-pour-corriger-les-problemes-dencoding-de-noms-de-fichiers/#respond Mon, 25 May 2020 16:03:04 +0000 https://www.lprp.fr/?p=4368 La gestion de l’unicode a toujours été la galère en programmation, et notamment en python. Il y a une vingtaine d’année avec les Windows-1252 ou latin1, au pire on se retrouvait un affichage bizarre mais cela marchait toujours. Avec la généralisation d’UTF8, maintenant standard partout que ce soit pour l’affichage sur les consoles ou les systèmes de fichiers la donne a changé, et les scripts python se retrouvent souvent à planter à cause d’un problème d’encoding, et les messages comme celui ci-dessous sont devenus l’enfer du développeur python, surtout avec python2 :

UnicodeEncodeError: 'ascii' codec can't encode character u'\xb7' in position 590: ordinal not in range(128)

C’était devenu tellement complexe avec les conversions explicites ou implicites qu’on se retrouvait alors à tâtonner en ajoutant des .encode  et des .decode  un peu dans tous les sens jusqu’à ce que ça tombe en marche… Pas terrible…

Trucs rapides pour maîtriser les encodings en python3

Python3 rationalise ça et apporte une solution bien plus efficace en séparant proprement les chaines de caractères unicode (str) des suites d’octets (bytes), et des fonctions d’encodage / décodage pour passer de l’une à l’autre : str.encode -> bytes, et bytes.decode -> str.  Pour faire la différence sur les chaînes littérales, il faut utiliser b” devant les bytes et sinon python3 interprétera en str, en décodant depuis l’encoding de votre fichier source, qu’il faut donc penser à indiquer avec “# coding: ” en début de script.

En utilisation normale python3 va donc parfaitement se comporter, faisant implicitement pour votre compte les traductions unicode -> encoding lorsque cela est nécessaire, par exemple pour ‘print’, pour l’ouverture d’un fichier en mode texte, etc.

Malheureusement, si le contenu que vous traitez comporte des erreurs, python3 est toujours aussi intolérant et vous retrouverez les exeptions UnicodeEncodeError & co…  Comme la distinction str / bytes est maintenant bien marquée il n’est plus aussi simple qu’avant que de l’embrouiller… Heureusement il y a cependant quelques astuces pour ce faire.  Votre bible est la section python specific encodings de la page 7.2 codecs de la documentation python3. Vous y trouverez des codecs particuliers pour faire des choses pas très catholiques, et un peu plus haut dans la page, la liste des errors handlers possibles.

En gros à chaque endroit où vous pouvez specifier un paramètre encoding il existe également un autre paramètre errors qui va spécifier le comportement du codec en cas d’erreur d’encoding. Si vous ne spécifiez rien, cela correspond à ‘ strict ‘ et la fameuse exception sera levée. Dans la liste possible, ‘ ignore ‘ est sans doute le plus simple : le caractère fautif est simplement ignoré. Vous pouvez redéfinir les options de stdout pour spécifier le comportement de print et ne plus avoir de plantage liés à des print de debugging…

# To avoid display problems of wrong encodings on utf8 terminal 
import sys 
sys.stdout.reconfigure(errors="ignore")

Si vous n’avez pas besoin d’un comportement exact c’est sans doute le plus simple, sinon il faut regarder de plus près les autres, qui vont tous substituer le caractère fautif en une autre forme acceptée (le cas des *replace), ou temporairement tolérée (le cas de surrogateescape). Le problème se pose alors si vous avez besoin de retrouver la chaine de caractère originale avec son problème d’encoding (c’est le cas des fichiers qu’on veut renommer). Pour sa gestion interne des systèmes de fichiers python3 semble avoir adopté la gestion du surrogateescape ; ainsi un os.listdir ne retournera pas d’exception si un nom de fichier ne suit pas l’encoding du filesystem mais la chaine de caractère unicode comportera des caractères ‘surrogate’. L’avantage sur surrogateescape est qu’il est simple de retrouver la forme d’origine, il suffit d’encoder en ajoutant le paramètre errors="surrogateescape" ; l’inconvénient est que par défaut tout codec renverra une erreur sur les caractères surrogate et qu’il faut donc spécifier systématiquement un comportement. Il existe “ surrogatepass ” pour les ignorer. Donc par exemple pour afficher sur la console des chaines potentiellement avec surrogate :

sys.stdout.reconfigure(errors="surrogatepass")

Le plus confortable pour ne pas craindre à chaque instant une exception est donc d’utiliser un des modes ‘*replace’ qui va remplacer le caractère fautif par une séquence d’échappement acceptée. Il n’est cependant pas toujours facile de revenir à la version initiale. Après avoir galéré un certain temps avec ‘backslashreplace’, j’ai trouvé dans ce fil stackoverflow une méthode simple pour le faire, qui se base en partie sur le codec unicode-escape, et en partie sur la capacité du codec latin1 de convertir 100% des bytes en string et inversement pour pallier le fonctionnement de unicode-escape uniquement sur des bytes. Pour inverser un ‘backslashreplace’, la fonction est donc :

# Adaptation to revert backslashreplace content 
def backslashreplace_revert(s): 
  return (s.encode('latin1') # To bytes, required by 'unicode-escape' 
          .decode('unicode-escape') # Perform the actual octal-escaping decode 
          .encode('latin1') ) # 1:1 mapping back to bytes

 

Assainir les noms de fichiers de son filesystem

Cette longue introduction pour présenter une application directe de ces éléments sur le cas qui m’intéresse, à savoir pouvoir faire en sorte que mon filesystem ne comporte que des noms de fichiers valides en UTF8. En effet, au fil de plus de 20 ans, entre le passage initial à utf8, les copies depuis des Windows plus ou moins au fait d’utf8, la décompression de vieux fichiers zip mal encodés, j’avais plus de 1000 noms de fichiers dont l’encoding n’était pas correct. Ça ne me gênait pas outre mesure jusque là, mais en voulant mettre en place un backup via rclone, ce dernier râle copieusement lorsque le nom de fichier n’est pas conforme… Pas facile à identifier et corriger à la main, donc j’ai fait un script.

Si identifier les fichiers fautifs est assez facile, c’est plus compliqué de deviner le bon encoding d’origine. Il existe un très bon outil chardet qui permet d’identifier l’encoding d’un texte inconnu. Malheureusement il ne supporte que quelques encodings et pas tous ceux que j’avais sur mon disque, c’est à dire à peu près tous ceux utilisés pour du français : latin1/15 le classique européen, cp1252 la déclinaison par Windows, et cp850, l’ancienne version sous DOS/Windows. Ce dernier n’est pas supporté par chardet (et l’ajout d’un nouvel encoding ne semble pas hyper simple dans cet outil). Il me fallait donc trouver un autre moyen. J’ai fait sale, mais ça marche pas si mal 🙂 : j’ai basiquement fait une liste des caractères qui peuvent légitimement se retrouver dans mes noms de fichiers. Si un encoding me sort un nom de fichier qui n’utilise que ces caractères il est alors sans doute correct, sinon il est sans doute faux. Je fais le test sur la liste de ceux que je suis susceptible de rencontrer, et si plusieurs matchent, je privilégie celui trouvé par chardet qui est un peu plus intelligent que ce que j’ai fait…  Si aucun ne correspond, je sélectionne celui qui comporte le moins de caractères en écart et sort une alerte pour l’utilisateur.

Pour les besoins de la mise au point de ce script, plutôt que de scanner à chaque fois mon disque j’ai préféré travailler sur un fichier de l’ensemble de la liste des fichiers, basiquement produit par find / .  Si c’est super simple pour détecter les fichiers fautifs, je me suis ensuite rendu compte qu’une structure à plat serait compliquée à traiter pour l’étape de renommage. J’ai donc opté pour une conversion du fichier à plat en une structure arborescente, qui serait plus facile à construire directement depuis le disque que depuis la liste des fichiers à plat.

Enfin j’aurais souhaité initialement pouvoir générer un script shell avec la liste des commandes mv plutôt que de renommer les fichiers en python (ce que je fais d’habitude et qui est plus pratique pour tester et plus sécurisant). Malheureusement la fonction shlex.quote  pour transformer une chaîne de caractère en argument pour le shell ne semble pas se comporter à l’identique du shell sur les noms de fichiers avec un mauvais encoding, il était donc plus simple de renommer en python directement plutôt que de devoir implémenter l’échappement correct.

Voici donc le code résultant :

# coding: utf8
# python3 only because of unicode support

import codecs
import json
import pprint
import os
import argparse

# for charset detection : pip install chardet
import chardet

normalchars="/ " + \
	"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" + \
	"ÉÊËÀàâéèëêïîôùûçñâôûÛ" + \
	"!'°~#$%_§&()+,-.;=@[]{}©®"
unwantedchars="\"^`|*?<>:\\²"

# defaults for debug
filelist='files.lst'
filerename='files.ren'

# To avoid display problems of wrong encodings on utf8 terminal
import sys
sys.stdout.reconfigure(errors="surrogatepass")

# From : https://stackoverflow.com/questions/14820429/how-do-i-decodestring-escape-in-python3
def string_escape(s, encoding='utf-8'):
    return (s.encode('latin1')         # To bytes, required by 'unicode-escape'
             .decode('unicode-escape') # Perform the actual octal-escaping decode
             .encode('latin1')         # 1:1 mapping back to bytes
             .decode(encoding,errors="surrogateescape"))        # Decode original encoding

# Adaptation to revert backslashreplace content
def backslashreplace_revert(s):
    return (s.encode('latin1')         # To bytes, required by 'unicode-escape'
             .decode('unicode-escape') # Perform the actual octal-escaping decode
             .encode('latin1') )        # 1:1 mapping back to bytes

# Utility function to len or 0 for None
def lenornone(var):
	if var:
		return len(var)
	else:
		return 0

# Utility function to check if filename is in the "authorized char list" 
#   (used to guess if it is right encoding or messed up...)
def check_filename(filename, setnormalchars):
	lineset = set(filename).difference(setnormalchars)
	if len(lineset) > 0:
		return lineset
	else:
		return None

# Get chars present in filenames that are not in the "authorized char list" 
def get_suspicious_chars(filelist, normalchars) :
	# Adapted from :  https://stackoverflow.com/questions/21522234/how-to-get-all-unique-characters-in-a-textfile-unix-python
	fh = open(filelist,'r', encoding="utf8", errors="backslashreplace").read()
	unique_chars = set(fh)
	suspicious = { (v if v not in normalchars else '')  for v in unique_chars }
	return suspicious

# List files that do not match the "authorized char list" 
def list_suspicious_files(filelist, setnormalchars):
	fh = open(filelist,'r', encoding="utf8", errors="ignore")
	for line in fh.read().splitlines():
		lineset = check_filename(line_utf8, setnormalchars)
		if lineset:
			print("# ", lineset)
			print(line)

# List files that present errors in UTF8
def list_utf8errors_files(filelist, setnormalchars):
	fh = open(filelist,'rb')
	for line in fh.read().splitlines():
		try: 
			line_utf8 = line.decode("utf8")
		except:
			# I should maybe have used replace, or surrogateescape, that would
			#   have been more easy to revert
			line_utf8 = line.decode("utf8", errors="backslashreplace")
			print("> ", line_utf8)
			detenc = chardet.detect(line)
			sel_encoding = None;
			for encoding in {"latin1", "cp1252", "cp850", detenc['encoding']}:
				line_enc = line.decode(encoding, errors="ignore")
				line_enc_set = check_filename(line_enc, setnormalchars)
				if (sel_encoding is None) or (sel_encoding and (lenornone(line_enc_set) < lenornone(sel_enc_set))):
					sel_encoding = encoding
					sel_enc_set = line_enc_set
			line_enc = line.decode(sel_encoding, errors="ignore")
			if lenornone(sel_enc_set) > 0:
				print("# !!! No suitable encoding found !!! Encoding: ", encoding," Set: ", sel_enc_set)
			else:
				print("# Encoding: ",  encoding)
			# shlex.quote do not seems to be working at all for encoding errors, 
			#    so we cannot create mv script as initiall intended
			#    (would have been easier to work with)
			# print("mv ", shlex.quote(line_utf8), shlex.quote(line_enc))
			print("Selected: ", line_enc)

# Clean the tree for empty renaming			
def clean_tree(tree):
	for key in list(tree.keys()):
		item = tree[key]
		if (key != '.') and (key != '..'):
			clean_tree(item)
		if (len(item) == 1) and (len(item['.']) == 0):
			del tree[key]

# Convert filename list to tree, because :
#  - for a huge bunch of files, it is more easy to work with a file 
#           that to scan the entire filesystem each time
#  - mandatory to manage properly the renaming of folders
#      (and the renaming of files contained in that folder, after renaming the folder)
def list2tree(filelist, setnormalchars):
	tree = {}
	fh = open(filelist,'rb')
	for line in fh.read().splitlines():
		try: 
			line_utf8 = line.decode("utf8")
		except:
			comps = line.split(b'/')
			cur = tree
			for comp in comps:
				enc_tips = None
				try:
					comp_utf8 = comp.decode("utf8")
					comp_enc = ""
				except:
					comp_utf8 = comp.decode("utf8", errors="backslashreplace")
					detenc = chardet.detect(comp)
					sel_encoding = None
					for encoding in {"latin1", "cp1252", "cp850", detenc['encoding']}:
						if encoding:
							line_enc = comp.decode(encoding, errors="ignore")
							line_enc_set = check_filename(line_enc, setnormalchars)
							if (sel_encoding is None) or (sel_encoding and (lenornone(line_enc_set) < lenornone(sel_enc_set))):
								sel_encoding = encoding
								sel_enc_set = line_enc_set
					comp_enc = comp.decode(sel_encoding, errors="ignore")
					if lenornone(sel_enc_set) > 0:
						enc_tips = "!!! No suitable encoding found !!! Encoding: " +  sel_encoding +" Set: " + str(sel_enc_set)
					else:
						enc_tips = "Encoding: " +  sel_encoding 
				if comp_utf8 in cur:
					cur = cur[comp_utf8]
				else:
					cur[comp_utf8]  = { '.' :  comp_enc }
					if enc_tips:
						cur[comp_utf8] ['..'] = enc_tips
					cur = cur[comp_utf8]
	clean_tree(tree)
	#pprint.pprint(tree)
	print(json.dumps(tree, indent=2,ensure_ascii=False))

# Recursive function to do the move of items in the tree
def do_mv(tree, cur):
	for key in list(tree.keys()):
		if (key != '.') and (key != '..'):
			item = tree[key]
			next = key
			if len(item['.']) > 0:
				key = backslashreplace_revert(key)
				src = cur.encode()+b'/'+ key
				dst = cur+'/'+item['.']
				print("mv ", src, " ", dst)
				os.rename(src,dst)
				next = item['.']
			do_mv(item, cur + "/" + next)

# Move the files by loading the tree file and starting the recursion
def json_do_mv(file):
	tree = json.load(open(file))
	do_mv(tree[''],"")

# Command line handling
parser = argparse.ArgumentParser(description='Helps the renaming of bad UTF8 filenames.')
parser.add_argument("command", help="the command to use", choices=['getchars', 'listsuspicious', 'listerrors', 'gettree', 'movetree'])
parser.add_argument("input", help="the input file")
args = parser.parse_args()

if args.command == "getchars":
	print(sorted(get_suspicious_chars(args.input, normalchars +  unwantedchars)))
elif args.command == "listsuspicious":
	list_suspicious_files(args.input, set(normalchars + unwantedchars))
elif args.command == "listerrors":
	list_utf8errors_files(args.input, set(normalchars + unwantedchars))
elif args.command == "gettree":
	list2tree(args.input, set(normalchars + unwantedchars))
elif args.command == "movetree":
	json_do_mv(args.input)

A noter que ce script est quand même assez expérimental / rudimentaire, et à ne pas utiliser aveuglement…

Il existe un script convmv disponible dans toutes les bonnes distributions qui permet de convertir assez simplement d’un encoding en utf8. Pour les cas simples, c’est LE script à regarder en premier. J’en avais fait il y a longtemps, à l’occasion de mon premier cleanup, une variante qui utilise le module Encode::Guess : convmv-detect (script perl à télécharger et dézipper). L’usage est identique à convmv, il suffit d’indiquer “-f detect” pour demander la détection et changer en ligne 449 la liste des encodings “suspects” (oui c’est moche : c’est du perl et je suis nul en perl…)

]]>
https://www.lprp.fr/2020/05/unicode-en-python3-et-script-pour-corriger-les-problemes-dencoding-de-noms-de-fichiers/feed/ 0
Création de disques virtuels sous Windows https://www.lprp.fr/2020/05/creation-de-disques-virtuels-sous-windows/?utm_source=rss&utm_medium=rss&utm_campaign=creation-de-disques-virtuels-sous-windows https://www.lprp.fr/2020/05/creation-de-disques-virtuels-sous-windows/#respond Mon, 18 May 2020 16:41:46 +0000 https://www.lprp.fr/?p=4359 Toutes les éditions de Windows 10 ont un support de disques virtuel qui est méconnu. Et si vous avez accès à la version Windows 10 Pro, vous pouvez le crypter avec BitLocker pour en faire un container crypté qui fonctionnera sur toutes les éditions de Windows sans besoin de logiciel supplémentaire. Pratique !

Création du disque virtuel

Créer un disque virtuel est assez facile avec l’utilitaire “Gestion de l’ordinateur”. C’est un outil standard Windows qui a été un peu masqué dans les dernières éditions de Windows, mais qui reste très efficace. Il est trouvable dans les “Outils d’administration” dans le menu “Système Windows”. Dans cette application vous trouverez l’outil “Gestion des disques”. Vous pouvez également le trouver en cherchant directement “partition”, “gestion des disques”, “gestion de l’ordinateur” dans la recherche :

1. Créer un disque virtuel avec le menu “Action” / “Créer un disque virtuel”

2. Sélectionner le format VHDX, avec extension dynamique, et la taille maximum que vous désirez. Comme avec Windows 10 Home le changement de la taille d’un disque virtuel n’est pas facile, mieux vaut opter pour une taille importante. Avec Windows 10 Pro vous pourrez étendre la taille d’un disque virtuel avec les outils de gestion Hyper-V.

3. Il faut ensuite initialiser le disque avec une table des partitions, soit le ‘vieux’ MBR ou le plus récent GPT.  Je préfère généralement le plus récent, mais cela prend également plus de place.

4. Puis ensuite créer une partition avec un clic droit sur l’espace libre du disque. Vous pouvez choisir d’utiliser l’intégralité du disque, ou si vous avez prévu large, vous pouvez réduire la partition à la taille utile en premier lieu, puis l’étendre par la suite. En effet, s’il n’est pas forcément facile de redimensionner un disque virtuel il est facile de le redimensionner avec l’outil de gestion des partitions disponible sur toutes les éditions. Vous pouvez donc commencer petit et augmenter au fur et à mesure des besoins, pour éviter que l’allocation automatique fasse grossir le disque virtuel jusqu’à sa taille maximum au fur et à mesure des écritures. Il faut ensuite choisir entre exFAT ou NTFS. Comme pour GPT, NTFS est plus performant mais prendra plus de place.

 

Vous avez maintenant un disque virtuel fonctionnel.

Pour le déconnecter vous pouvez soit :

  • depuis l’explorateur, faire un clic droit sur le disque, et sélectionner “Ejecter” (si vous avez créé plusieurs partitions sur le même disque il vous faudra toutes les ejecter pour ejecter complètement le disque virtuel)
  • depuis l’outil de gestion des partitions, faire un clic droit sur le disque virtuel et sélectionner “Détacher le disque virtuel”

Pour le re-connecter ensuite, il suffit de double cliquer sur le fichier VHDX.

Le chiffrement avec BitLocker

Pour ajouter du chiffrerment avec BitLocker, depuis une édition Windows 10 Pro, cliquer droit sur le disque virtuel connecté dans l’explorateur et cliquer sur “Activer BitLocker” puis suivre les étapes : un mot de passe robuste, la sauvegarde des informations de récupération, ne chiffrer que l’espace utilisé, et conserver les autres paramètres par défaut.

 

Ejecter le disque et vous avez maintenant un  conteneur autonome chiffré avec BitLocker et qui fonctionnera sur n’importe quelle édition de Windows 10, qu’elle soit Home ou Pro. Vous bénéficierez d’ailleurs de l’ensemble des fonctions BitLocker sur ce disque, comme la possibilité de changer le mot de passe ou de récupérer un mot de passe oublié avec les informations de récupération. Vous pouvez faire plusieurs copies de ce container pour en créer autant qu’il vous faut, avec des mots de passe distincts. La seule limitation est qu’ils vont partager les mêmes informations de récupération qu’il faudra donc conserver bien à l’abri.  Windows 10 Pro n’est requis que pour la création du container, vous pouvez donc emprunter un PC d’un ami / collègue ayant Windows 10 Pro 5mn pour créer votre disque puis ensuite ne plus avoir besoin d’avoir accès à cette édition.

Comparaison des tailles des conteneurs

Comme j’ai été un peu surpris par les tailels des fichiers créés, j’ai fait quelques tests. A noter que ces tests ne correspondent qu’à des conteneurs vides. Il est probable que les différences s’estompent au fur et à mesure de l’utilisation avec des vraies données.

J’ai créé une série de disques virtuels avec des paramètres différents. En premier des disques non initialisés qui ne prennent quasiment pas de place :

Puis avec une table de partition et une partition : GPT prend plus de place que MBR, et NTFS plus que exFAT. Pour une taille minimum, prendre le duo MBR et exFAT :

BitLocker va naturellement demander plus de place avec le chiffrement :

Ce qui est très intéressant, c’est que bien que les tailles des disques deviennent conséquentes bien que vides, ces fichiers se compressent très très bien avec au final 377ko pour NTFS/GPT en zip, ou 13 Mo pour un disque virtuel zippé Bitlocker/exFAT/MBR.

Vous pouvez donc vous préparer des disques en avance et les stocker pour quasiment pas de place.

Je restais un peu étonné de la différence des tailles avec des disques créés depuis des clés USB avec Disk2VHD :

Malheureusement, impossible d’utiliser Disk2VHD sur des disques virtuels… Dommage ça aurait pu être fun!  Comme ces différences peuvent être dûes à des pré-allocations, j’ai voulu convertir les fichiers sans preallocation pour voir si ça change quelque chose.

On joue un peu avec QEmu-img

Un outil pratique pour manipuler les disques virtuels est qemu-img de l’émulateur QEmu. Disponible pour Windows et Linux il vous permet de faire un peu tout : compactage, redimensionnement, et conversions entre qcow2 (format natif QEmu), vmdk (format natif VMWare), vhi (format natif Virtual Box) and vhdx (format natif Hyper-V).

J’ai commencé par une conversion directe de VHDX en VHDX avec :

qemu-img.exe convert -f vhdx -O vhdx -o subformat=dynamic Empty100Go.vhdx Empty100Go-converted.vhdx

Echec total, cela a fait grossir le fichier à quasiment sa taille complète ! (86 Go vs 100 Go de capacité maximale)

Etrangement, avec un intermédiaire en qcow2 ça marche beaucoup mieux :

qemu-img.exe convert -f vhdx -O qcow2 -o preallocation=off Empty100Go.vhdx Empty100Go-converted.qcow2
qemu-img.exe convert -f qcow2 -O vhdx -o subformat=dynamic Empty100Go-converted.qcow2 Empty100Go-converted.vhdx

Le fichier résultant pèse 168 Mo, donc moins que l’original à 196 Mo. A noter que le fichier temporaire qcow2 fait 2.75 Go, ce qui est plutôt surprenant compte tenu de la préallocation nulle…

Donc en résumé, les tailles minimum des conteneurs sont obtenues :

  • lorsqu’ils sont compressés !
  • avec MBR & exFAT (versus GPT & NTFS)
  • en les créant avec Disk2VHD depuis des clés USB vides (plutôt que les créer avec la gestion des disques)

(Résultats applicables uniquement sur des conteneurs vides, il est très probable que l’écart soit diminué avec du contenu.)

A noter que si vous avez l’édition Windows 10 Pro, vous pouvez installer la fonctionnalité optionnelle Hyper-V et avoir des fonctions de manipulations supplémentaires sur les disques virtuels dans la console de management Hyper-V dans le menu “Action” “Modifier le disque” : vous pourrez compacter, étendre et convertir les disques VHDX (conversion uniquement entre VHD/VHDX et prealloué ou non)

]]>
https://www.lprp.fr/2020/05/creation-de-disques-virtuels-sous-windows/feed/ 0
vcpkg – un gestionnaire de bibliothèques C/C++ https://www.lprp.fr/2020/05/vcpkg-un-gestionnaire-de-librairies-c-c/?utm_source=rss&utm_medium=rss&utm_campaign=vcpkg-un-gestionnaire-de-librairies-c-c https://www.lprp.fr/2020/05/vcpkg-un-gestionnaire-de-librairies-c-c/#respond Sun, 03 May 2020 19:17:21 +0000 https://www.lprp.fr/?p=4301 A chaque réinstallation de Visual Studio je râle contre la galère d’installer les différentes dépendances de compilation de mes projets, surtout une fois qu’on a goûté sur d’autres OS ou dans d’autres langages à des gestionnaires de packages comme sous linux, ou maven en java, pip en python, ou npm en js. Cela existe maintenant avec vcpkg , open-source, multiplateforme, initié par Microsoft et alimenté par la communauté, une nouvelle preuve de la nouvelle orientation intéressante de Microsoft vers le développeur, l’open-source et Linux.

L’installation est un peu inhabituelle sous Windows puisqu’on va commencer par cloner le repository et compiler l’outil :

git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
.\bootstrap-vcpkg.bat

Ce qui au final est très agréable puisqu’on obtient un répertoire tout à fait portable. 

Pour intégrer vcpkg à Visual Studio, il suffit de lancer :

vcpkg integrate install

J’ai pris l’habitude pour simplifier la distribution de mes projets de toujours compiler en statique, pour éviter les dépendances avec les librairies Visual Studio, et devoir ainsi distribuer l’installateur correspondant. vcpkg intègre la possibilité de construire l’ensemble des bibliothèques avec des paramètres cohérents, regroupés sous l’appellation de “triplets”. Pour compiler en statique et en 32bits le triplet correspondant est “x86-windows-static”. Pour éviter de l’oublier j’ai ajouté un fichier batch “vcpkg-static.bat” qui contient simplement :

@vcpkg.exe --triplet x86-windows-static %*

Pour ajouter la configuration du triplet dans le projet, il faut éditer le vcxproj et ajouter dans le groupe de propriétés “Globals” la mention du triplet :

&lt;<span class="pl-ent">PropertyGroup</span> <span class="pl-e">Label</span>=<span class="pl-s"><span class="pl-pds">"</span>Globals<span class="pl-pds">"</span></span>&gt;
  <span class="pl-c">&lt;!-- .... --&gt;</span>
  &lt;<span class="pl-ent">VcpkgTriplet</span> <span class="pl-e">Condition</span>=<span class="pl-s"><span class="pl-pds">"</span>'$(Platform)'=='Win32'<span class="pl-pds">"</span></span>&gt;x86-windows-static&lt;/<span class="pl-ent">VcpkgTriplet</span>&gt;
  &lt;<span class="pl-ent">VcpkgTriplet</span> <span class="pl-e">Condition</span>=<span class="pl-s"><span class="pl-pds">"</span>'$(Platform)'=='x64'<span class="pl-pds">"</span></span>&gt;x64-windows-static&lt;/<span class="pl-ent">VcpkgTriplet</span>&gt;
&lt;/<span class="pl-ent">PropertyGroup</span>&gt;

Ensuite pour installer un paquet, rien de plus simple :

vcpkg-static install wxwidgets

vcpkg télécharge et compile la bibliothèque demandée et ses dépendances. Pour wxwidgets tout s’est passé automatiquement sans problème et a pris 16 minutes. A noter que les paquets sources des bibliothèques jpeg, png, zlib & co  sont celles de vcpkg et non celles incluses dans wxwidgets. Vous n’aurez donc pas exactement le même nommage des bibliothèques à inclure à l’édition de liens (quelques préfixes wx à retirer, que l’on identifie assez simplement en observant le contenu du répertoire  vcpkg\installed\x86-windows-static\lib  

Attention vcpkg ne fait pas le ménage, et va vite prendre des gigas si vous n’y faites pas attention. Il suffit alors de supprimer régulièrement les répertoires intermédiaires de compilation et de téléchargement : rmdir /s /q packages buildtrees downloads    (dans un vcpkg-clean.bat par exemple)

Je commence à aimer à nouveau Windows comme environnement de développement 😉

]]>
https://www.lprp.fr/2020/05/vcpkg-un-gestionnaire-de-librairies-c-c/feed/ 0
Logithèque Windows 2020 https://www.lprp.fr/2020/05/logitheque-windows-2020/?utm_source=rss&utm_medium=rss&utm_campaign=logitheque-windows-2020 https://www.lprp.fr/2020/05/logitheque-windows-2020/#respond Sat, 02 May 2020 16:08:15 +0000 https://www.lprp.fr/?p=4289 Suite à une réinstallation de Windows 10, l’occasion de fait un point sur les logiciels que j’utilise au quotidien sous Windows 10 en 2020 :

  • La base pour l’utilisation quotidienne :
    • Navigateur Google Chrome, pour le surf Internet bien sûr, et utiliser les services GMail, Drive, Feedly, Pocket, Whatsapp
    • LibreOffice pour l’usage bureautique ; j’ai opté pour cette suite logicielle depuis StarOffice, puis OpenOffice.org, et maintenant LibreOffice, et pour un usage personnel c’est absolument parfait.
    • Spotify en client lourd, plus agréable que l’interface web
    • Skype
    • Un client VNC pour me connecter à mon serveur Linux ; j’utilise une vieille version portable de VNC Viewer 5.3 de RealVNC, leur dernière version étant insupportable. J’installe en complément un TightVNC qui me sert comme serveur VNC pour mon Windows.
    • Thunderbird, pour avoir une copie locale de mes mails ; pour l’usage des mails j’utilise l’interface GMail web, pour pouvoir utiliser mes mails de n’importe quel device.
    • KeePass (en version portable), pour la gestion de mes mots de passe
    • SyncThing (via l’IHM SyncTrayzor) pour la synchronisation et sauvegarde de mes documents avec mon serveur et autres devices
    • GoodSync pour la synchronisation périodique de mes autres contenus plus gros ; c’est un logiciel payant très performant qui permet un contrôle total sur les synchronisations et qui s’est montré jusqu’à présent très fiable. J’ai eu un peu de mal à télécharger la version qui correspond à ma licence car visiblement l’éditeur souhaite y mettre fin. C’est normal, les éditeurs de logiciels payants ne peuvent pas maintenir pendant des années gratuitement leurs logiciels, mais il est probable que j’évaluerais la capacité de SyncThing avant d’envisager de le racheter pour la troisième fois.
    • Insync pour la synchronisation des fichiers de plusieurs comptes Google Drive ; c’est un logiciel payant dont j’ai pu bénéficier d’une licence gratuite pendant leur phase de test, bien utile depuis que Google a remplacé son client par le ‘bizarre’ Sync and Backup et qui ne supportait toujours pas plusieurs comptes
  • Pour le développement :
    • SciTE, l’éditeur de Scintilla, qui est gratuit, très léger, et très efficace pour l’édition rapide d’un fichier seul.
    • VSCode qui est gratuit, multiplateforme, relativement léger par rapport à ses concurrents, et dispose d’un formidable écosystème d’extensions ; je ne lui reproche que sa déroutante “palette” et l’absence de menus/toolbars classiques. C’est mon éditeur par défaut dès que je travaille sur un projet et que SciTE devient limité, et pour des projets python/js/php.
    • Visual Studio Community pour les projets C/C++  même si sa taille XXXL a tendance à m’exaspérer, que je galère à chaque nouvelle édition pour retrouver un environnement fonctionnel, et que je n’en utilise sans doute pas 1% des possibilités, cela reste le meilleur pour l’édition et débogage C/C++ sous Windows. C’est mon IDE principal pour la maintenance de RPhoto, xmlTreeNav & libxmldiff.
    • VMWare Player pour la gestion des machines virtuelles, que je préfère depuis quelques années à VirtualBox pour son mode non persistant des disques virtuels (qui n’est malheureusement plus disponibles dans l’IHM, mais qu’on peut ajouter à la main dans les fichiers VMX) : cela permet ainsi de tester n’importe quel logiciel mais de garder une image disque toujours propre. Sous Linux j’utilise plutôt QEmu-KVM qui permet plus facilement un accès VNC sur la VM.
    • PoEdit pour la localisation des applications et l’édition des fichiers .po
    • PuTTY pour l’accès en SSH à mon serveur Linux (lorsque VNC ne marche plus) ou à un raspberry.
    • VcXsrv qui est un serveur X gratuit pour Windows, et qui permet ainsi d’avoir accès à l’interface graphique d’un Ubuntu installé sous Windows via le Windows Subsystem for Linux (WSL). J’ai surtout utilisé pour tester car au final je préfère quand même utiliser une VM
    • InnoSetup et son Studio pour la création des installeurs (même si personnellement je préfère toujours les versions portables c’est principalement ce qu’utilisent les personnes qui téléchargent RPhoto / xmlTreeNav)
  • Pour la 3D / maker : 
    • Fusion 360, la référence pour la modélisation 3D dans le monde des makers, un grand merci à Autodesk d’offrir cette suite professionnelle gratuitement aux makers, que ce soit pour la modélisation paramétrique, la simulation,…
    • Cura, un slicer 3D puissant mais qui reste simple d’accès
    • OpenSCAD, lorsque je suis suffisamment motivé pour faire une pièce via ce langage de programmation ; l’avantage est l’intégration native de la gestion paramétrique dans Thingiverse, mais le langage devient très galère dès l’utilisation de fillet ou thread…
    • Fritzing pour l’édition des projets arduino ; cet outil permet de gérer à un même endroit le circuit électronique et le code
  • Autres programmes / utilitaires :
    • 7-zip pour une gestion un peu plus puissante des archives qu’en standard dans Windows
    • Cyberlink Power2Go & Media Player dont le mérite est d’être fourni avec mon PC pour la gravure DVD et la licence codec MPEG2 ; même si je ne me souviens même plus de la dernière gravure, ou même dernière utilisation d’un CD… Sans doute mon dernier PC avec un lecteur…
    • ElitechLog_Win qui me permet la lecture des enregistrements d’un enregistreur de température Elitech RC-4
    • GeoSetter qui permet de manipuler les coordonnées GPS de photos. Cela permet notamment de géocoder des photos prises en voyages avec une trace GPS enregistrée sur son téléphone (ou simplement via celle que Google construit automatiquement pour vous et qui est téléchargeable, mais moins précise que celle que vous pourrez enregistrer)
    • FSViewer pour trier facilement les photos
    • Minitool Partition Wizard Pro, un super gestionnaire de partition très puissant, qui dispose d’une version gratuite déjà très utile, et dont j’ai pu avoir une licence Pro via un ‘giveaway’
    • Les nouveaux PowerToys microsoft, notamment pour le PowerRename
    • FreeCommander notamment pour trier/ranger des fichiers plus facilement avec le système de double panneaux
    • LiberKey pour l’installation d’un certain nombre de programmes portables utilisés ponctuellement, comme Gimp, Inkscape, Firefox, VLC
  • Dans les outils Windows, notamment :
    • “Assistance rapide” pour le dépannage à distance de PC, qui est super simple à utiliser et très efficace
    • “Capture d’écran et croquis” pour mes captures d’écran

J’ai également accumulé au fur et à mesure des années une important logithèque de programmes et utilitaires portables que j’utilise somme toute assez peu, ainsi qu’une toolbox de petites pépites légères et très efficaces, dont je ne vais pas donner la liste exhaustive mais quelques exemples :

  • AutoCopy, très utile pour numériser en masse sa collection de Cd / Dvd avant de ne plus avoir de lecteur pour les lire
  • DriveSort, qui permet de définir l’ordre des fichiers dans la table des fichiers, très utile pour les lecteurs MP3 qui prennent l’ordre par défaut de la table des fichiers
  • h2testw, un indispensable pour tester chaque clé USB / carte SD après achat pour vérifier que la capacité réelle est bien disponible sans perte de fichier (et que ce n’est pas une contrefaçon chinoise qui fait croire que vous avez 32Go alors qu’il n’y a que 2Go de mémoire)
  • TreeComp pour comparer des arborescences importantes 
  • TreeSizeFree pour identifier les dossiers les plus volumineux
  • WiFiGuard (dans sa dernière version gratuite avant que ça devienne payant) pour surveiller les périphériques connectés sur le WiFi
  • WinSCP, l’alter ego de PuTTY pour la copie de fichier via SSH
  • Disk2VHD, pour convertir des disques physiques en disques virtuels VHDX
  • UPX pour compresser bon nombre d’executables de cette toolbox

Voilà pour cet état des lieux des logiciels Windows que j’utilise en 2020. Cette liste évolue lentement, je regrette de ne pas en avoir fait avant pour voir l’évolution, j’essaierai de refaire l’exercice dans 5-10 ans voir les gros changements !

]]>
https://www.lprp.fr/2020/05/logitheque-windows-2020/feed/ 0
Machine virtuelle avant réinstallation https://www.lprp.fr/2020/04/machine-virtuelle-avant-reinstallation/?utm_source=rss&utm_medium=rss&utm_campaign=machine-virtuelle-avant-reinstallation https://www.lprp.fr/2020/04/machine-virtuelle-avant-reinstallation/#respond Sat, 25 Apr 2020 14:39:38 +0000 https://www.lprp.fr/?p=4291 J’ai du réinstaller mon Windows récemment, car celui-ci s’était bizarrement corrompu au niveau des pilotes réseau et toute nouvelle installation de drivers plantait, supprimant ainsi petit à petit mes interfaces réseau. Windows 10 est cependant un OS très stable par rapport à ses prédécesseurs, car 5 ans entre deux réinstallations c’est mon record absolu. Comme toujours avant de ré-installer, quelques précautions s’imposent comme des sauvegardes, bien identifier ce qui sera à réinstaller, et pour plus de sécurité, j’ai décidé de créer une machine virtuelle de mon OS avant réinstallation.

Sur mes PCs j’ai pris l’habitude de bien distinguer une partition système des partitions de données. Ainsi lors d’une réinstallation, seule la partition système est impactée et les autres partitions ne bougent pas. Cette distinction me permet également de pouvoir faire une image disque de la partition système, au juste nécessaire, et de la stocker sur une partition non impactée.

Voici les opérations que j’ai effectuées :

  1. Pour ne copier que le juste nécessaire de la partition, j’utilise sdelete avant pour supprimer les espaces libres : sdelete -z C:  ; ce petit outil est également très utile pour vos disques de machines virtuelles qui grossissent au fur et à mesure des mises à jour. Un peu de ménage, sdelete puis le compactage de l’image disque et celle-ci reprend une taille de guèpe !
  2. Ensuite, pour créer l’image disque de la partition, un autre outil que j’utilise très souvent : Disk2VHD ; cet outil va permettre de prendre une image disque de n’importe quel disque, clé USB, carte SD, et de le convertir au format VHDX. Ce format est le format des images virtuelles des outils microsoft, et comporte l’énorme avantage de pouvoir être montés nativement par Windows simplement en double cliquant dessus. Vosu avez alors accès au contenu du disque et pouvez même le modifier. Il y a de rares cas où il est nécessaire d’attribuer une lettre de partition avec la gestion des disques de Windows (via Gestion de l’ordinateur) ; c’est le cas notamment de la partition C:. Cet outil permet également de copier des images bitlocker, ce qui est un moyen très pratique de protéger par mot de passe un ensemble de document et d’y accéder simplement.
  3. Pour l’essentiel des besoins de récupération de données, le simple accès au disque devrait être suffisant ; si cependant pour une raison vous avez besoin de booter sur votre ancien système, il est facile de créer une machine virtuelle :
    • Pour booter il est nécessaire de copier également les deux premières partitions cachées qui servent au boot, et non pas seulement la partition C: ; si comme moi vous les aviez oubliées, pas de panique, on peut les copier après avec un outil de gestion des partitions, comme par exemple MiniTool Partition ; j’utilie la version Pro que j’avais pu acquérir gratuitement car assez souvent proposé gratuitement dans les journées ‘giveaway’, mais la version gratuite devrait suffire (et sinon, je ne peux que vous conseiller de l’acheter car c’est un très bon outil).
    • Comme je souhaite utiliser VMWare Player (mais ça marcherait sans doute avec Virtual Box), il faut également convertir l’image disque en vmdk avec qemu-img (distribué avec QEmu) : qemu-img.exe convert -f vhdx -O vmdk .\HP-2020-04-26i.VHDX .\HP-2020-04-26i.vmdk
    • Puis ensuite créer sous VMWare une nouvelle machine virtuelle, ne pas créer de disque, puis éditer la machine virtuelle pour ajouter le disque existant
  4. Pour le rendre non persistent, éditer le vmx et ajouter : scsi0:0.mode = "independent-nonpersistent"   ; vous pouvez copier le vmx et ainsi disposer pour la même image disque d’une machine en mode persistent et une autre en mode non persistent, vous permettant ainsi de choisir à chaque boot.

Le premier boot sera assez long car il va installer tous les drivers des périphériques VMWare. Vous avez également intérêt à installer les outils VMTools. Pour ces opérations, sauf si vous voulez absolument garder votre disque d’origine, je vous conseille d’être en mode persistent, sinon les opérations seront à répéter à chaque boot.

]]>
https://www.lprp.fr/2020/04/machine-virtuelle-avant-reinstallation/feed/ 0
Problème de montage de clés USB sous Debian ? https://www.lprp.fr/2020/03/probleme-de-montage-de-cles-usb-sous-debian/?utm_source=rss&utm_medium=rss&utm_campaign=probleme-de-montage-de-cles-usb-sous-debian https://www.lprp.fr/2020/03/probleme-de-montage-de-cles-usb-sous-debian/#respond Mon, 30 Mar 2020 18:34:48 +0000 https://www.lprp.fr/?p=4273 Si depuis une mise à jour de Debian vous avez lors de l’insertion d’une clé USB une demande d’authentification suivi d’un vilain message “Not authorized to perform operation”, le problème vient certainement de udisks2 + polkit. En effet, la police par défaut distribuée avec Debian est quelque peut restrictive et demande les droits administrateurs pour ces opérations. Avec l’authentification de l’utilisateur normal, le message d’erreur s’explique.

Pour autoriser votre utilisateur sur ces opérations, il faut ajouter une règle qui va surcharger la police par défaut. Créer un fichier automount.pkla  dans le répertoire /etc/polkit-1/localauthority/50-local.d/  avec le contenu suivant :

[Allow Automount]
Identity=unix-group:plugdev
Action=org.freedesktop.udisks2.filesystem-mount*
ResultAny=yes
ResultInactive=yes
ResultActive=yes

[Allow Eject]
Identity=unix-group:plugdev
Action=org.freedesktop.udisks2.eject-media*
ResultAny=yes
ResultInactive=yes
ResultActive=yes

[Allow Mounting of fstab]
Identity=unix-group:plugdev
Action=org.freedesktop.udisks2.filesystem-fstab*
ResultAny=yes
ResultInactive=yes
ResultActive=yes

[Allow Unlock]
Identity=unix-group:plugdev
Action=org.freedesktop.udisks2.encrypted-unlock*
ResultAny=yes
ResultInactive=yes
ResultActive=yes

Si ce n’est pas déjà fait, ajoutez votre utilisateur au groupe plugdev  et redémarrez la session.

Par ailleurs si les partitions de vos clés USB ne s’affichent pas comme il vous plait, c’est sans doute qu’il n’y a pas de label. Ajoutez-le suivant le type de partition :

  • ext2/3/4 : e2label /dev/<your device> "your label"
  • fat32 : fatlabel /dev/<your device> "yourlabel"

Et pour essayer tout ça sans devoir physiquement retirer/remettre le périphérique USB, un script très pratique sur cette page.

]]>
https://www.lprp.fr/2020/03/probleme-de-montage-de-cles-usb-sous-debian/feed/ 0
Nettoyer son mécanisme WC plutôt que le changer https://www.lprp.fr/2020/03/nettoyer-son-mecanisme-wc-plutot-que-le-changer/?utm_source=rss&utm_medium=rss&utm_campaign=nettoyer-son-mecanisme-wc-plutot-que-le-changer https://www.lprp.fr/2020/03/nettoyer-son-mecanisme-wc-plutot-que-le-changer/#respond Sun, 08 Mar 2020 18:05:16 +0000 https://www.lprp.fr/?p=4246 Cette semaine mon mécanisme de WC s’est mis à refuser énergiquement de remplir à nouveau la cuve. Comme c’est un problème assez gênant… sans réfléchir je suis allé en acheter un autre. Lorsque je l’ai changé, j’ai constaté qu’il ne semblait pas si abîmé que ça, et que du calcaire s’était déposé et empêchait simplement que le flotteur coulisse correctement, et dans mon cas il ne tombait plus lorsque l’eau descendait.

J’ai donc décidé de voir ce que ça donnait avec un peu de nettoyage. Avec un peu d’antikal et une éponge, le calcaire disparaît en moins de deux. J’en ai profité pour un démontage complet pour bien nettoyer à l’intérieur les différentes saletés qui peuvent également gêner le dispositif, notamment au niveau de la membrane à pression. Une fois remonté, le flotteur coulisse à nouveau parfaitement. A défaut d’avoir économisé l’achat d’un nouveau modèle, j’ai maintenant un modèle de rechange 🙂

   

 

A cette occasion j’ai pu constater un nouvel exemple d’obsolescence programmée. En effet, impossible de couper mon robinet d’arrêt. Il se trouve en fait que si le robinet lui même est bien en métal, le capuchon qui sert pour fermer le robinet est en plastique. Le plastique est recouvert d’une peinture métal… bien malin celui qui pourra identifier le plastique depuis le blister en magasin… Avec le temps, le robinet se grippe un peu, et par conséquent le plastique ne résiste pas et la petite languette de maintien se casse. On peut voir d’ailleurs qu’elle est très fine et que rien n’est fait pour la renforcer. C’est sûr qu’une fois cassé on est très tentés de remplacer le robinet, qui pourtant fonctionne encore parfaitement avec une clé à molette.

J’ai modélisé en 3D une pièce pour remplacer le capuchon cassé en plus compact pour que ça soit plus pratique chez moi. J’avais peur que le plastique ne soit pas assez solide, mais il se comporte parfaitement sur mes robinets qui sont pourtant devenus assez durs.

Lien vers le modèle sous Thingiverse : https://www.thingiverse.com/thing:4234619

]]>
https://www.lprp.fr/2020/03/nettoyer-son-mecanisme-wc-plutot-que-le-changer/feed/ 0