<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Grimoire-Command.es</title><link href="https://grimoire.d12s.fr/" rel="alternate"/><link href="https://grimoire.d12s.fr/feed/atom" rel="self"/><id>https://grimoire.d12s.fr/</id><updated>2026-03-18T00:00:00+01:00</updated><subtitle>GNU+Linux command memo</subtitle><entry><title>Migration sous SailfishOS</title><link href="https://grimoire.d12s.fr/2026/sailfishos_discovery.html" rel="alternate"/><published>2026-03-18T00:00:00+01:00</published><updated>2026-03-18T00:00:00+01:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2026-03-18:/2026/sailfishos_discovery.html</id><summary type="html">&lt;div id="toc" class="toc"&gt;
&lt;div id="toctitle"&gt;Index&lt;/div&gt;
&lt;ul class="sectlevel1"&gt;
&lt;li&gt;&lt;a href="#_version_en"&gt;1. version : en&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_version_fr"&gt;2. version : fr&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_sailfish_os_jconnais_le_mot_oui_jai_un_copain_qui_fait_ça_mais"&gt;3. Sailfish OS ? j&amp;#8217;connais le mot oui, j&amp;#8217;ai un copain qui fait ça, mais…&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_choisir_un_téléphone"&gt;4. Choisir un téléphone&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_démarrer_un_téléphone_avec_sailfish_os"&gt;5. Démarrer un téléphone avec Sailfish OS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_au_démarrage"&gt;6. Au démarrage&lt;/a&gt;
&lt;ul class="sectlevel2"&gt;
&lt;li&gt;&lt;a href="#_applications_bancaires"&gt;6.1. Applications bancaires&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_rodéo"&gt;6.2. Rodéo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_stockage_chiffré"&gt;6.3. Stockage chiffré&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_import_des_contacts_via_nextcloud"&gt;6.4 …&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;</summary><content type="html">&lt;div id="toc" class="toc"&gt;
&lt;div id="toctitle"&gt;Index&lt;/div&gt;
&lt;ul class="sectlevel1"&gt;
&lt;li&gt;&lt;a href="#_version_en"&gt;1. version : en&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_version_fr"&gt;2. version : fr&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_sailfish_os_jconnais_le_mot_oui_jai_un_copain_qui_fait_ça_mais"&gt;3. Sailfish OS ? j&amp;#8217;connais le mot oui, j&amp;#8217;ai un copain qui fait ça, mais…&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_choisir_un_téléphone"&gt;4. Choisir un téléphone&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_démarrer_un_téléphone_avec_sailfish_os"&gt;5. Démarrer un téléphone avec Sailfish OS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_au_démarrage"&gt;6. Au démarrage&lt;/a&gt;
&lt;ul class="sectlevel2"&gt;
&lt;li&gt;&lt;a href="#_applications_bancaires"&gt;6.1. Applications bancaires&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_rodéo"&gt;6.2. Rodéo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_stockage_chiffré"&gt;6.3. Stockage chiffré&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_import_des_contacts_via_nextcloud"&gt;6.4. Import des contacts via NextCloud&lt;/a&gt;
&lt;ul class="sectlevel3"&gt;
&lt;li&gt;&lt;a href="#_agenda_synchronisés_caldav_et_ics"&gt;6.4.1. Agenda synchronisés CalDav et ICS&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#_cas_dusages_et_applications"&gt;7. Cas d&amp;#8217;usages et applications&lt;/a&gt;
&lt;ul class="sectlevel2"&gt;
&lt;li&gt;&lt;a href="#_photos_et_imageworks"&gt;7.1. Photos et Imageworks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_guidage_gps"&gt;7.2. Guidage GPS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_kagi_com_et_le_navigateur_web_par_défaut"&gt;7.3. Kagi.com et le navigateur web par défaut&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_copie_de_wikipedia_hors_ligne"&gt;7.4. Copie de Wikipedia hors-ligne&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_torbrowser"&gt;7.5. TorBrowser&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_trousseau_otp"&gt;7.6. Trousseau OTP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_lecteur_émetteur_de_qr_code"&gt;7.7. Lecteur / émetteur de QR code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_lecture_de_livre_au_format_epubs_pdf_et_cbz"&gt;7.8. Lecture de livre au format ePubs (PDF et CBZ)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_mieux_quandroid_tooter"&gt;7.9. Mieux qu&amp;#8217;Android ? (Tooter)&lt;/a&gt;
&lt;ul class="sectlevel3"&gt;
&lt;li&gt;&lt;a href="#_sailtrix_le_client_matrix"&gt;7.9.1. Sailtrix, le client Matrix&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_whisperfish_le_client_signal"&gt;7.9.2. Whisperfish, le client Signal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_arcanechat_le_client_delta_chat"&gt;7.9.3. ArcaneChat, le client Delta-Chat&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#_jeux_et_gadgets"&gt;8. Jeux et gadgets&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_backup_du_système"&gt;9. Backup du système&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_blocage_dappels_et_enregistrement_des_appels"&gt;10. Blocage d&amp;#8217;appels et enregistrement des appels&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_lexplorateur_de_fichier_file_browser"&gt;11. L&amp;#8217;explorateur de fichier : File Browser&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_storeman_la_2e_logithèque"&gt;12. Storeman, la 2e logithèque&lt;/a&gt;
&lt;ul class="sectlevel2"&gt;
&lt;li&gt;&lt;a href="#_wireguard"&gt;12.1. WireGuard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_fishobd"&gt;12.2. FishOBD&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_améliorer_le_guidage_gps_avec_pure_maps"&gt;12.3. Améliorer le guidage GPS avec Pure Maps&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_améliorer_le_claver_avec_okboard_et_multi_keyboard_layouts"&gt;12.4. Améliorer le claver avec OKboard et Multi Keyboard Layouts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_lecture_nfc_ndefined_storeman"&gt;12.5. Lecture NFC : NDEFined (Storeman)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_advanced_camera"&gt;12.6. Advanced Camera&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#_chum"&gt;13. Chum&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_patchmanager"&gt;14. Patchmanager&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_notes_sur_le_quotidien"&gt;15. Notes sur le quotidien&lt;/a&gt;
&lt;ul class="sectlevel2"&gt;
&lt;li&gt;&lt;a href="#_autonomie_50_de_batterie_utilisée_par_jour_de_80_à_30"&gt;15.1. Autonomie : 50% de batterie utilisée par jour (de 80% à 30%)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_empreintes_digitales"&gt;15.2. Empreintes digitales&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_un_bon_son"&gt;15.3. Un bon son&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_nextcloud_notes"&gt;15.4. NextCloud Notes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#_en_conclusion"&gt;16. En conclusion&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_version_en"&gt;1. version : en&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Contribution welcome.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_version_fr"&gt;2. version : fr&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Où comment j&amp;#8217;ai migré tous mes usages numériques mobiles sur Sailfish OS en un samanche&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Résumé : Sailfish OS est un système d&amp;#8217;exploitation GNU+Linux pour téléphone portable qui bénéficie d&amp;#8217;une maintenance professionnelle depuis plus de 10 ans. Il peut fonctionner sur une dizaine d&amp;#8217;appareils dont plusieurs encore d&amp;#8217;actualité. Avec Sailfish OS, vous êtes root sur votre mobile, tout simplement. Et puis vous êtes au pays d&amp;#8217;F-Droid, mais sans menace sur l&amp;#8217;avenir. Les applications viennent sous forme de paquets RPM normaux et vous pouvez vraiment modifier le système depuis le terminal. D&amp;#8217;ailleurs les options développeur permettent, d&amp;#8217;un clic, d&amp;#8217;activer le serveur SSH embarqué. Dans ce billet, je détaille comment j&amp;#8217;ai migré mes 15 usages numériques mobiles en espérant vous faire gagner du temps pour votre propre migration.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_sailfish_os_jconnais_le_mot_oui_jai_un_copain_qui_fait_ça_mais"&gt;3. Sailfish OS ? j&amp;#8217;connais le mot oui, j&amp;#8217;ai un copain qui fait ça, mais…&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Je me suis souvenu de Jolla et de son Sailfish OS à l&amp;#8217;occasion de la campagne actuelle de pré-commande du téléphone haut de gamme nommé J2 qu&amp;#8217;ils sont entrain de faire produire.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Malgré tous les efforts que je fais pour éviter le colonialisme numérique américain, je ne m&amp;#8217;étais pas encore suffisamment penché sur la question. Je m&amp;#8217;étais arrêté, il y a 10 ans, à des broutilles comme : les paquets c&amp;#8217;est du RPM c&amp;#8217;est pas ma famille, en plus c&amp;#8217;est basé sur Systemd… ou sur des considérations de politique internationale brillamment rendues caduques depuis (Jolla a survécu et rompu son partenariat russe depuis le début de la tentative actuelle d&amp;#8217;invasion de l&amp;#8217;Ukraine par la Russie).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;a href="https://linuxfr.org/users/siltaar/journaux/alors-il-est-bien-le-fairphone-2" class="bare"&gt;https://linuxfr.org/users/siltaar/journaux/alors-il-est-bien-le-fairphone-2&lt;/a&gt; (il y a bien là des gens qui ont tenté de me faire gagner 8-9 ans d&amp;#8217;errance et je les en remercie)&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;À l&amp;#8217;époque entre FirefoxOS, Ubuntu Touch et puis PinePhone et Librem… je croyais avoir le choix.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Avec cette actualité côté Jolla je me suis dit que ça valait la peine de se repencher sur cette possibilité. À vrai dire, je me suis également souvenu qu&amp;#8217;un ami m&amp;#8217;avait détaillé son quotidien avec un téléphone sous Ubuntu Touch (UBports) il y a 4-5 ans dans une colloc' avec Lunar en marge des JDLL je crois… Son propos pouvait se résumer à la maxime du film « Les enfants du marais » sur le bonheur de ne manquer de rien (sans pour autant rouler sur l&amp;#8217;or).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Je me suis donc mis en quête d&amp;#8217;un obstacle majeur pour m&amp;#8217;éviter d&amp;#8217;avoir à changer mes habitudes, mais je n&amp;#8217;en ai pas trouvé. Et puis, quelqu&amp;#8217;un a eu besoin d&amp;#8217;un téléphone pour Noël dans ma famille alors l&amp;#8217;idée de déménager sur Sailfish OS avant la fête et pouvoir ainsi offrir mon appareil (connu, fiable et bien entretenu) m&amp;#8217;a encouragée.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;J&amp;#8217;ai cherché plus en détail si tous mes usages habituels de smartphone seraient couvert par ce nouvel écosystème, et des pistes sont apparues dans tous les domaines. En plus en cas de doute Jolla annonce que la version payante de son Sailfish OS est en mesure de faire fonctionner les applications Android via une « couche de compatibilité ». Le système propose même directement d&amp;#8217;installer F-Droid et Aurora Store en fin de parcours d&amp;#8217;accueil ce qui promet une transition en douceur.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Dans mon cas il y avait toutefois également des solutions « natives » Sailfish OS à tester pour chaque usage. L&amp;#8217;espoir d&amp;#8217;avoir un téléphone sous GNU+Linux sans plus rien d&amp;#8217;Android à la fin faisait briller une belle lumière au bout de ce tunnel.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;J&amp;#8217;avais 2 semaines avant les fêtes, j&amp;#8217;étais large !&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_choisir_un_téléphone"&gt;4. Choisir un téléphone&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;C&amp;#8217;est la partie où on se fait plaisir en faisant du lèche-vitrine sur les modèles supportés. Dans mon cas le choix fut assez rapide car mon critère principal c&amp;#8217;est la largeur de l&amp;#8217;appareil. Les mobiles peuvent évoluer autant qu&amp;#8217;ils veulent (jusqu&amp;#8217;à flirter avec les tablettes) mes mains elles ne grandissent plus. Jusqu&amp;#8217;ici le téléphone que j&amp;#8217;ai préféré fut le Fairphone 1 : il avait des dimensions idéales. Dernièrement j&amp;#8217;utilisais un Samsung Galaxy S10e, y&amp;#8217;avait plus rien de libre là dedans, mais il faisait de belles photos…&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;J&amp;#8217;ai compilé quelques infos sur les téléphones un peu éthiques supportant Sailfish OS ou Ubuntu Touch (en commençant par le Fairphone 1, et en mentionnant le S10e pour comparaison) :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;Fairphone 1  : 126 × 64 × 10 mm (170g)
Xperia 5 IV  : 156 x 67 x 8,2 mm (172g) (*)
Xperia 10 III: 154 x 68 x 8,3 mm (169g) ***
Samsung S10e : 142 × 70 × 8 mm (150g)
Xiaomi Mi 6  : 145 x 70 x 7,45mm (168g) -*-&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Fracture&lt;/p&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;Fairphone 6  : 156 × 73 × 9.6 mm (193g) (*)
Jolla J2     : 158 × 74 × 9 mm  (-?-g) (***)
Librem 5     : 152 x 74 x 15 mm (262g)
Volla phon.22: 157 x 75 x 10 mm (210g) -*-
Fairphone 5  : 162 × 76 × 9.6 mm (212g) -*-
FLX1         : 170 x 76 x 8 mm (200g)
Pinephone    : 160 × 77 × 9,2 mm (185g) -*-
Jolla C2     : 179 x 78 x 8.5mm ***&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;Légende :
-*- : utilisables avec SailfishOS
*** : officiellement supporté
(*) : bientôt utilisables
(***) : bientôt officiellement supporté&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Les modèles supportés par Ubuntu Touch avec des largeurs acceptables sont à ce jour tous trop anciens et je n&amp;#8217;ai pas le temps d&amp;#8217;attendre la sortie du J2. Le C2 lui est vraiment trop large (et pas ouf non plus niveau specs).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;C&amp;#8217;est là qu&amp;#8217;il convient de préciser que si Jolla a survécu 13 ans principalement en régime de vache maigre, ils ont appris à être efficaces et à ne pas s&amp;#8217;éparpiller. Entre deux campagnes de production de téléphone pour un marché des BRICS (Jolla C, C2…) ils se concentrent sur le fait de supporter commercialement un modèle de mobile de multinationale, un seul. Ils ont choisi les Sony Xperia 10 (l&amp;#8217;entrée de gamme d&amp;#8217;un constructeur prestigieux). C&amp;#8217;est un choix raisonnable quant à la qualité des appareils, leur disponibilité d&amp;#8217;occasion, leur prix, leur puissance et même leur largeur !&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Je dégaine donc LeBonCoin et me fait livrer un modèle Xperia 10 III pour 110€ (c&amp;#8217;est le plus récent qui soit officiellement supporté par Jolla). S&amp;#8217;ajoute à ça la licence logicielle annuelle à verser à Jolla pour la modique somme de 24,90€ et on devrait pouvoir passer à l&amp;#8217;étape suivante.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Bon mais tout d&amp;#8217;abord, moment d&amp;#8217;émotion, j&amp;#8217;ai 42 ans et c&amp;#8217;est la première fois de ma vie que je paye une licence logicielle. Rien que de prononcer le terme ça me fait venir des boutons. Mais là j&amp;#8217;suis pressé et j&amp;#8217;ai pas envie de me plonger moi-même dans la configuration de la version communautaire du support des applications Android sur GNU+Linux (Anbox, Alien Dalvik, Waydroid ?). Alors je vois d&amp;#8217;un bon œil que des anciens de chez Nokia me proposent le truc clé en main pour 2€ / mois. En fait je verse 5€ / mois à l&amp;#8217;April.org (et 5 autres à MSF) depuis 2002, je peux bien m&amp;#8217;offrir Linux sur mon téléphone portable pour moins de la moitié de chacunes de ces sommes !?&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Et puis au delà du montant, l&amp;#8217;idée c&amp;#8217;est de changer de paradigme dans ma façon de consommer. Si je ne veux plus de cette société de capitalisme de surveillance, il me faut bien trouver des alternatives de confiance. Puisque je ne peux pas tout faire moi-même, j&amp;#8217;suis ravi de trouver à acheter du service honnête, sans pub et sans cynisme. J&amp;#8217;suis en fait plutôt rassuré de le payer, ce service et donc d&amp;#8217;avoir une vrai relation client / producteur et les droits qui vont avec et me protègent.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Les acteurs du web qui proposent des services "gratuits" mais bourrés de publicités (les plus ciblées possibles) vendues aux enchères dans les premières millisecondes du chargement de vos pages web, ils ne sont pas honnêtes. Les Google, les Facebook, on les retrouve à trafiquer les élections derrière… Et puis c&amp;#8217;est pas comme pour l&amp;#8217;état, là on parle d&amp;#8217;une mafia dont on peut se passer. Il suffit de le décider, et je m&amp;#8217;en vais vous le montrer !&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_démarrer_un_téléphone_avec_sailfish_os"&gt;5. Démarrer un téléphone avec Sailfish OS&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Une fois le téléphone reçu, l&amp;#8217;aventure pu commencer. Mais faisons un pas de côté pour étudier un autre scénario que le mien, si vous êtes pressés et malins, prenez votre mobile chez :
&lt;a href="https://buy.jolla-devices.com/" class="bare"&gt;https://buy.jolla-devices.com/&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;C&amp;#8217;est un peu plus cher, mais ça vous économisera les 2h que j&amp;#8217;ai passées à installer Sailfish OS sur le téléphone. On parle d&amp;#8217;une procédure en 40 étapes, dont l&amp;#8217;ouverture d&amp;#8217;un compte chez Sony pour débloquer le bootloader du téléphone et télécharger le système Android d&amp;#8217;origine de l&amp;#8217;appareil… sans oublier qu&amp;#8217;il faut impérativement le brancher sur un port USB2 pour réussir à flasher l&amp;#8217;image de Sailfish OS à la fin, via adb en ligne de commande… Alors qu&amp;#8217;avec un « Jolla-device » vous avez juste à appuyer sur le bouton pour qu&amp;#8217;il démarre. Mon premier réflexe fut certes de tout faire moi-même, mais si c&amp;#8217;était à refaire je ne sais pas si ça m&amp;#8217;amuserait encore.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_au_démarrage"&gt;6. Au démarrage&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Au démarrage, c&amp;#8217;est la grande classe, le cœur battant on arrive dans une procédure d&amp;#8217;accueil qui explique comment on navigue dans Sailfish OS : tout d&amp;#8217;une main et par glissades sur l&amp;#8217;écran (le système n&amp;#8217;ayant besoin d&amp;#8217;aucun bouton physique).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;C&amp;#8217;est ingénieux et ça se révèle pratique au quotidien. Il y a d&amp;#8217;ailleurs d&amp;#8217;autres idées originales à découvrir comme ça.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;J&amp;#8217;ai décris il y a quelques années les procédures de démarrage d&amp;#8217;un Android 12, puis devant le succès du billet, d&amp;#8217;un Windows 10 :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://grimoire.d12s.fr/2022/initialisation_android_2022.html#_version_fr" class="bare"&gt;https://grimoire.d12s.fr/2022/initialisation_android_2022.html#_version_fr&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://grimoire.d12s.fr/2022/initialisation_windows_2022.html#_version_fr" class="bare"&gt;https://grimoire.d12s.fr/2022/initialisation_windows_2022.html#_version_fr&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Il y a presque autant d&amp;#8217;étapes dans ces procédures d&amp;#8217;accueil que l&amp;#8217;installation manuelle de Sailfish OS, avec, chez ces géants du numérique capables de mettre des millions dans une interface graphique, toute la prestidigitation possible en terme de Dark pattern pour te faire croire que tu DOIS ouvrir un compte chez Google, et puis un autre, juste après, chez Samsung… Que sinon t&amp;#8217;auras pas accès au catalogue d&amp;#8217;applications, ni même à une calculatrice une fois arrivé (enfin !) sur le bureau (ni de thème Samsung sombre pour ton écran OLED ! La misère quoi). Mais ce qui a fait le succès de ces billets, c&amp;#8217;est l&amp;#8217;incrédulité des gens qui découvraient à cette occasion qu&amp;#8217;il est possible de ne pas se connecter à Google Play, ni au "store" de Samsung. Que le téléphone démarre quand même…&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Bon, avec Jolla le compte tu l&amp;#8217;as ouvert avant de démarrer le téléphone et tu ne peux rien acheter d&amp;#8217;autre avec. Toutefois ce compte permet de se connecter au forum de la communauté Jolla. Parce que Sailfish OS, un peu comme Fairphone, c&amp;#8217;est aussi une communauté animée en ligne sur un forum moderne (Discourse). Cette approche est encore le meilleur moyen, pour les petites entreprises (comme Fairphone et Jolla) de moissonner les bonnes volontés des plaines fertiles du logiciel libre (et d&amp;#8217;économiser sur le service client en laissant les utilisateurs se répondre entre eux).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Au passage, le forum de Sailfish OS est bien vivant. Il compte, début 2026, un peu plus de 3500 membres si on en croit le nombre de badges utilisateur "Basic" attribués. La communauté me semble plutôt active puisqu&amp;#8217;environ 2500 utilisateurs ont reçu un "Like" et presque autant en on donné, pour à peine 150 membres ayant pris la peine de renseigner une biographie (et pas tout à fait autant, de suivre le tutoriel des utilisateurs avancés). 40 sujets ont dépassé les 20k vues, 8 sujets ont dépassé les 50k vues et les deux stars ont atteint 95k vues pour l&amp;#8217;annonce du lancement de Whisperfish et 353k vues pour l&amp;#8217;annonce de la fusion du Mer project dans Sailfish OS en août 2020.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;En fin de procédure d&amp;#8217;accueil de Sailfish OS, on a un écran permettant de choisir quelques applications à installer directement depuis la logithèque officielle (à laquelle on est identifié via son compte Jolla). On retrouve dans cette sélection la couche de compatibilité Android (qui est donc désinstallable) et avec cette dernière les logithèques F-Droid et Aurora Store.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Apercevoir ces icônes familières est assez réconfortant après toutes ces nouveautés.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;On retrouve dans cette logithèque officielle :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;une extension du Système pour se connecter à du VPN (Open Forti)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;une application dictaphone (Audio Recorder)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;l&amp;#8217;extension d&amp;#8217;écriture prédictive pour le clavier (la liste de mots que vous semblez avec commencé à écrire… et qui est donc réservée à la version payante de Sailfish OS)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;une calculatrice (parce que c&amp;#8217;est décidément la carotte choisie pour vous intéresser aux places de marcher logicielles dans la téléphonie mobile)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;un calendrier&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;une visionneuse de documents&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;un client mail&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;un lecteur multimédia (basé sur VLC)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;une application de prise de notes…&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;J&amp;#8217;ai donc pu rapidement commencer à cocher des cases dans l&amp;#8217;inventaire de mes usages mobiles. Regardons un peu cette liste, il me fallait :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;des clients de messagerie chiffrée : Signal, Delta-Chat, Element (Matrix)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;un client Mastodon&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;une appli météo&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;le lien sur le bureau avec les horaires des déchèteries alentour…&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;de la photo (avec édition des photos depuis le téléphone, parce que j&amp;#8217;ai pris de mauvaises habitudes avec le Samsung…)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;du stockage chiffré sur carte SD&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;des contacts, notes et agendas synchronisés NextCloud&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;un logiciel de guidage GPS (un peu plus performant qu&amp;#8217;OSMand en matière de recherche d&amp;#8217;adresses si possible)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;l&amp;#8217;intégration de mon abonnement au moteur de recherche Kagi.com&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;du TorBrowser pour lire la presse&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;une copie de Wikipedia hors-ligne (d&amp;#8217;ailleurs on me demande souvent de ne pas finir la lecture des pages ouvertes pour documenter les discussions lors des repas de famille ; je ne comprends pas bien ce manque de curiosité…)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;un trousseau OTP (parce que 7 services m&amp;#8217;ont imposé cet usage au cours de la dernière décennie)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;un logiciel de lecture OBD (pour effacer les codes d&amp;#8217;erreur avant un contrôle technique quand on roule à l&amp;#8217;éthanol en Prius)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;de quoi lire des ePub et des PDF (et j&amp;#8217;vous parlerai des .cbz aussi)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;avant le Samsung, quand j&amp;#8217;utilisais un Android rooté j&amp;#8217;utilisais un VPN (WireGuard) et un enregistreur d&amp;#8217;appels téléphoniques… (et un limitateur de charge batterie, mais ça ça a été intégré dans à peu près tous les systèmes, tout comme les filtres rouges pour l&amp;#8217;écran la nuit)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;un logiciel de filtrage des appels entrant pour éviter le démarchage téléphonique (j&amp;#8217;ai récemment découvert SpamBlock sur Android et c&amp;#8217;est rudement efficace en France avec cette configuration : &lt;a href="https://pled.fr/spamblocker-pour-le-telephone/" class="bare"&gt;https://pled.fr/spamblocker-pour-le-telephone/&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;et pourquoi pas quelques jeux, j&amp;#8217;aime bien : Sokoban, OpenFlood, Tetris ou Andor&amp;#8217;s Trail…&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Ça fait 15 objectifs, j&amp;#8217;ai 15 jours : j&amp;#8217;suis laaarge (et puis j&amp;#8217;ai mon plan pour la suite de ce billet).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Mais pour faire court : j&amp;#8217;ai tout activé en 12h un samanche (un samedi-dimanche… sans concession sur la colonisation des esprits j&amp;#8217;vous dit !).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;À la fin de ce sprint, je n&amp;#8217;avais installé que 5 applications Android via la couche de compatibilité. L&amp;#8217;objectif pour moi c&amp;#8217;est plutôt de pouvoir m&amp;#8217;en passer un jour, parce qu&amp;#8217;il est temps de vous le dire, la « couche de compatibilité » c&amp;#8217;est juste une machine virtuelle, lancée dans votre Linux tout propre, qui fait démarrer un système Android entier pour faire tourner vos applications préférées. Alors c&amp;#8217;est longuet à démarrer, ça rempli la RAM et même au repos ça entraine une légère surconsommation d&amp;#8217;énergie. C&amp;#8217;est certes très bien intégré dans le reste du système, mais si le but c&amp;#8217;est de se passer d&amp;#8217;Android on y est pas vraiment. Toutefois ça permet de migrer rapidement ses données et d&amp;#8217;avoir accès à la grosse logithèque Android.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Cette migration m&amp;#8217;a donc pris pas mal de temps, mais j&amp;#8217;avais tout à découvrir. En suivant ce guide vous devriez arriver au même résultat en une paire d&amp;#8217;heures (le temps que j&amp;#8217;ai mis la dernière fois pour migrer les données d&amp;#8217;Android entre deux Samsungs, en commençant par utiliser le logiciel de migration fourni par le constructeur).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Un premier raccourci peut être pris ici : &lt;a href="https://forum.sailfishos.org/t/list-of-android-sailfish-os-applications/6866" class="bare"&gt;https://forum.sailfishos.org/t/list-of-android-sailfish-os-applications/6866&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_applications_bancaires"&gt;6.1. Applications bancaires&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Autre préambule, aussi étonnant que cela puisse paraitre, beaucoup de gens s&amp;#8217;arrêtent avant d&amp;#8217;en arriver là en s&amp;#8217;écharpant au sujet des applications bancaires. Il y a effectivement des recommandations européennes pour de bons mécanismes de validations des transactions bancaires qui imposent une validation dynamique et contextuelle, via un système certifié et tout et tout (DSP3)… Et les banques n&amp;#8217;ont certifié qu&amp;#8217;Android et iOS pour l&amp;#8217;instant. Donc en théorie les applications bancaires sont obligatoires et elles peuvent exiger un niveau de compatibilité Android supérieur à ce que Sailfish OS peut proposer aujourd&amp;#8217;hui (sans perspective d&amp;#8217;amélioration immédiate). C&amp;#8217;est un risque.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Dans la pratique, ça fait 10 ans que les banques communiquent en mode : attention, la validation par SMS ne va bientôt plus être possible ; en espérant qu&amp;#8217;on installe leurs applications maison, à code source secret, sur nos terminaux. De ce que j&amp;#8217;ai pu tester jusque là, les banques proposent des solutions alternatives, que ce soit la validation de codes SMS puis courriel à quelques minutes d&amp;#8217;intervalle, ou l&amp;#8217;utilisation d&amp;#8217;un boîtier OTP maison. Je suis gérant de 2 entreprises, trésorier de plusieurs associations, je pratique 4 banques au quotidien et je n&amp;#8217;envisage franchement pas d&amp;#8217;installer une application bancaire qui ne viendrait pas d&amp;#8217;F-Droid…&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Ce ne serait pas raisonnable d&amp;#8217;installer sur sa machine une application dont le code n&amp;#8217;a été revu par aucun pair. Si ça se trouve elle vous espionne et siphonne votre profil, vos contacts et vos photos de vacances. En fait l&amp;#8217;association Exodus privacy a même prouvé qu&amp;#8217;elles contiennent des pisteurs, ces applications. Vraiment, plusieurs…&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Et puis ma grand-mère par exemple, elle n&amp;#8217;a pas de téléphone Android, mais sa banque veut quand même la garder comme cliente. (Y&amp;#8217;a peut être même des bouts de droit qui diraient que la banque doit conserver ses services aux clients ayant signés…)&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_rodéo"&gt;6.2. Rodéo&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Quelques mots sur Sailfish OS avant de reprendre ma liste de cas d&amp;#8217;usages. Le système est globalement zen, homogène et assez minimaliste. Beaucoup de paramètres sont réglés par défaut comme je les aimes et tant mieux parce qu&amp;#8217;on n&amp;#8217;est pas non plus noyés sous les possibilités de réglages.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Par exemple avec Android j&amp;#8217;en étais rendu à régler la force de la vibration des retours tactiles ou la puissance de la torche LED… Avec Sailfish OS on peut activer ou non les retours tactiles, et allumer ou éteindre la lampe torche. Et ça suffit bien en vrai.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Si déjà là c&amp;#8217;est la frustration qui l&amp;#8217;emporte parce qu&amp;#8217;il vous faut le dernier gadget à la mode, prenez le temps d&amp;#8217;y penser. Peut-être qu&amp;#8217;il vaudra mieux revenir plus tard, quand vous serez prêt. Sailfish OS est un système GNU+Linux, un vrai, donc une sorte de désert concernant le support du matériel récent ou un tant soit peu exotique, parce que les constructeurs ne font pas leurs choux gras avec nous. On est plus sur l&amp;#8217;essentiel que sur l&amp;#8217;accessoire avec Sailfish OS.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Mais j&amp;#8217;ai parlé de trouvailles confortables dans ce système. En effet, en plus de la navigation par glissades, il y a par exemple le saut de défilement : quand on défile une longue liste, l&amp;#8217;ascenseur de la barre de défilement est rapidement augmenté de deux boutons ajoutés en surimpression, chacun sur une moitié de la hauteur de l&amp;#8217;écran. Ces boutons permettent d&amp;#8217;aller directement tout en bas, ou de remonter tout en haut. C&amp;#8217;est typiquement le genre de fonctionnalité qui apparaît comme évidente mais manque cruellement si on doit retourner sur Android.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Au cours de mes premières semaines d&amp;#8217;utilisation j&amp;#8217;ai souvent eu l&amp;#8217;occasion de me dire que Sailfish OS était codé par des libristes, pour des libristes et, plus on avance dans les solution communautaire, plus on arrive sur des bidouilles d&amp;#8217;informaticien. Vous pourrez vous faire votre avis en lisant la suite de ce billet et je note que Jolla est une petite équipe, qu&amp;#8217;elle jardine bien sa communauté et que compte-tenu de leur moyens ils offrent quelque chose de remarquable.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Tient, un autre exemple de fonctionnalité mieux pensée côté Sailfish OS qu&amp;#8217;Android ce sont les captures d&amp;#8217;écran. Elles sont pénibles à déclencher pour tous les utilisateurs d&amp;#8217;Android avec lesquels j&amp;#8217;ai pu en parler : il faut se souvenir de la combinaison de touches pour leur modèle de téléphone, il faut avoir assez de doigts disponibles pour atteindre les touches et assez de mains pour avoir la force d&amp;#8217;enfoncer toutes les touches en même temps… Alors qu&amp;#8217;avec Sailfish OS, y&amp;#8217;a un mode « capture d&amp;#8217;écran » à activer dans le menu du volet déroulant, à côté du WiFi, du Bluetooth et du mode avion. Une fois le mode « screenshot » activé, un bouton de déclenchement s&amp;#8217;ajoute à l&amp;#8217;écran (on peut le glisser n&amp;#8217;importe où) et il suffit d&amp;#8217;appuyer dessus pour enregistrer une capture. On peut en faire plein à la suite et le bouton n&amp;#8217;est évidemment pas présent sur la capture. Là encore, c&amp;#8217;est livré avec le système, direct et intuitif.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Mais reprenons donc ma listes de cas d&amp;#8217;usage en voyons comment ça se passe avec Sailfish OS.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_stockage_chiffré"&gt;6.3. Stockage chiffré&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Au 1er démarrage de Sailfish OS, le système demande un mot de passe et chiffre le stockage interne du téléphone.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Quand on insère une carte SD, on peut la formater pour Sailfish OS (en ext4) et activer le chiffrement du volume (via LUKS). C&amp;#8217;est tout prévu tel quel, y&amp;#8217;a qu&amp;#8217;à dérouler.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Rien à voir avec : &lt;a href="https://grimoire.d12s.fr/2018/format_android_external_sdcard_in_ext4.html" class="bare"&gt;https://grimoire.d12s.fr/2018/format_android_external_sdcard_in_ext4.html&lt;/a&gt; ; l&amp;#8217;application EDS Lite plantant aléatoirement à chaque transfert de fichier vers le conteneur chiffré (j&amp;#8217;ai tenu des années à y glisser mes photos tous les mois par petits lots…).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Par contre c&amp;#8217;est sans concession sur la sécurité et il faut retourner dans les menus (Paramètres &amp;#8594; Stockage) pour monter la carte SD (en saisissant le mot de passe) à chaque redémarrage. Bon, c&amp;#8217;est du Linux, il n&amp;#8217;y a pas besoin de le redémarrer souvent…&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_import_des_contacts_via_nextcloud"&gt;6.4. Import des contacts via NextCloud&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Ça se passe dans l&amp;#8217;onglet de droite des paramètres du système. On peut y définir des comptes, y compris des comptes NextCloud pour synchroniser : contacts, agendas, images…&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Pour les contacts c&amp;#8217;est presque frustrant de ne rien avoir à en dire non plus. Il y a des procédures d&amp;#8217;import pour différentes sources, ils se synchronisent ensuite tous seuls avec le compte NextCloud. Ça juste marche.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="sect3"&gt;
&lt;h4 id="_agenda_synchronisés_caldav_et_ics"&gt;6.4.1. Agenda synchronisés CalDav et ICS&lt;/h4&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Pour les agendas, c&amp;#8217;est un autre exemple de truc plus simple dans Sailfish OS que dans Android.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Dans mon cas j&amp;#8217;agrège des agendas depuis deux instances NextCloud, des comptes Infomaniak et un site web (jourstempo.fr).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Avec Android il faut installer au minimum 3 applications depuis F-Droid pour synchroniser tout ça :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;DAVx5 : pour lire les NextCloud&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;kSync : pour lire les comptes Infomaniak&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ICSx5 : pour lire jourstempo.fr&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Avec les applis à ressortir régulièrement du congélateur d&amp;#8217;économie d&amp;#8217;énergie et à r&amp;#8217;associer à l&amp;#8217;Agenda d&amp;#8217;Android (si vous n&amp;#8217;avez pas installé une application tierce depuis F-Droid).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Avec Sailfish OS je n&amp;#8217;ai rien eu à installer. J&amp;#8217;ai juste "triché" sur un point, c&amp;#8217;est que les agendas Infomaniak, je les ai importés depuis mon instance NextCloud (qui sait déjà les lire) au lieu d&amp;#8217;aller les chercher à la source. Mais c&amp;#8217;est pas interdit :-)&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_cas_dusages_et_applications"&gt;7. Cas d&amp;#8217;usages et applications&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_photos_et_imageworks"&gt;7.1. Photos et Imageworks&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Le téléphone est livré avec une application photo fonctionnelle, nommée Camera. Elle est à l&amp;#8217;image du reste du système : volontairement zen et minimaliste ; avec toutefois le nécessaire à portée de main (enfin, à portée de pouce).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Les photos sont correctes quand on est dans de bonnes conditions d&amp;#8217;éclairage ou que le sujet est immobile, mais j&amp;#8217;en attendais plus de Sony. LesNumériques.com aussi en constataient du mal à la sortie de l&amp;#8217;appareil. Les prises de vue ne sont pas stabilisées mécaniquement, mais c&amp;#8217;est parce que Sony a décidé que se serait un des points de limitation imposés à son entrée de gamme.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Avec Sailfish OS on a (facilement) accès qu&amp;#8217;à un seul des 3 capteurs photo présents au dos de l&amp;#8217;appareil (le capteur principal). Je ne m&amp;#8217;en sens pas tellement lésé car les autres capteurs font 8Mpx et pas 12Mpx comme le principal. Je m&amp;#8217;interroge d&amp;#8217;ailleurs sur la stratégie de Sony consistant à fournir un capteur annoncé comme un zoom optique x2 tout en mettant en fait derrière un capteur comptant un tiers de pixels en moins… le compte n&amp;#8217;y est pas pour obtenir le x2 annoncé (on est plus à x1,33 dans ces conditions).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Pour l&amp;#8217;édition embarquée des photos on peut installer l&amp;#8217;application Imageworks depuis la logithèque Jolla. Sans arriver au niveau de complexité de The Gimp, cette application est très riche en fonctionnalités et mérite qu&amp;#8217;on prenne le temps de l&amp;#8217;explorer. Pour ce qui m&amp;#8217;intéressait, elle permet facilement de recadrer une photo, de la redresser, de la passer en noir&amp;amp;blanc ou d&amp;#8217;en étendre le contraste (global, ou canal par canal), à la main ou via l&amp;#8217;un des 30 filtres embarqués.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Comme l&amp;#8217;a dit un ami, après avoir lu un document sur la migration annoncée du Danemark vers Linux et LibreOffice, le mot "souveraineté" se traduit en langage technique par : montée en compétences, meilleure compréhension, contrôle accru… (c&amp;#8217;est vrai que je ne sais pas vraiment ce qu&amp;#8217;elle faisait la fonction "tout automatique" de Samsung pour améliorer les photos)&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_guidage_gps"&gt;7.2. Guidage GPS&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;On trouve à ce sujet l&amp;#8217;application OSM Scout dans la logithèque de Jolla. Elle permet de télécharger facilement la cartographie de la France pour un usage hors-ligne et est parfaitement fonctionnelle. S&amp;#8217;il fallait lui trouver un défaut, ce serait celui d&amp;#8217;avoir été codée par un informaticien plutôt backend a priori et donc de ne pas être folichonne niveau interface graphique. Heureusement il existe une alternative : Pure Maps, qui elle arrive directement en tête de toutes les applications de guidage par GPS que j&amp;#8217;ai pu tester (OSMand, Organic Maps, CoMaps…) mais j&amp;#8217;y revendrai un peu plus loin.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_kagi_com_et_le_navigateur_web_par_défaut"&gt;7.3. Kagi.com et le navigateur web par défaut&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Le navigateur web livré avec Sailfish OS est un Firefox mobile dont l&amp;#8217;interface a été adaptée pour s&amp;#8217;intégrer à l&amp;#8217;environnement graphique de Sailfish OS avec ses fonds transparents et ses menus à tirer de chaque côté de l&amp;#8217;écran.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Cette adaptation demande beaucoup de travail et Jolla peine à le fournir, se concentrant sur les versions de Firefox à support long (ESR), donc vieilles, et même souvent déjà légèrement périmées une fois adaptées… La plupart des sites s&amp;#8217;affichent très bien, mais d&amp;#8217;autres ne sont pas complètement fonctionnels (et c&amp;#8217;est dommage quand c&amp;#8217;est LeBonCoin.fr).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Pour Kagi.com tout se passe très bien : il est possible d&amp;#8217;ajouter un marque-page dans la liste des applications pour retourner rapidement sur le site et lancer une recherche tant que les cookies gardent la session ouverte.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Il est aussi possible d&amp;#8217;ajouter Kagi comme moteur de recherche par défaut du navigateur. Pour faire ça il faut savoir que la liste des moteurs de recherche disponibles se met à jour toute seule en fonction des sites qu&amp;#8217;on visite. Les sites qui s&amp;#8217;annoncent comme étant des moteurs de recherche sont automatiquement ajoutés à la liste. Mais vous ne pouvez pas ajouter un élément vous-même. Kagi.com fait partie des moteurs de recherche reconnus par le navigateur et on peut donc aller le sélectionner dans la liste après l&amp;#8217;avoir utilisé au moins une fois.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Pour en revenir au navigateur web, ce qui me dérange le plus ce n&amp;#8217;est pas son age, mais l&amp;#8217;absence des addons / WebExtensions. Je ne dit pas seulement ça parce que j&amp;#8217;en développe une (Meta-Press.es), mais parce qu&amp;#8217;il est impossible d&amp;#8217;installer la WebExtension de Kagi pour fluidifier l&amp;#8217;expérience utilisateur, ni même un simple bloqueur de pub (comme uBlock origin) ce qui oblige à revoir le monde tel qu&amp;#8217;il est vraiment et à mieux choisir les sites qu&amp;#8217;on a vraiment envie d&amp;#8217;afficher…&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Une nouvelle version de ce navigateur devrait arriver bientôt, mais elle est en retard d&amp;#8217;un an et sera elle aussi déjà obsolète quand elle sera disponible… L&amp;#8217;ironie de la situation s&amp;#8217;apprécie vraiment quand on visite le forum officiel des utilisateurs de Sailfish OS, car le Discourse annonce « Votre navigateur web est obsolète et ne sera bientôt plus supporté ».&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_copie_de_wikipedia_hors_ligne"&gt;7.4. Copie de Wikipedia hors-ligne&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Je colle ce point ici car c&amp;#8217;est vraiment la suite du point précédent. La logithèque de Jolla propose l&amp;#8217;application Zimpedia pour lire des copies de Wikipedia hors-ligne. C&amp;#8217;est un lecteur de fichier ZIM, un format créé pour ça.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Quand on installe Zimpedia, l&amp;#8217;application renvoie vers le site web du projet pour se fournir en fichiers ZIM (un peu comme le fait Aard2 d&amp;#8217;F-Droid). Mais hélas, la page web permettant de chercher parmi les fichiers ZIM disponibles sur Kiwix.org (l&amp;#8217;organisme à l&amp;#8217;origine du format ZIM) n&amp;#8217;est pas fonctionnelle quand elle est chargée dans le navigateur web par défaut…&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Alors utilisons notre premier jocker : on lance F-Droid, on installe Fennec et puis voilà.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;On découvre alors qu&amp;#8217;on a le choix entre 3 longueurs de Wikipedia francophone : 3GO pour la version abrégée, 11GO pour la version texte seulement et 50GO pour la totale avec les photos ! J&amp;#8217;ai testé la 3GO mais c&amp;#8217;est un peu trop court, il n&amp;#8217;y a que les introductions des articles. Je me suis rabattu sur la version 11GO.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Et surprise, il y a aussi les Wiktionnaires, et une archive de 5,5GO de livres libres de droits (j&amp;#8217;ai lu du Voltaire dernièrement), et puis des copies de pleins de gros sites comme le célèbre wiki d&amp;#8217;Arch Linux (que j&amp;#8217;utilise, soi dit en passant ; enfin une Artix) ou des pans entier de StackOverflow. Et là, ça dépasse largement ce qu&amp;#8217;on peut avoir avec Aard2 sur Android.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_torbrowser"&gt;7.5. TorBrowser&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Inutile d&amp;#8217;y aller par 4 chemins, pour installer le TorBrowser c&amp;#8217;est joker direct : il faut aller le chercher dans F-Droid.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Tant que j&amp;#8217;y suis, j&amp;#8217;y ajoute toujours quelques WebExtensions :
- uBlock origin pour bloquer les pubs
- Local CDN pour économiser de la banque passant et évitant de me faire pister par les CDN utilisés par les sites web visités (c&amp;#8217;est beaucoup Google, pour beaucoup jQuery ou Bootstrap).
- GenAi, pour éviter de perdre son temps à lire un truc pondu par IA générative et dont personne n&amp;#8217;a vérifié si ça avait vraiment du sens
- Dark Reader, pour avoir du fond sombre partout (ce qui économise la batterie quand on a un écran OLED)
- Firefox Multi-Account Containers (pour conteneuriser ses cookies et ouvrir plusieurs sessions d&amp;#8217;un même site dans plusieurs onglets, au moins sur les machines avec clavier)
- Temporary containers (pour que les onglets se comportent comme on croit qu&amp;#8217;ils le font, isolés les uns des autres)
- I still don&amp;#8217;t care about cookies (pour gagner du temps)
- Kagi, Meta-Press.es, Ophirofox, Cesium…&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Une WebExtension, c&amp;#8217;est le moyen le plus simple d&amp;#8217;implémenter une nouvelle idée logicielle. Une richesse insoupçonnée pour beaucoup. Le césame de l&amp;#8217;informatique : codez une fois, exécutez partout !&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_trousseau_otp"&gt;7.6. Trousseau OTP&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;La logithèque de Jolla propose SailOTP, une application assez proche du FreeOTP+ que j&amp;#8217;utilisais via F-Droid. J&amp;#8217;ai ré-importé les 7 comptes un par un (sans parvenir à faire fonctionner la lecture de QR code intégrée à l&amp;#8217;application ; c&amp;#8217;est un bug déjà connu, n&amp;#8217;y perdez pas votre temps). Si vous avez 200 comptes, il est peut être plus raisonnable de vous ré-installer le même FreeOTP+ ou de vous pencher sur le format de fichier d&amp;#8217;import de comptes de SailOTP.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Dans mon cas, et puisque Sailfish OS est livré avec un lecteur de QR, je me suis généré un QR code par compte OTP à transférer depuis la console de mon ordinateur. J&amp;#8217;ai utilisé la commande qrencode côté GNU+Linux :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;qrencode -t utf8 'Texte à transmettre'&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Et voyons au titre suivant comment je les ai lus côté Sailfish.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_lecteur_émetteur_de_qr_code"&gt;7.7. Lecteur / émetteur de QR code&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Pour lire un QR code depuis Sailfish OS c&amp;#8217;est simple : c&amp;#8217;est l&amp;#8217;application Camera qui s&amp;#8217;en charge. Elle intègre en effet une fonctionnalité de scan de QR code : une icône apparait quand un QR code est détecté sur la prise de vue en cours. Au passage, il est possible d&amp;#8217;utiliser l&amp;#8217;objectif à selfie pour lire des QR codes et bénéficier d&amp;#8217;une mise au point parfois plus rapide (ce qui est vrai pour tous les téléphones).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Par la suite, j&amp;#8217;ai toutefois trouvé plus pratique d&amp;#8217;utiliser l&amp;#8217;application CodeReader de la logithèque Jolla pour ce genre d&amp;#8217;exercice. Elle gère notamment un historique des photos des QR codes et de leurs valeurs décodées.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Ensuite on trouve dans la logithèque Jolla l&amp;#8217;application QR clip qui permet de générer un QR code à partir du contenu du presse papier. Ça peut toujours être pratique d&amp;#8217;avoir ça sous le coude.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Une remarque en passant sur les copier/coller, Sailfish OS étant une distribution GNU+Linux le presse papier fonctionne comme dans le monde Unix : tout texte sélectionné est automatiquement copié, pas besoin de préciser la chose. Vous pouvez directement vous déplacer ailleurs dans le texte (ou dans une autre fenêtre) et coller votre sélection depuis le bouton du presse papier intégré au clavier, ou donc en générer un QR code via QR clip.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_lecture_de_livre_au_format_epubs_pdf_et_cbz"&gt;7.8. Lecture de livre au format ePubs (PDF et CBZ)&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;La logithèque de Jolla propose une application nommée Books. Il s&amp;#8217;agit d&amp;#8217;un fork du logiciel FBreader que j&amp;#8217;utilisais sur Android. Ce logiciel était donc facilement recompilable pour une autre plateforme…&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Books permet d&amp;#8217;ouvrir des .epub et de se mettre un fond noir avec le texte en vert. C&amp;#8217;est ce réglage que j&amp;#8217;utilise pour optimiser le contraste de lecture et la consommation énergétique d&amp;#8217;un écran OLED. Je n&amp;#8217;en demandais pas plus pour lire mes livres la nuit.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;a href="https://grimoire.d12s.fr/2021/green_on_black_oled_screen.html" class="bare"&gt;https://grimoire.d12s.fr/2021/green_on_black_oled_screen.html&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Concernant les fichiers .cbz, qui sont utilisés pour la distribution de mangas et autres BD sur le web, je n&amp;#8217;ai pas trouvé d&amp;#8217;application. J&amp;#8217;avais pourtant une œuvre de ce format qui me trainait dans les pattes. J&amp;#8217;ai tenté de l&amp;#8217;ouvrir à tout hasard, mais le format n&amp;#8217;est pas pris en charge comme ça. Par contre l&amp;#8217;explorateur de fichier (installé à la fin de la procédure de bienvenue) constate rapidement qu&amp;#8217;un fichier .cbz c&amp;#8217;est juste un tas de fichiers .jpeg dans une archive compressée, et il propose alors de sortir les images dans un dossier.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;De là, il existe un mode "galerie" dans ce File Browser, et ça affiche directement les images du dossier courant en pleine largeur, les unes à la suite des autres. J&amp;#8217;ai donc pu relire confortablement la BD réclamée par mon fils (un peu inquiet à l&amp;#8217;idée de peut-être y perdre au change lui aussi).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Ce mode galerie, c&amp;#8217;est un bon compromis entre l&amp;#8217;affichage d&amp;#8217;une icône générique pour les images dans la liste des fichiers et l&amp;#8217;affichage d&amp;#8217;une vignette générée à la volée (ou quand thumblerd décide de squatter tout ton CPU alors que toi tu voudrais juste démonter ta clé USB…). C&amp;#8217;est original comme fonctionnalité, mais je suis directement tombé sur un cas d&amp;#8217;usage.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Concernant les PDF, je n&amp;#8217;ai pas testé mais l&amp;#8217;application Documents installée d&amp;#8217;office est réputée capable de les ouvrir. Je tâcherai de tester ça avant de me retrouver dans la file d&amp;#8217;attente d&amp;#8217;un concert.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_mieux_quandroid_tooter"&gt;7.9. Mieux qu&amp;#8217;Android ? (Tooter)&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;J&amp;#8217;ai décris jusque là pas mal d&amp;#8217;aspects de Sailfish OS qui me semblent meilleurs qu&amp;#8217;Android. Mais ce n&amp;#8217;est pas le cas partout non plus.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Pour commencer, le navigateur web périmé fait tâche. Ensuite mon premier essai de Tooter, le client Mastodon ne m&amp;#8217;a pas convaincu. Je l&amp;#8217;ai vite refermé et me suis consolé en constatant que le client web de Mastodon fonctionne très bien dans le navigateur par défaut.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Pour la météo j&amp;#8217;ai testé France Météo, mais l&amp;#8217;application n&amp;#8217;est qu&amp;#8217;une preuve de concept pour l&amp;#8217;instant. Alors puisque les onglets restent ouverts d&amp;#8217;une fois sur l&amp;#8217;autre dans le navigateur, je me suis ouvert le météogramme de MeteoBlue.com (mais franchement, si vous voulez vous abonner à MeteoBlue, faîtes aussi, et même d&amp;#8217;abord, un don à InfoClimat.fr : c&amp;#8217;est une super association française qui propose aussi des prévisions météo, à partir des modèles qu&amp;#8217;elle fait tourner sur ses propres serveurs, merci pour eux &lt;sup&gt;_&lt;/sup&gt;).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Pour revenir à Tooter, je me suis progressivement familiarisé avec le style des interfaces graphiques de Sailfish OS (qui s&amp;#8217;appuie sur la bibliothèque de fonctions maison Silica, elle même appuyée sur Qt5) d&amp;#8217;une part et des fonctionnalités ont récemment été ajoutées au logiciel d&amp;#8217;autre part. Alors j&amp;#8217;ai révisé mon jugement : c&amp;#8217;est utilisable. Mais je préfère quand même le client web, question d&amp;#8217;habitude et de couverture fonctionnelle.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="sect3"&gt;
&lt;h4 id="_sailtrix_le_client_matrix"&gt;7.9.1. Sailtrix, le client Matrix&lt;/h4&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Dans le même esprit, parlons de Sailtrix : le client Matrix. Il est fonctionnel. Je voulais parler de "software ruin porn" mais il a lui aussi reçu des mises à jour importantes depuis Noël. J&amp;#8217;ai ainsi pu finalement y vérifier ma session (par reconnaissance d&amp;#8217;emojis). Mais la couverture fonctionnelle reste elle aussi limitée et là pas de bol, un client web Element à jour refuse de se charger dans le navigateur web.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Bon, à la réflexion le clavardage en ligne avec un écran tactile de téléphone mobile c&amp;#8217;est de toutes façons pas extraordinaire comme idée… Saitrix n&amp;#8217;est pas prévu pour être votre client principal pour le protocole Matrix, mais il permet de suivre et de participer à une discussion même lorsqu&amp;#8217;on est loin d&amp;#8217;un clavier (un vrai, un Quacken des Ergonautes ! &lt;a href="https://cfp.capitoledulibre.org/cdl-2025/talk/review/PXWB398QJSJSLN3DTFEV8VC7WMUUHGXX" class="bare"&gt;https://cfp.capitoledulibre.org/cdl-2025/talk/review/PXWB398QJSJSLN3DTFEV8VC7WMUUHGXX&lt;/a&gt;).&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect3"&gt;
&lt;h4 id="_whisperfish_le_client_signal"&gt;7.9.2. Whisperfish, le client Signal&lt;/h4&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Tant que j&amp;#8217;y suis, le client Signal non officiel nommé Whisperfish est l&amp;#8217;objet de beaucoup d&amp;#8217;attention, certes, mais avec là encore une couverture fonctionnelle limitée. Et dès que le protocole de Signal évolue, Whisperfish se retrouve sur la touche le temps que son super développeur règle le problème. Or Signal est développé à l&amp;#8217;américaine en mode "move fast and break things™".&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;La dernière fois c&amp;#8217;était réglé en 48h, bel effort, mais l&amp;#8217;application n&amp;#8217;était plus fiable pendant ce laps de temps. J&amp;#8217;ai raté des messages directs et va ramer derrière pour expliquer aux gens que : non, t&amp;#8217;as pas eu leurs messages… Alors pour l&amp;#8217;instant c&amp;#8217;est joker là aussi, je suis retourné sur le client Signal officiel dans la VM Android. Le développeur de Whisperfish lui-même recommande de garder un client officiel en "installation principale" et il croise les doigts pour que le protocole se stabilise en mode : ils vont bien finir par se calmer !?&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect3"&gt;
&lt;h4 id="_arcanechat_le_client_delta_chat"&gt;7.9.3. ArcaneChat, le client Delta-Chat&lt;/h4&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Concernant Delta-Chat, mon test d&amp;#8217;ArcaneChat a tourné court lui aussi : l&amp;#8217;application n&amp;#8217;est pas encore en mesure d&amp;#8217;émettre des notifications. Game over. Mon objectif étant d&amp;#8217;éteindre la VM Android, j&amp;#8217;ai besoin d&amp;#8217;un client qui me prévienne quand j&amp;#8217;ai un message &lt;sup&gt;_&lt;/sup&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Quand j&amp;#8217;aurais fini d&amp;#8217;écrire ce billet, je regarderais si on peut compiler DeltaTouch pour Sailfish OS, peut être via les lib Qt6 communautaires… (sur le forum ça parle d&amp;#8217;attendre la version 5.1 de Sailfish OS pour bénéficier d&amp;#8217;un environnement rust plus récent)&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Voilà, avec ces 3 chapitres j&amp;#8217;ai ré-équilibré un peu la balance. C&amp;#8217;est pas tout rose non plus et je me sers encore de la compatibilité Android :-/ (elle est bien intégrée, je n&amp;#8217;ai pas à m&amp;#8217;en plaindre).&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_jeux_et_gadgets"&gt;8. Jeux et gadgets&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;La sélection n&amp;#8217;est pas la plus fournie mais on trouve des jeux dans la boutique Jolla. J&amp;#8217;ai retrouvé un OpenFlood, un Tetris, un Reversi… mais aussi Patience Deck : un jeu de carte façon solitaire qui ne propose pas moins de 90 variantes du jeu !&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Il y a aussi Jewel Rush, qui semble développé par un studio. Le nom a effectivement été choisi pour faire penser aux bonbons qui explosent mais ce n&amp;#8217;est pas un clone non plus. Le principe en est proche et assez amusant.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Tant que j&amp;#8217;y étais je me suis installé un logiciel pour compter les gens qui entrent dans une salle de spectacle (ça pourra être utile lors du prochain festival du Nombril du Monde à Pougne-Hérisson : nombril.com) et pour finir une horloge virtuelle pour le jeu d&amp;#8217;échecs.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Moi qui suis un grand fan de Pl@ntNet, j&amp;#8217;ai été agréablement surpris de trouver un client natif pour cette application en ligne de reconnaissance de végétaux à partir de photos. Je ne l&amp;#8217;ai pas encore testée (l&amp;#8217;hiver si c&amp;#8217;est pas recouvert de neige ça donne moins envie de sortir, et puis il faut ouvrir un compte chez Pl@ntNet…).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;J&amp;#8217;ai également pu installer Andor&amp;#8217;s Trail depuis F-Droid sans problème, et réimporter mes parties en cours.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_backup_du_système"&gt;9. Backup du système&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Dans les réglages de Sailfish OS on trouve une option « Sauvegarde ». Elle permet de rassembler tous les paramétrages saisis dans le système (mais pas dans les applications, ni les applications elles mêmes). Le résultat est un fichier compacte (quelques MO) que l&amp;#8217;on peut choisir de faire exporter automatiquement vers un stockage de fichier NextCloud.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;L&amp;#8217;option permet de régler facilement une fréquence de sauvegarde automatique et une destination (carte SD ou stockage distant), et de choisir s&amp;#8217;il est acceptable d&amp;#8217;envoyer une sauvegarde sur le réseau via données mobiles ou seulement par WiFi.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;C&amp;#8217;est une option plutôt bienvenue quand on a passé quelques heures à faire des réglages.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Je n&amp;#8217;ai pas encore testé une restauration du paramétrage en question (comptes, signets du navigateur web, calendriers, messages, notes, contacts, journal d&amp;#8217;appel…), et je constate que la sauvegarde automatique ne s&amp;#8217;exécute pas actuellement sur mon système. Si je clique sur le bouton de sauvegarde manuelle tout se passe très bien, mais je n&amp;#8217;ai pas ma sauvegarde quotidienne à 2h du matin chaque nuit (renseignements pris c&amp;#8217;est un bug déjà identifié).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Une dernière chose : les photos, les vidéos et autres fichiers (comme la musique) ne sont pas embarqués dans ces sauvegardes, qui restent ainsi rapides et légères.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_blocage_dappels_et_enregistrement_des_appels"&gt;10. Blocage d&amp;#8217;appels et enregistrement des appels&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Là encore, la version courte c&amp;#8217;est que la fonctionnalité est prévue dans le système. On est par contre sur de la peinture très fraîche. C&amp;#8217;est tellement récent que ce n&amp;#8217;est pas encore documenté (les infos sont éparpillées sur plusieurs fils de discussions sur le forum… &lt;a href="https://forum.sailfishos.org/t/block-numbers-by-group-with-mask/21988/4" class="bare"&gt;https://forum.sailfishos.org/t/block-numbers-by-group-with-mask/21988/4&lt;/a&gt; ).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;a href="https://forum.sailfishos.org/t/how-to-block-or-ignore-calls-from-hidden-numbers/27948" class="bare"&gt;https://forum.sailfishos.org/t/how-to-block-or-ignore-calls-from-hidden-numbers/27948&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Par contre c&amp;#8217;est facile à utiliser, depuis un contact y&amp;#8217;a l&amp;#8217;option : bloquer ce numéro.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;On peut retrouver la liste des numéros bloqués depuis les paramètres de l&amp;#8217;application Téléphone (onglet de gauche dans les réglages généraux) et on peut manipuler cette liste de blocage depuis la console, comme illustré ici : &lt;a href="https://sailfishos.wiki/books/system/page/blocking-phone-numbers-from-cli-in-sailfish-os" class="bare"&gt;https://sailfishos.wiki/books/system/page/blocking-phone-numbers-from-cli-in-sailfish-os&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;C&amp;#8217;est également sur cette même page dans les réglages qu&amp;#8217;il y a l&amp;#8217;activation de l&amp;#8217;option d&amp;#8217;enregistrement des appels (ou juste l&amp;#8217;affichage du bouton permettant d&amp;#8217;activer cet enregistrement à tout moment pendant un appel). Cette dernière fonctionnalité n&amp;#8217;est pas activée par défaut, il faut évidemment s&amp;#8217;assurer que la chose est légale dans son pays avant de l&amp;#8217;activer… J&amp;#8217;ai testé, ça fonctionne sans histoire, ça m&amp;#8217;a rappelé mes Androids rootés sur Fairphone y&amp;#8217;a 10 ans.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Pour en revenir au blocage de numéros, j&amp;#8217;ai d&amp;#8217;abord essayé avec SpamBlocker, installé via F-Droid. Mais sans succès : l&amp;#8217;appli fonctionne sans se rendre compte que Sailfish OS ne lui envoi pas les signaux d&amp;#8217;appel derrière. Lors du samanche initial j&amp;#8217;en était resté là pour être honnête.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;J&amp;#8217;ai ensuite passé pas mal de temps à tester l&amp;#8217;application Phonehook, recommandée à maintes reprises sur le forum, mais qui est compliquée à installer et qui ne fonctionne pas avec un Sailfish OS récent (si on ne désactive pas l&amp;#8217;option Sailjail en éditant le lanceur de l&amp;#8217;application sur le bureau… chose que je n&amp;#8217;ai pas essayée vu que j&amp;#8217;ai trouvé entre temps l&amp;#8217;info pour le blocage par prefix intégré au système).&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_lexplorateur_de_fichier_file_browser"&gt;11. L&amp;#8217;explorateur de fichier : File Browser&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Il y a un super explorateur de fichiers. C&amp;#8217;est une application tierce, mais elle est indispensable à mes yeux. Elle est proposées à l&amp;#8217;installation en fin de procédure d&amp;#8217;accueil.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;On notera au passage que dans l&amp;#8217;univers de Sailfish OS certaines applications portent des noms descriptifs comme : Calendrier, Books ou File Browser… Pour un peu on se croirait chez /e/OS (Murena), le renommage cavalier de projets libres en moins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Le File Browser est un peu l&amp;#8217;ambassadeur du concept de navigation par glissades sur l&amp;#8217;écran, hérité du swype swag de Nokia avant la chute. Ça demande un peu de concentration au début, mais c&amp;#8217;est amusant, efficace et bien vite adopté.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Pour l&amp;#8217;anecdote, il est possible de configurer Android de manière à ne pas afficher les trois coquillag^W  boutons en bas de l&amp;#8217;écran pour gagner de la place et on accède alors aux fonctionnalités correspondantes en glissant son pouce depuis les bords de l&amp;#8217;écran. C&amp;#8217;est justement comme ça que j&amp;#8217;utilisais mon Android 12 et j&amp;#8217;ai donc apprécié de découvrir qu&amp;#8217;Android ne proposait en la matière qu&amp;#8217;une pale copie de la navigation imaginée par Nokia pour son N9. Le swype c&amp;#8217;est facile et rapide, pas besoin d&amp;#8217;être précis.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Et quand je me suis retrouvé quelques heures plus tard, à nouveau avec mon ancien Android dans les mains pour quelques derniers exports de données, j&amp;#8217;ai trouvé sa navigation pataude et ringarde ce qui m&amp;#8217;a surpris moi-même (après une décennie passée sous Android).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Avec Sailfish OS on glisse : vers le haut, vers le bas, à gauche à droite, en partant du bord ou pas, le long d&amp;#8217;un bord ou pas… Et même avec un écran trop grand ou trop long, on active les menus situés à l&amp;#8217;autre bout de l&amp;#8217;affichage juste en tirant dessus depuis le bas ! Adoption immédiate… Et puis en terme d&amp;#8217;accessibilité, c&amp;#8217;est au top. Faut dire que le PDG de Jolla il n&amp;#8217;a qu&amp;#8217;un bras, alors j&amp;#8217;imagine que la navigation à une main est sérieusement testée de leur coté.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Bon, mais pour revenir au File Browser, je n&amp;#8217;ai par contre pas trouvé tout seul comment on sélectionne plusieurs fichiers à la fois… J&amp;#8217;ai même cru que ce n&amp;#8217;était pas possible avant de me raviser devant l&amp;#8217;énormité de l&amp;#8217;idée. J&amp;#8217;ai vu que d&amp;#8217;autres utilisateurs parlaient de sélections multiples sur le forum et je me résigné à aller lire la documentation du logiciel pour trouver comment faire. Oui je sais, la honte… mais que voulez-vous j&amp;#8217;étais pressé.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Vu que l&amp;#8217;idée de cet article c&amp;#8217;est de vous faire gagner du temps, je vous livre l&amp;#8217;astuce : il faut cliquer sur les icônes des fichiers qu&amp;#8217;on veut sélectionner (pas leur nom) pour réaliser une sélection multiple, ça les surligne. Peut être fusse par rancune, mais en tout cas je me suis empressé de configurer l&amp;#8217;affichage de l&amp;#8217;application pour avoir des icônes légèrement plus grosses que par défaut…&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Malgré ces débuts un peu crispés, j&amp;#8217;ai vite appris à apprécier cette application et je comprends qu&amp;#8217;elle soit la mieux notée de la logithèque Jolla avec plus de 6000 suffrages.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Toutefois, c&amp;#8217;est cette application qui va nous faire tomber dans le terrier du lapin (blanc). En effet, dès qu&amp;#8217;on la lance, elle, la star de la logithèque, installée quasiment d&amp;#8217;office en fin de procédure de bienvenue, la chouchoute des utilisateurs, dès sont premier lancement : elle annonce qu&amp;#8217;il ne faut pas utiliser sa version officielle et qu&amp;#8217;il est recommandé d&amp;#8217;installer sa version complète depuis OpenRepos.net.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Il existe donc une 2e logithèque pour Sailfish OS (en plus des F-Droid et Aurora Store). Une logithèque non officielle, une porte ouverte vers encore plus de liberté ? En tous cas vers encore plus de choix !&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_storeman_la_2e_logithèque"&gt;12. Storeman, la 2e logithèque&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Pourquoi une 2e logithèque ? Parce que Jolla n&amp;#8217;accepte dans la sienne que des applications soigneusement revues et qui ne peuvent pas abimer le système (vérifications pour lesquelles ils ont de toutes façons 2 semaines de file d&amp;#8217;attente en ce moment).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Ça peut être vu comme un joug pour les libristes, mais c&amp;#8217;est plutôt rassurant pour ceux qui veulent juste faire ce qui est prévu, sans tout casser. (je me souviens par exemple m&amp;#8217;être dépêché de rapporter mon Orange SPV sous Windows Mobile premier du nom, en 2002, après avoir cassé le système en modifiant des fichiers pas très importants d&amp;#8217;habitude dans Windows…)&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;C&amp;#8217;est plutôt rassurant de savoir qu&amp;#8217;avec la première logithèque on ne court aucun danger. Enfin presque, on dispose tout de même d&amp;#8217;un terminal, astucieusement nommé Terminal, dans lequel on peut acquérir des droits d&amp;#8217;administrateur et donc le pouvoir de tout casser. Mais là c&amp;#8217;est clairement un argument pro-Sailfish OS : pas besoin de manipulations complexes pour "rooter" son téléphone en faisant sauter la garantie. Sailfish OS c&amp;#8217;est un GNU+Linux normal, avec des paquets .RPM habituels et vous êtes administrateur sur la machine. Elle est donc enfin vraiment à vous cette machine. C&amp;#8217;est quand même l&amp;#8217;intérêt principal de passer à Sailfish OS de mon point de vue : le système ne peut rien m&amp;#8217;imposer et au pire je peux toujours modifier ce qui m&amp;#8217;y déplait (HAL : non Dave, ne débranche pas…).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Au passage, la commande pour acquérir les droits administrateurs est &lt;code&gt;devel-su&lt;/code&gt; (et pas l&amp;#8217;habituel &lt;code&gt;sudo&lt;/code&gt;) et le mot de passe est à préciser dans les options de développeurs à la fin du menu des réglages. On peut trouver des exemples d&amp;#8217;échanges en ligne de commande avec le système sur le wiki de la communauté : &lt;a href="https://Sailfishos.wiki" class="bare"&gt;https://Sailfishos.wiki&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Sailfish OS c&amp;#8217;est à 90% du logiciel libre qu&amp;#8217;on peut vérifier et modifier. 90% seulement ? Oui, parce qu&amp;#8217;il y a des petits bouts développés par Jolla et sur lesquels ils comptent pour survivre. C&amp;#8217;est notamment le cas de la bibliothèque graphique Silica qui permet cette expérience zen et homogène du système : « toutes les applications s&amp;#8217;habillent pareil »), ou les applications accessibles seulement avec la version payante (comme le support des applications Android, les suggestions de saisie prédictives du clavier…).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Jolla libère régulièrement les éléments et applications qu&amp;#8217;ils ont développés et qui ne sont plus stratégiques (comme récemment : leur application météo tout bien intégrée au système, qui ne marche plus faute de contrat avec le prestataire qui fournissait les données météo).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Mais il y a donc une deuxième logithèque, où les développeurs peuvent poster ce qu&amp;#8217;ils veulent (comme les dépôts communautaire d&amp;#8217;Arch Linux), sans avoir à brider leur logiciel comme c&amp;#8217;est le cas pour l&amp;#8217;explorateur de fichiers.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Et puis, en fait Sailfish OS n&amp;#8217;est que la dernière incarnation d&amp;#8217;une lignée de systèmes GNU+Linux pour téléphone portable démarrée par Nokia et Intel il y a déjà fort longtemps : Meego, Mer… or les applications développées pour ces précédents systèmes existent encore et fonctionnent toujours pour la plupart. Elles sont regroupées sur le site web OpenRepos.net. Ce dernier revendique d&amp;#8217;ailleurs un total de 14 millions de téléchargements depuis son lancement et on y découvre que la France est un bastion d&amp;#8217;utilisateurs de Sailfish OS (occupant la 4e marche du podium mondial).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Storeman, c&amp;#8217;est un client natif Sailfish OS pour OpenRepos.net : c&amp;#8217;est à dire une application qui permet d&amp;#8217;installer facilement sur son Sailfish OS les applications proposées par OpenRepos.net.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Je me suis donc retrouvé à télécharger Storeman depuis le site OpenRepos.net et à activer l&amp;#8217;autorisation d&amp;#8217;installer des logiciels tiers dans Sailfish OS, avec une grosse impression de déjà vu… c&amp;#8217;est tout comme quand on installe F-Droid sur Android. On retrouve la même satisfaction de transgresser un "interdit" :-) Un peu comme quand tu t&amp;#8217;enfuis par la fenêtre, sauf que là t&amp;#8217;étais pas dans une prison Android, juste dans ta maison confortable.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Dans la suite de ce texte, nous allons désormais explorer les trésors cachés dans ces dépôts, mais avant je tiens à préciser que j&amp;#8217;ai organisé ce récit de manière à retarder ce moment le plus longtemps possible, afin de donner un aperçu clair de ce qu&amp;#8217;il est possible de faire sans bidouillage, si on se contente de la boutique officielle. Force est de reconnaître qu&amp;#8217;on va déjà très loin, dans ce cas.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Passé ce cap, chaque évolution demandera graduellement un peu plus d&amp;#8217;efforts, mais l&amp;#8217;aspect escape-game ne fut pas pour me déplaire. Ça faisait même longtemps que je ne m&amp;#8217;étais pas autant amusé.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_wireguard"&gt;12.1. WireGuard&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Pour configurer un VPN WireGuard, il faut en passer par Storeman. En cherchant par mots clés on trouve au moins 5 paquets concernés. Avec Sailfish OS 5.0 il n&amp;#8217;est en fait plus besoin que du premier : WireGuard for Sailfish (Settings UI). En effet WireGuard est un module du noyau Linux et il suffit de bien compiler ce dernier pour le rendre disponible. Les précédentes versions de Sailfish OS ne proposaient pas le module du noyau et il fallait installer une ré-implémentation de WireGuard dans l&amp;#8217;espace utilisateur (c&amp;#8217;est à dire : hors du noyau) et ça devait être plus lent et plus consommateur en batterie à l&amp;#8217;usage.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Une fois le paquet installé une nouvelle catégorie de VPN est disponible dans les réglages généraux de Sailfish OS : WireGuard.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Pour ma part je me suis transféré un fichier de configuration via QR code pour l&amp;#8217;importer dans le système et m&amp;#8217;éviter d&amp;#8217;avoir à recopier les longues clés de chiffrement à la main.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Dans les réglages du VPN, il est recommandé de cocher l&amp;#8217;option "Remember authentication information" et "Enable IPv6 data leak protection". On est en droit de se demander pourquoi ce n&amp;#8217;est pas coché par défaut (ni, en fait, le type de VPN WireGuard lui-même ; ce n&amp;#8217;est peut être qu&amp;#8217;une question de temps).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Tant que j&amp;#8217;y étais à rassembler les informations correspondantes depuis le forum communautaire de Sailfish OS, j&amp;#8217;ai mis à jour cette page du Sailfishos.wiki :
- &lt;a href="https://sailfishos.wiki/books/wireguard-on-sailfishos/page/installing-wireguard" class="bare"&gt;https://sailfishos.wiki/books/wireguard-on-sailfishos/page/installing-wireguard&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;WireGuard c&amp;#8217;est encore un objectif atteint. Avec la protection de la batterie (par limite de charge) maintenant intégrée de base dans la plupart des systèmes d&amp;#8217;exploitation de téléphones mobiles, me voilà revenu au niveau de fonctionnalité du précédent téléphone que j&amp;#8217;avais rooté.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_fishobd"&gt;12.2. FishOBD&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Storeman nous ouvre aussi les portes de FishOBD : une application qui permet de lire les informations de diagnostic d&amp;#8217;un moteur de voiture (en fonctionnement) en se substituant à la fameuse valise des garagistes. Là les informations sont transmises par bluetooth vers le téléphone via un "dongle" (qu&amp;#8217;on traduit assez spontanément par 'bidule' en français) branché sur le port OBD du véhicule.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;FishOBD nécessite un bidule compatible ELM327, ce qui est le cas d&amp;#8217;un des deux machins dont je m&amp;#8217;étais déjà équipé (pour 10€ sur un site en ligne, avant qu&amp;#8217;on ne découvre la tolérance au fascisme de ses actionnaires américains).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;J&amp;#8217;ai trouvé la présentation de FishOBD meilleure que celle d&amp;#8217;AndrOBD (que j&amp;#8217;utilisais précédemment). En effet, les informations sont regroupées dans des pages, que l&amp;#8217;on tourne avec le pouce de gauche à droite au lieu d&amp;#8217;avoir tout à la suite dans la longue liste à faire défiler dans AndrOBD. On ne sait alors jamais où s&amp;#8217;arrêter pour retrouver une info précise… ils ont bien essayé de clarifier la situation en ajoutant des couleurs aux catégories d&amp;#8217;info, ça reste pénible à utiliser AndrOBD (surtout dans le contexte typique : en voiture, avec généralement un qui voyants rouge qui vient de s&amp;#8217;allumer sur le tableau de bord&amp;#8201;&amp;#8212;&amp;#8201;quand c&amp;#8217;est pas deux&amp;#8201;&amp;#8212;&amp;#8201;et la voiture qui s&amp;#8217;arrête, alors que ce n&amp;#8217;est pas le bon moment…).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Dans FishOBD, la lecture des codes d&amp;#8217;erreur n&amp;#8217;est par contre pas régulière avec ma configuration actuelle. Il faut en effet rafraichir plusieurs fois la page pour avoir une lecture fidèle. Une fois sur deux l&amp;#8217;appli annonce qu&amp;#8217;il n&amp;#8217;y aucun code d&amp;#8217;erreur alors que je vois bien le voyant sur mon tableau de bord ! J&amp;#8217;ai également eu des codes d&amp;#8217;erreur tronqués parfois, alors c&amp;#8217;est un peu la fête quand la page fonctionne correctement.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;L&amp;#8217;effacement des codes d&amp;#8217;erreur ne pose lui aucun problème.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Et puis il faut s&amp;#8217;en contenter de FishOBD car AndrOBD ne parvient pas à se connecter de son côté le bluetooth n&amp;#8217;étant pas encore disponible dans la VM Android.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_améliorer_le_guidage_gps_avec_pure_maps"&gt;12.3. Améliorer le guidage GPS avec Pure Maps&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Bien que nous ayons déjà une application de guidage par GPS qui fonctionne je conseille vraiment d&amp;#8217;essayer Pure Maps depuis Storeman. C&amp;#8217;est de mon point de vue la meilleure application libre de guidage par GPS.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Des amis m&amp;#8217;ont répondu : « mais comment ça peut être mieux qu&amp;#8217;Organic Maps qui juste marche ? »&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Eh bien pour commencer, Organic Maps s&amp;#8217;est complexifiée ces dernières années. La situation aussi s&amp;#8217;est complexifiée et je suis passé, comme beaucoup, à CoMaps. Mais pour bien illustrer mon point de vue prenons l&amp;#8217;exemple d&amp;#8217;un réglage simple : « éviter les routes à péage » (parce que oui, on est pas encore vraiment sorti du moyen age et il existe toujours des péages sur les routes importantes…). Dans OSMAnd ou CoMaps c&amp;#8217;est un réglage enfoui sous plusieurs couches de menus, alors que même avec une politique aussi arrêtée que la mienne à ce sujet, c&amp;#8217;est en fait un paramètre qui bouge souvent.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Pourquoi ? Parce que parfois c&amp;#8217;est un gain de plusieurs heures de passer par une route à péage, parfois on a besoin de calculer un itinéraire en urgence alors qu&amp;#8217;on se trouve déjà sur la route à péage (game over) et parfois il faut négocier avec les autres passagers… Et dans l&amp;#8217;autre sens, hein ? Quand on le laisse en mode "piège" et qu&amp;#8217;on se rend compte au bout d&amp;#8217;une demi-heure qu&amp;#8217;on ne roule pas dans la bonne direction mais vers l&amp;#8217;entrée d&amp;#8217;autoroute la plus proche, que du bonheur…&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Avec Pure Maps, le réglage est présenté sur l&amp;#8217;écran de programmation de l&amp;#8217;itinéraire après le lieu de départ, la destination et le mode de transport. T&amp;#8217;es couvert.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Accessoirement, Pure Maps c&amp;#8217;est une application GNU+Linux, elle peut fonctionner pareil sur votre machine de bureau… elle est au moins packagée Nix et pour Alpine Linux.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Toutefois Pure Maps ne vient pas avec son mécanisme de téléchargement de cartes hors-ligne. Il faut donc passer par une application tierce : OSM Scout Server. Les deux applications parlerons ensuite ensemble de manière transparente, mais il faut d&amp;#8217;abord indiquer à OSM Scout Server ce qu&amp;#8217;on veut télécharger comme carte en s&amp;#8217;abonnant à des zones géographiques (par exemple la France, région par région…).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Il y a plusieurs jeux de données pour chaque zone géographique. J&amp;#8217;ai testé quelques combinaisons et en suis arrivé à tout prendre sauf les données Mapnik, ça économise toujours ~25% de l&amp;#8217;espace de stockage nécessaire… Les cartes restent énormes (18GO pour la France métropolitaine&amp;#8201;&amp;#8212;&amp;#8201;et je précise parce que oui, en plus des routes à péage la France impérialiste a encore des colonies un peu partout dans le monde et que c&amp;#8217;est relou à télécharger), mais détaillées et ce qui compte au final, c&amp;#8217;est surtout que le moteur de recherche nous trouve la destination saisie ! (de toutes façons je ne range rien de précieux dans la mémoire du téléphone, les trucs importants sont sur la carte SD amovible et chiffrée, alors autant qu&amp;#8217;il serve à quelque chose l&amp;#8217;espace de stockage interne…).&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_améliorer_le_claver_avec_okboard_et_multi_keyboard_layouts"&gt;12.4. Améliorer le claver avec OKboard et Multi Keyboard Layouts&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Concernant le clavier, on a un bon moteur de suggestion de saisies qui vient avec les modules pas libres accessibles avec une licence Jolla. Il s&amp;#8217;appelle XT9.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Toutefois, sans vouloir en faire un critère important, moi j&amp;#8217;étais assez fan de la saisie par glissade sur le clavier d&amp;#8217;une lettre à l&amp;#8217;autre. OK, c&amp;#8217;est un gadget, mais la vie est aussi faite de petits plaisirs…&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Autant vous dire que j&amp;#8217;étais ravi de découvrir l&amp;#8217;application OKboard dans Storeman qui permet justement d&amp;#8217;augmenter le clavier avec ce mode de saisie. J&amp;#8217;avancerai même que ce mode 'swype' là est plus léger et plus rapide que celui proposé par Microsoft pour un téléphone Samsung sous Android. Autant pour les petits plaisirs du quotidien.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Mais ce n&amp;#8217;est pas tout, un utilisateur français de Sailfish OS propose également des agencements alternatifs de lettres et de symboles. On peut ainsi avoir un clavier 'azerty' avec des symboles de programmation proches de la surface (et une rangée de chiffres). Ce super professeur d&amp;#8217;université a même eu une idée géniale : il propose un clavier anglais, mais azerty ! On bénéficie comme ça de la correction orthographique anglaise, tout en gardant les lettres à la même place ! (il ne manque plus qu&amp;#8217;une disposition Ergol). Pour bénéficier de ces dispositions clavier enrichies, il faut installer Multi Keyboard Layouts depuis Storeman.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Et le meilleur c&amp;#8217;est que le clavier, la couche de glissades et la disposition azerty augmentée s&amp;#8217;empilent parfaitement.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Pour en finir avec le clavier, il reste une application Neuntrainer (qui permet d&amp;#8217;enseigner vos mots au moteur de suggestion) et un patch qui promet d&amp;#8217;améliorer la gestion de la ponctuation par le moteur de suggestions XT9, mais on verra les patchs un peu plus loin.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_lecture_nfc_ndefined_storeman"&gt;12.5. Lecture NFC : NDEFined (Storeman)&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;J&amp;#8217;avoue, celle là j&amp;#8217;ai mis du temps à la trouver. C&amp;#8217;est avec cette application que j&amp;#8217;ai testé le lecteur NFC. L&amp;#8217;interface est simple : un onglet lecture, un onglet écriture.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;L&amp;#8217;application se concentre sur la norme NDEF seulement mais elle a fait preuve d&amp;#8217;une grande réactivité pour m&amp;#8217;indiquer que mes cartes bancaires n&amp;#8217;étaient pas d&amp;#8217;un format compatible. Une fois passée la déception première, j&amp;#8217;en suis arrivé à la conclusion que c&amp;#8217;était probablement préférable ainsi… en tous cas le NFC fonctionne.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;La prise en charge du côté de la couche de compatibilité Android est par contre réputée non fonctionnelle et elle n&amp;#8217;est pas prioritaire non plus. Le chantier en cour dans ce domaine c&amp;#8217;est le bluetooth, son support côté Android semble lui imminent, via une application à installer via le 'Jolla store'.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Alors on est pas à l&amp;#8217;abri d&amp;#8217;une surprise pour le NFC, tout comme ça peut encore prendre des années.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_advanced_camera"&gt;12.6. Advanced Camera&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;L&amp;#8217;autre star de Storeman c&amp;#8217;est Advanced Camera. Un logiciel un peu plus complet pour faire des photos.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;À l&amp;#8217;usage, je ne lui ai pas trouvé beaucoup d&amp;#8217;avantages et suis revenu au premier choix. Ce qui m&amp;#8217;a gêné dans Advanced Camera c&amp;#8217;est qu&amp;#8217;il est plus long et compliqué de vérifier si la photo qu&amp;#8217;on vient de faire est bonne ou pas… La navigation pour retrouver l&amp;#8217;aperçu de la dernière photo n&amp;#8217;est pas homogène avec le reste du système (bouton et pas glissade) et on ne peut pas zoomer sur cet aperçu (alors qu&amp;#8217;un simple double clic zoomait directement à de 100% chez Samsung par exemple).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Toutefois, Advanced Camera présente l&amp;#8217;avantage d&amp;#8217;offrir du choix et surtout, c&amp;#8217;est ce logiciel qui m&amp;#8217;a ouvert les portes d&amp;#8217;une 3e logithèque !&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;En effet, dans la description d&amp;#8217;Advanced Camera présentée par Storeman il est précisé que la version proposée par Storeman est obsolète et qu&amp;#8217;il faut passer par Chum pour télécharger la dernière version.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Il y a donc encore un catalogue à explorer \o/&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_chum"&gt;13. Chum&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Depuis Storeman, une recherche sur "chum" renvoie « SailfishOS:Chum GUI Installer » comme premier résultat.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Dans cette nouvelle logithèque on retrouve bon nombre d&amp;#8217;applications déjà listées dans ce texte (et déjà présentes dans les autres magasins d&amp;#8217;applications), mais pour certaines dans une version plus récente. En effet, les développeurs les plus actifs ont décidé de migrer vers cette plateforme. C&amp;#8217;est le cas d&amp;#8217;Advanced Camera, ou Pure Maps. Pour d&amp;#8217;autres, l&amp;#8217;avance n&amp;#8217;est que de quelques semaines au mieux, le temps que Jolla consomme ses 2 semaines de liste d&amp;#8217;attente de validation. C&amp;#8217;est par exemple le cas de : Sailtrix, Tooter, BarCode &amp;amp; QrClip, Stellarium…&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Mais qu&amp;#8217;est-ce qui a pu motiver les meilleurs développeurs à compliquer encore la situation ? Je ne me suis pas penché sur les gros débats à ce sujet sur le forum, mais j&amp;#8217;y vois au moins un intérêt : la perspective de pouvoir grossir sans subir de trop gros ralentissements. En effet, Chum est un dépôt unique (rapide à charger) là où le couple Storeman / OpenRepos.net s&amp;#8217;est construit en offrant un dépôt pour chaque utilisateur. Le modèle "chacun chez soi" offre un maximum de liberté aux développeurs et ne demande pas vraiment de travail de modération de la part de l&amp;#8217;administrateur du serveur, mais il présente aussi l&amp;#8217;inconvénient de multiplier les latences réseau de mise à jour du catalogue par le nombre de dépôts. Dans cette configuration plus Storeman a de succès (en terme de nombre de développeurs ou de nombre d&amp;#8217;applications installées) plus il est ralenti.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Le modèle de Chum me semble exiger une modération des contenus intégrés au catalogue commun, mais ce sont aussi les temps de chargement de dépôt qui se retrouvent mis en commun.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;En pratique on gagne en plus un clic par installation car il n&amp;#8217;y a plus besoin de s&amp;#8217;abonner d&amp;#8217;abord au dépôt d&amp;#8217;un développeur pour pouvoir installer son application.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Avec Chum, les installations et les recherches de mises à jour sont donc plus rapides.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Il semble que nous soyons dans une période de transition pendant laquelle Storeman reste incontournable, mais présente le piège de proposer des paquets périmés pour certains logiciels importants…&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_patchmanager"&gt;14. Patchmanager&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Il existe encore une caverne d&amp;#8217;Alibaba à explorer. Elle est accessible depuis Storeman, c&amp;#8217;est le Patchmanager.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Ce dernier permet d&amp;#8217;appliquer des modifications (réversibles) aux fichiers du système pour en amender le comportement.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Quand on installe le Patchmanager, une nouvelle entrée est créée dans le menu des paramètres du système.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;En explorant le catalogue des patchs disponibles j&amp;#8217;ai notamment retenu :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;"Torch on lockscreen" et "Pulley menu: Always Bounce Back" qui permettent de mettre l&amp;#8217;appareil en mode torche en deux coup de cuillères à pot (enfin, de pouce) sans le déverrouiller, grâce à un menu du haut de l&amp;#8217;écran à tirer ;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;"Always show close icon" pour fermer plus facilement les applications ;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;"Improved XT9 punctuation handling" : déjà évoqué, mais honnêtement là j&amp;#8217;ai pas comparé avec ou sans ;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;et le meilleur pour la fin : "Compositor Animation" un patch qui ajoute lui aussi une entrée dans le menu des paramètres du système ouvrant vers la possibilité de réduire la durée des animations ! (j&amp;#8217;ai mis 250 ms partout, gagnant ainsi un quart et parfois même une demie seconde sur chaque animation)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_notes_sur_le_quotidien"&gt;15. Notes sur le quotidien&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_autonomie_50_de_batterie_utilisée_par_jour_de_80_à_30"&gt;15.1. Autonomie : 50% de batterie utilisée par jour (de 80% à 30%)&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Mon système tiendrait 2 jours en veille sur les 4100mAh de capacité restante de ma batterie (sur les 4500 annoncés par le constructeur au départ) et il ne descend pas en dessous de 20% les jours les plus occupés. Ce n&amp;#8217;est donc pas une préoccupation : chaque soir je le pose sur une base de rechargement par induction, du côté où j&amp;#8217;ai branché un patch externe, planqué sous la coque et je le récupère à 80% le lendemain.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Si le WiFi est activé et que le téléphone est gardé à portée d&amp;#8217;émetteur, la consommation n&amp;#8217;est plus que de 30% sur une journée légère. On passe de 2,5% de perte batterie par heure à 1,3% (mesuré par l&amp;#8217;application Usage de Storeman). Je n&amp;#8217;imaginais pas une telle différence.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_empreintes_digitales"&gt;15.2. Empreintes digitales&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Le lecteur d&amp;#8217;empreintes digitales est plutôt lent 1 à 3s par lecture… Si en plus vous ajoutez une coque un peu épaisse (qui borde le lecteur d&amp;#8217;empreintes d&amp;#8217;une petite falaise de plastique) déverrouiller l&amp;#8217;appareil peut devenir franchement pénible.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Deux astuces ont permis d&amp;#8217;améliorer grandement la situation :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;enregistrer plusieurs fois mon emprunte de pouce (j&amp;#8217;suis monté à 5, un peu pour tester, avec et sans coque…)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mettre une coque plus fine ! (très efficace)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_un_bon_son"&gt;15.3. Un bon son&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Je tenais à mentionner quelque part que si je suis critique de la qualité du matériel photo embarqué par Sony dans ce modèle, le qualité du son m&amp;#8217;a semblé elle tout à fait à la hauteur (pour ne pas dire très bonne).&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_nextcloud_notes"&gt;15.4. NextCloud Notes&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Il y a une application NextCloud Notes dans Storeman pour interagir avec les notes de son serveur. Je regrette qu&amp;#8217;elle ne garde pas les fichiers en cache hors ligne, mais je l&amp;#8217;utilise beaucoup !&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_en_conclusion"&gt;16. En conclusion&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Pari gagné, j&amp;#8217;ai tenu mes délais et ça a été un beau Noël pour tout le monde !&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Ces découvertes m&amp;#8217;ont enthousiasmées et je me suis bien amusé à peaufiner mon système ensuite.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Et puis le quotidien a repris son cours, tout ce dont j&amp;#8217;ai besoin fonctionne et mon téléphone est repassé de « terrain de jeux » à téléphone qui se fait oublier.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Entre temps j&amp;#8217;ai monté une équipe Liberapay (qui compte déjà 22 développeurs) pour avoir une porte de collecte unique des dons pour les contributeurs de la communauté SailfishOS : &lt;a href="https://liberapay.com/SailfishOScommunityTeam/"&gt;&lt;img src="https://img.shields.io/liberapay/patrons/SailfishOScommunityTeam.svg?logo=liberapay"&gt;&amp;nbsp; &lt;img src="https://img.shields.io/liberapay/receives/SailfishOScommunityTeam.svg?logo=liberapay"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Et j&amp;#8217;ai encore 2-3 idées d&amp;#8217;améliorations du clavier avancé et envie de travailler sur le support de la radio FM embarquée par Qualcomm dans ces engins… Et puis, comme mentionné au début, il vient de sortir un portage communautaire de SailfishOS pour les terminaux Sony Xperia 5 IV : une nouvelle jungle à explorer !&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</content><category term="Articles"/><category term="Fairphone"/><category term="SailfishOS"/></entry><entry><title>Artix boot failures</title><link href="https://grimoire.d12s.fr/2026/artix_boot_failure.html" rel="alternate"/><published>2026-02-08T00:00:00+01:00</published><updated>2026-02-08T00:00:00+01:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2026-02-08:/2026/artix_boot_failure.html</id><summary type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Réparation du démarrage d&amp;#8217;une Artix Linux.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;If it bips instead of displaying things : check RAM or storage.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;If it displays : no bootable media found ; dive into the BIOS to check if it forgot your UEFI boot options and create new ones.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;If your BIOS can&amp;#8217;t create them, boot …&lt;/p&gt;&lt;/div&gt;</summary><content type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Réparation du démarrage d&amp;#8217;une Artix Linux.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;If it bips instead of displaying things : check RAM or storage.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;If it displays : no bootable media found ; dive into the BIOS to check if it forgot your UEFI boot options and create new ones.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;If your BIOS can&amp;#8217;t create them, boot from an Artix live USB.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Once the desktop is loaded click the ciphered-volume icon to mount it.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Then open a console :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;$ sudo mount -o bind /run/media/artix/BOOT /run/media/artix/51f97c3f-cb07-4e9c-940d-2979138a5457/boot/efi/BOOT
$ sudo artix-chroot /run/media/artix/51f97c3f-cb07-4e9c-940d-2979138a5457&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;If you were stuck before GRUB at startup, try re-installing GRUB (it should create the necessary UEFI boot options in the BIOS) :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;# update-grub
# grub-install /dev/sda&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;If you were stuck after the GRUB at initramfs loading time you can explore the situation with the following commands :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;# pacman -Qikk linux
Name            : linux
Version         : 6.9.10.arch1-1
Description     : The Linux kernel and modules
Architecture    : x86_64
[…]
# file /boot/vmlinuz-linux
/boot/vmlinuz-linux: Linux kernel x86 boot executable bzImage, version 6.9.10-arch1-1 (linux@archlinux) #1 SMP PREEMPT_DYNAMIC Thu, 18 Jul 2024 18:06:13 +0000, RO-rootFS, swap_dev 0XC, Normal VGA
# uname -r
6.8.9-zen1-2-zen&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Then this single command should fix things :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;# pacman -S linux&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;If you get errors during the execution of the above command (like missing kernel modules) you have work to do… Try this :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;# ls /usr/lib/modules
6.9.10-arch1-1
# depmod -a 6.9.10-arch1-1
# mkinitcpio -P &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;This will regenerate the initramfs (&lt;code&gt;-P&lt;/code&gt; for all presets)&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;If there were no more errors you can safely reboot.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Commands were mainly read from : &lt;a href="https://bbs.archlinux.org/viewtopic.php?id=298525" class="bare"&gt;https://bbs.archlinux.org/viewtopic.php?id=298525&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;</content><category term="Commandes"/><category term="adminsys"/><category term="Artix"/></entry><entry><title>Stop chromium process from inhibiting power management</title><link href="https://grimoire.d12s.fr/2026/xfce4_power_manager.html" rel="alternate"/><published>2026-01-28T00:00:00+01:00</published><updated>2026-01-28T00:00:00+01:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2026-01-28:/2026/xfce4_power_manager.html</id><summary type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Chromium a un bug connu par lequel il verrouille la gestion de l&amp;#8217;alimentation d&amp;#8217;une machine Linux, par exemple pour éviter que l&amp;#8217;ordinateur ne se mette en veille pendant la lecture d&amp;#8217;une vidéo, et laisse le verrou en place après usage. En fermant chromium et en relançant …&lt;/em&gt;&lt;/p&gt;&lt;/div&gt;</summary><content type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Chromium a un bug connu par lequel il verrouille la gestion de l&amp;#8217;alimentation d&amp;#8217;une machine Linux, par exemple pour éviter que l&amp;#8217;ordinateur ne se mette en veille pendant la lecture d&amp;#8217;une vidéo, et laisse le verrou en place après usage. En fermant chromium et en relançant la gestion de l&amp;#8217;alimentation d&amp;#8217;XFCE on permet à nouveau à la machine de gérer son alimentation.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;If "chromium inhibits the power management": kill all chromium instances and restart XFCE power management.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;$ xfce4-power-manager --restart&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Ressources :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://systemd.io/INHIBITOR_LOCKS/" class="bare"&gt;https://systemd.io/INHIBITOR_LOCKS/&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://unix.stackexchange.com/questions/451413/disabling-chromium-xfce-power-management-inhibition" class="bare"&gt;https://unix.stackexchange.com/questions/451413/disabling-chromium-xfce-power-management-inhibition&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://bugs.launchpad.net/ubuntu/+source/gnome-session/+bug/1600622" class="bare"&gt;https://bugs.launchpad.net/ubuntu/+source/gnome-session/+bug/1600622&lt;/a&gt; 2016-07-10&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Using uBlock origins prevent chromium from loading the GoogleTagServices.com script that causes the bad locking behavior&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;</content><category term="Commandes"/><category term="repair"/></entry><entry><title>ZRAM compressed RAM swap</title><link href="https://grimoire.d12s.fr/2025/zram_compressed_ram_swap.html" rel="alternate"/><published>2025-12-06T00:00:00+01:00</published><updated>2025-12-06T00:00:00+01:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2025-12-06:/2025/zram_compressed_ram_swap.html</id><summary type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Ajouter de la RAM virtuelle à sa machine, avec une mémoire d&amp;#8217;échange compressée.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;The linux kernel comes with a &lt;code&gt;zram&lt;/code&gt; module which provides the &lt;code&gt;zramctl&lt;/code&gt; command. It allows to setup a virtual memory storage which content is stored compressed. This allows to store more things in RAM, at the …&lt;/p&gt;&lt;/div&gt;</summary><content type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Ajouter de la RAM virtuelle à sa machine, avec une mémoire d&amp;#8217;échange compressée.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;The linux kernel comes with a &lt;code&gt;zram&lt;/code&gt; module which provides the &lt;code&gt;zramctl&lt;/code&gt; command. It allows to setup a virtual memory storage which content is stored compressed. This allows to store more things in RAM, at the cost of a slower access for the compressed part.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;This is a better solution for a previous problem evoqued here : &lt;a href="/2019/no_swap_no_freeze.html"&gt;No swap but no freeze&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;$ sudo vi /etc/rc.local&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;modprobe zram &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
zramctl /dev/zram0 --algorithm zstd --size "$(grep MemTotal /proc/meminfo | tr -dc '0-9')KiB" &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;
mkswap -U clear /dev/zram0 &lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;(3)&lt;/b&gt;
swapon --priority 100 /dev/zram0 &lt;i class="conum" data-value="4"&gt;&lt;/i&gt;&lt;b&gt;(4)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;This line allows to load the zram module in the running kernel&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;This invoques the zramctl command to create the virtual drive. It specifies wich compression algorithm to use, here it&amp;#8217;s Z-standard (an algorithme known to be very fast on decompression), and the size of the virtual drive, here it&amp;#8217;s the size of the existing physical RAM, but it can be more or less depending on specific needs).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;This line format the virtual drive to allow using it as a swap drive.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="4"&gt;&lt;/i&gt;&lt;b&gt;4&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;This last line tells the system to actually use the zram drive as a swap one.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Then you can increase the swappiness of your system.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;$ sudo vi /etc/sysctl.d/99-vm-zram-parameters.conf&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;# https://wiki.archlinux.org/title/Zram
vm.swappiness = 180
vm.watermark_boost_factor = 0
vm.watermark_scale_factor = 125
vm.page-cluster = 0&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;</content><category term="Commandes"/><category term="adminsys"/><category term="hardware"/><category term="optimization"/><category term="storage"/></entry><entry><title>Kill long PostgreSQL request</title><link href="https://grimoire.d12s.fr/2025/kill_long_postgresql_request.html" rel="alternate"/><published>2025-12-03T00:00:00+01:00</published><updated>2025-12-03T00:00:00+01:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2025-12-03:/2025/kill_long_postgresql_request.html</id><summary type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Interrompre une requête PostgreSQL trop longue.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;# ./manage.py dbshell &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
DB_NAME=&amp;gt; SELECT * FROM pg_stat_activity WHERE state = 'active'; &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;
DB_NAME=&amp;gt; SELECT pg_cancel_backend(&amp;lt;pid of the process&amp;gt;); &lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;(3)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;If you are working on a Django project, else check : &lt;a href="/2019/database_list_tables.html"&gt;here&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;This will output a description of currently processed queries, their PID …&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;</summary><content type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Interrompre une requête PostgreSQL trop longue.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;# ./manage.py dbshell &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
DB_NAME=&amp;gt; SELECT * FROM pg_stat_activity WHERE state = 'active'; &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;
DB_NAME=&amp;gt; SELECT pg_cancel_backend(&amp;lt;pid of the process&amp;gt;); &lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;(3)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;If you are working on a Django project, else check : &lt;a href="/2019/database_list_tables.html"&gt;here&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;This will output a description of currently processed queries, their PID is the 3rd field.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;This tries a gracefull stop, if it is still to long to stop try &lt;code&gt;SELECT pg_terminate_backend(&amp;lt;pid of the process&amp;gt;);&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Discorvered here : &lt;a href="https://stackoverflow.com/a/35319598" class="bare"&gt;https://stackoverflow.com/a/35319598&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;</content><category term="Commandes"/><category term="database"/><category term="adminsys"/></entry><entry><title>Late purge of removed packages on Debian</title><link href="https://grimoire.d12s.fr/2025/late_purge_of_removed_packages_on_debian.html" rel="alternate"/><published>2025-10-07T00:00:00+02:00</published><updated>2025-10-07T00:00:00+02:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2025-10-07:/2025/late_purge_of_removed_packages_on_debian.html</id><summary type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Purger des paquets déjà supprimés et ayant laissés des fichiers derrières eux.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;# dpkg -l | awk '/^rc/ {print $2}' | sudo xargs dpkg -P &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt; &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;This lists the packages, filter those which line starts with « rc » and purge them, one by one as they are discovered.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Extracted from : &lt;a href="https://askubuntu.com/questions/687295/how-to-purge-previously-only-removed-packages" class="bare"&gt;https …&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;</summary><content type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Purger des paquets déjà supprimés et ayant laissés des fichiers derrières eux.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;# dpkg -l | awk '/^rc/ {print $2}' | sudo xargs dpkg -P &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt; &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;This lists the packages, filter those which line starts with « rc » and purge them, one by one as they are discovered.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Extracted from : &lt;a href="https://askubuntu.com/questions/687295/how-to-purge-previously-only-removed-packages" class="bare"&gt;https://askubuntu.com/questions/687295/how-to-purge-previously-only-removed-packages&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Et selon les notes de publication de Debian &lt;a href="https://www.debian.org/releases/trixie/release-notes/upgrading.en.html#cleanup-after-the-upgrade" class="bare"&gt;https://www.debian.org/releases/trixie/release-notes/upgrading.en.html#cleanup-after-the-upgrade&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;# apt list '?config-files' &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
# apt purge '?config-files' &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;List those packages&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Purge them&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Merci &lt;a href="https://piaille.fr/@whilelm@mstdn.fr/115333035593334079"&gt;WhilelM&lt;/a&gt; !&lt;/p&gt;
&lt;/div&gt;</content><category term="Commandes"/><category term="Debian"/><category term="adminsys"/></entry><entry><title>Format JSON data in VIM editor</title><link href="https://grimoire.d12s.fr/2025/format_json_in_vim.html" rel="alternate"/><published>2025-09-30T00:00:00+02:00</published><updated>2025-09-30T00:00:00+02:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2025-09-30:/2025/format_json_in_vim.html</id><content type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Comment reformater des données JSON compactées pour les rendre plus lisibles par un humain.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;:%!jq . &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Calls extarnal command &lt;code&gt;jq&lt;/code&gt; over all the vim buffer content (the currently edited file)&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;</content><category term="Commandes"/><category term="code"/><category term="vim"/></entry><entry><title>No sound with Wine</title><link href="https://grimoire.d12s.fr/2025/no_sound_with_wine.html" rel="alternate"/><published>2025-04-04T00:00:00+02:00</published><updated>2025-04-04T00:00:00+02:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2025-04-04:/2025/no_sound_with_wine.html</id><content type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Que faire si les jeux lancés avec Wine ne produisent pas de son ?&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;$ pamac install lib32-mesa lib32-vulkan-intel &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Those libraries are needed (maybe only under Artix Linux)&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;</content><category term="Commandes"/><category term="game"/></entry><entry><title>Format ciphered ext4 USB key</title><link href="https://grimoire.d12s.fr/2025/format_ciphered_ext4_usb_key.html" rel="alternate"/><published>2025-03-25T00:00:00+01:00</published><updated>2025-03-25T00:00:00+01:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2025-03-25:/2025/format_ciphered_ext4_usb_key.html</id><summary type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Formater une nouvelle clé USB chiffrée, en ext4 pour Linux.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;# # plug-in the storage peripheral
# cfdisk /dev/sdb &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
# cryptsetup luksFormat /dev/sdb1 &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;
# cryptsetup open /dev/sdb1 cle &lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;(3)&lt;/b&gt;
# mkfs.ext4 -v -L 'Étiquette' -b 4096 -E stride=128,stripe-width=256 /dev/mapper/cle &lt;i class="conum" data-value="4"&gt;&lt;/i&gt;&lt;b&gt;(4)&lt;/b&gt;
# # click in Thunar to mount …&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;</summary><content type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Formater une nouvelle clé USB chiffrée, en ext4 pour Linux.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;# # plug-in the storage peripheral
# cfdisk /dev/sdb &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
# cryptsetup luksFormat /dev/sdb1 &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;
# cryptsetup open /dev/sdb1 cle &lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;(3)&lt;/b&gt;
# mkfs.ext4 -v -L 'Étiquette' -b 4096 -E stride=128,stripe-width=256 /dev/mapper/cle &lt;i class="conum" data-value="4"&gt;&lt;/i&gt;&lt;b&gt;(4)&lt;/b&gt;
# # click in Thunar to mount the volume
# chmod -R 777 /run/media/$user/Étiquette &lt;i class="conum" data-value="5"&gt;&lt;/i&gt;&lt;b&gt;(5)&lt;/b&gt;
# umount /dev/mapper/cle &lt;i class="conum" data-value="6"&gt;&lt;/i&gt;&lt;b&gt;(6)&lt;/b&gt;
# cryptsetup close /dev/mapper/cle &lt;i class="conum" data-value="7"&gt;&lt;/i&gt;&lt;b&gt;(7)&lt;/b&gt;
# # plug-off the storage peripheral&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Create a partition via this text-based curses program&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Format the partition as a LUKS container&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Mount the LUKS container as a /dev/mapper peripheral&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="4"&gt;&lt;/i&gt;&lt;b&gt;4&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Format the container as an Ext4 filesystem&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="5"&gt;&lt;/i&gt;&lt;b&gt;5&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Lazy step : set permissions to "free for all" to share the disk with different users&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="6"&gt;&lt;/i&gt;&lt;b&gt;6&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;umount the Ext4 partition&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="7"&gt;&lt;/i&gt;&lt;b&gt;7&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;close the LUKS container&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;</content><category term="Commandes"/><category term="storage"/></entry><entry><title>Free some space on Ubuntu</title><link href="https://grimoire.d12s.fr/2025/free_some_storage_space_on_ubuntu.html" rel="alternate"/><published>2025-03-13T00:00:00+01:00</published><updated>2025-03-13T00:00:00+01:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2025-03-13:/2025/free_some_storage_space_on_ubuntu.html</id><summary type="html">&lt;div id="toc" class="toc"&gt;
&lt;div id="toctitle"&gt;Index&lt;/div&gt;
&lt;ul class="sectlevel1"&gt;
&lt;li&gt;&lt;a href="#_version_en"&gt;1. version : en&lt;/a&gt;
&lt;ul class="sectlevel2"&gt;
&lt;li&gt;&lt;a href="#_checking_the_situation"&gt;1.1. Checking the situation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_the_easy_graphical_way_stacer"&gt;1.2. The easy graphical way : Stacer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_removing_unused_packages_applications_programs_using_synaptic"&gt;1.3. Removing unused packages / applications / programs using Synaptic&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_tame_systemd_journald_log_size"&gt;1.4. Tame SystemD &lt;code&gt;journald&lt;/code&gt; log size&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_drop_old_snap_versions"&gt;1.5. Drop old &lt;code&gt;snap&lt;/code&gt; versions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_free_some_space_using_apt"&gt;1.6. Free some space using &lt;code&gt;apt&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_manually_remove_old_linux_kernels"&gt;1.7. Manually remove old …&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;</summary><content type="html">&lt;div id="toc" class="toc"&gt;
&lt;div id="toctitle"&gt;Index&lt;/div&gt;
&lt;ul class="sectlevel1"&gt;
&lt;li&gt;&lt;a href="#_version_en"&gt;1. version : en&lt;/a&gt;
&lt;ul class="sectlevel2"&gt;
&lt;li&gt;&lt;a href="#_checking_the_situation"&gt;1.1. Checking the situation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_the_easy_graphical_way_stacer"&gt;1.2. The easy graphical way : Stacer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_removing_unused_packages_applications_programs_using_synaptic"&gt;1.3. Removing unused packages / applications / programs using Synaptic&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_tame_systemd_journald_log_size"&gt;1.4. Tame SystemD &lt;code&gt;journald&lt;/code&gt; log size&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_drop_old_snap_versions"&gt;1.5. Drop old &lt;code&gt;snap&lt;/code&gt; versions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_free_some_space_using_apt"&gt;1.6. Free some space using &lt;code&gt;apt&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_manually_remove_old_linux_kernels"&gt;1.7. Manually remove old Linux kernels&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#_version_fr"&gt;2. version : fr&lt;/a&gt;
&lt;ul class="sectlevel2"&gt;
&lt;li&gt;&lt;a href="#_faire_le_point_sur_lusage_disque"&gt;2.1. Faire le point sur l&amp;#8217;usage disque&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_la_methode_graphique_stacer"&gt;2.2. La methode graphique : Stacer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_supprimer_des_paquets_applications_programmes_et_librairies_via_synaptic"&gt;2.3. Supprimer des paquets / applications / programmes et librairies via Synaptic&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_dompter_la_taille_des_journaux_de_fonctionnement_systemd_tenus_par_journald"&gt;2.4. Dompter la taille des journaux de fonctionnement SystemD tenus par &lt;code&gt;journald&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_supprimer_les_vieux_paquets_snap"&gt;2.5. Supprimer les vieux paquets &lt;code&gt;snap&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_libérer_de_lespace_en_utilisant_apt"&gt;2.6. Libérer de l&amp;#8217;espace en utilisant &lt;code&gt;apt&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_supprimer_manuellement_les_vieux_noyaux"&gt;2.7. Supprimer "manuellement" les vieux noyaux&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id="preamble"&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Libérer de l&amp;#8217;espace disque avec Ubuntu / xUbuntu&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_version_en"&gt;1. version : en&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Via the &lt;a href="https://gebull.org"&gt;Gebull&lt;/a&gt; Linux User Group we had several demands about unexpectedly saturated disks on Ubuntu. It means that regular users did not copy too much files on their storage but Ubuntu did filled it up with bloat things. Let&amp;#8217;s see what can be safely removed.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_checking_the_situation"&gt;1.1. Checking the situation&lt;/h3&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;$ df -h | rg '/$'
/dev/dm-0          916G    842G   74G  92% /&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;This command display the occupation percentage of your main storage peripheral. Here it&amp;#8217;s 92%. So we&amp;#8217;re about to have problems. Problems occurs at 100%. The system can&amp;#8217;t run with a saturated disk, as most programs you use need to write temporary files to run, and you&amp;#8217;ll need space to store your new work anyway.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;After each attempt to improve the situation, you&amp;#8217;ll be able to run this command again and see the improvement.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_the_easy_graphical_way_stacer"&gt;1.2. The easy graphical way : Stacer&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Stacer is an application you can install on Ubuntu (via the graphical interface or the command line) :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;$ sudo apt install stacer&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Then launch &lt;code&gt;stacer&lt;/code&gt; :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;$ stacer&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;It will list several way to cleanup the system, such as :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;removing old unused snap paquet versions&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;removing old unused Linux kernel versions&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;emptying the trashbin&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;removing &lt;code&gt;apt&lt;/code&gt; caches&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;…&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_removing_unused_packages_applications_programs_using_synaptic"&gt;1.3. Removing unused packages / applications / programs using Synaptic&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;This can be done via the graphical interface Synaptic. Filter your installed packages only, sort them by size to spot the biggests and remove the one corresponding to what you remember you installed a while ago, stopped using since and forgot about.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;This last point is important, you wont come up the idea of what package to remove, but browsing them via Synaptic should allow you to spot them.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;In particular, games might be big applications.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Removing old Linux kernel can also be done via Synaptic.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_tame_systemd_journald_log_size"&gt;1.4. Tame SystemD &lt;code&gt;journald&lt;/code&gt; log size&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;As of 2022 - 2025 the Ubuntu defaut `journald`setting allows this program to store gigabytes of system logs. This might be enough to bloat your storage.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;You can check the size of your current logs, drop the old ones and set the tool to limit its appetite :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;$ sudo journalctl --disk-usage &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
$ sudo journalctl --vacuum-size 10M &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;
$ sudo nano /etc/systemd/journald.conf &lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;(3)&lt;/b&gt;
 …
SystemMaxUse=10M
 …&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;check current systemd log disk usage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;drop everything but the last 10MO of logs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;edit the journald configuration file to set a permanent 10MO limit&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_drop_old_snap_versions"&gt;1.5. Drop old &lt;code&gt;snap&lt;/code&gt; versions&lt;/h3&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;$ du -hs /var/lib/snapd/snaps &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
$ sudo snap set system refresh.retain=2 &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;
$ sudo snap list --all &lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;(3)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;check the snap storage usage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;set snap to keep only the 2 last versions of each package (default can found at 20…)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;list all snaps to check what remains&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_free_some_space_using_apt"&gt;1.6. Free some space using &lt;code&gt;apt&lt;/code&gt;&lt;/h3&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;$ df -h | rg '/$'
$ /dev/sdb3           29G     27G  535M  99% /
$ sudo apt autoremove &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
$ /dev/sdb3           29G     26G  1,1G  97% /
$ sudo apt-get autoclean &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;
$ /dev/sdb3           29G     26G  1,1G  97% /
$ sudo apt-get clean &lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;(3)&lt;/b&gt;
$ /dev/sdb3           29G     26G  1,2G  96% /&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;remove packages that were installed automatically (as dependency from other packages) but are not usefull anymore (as the needing packages were removed since)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;remove useless files in local cache (if you need more, jump to the next command)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;remove all files in local cache&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_manually_remove_old_linux_kernels"&gt;1.7. Manually remove old Linux kernels&lt;/h3&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;$ sudo dpkg --get-selections | grep linux-image &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
$ sudo apt remove --purge linux-image-X.X.XX-XX-generic &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;list all the installed linux-image packages&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;remove (with all its configuration files) the designated linux-image package (one by one)&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_version_fr"&gt;2. version : fr&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Au groupe d&amp;#8217;utilisateur de GNU+Linux &lt;a href="https://gebull.org"&gt;Gebull&lt;/a&gt; à Bressuire on a récemment eu plusieurs demandes d&amp;#8217;utilisateurs ayant une machine, sous GNU+Linux, qui arrête du jour au lendemain de fonctionner correctement. Dans ces cas là, il s&amp;#8217;agissait de la distribution Ubuntu et c&amp;#8217;était le disque dur qui était plein. Les utilisateurs ont été surpris car il n&amp;#8217;avaient pas copié eux même trop de fichier sur leur disque. Puisqu&amp;#8217;Ubuntu à tendance à remplir le disque, voyons comment faire de la place.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_faire_le_point_sur_lusage_disque"&gt;2.1. Faire le point sur l&amp;#8217;usage disque&lt;/h3&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;$ df -h | rg '/$'
/dev/dm-0          916G    842G   74G  92% /&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Cette commande affiche le pourcentage d&amp;#8217;occupation du disque principal. Ici c&amp;#8217;est 92%, les problèmes ne vont pas tarder. Un disque rempli à 100% pose problème. Le système ne peut pas fonctionner avec un disque entièrement plein car la plupart des programmes ont besoin de créer des fichiers temporaires pour fonctionner, et puis vous aurez besoin d&amp;#8217;espace pour stocker vos propres travaux de toutes façons.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Après chaque opération de maintenance, il sera intéressant de relancer cette commande pour suivre l&amp;#8217;avancée des résultats.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_la_methode_graphique_stacer"&gt;2.2. La methode graphique : Stacer&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Stacer est un utilitaire graphique de maintenance qui vous pouvez installer sur Ubuntu via l&amp;#8217;une des interfaces graphiques prévues pour ou via la commande suivante :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;$ sudo apt install stacer&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Il vous suffira ensuite d&amp;#8217;invoquer la commande &lt;code&gt;stacer&lt;/code&gt; pour lancer l&amp;#8217;utilitaire :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;$ stacer&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Stacer propose plusieurs leviers pour tenter de regagner de l&amp;#8217;espace libre :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;supprimer les vieux paquets &lt;code&gt;snap&lt;/code&gt; plus utilisés&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;supprimer les vieilles versions du noyau Linux&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;vider la corbeille&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;supprimer les caches du gestionnaire de paquet &lt;code&gt;apt&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;…&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_supprimer_des_paquets_applications_programmes_et_librairies_via_synaptic"&gt;2.3. Supprimer des paquets / applications / programmes et librairies via Synaptic&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Synaptic est un utilitaire graphique d&amp;#8217;installation de paquets. Il permet de ne lister que les paquets installés, et de trier ces derniers par taille de paquet. On peut ainsi facilement repérer les gros paquets et désinstaller ceux qui correspondent à des programmes que vous avez installés il y a longtemps, dont vous ne vous servez plus et dont vous aviez peut être même oublié l&amp;#8217;existence.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Ce dernier point est important car l&amp;#8217;idée de supprimer ces vieux paquets ne vous viendra probablement pas spontanément tant que vous ne serez pas allé re-parcourir la liste dans Synaptic.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;En particulier, les jeux peuvent facilement représenter de gros paquets qu&amp;#8217;on oublie.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Il est enfin également possible de retirer les vieux noyaux Linux depuis Synaptic.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_dompter_la_taille_des_journaux_de_fonctionnement_systemd_tenus_par_journald"&gt;2.4. Dompter la taille des journaux de fonctionnement SystemD tenus par &lt;code&gt;journald&lt;/code&gt;&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Depuis au moins 2022 la configuration par défaut de &lt;code&gt;journald&lt;/code&gt; dans Ubuntu permet à ce programme de stocker des giga-octets de journaux de fonctionnement. Cela représente malheureusement rapidement beaucoup de place occupée pour rien si vous ignoriez même l&amp;#8217;existence de ces journaux.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Vous pouvez vérifier la place qu&amp;#8217;ils prennent chez vous, la diminuer et limiter durablement l&amp;#8217;appétit de cet ogre :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;$ sudo journalctl --disk-usage &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
$ sudo journalctl --vacuum-size 10M &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;
$ sudo nano /etc/systemd/journald.conf &lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;(3)&lt;/b&gt;
 …
SystemMaxUse=10M
 …&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;affiche l&amp;#8217;espace disque utilisé actuellement par les logs de SystemD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;supprimer tout ce qui dépasse de 10MO&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;éditer le fichier de configuration de &lt;code&gt;journald&lt;/code&gt; pour imposer une limite permanente de 10MO. Il sera toujours possible d&amp;#8217;en remettre plus pour observer un phénomène si le besoin apparait plus tard.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_supprimer_les_vieux_paquets_snap"&gt;2.5. Supprimer les vieux paquets &lt;code&gt;snap&lt;/code&gt;&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Ces paquets alternatifs à ceux gérés par Synaptic ont comme caractéristiques d&amp;#8217;embarquer tout l&amp;#8217;environnement d&amp;#8217;exécution d&amp;#8217;un programme au lieu de se contenter de celui fournis par le système et partagé avec les autres programmes. Ces paquets sont donc tous très gros, c&amp;#8217;est fait exprès.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Ils sont à réserver pour vos quelques applications métier, rares, pas inclues dans le catalogue  normal de Synaptic (qui compte des dizaines de milliers de références), et dont vous avez besoin des dernières versions pour travailler.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;$ du -hs /var/lib/snapd/snaps &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
$ sudo snap set system refresh.retain=2 &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;
$ sudo snap list --all &lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;(3)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;vérifier l&amp;#8217;espace de stockage utilisé par les paquets snaps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;configurer les &lt;code&gt;snap&lt;/code&gt; pour que seules les 2 dernières versions de chaque paquet soient gardées sur les disque dur (il arrive que la valeur par défaut soit réglée à 20 !). Il est intéressant de garder une ou deux anciennes versions au cas où la nouvelle reçue soit défectueuse.g&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;lister l&amp;#8217;ensemble des paquets &lt;code&gt;snap&lt;/code&gt; pour voir ceux qui subsistent.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_libérer_de_lespace_en_utilisant_apt"&gt;2.6. Libérer de l&amp;#8217;espace en utilisant &lt;code&gt;apt&lt;/code&gt;&lt;/h3&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;$ df -h | rg '/$'
$ /dev/sdb3           29G     27G  535M  99% /
$ sudo apt autoremove &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
$ /dev/sdb3           29G     26G  1,1G  97% /
$ sudo apt-get autoclean &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;
$ /dev/sdb3           29G     26G  1,1G  97% /
$ sudo apt-get clean &lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;(3)&lt;/b&gt;
$ /dev/sdb3           29G     26G  1,2G  96% /&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;supprime les vieux paquets qui ont été installés automatiquement en tant que dépendance d&amp;#8217;autres paquets et qui ne sont plus utiles aujourd&amp;#8217;hui car les paquets qui en avaient besoin ont été supprimés.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;supprimer les fichiers inutiles du cache local d&amp;#8217;APT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;supprimer tous les fichiers du cache local d&amp;#8217;APT&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_supprimer_manuellement_les_vieux_noyaux"&gt;2.7. Supprimer "manuellement" les vieux noyaux&lt;/h3&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;$ sudo dpkg --get-selections | grep linux-image &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
$ sudo apt remove --purge linux-image-X.X.XX-XX-generic &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;cette ligne liste tous les paquets contenant linux-image dans leur nom&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;cette ligne supprimer le noyau ciblé. Faîtes attention à garder au moins le paquet du noyau en cours d&amp;#8217;utilisation (sinon le système va devenir instable) et au moins un noyau installé, sinon le système ne redémarrera pas. &lt;code&gt;--purge&lt;/code&gt; permet de supprimer en plus du noyau tous ces fichiers de configuration (pour gagner encore plus de place, alors qu&amp;#8217;ils sont conservés par défaut au cas où vous les auriez modifié, ce qui prends du temps, un temps qu&amp;#8217;on n&amp;#8217;a généralement pas envie de perdre en supprimant le paquet).&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</content><category term="Articles"/><category term="adminsys"/><category term="Debian"/><category term="hardware"/><category term="repair"/><category term="storage"/></entry><entry><title>SSH : remote host identification has changed</title><link href="https://grimoire.d12s.fr/2025/ssh_remote_host_identification_has_changed.html" rel="alternate"/><published>2025-01-22T00:00:00+01:00</published><updated>2025-01-22T00:00:00+01:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2025-01-22:/2025/ssh_remote_host_identification_has_changed.html</id><summary type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Que faire quand SSH refuse de se connecter à une machine dont la clé d&amp;#8217;identification a changé ?&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code&gt;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host …&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;</summary><content type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Que faire quand SSH refuse de se connecter à une machine dont la clé d&amp;#8217;identification a changé ?&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code&gt;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;If you can identify what caused the change of the identification key, like an update in your hosting plan, it&amp;#8217;s OK to just forget the old key using this command:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;$ ssh-keygen -R 192.168.3.10 &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;IP address of the remote host&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;</content><category term="Commandes"/><category term="shell"/><category term="security"/><category term="network"/></entry><entry><title>Thermal pad to maximize performances of aluminium shell laptops</title><link href="https://grimoire.d12s.fr/2024/thermald_pad_to_maximize_the_performance_of_an_asus_ux305ca.html" rel="alternate"/><published>2024-12-07T00:00:00+01:00</published><updated>2024-12-07T00:00:00+01:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2024-12-07:/2024/thermald_pad_to_maximize_the_performance_of_an_asus_ux305ca.html</id><summary type="html">&lt;div id="toc" class="toc"&gt;
&lt;div id="toctitle"&gt;Index&lt;/div&gt;
&lt;ul class="sectlevel1"&gt;
&lt;li&gt;&lt;a href="#_version_en"&gt;1. version : en&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_version_fr"&gt;2. version : fr&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_version_en"&gt;1. version : en&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;3 years after the &lt;a href="/2021/intel_undervolt.html"&gt;undervolting&lt;/a&gt; of my laptop (which improved its performances) I finally unlocked another level of performance. I stumbled upon some thermal pad : a 2-3mm thick fragile silicon-like sticky material, I found on the dead body of another …&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</summary><content type="html">&lt;div id="toc" class="toc"&gt;
&lt;div id="toctitle"&gt;Index&lt;/div&gt;
&lt;ul class="sectlevel1"&gt;
&lt;li&gt;&lt;a href="#_version_en"&gt;1. version : en&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_version_fr"&gt;2. version : fr&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_version_en"&gt;1. version : en&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;3 years after the &lt;a href="/2021/intel_undervolt.html"&gt;undervolting&lt;/a&gt; of my laptop (which improved its performances) I finally unlocked another level of performance. I stumbled upon some thermal pad : a 2-3mm thick fragile silicon-like sticky material, I found on the dead body of another laptop.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I opened my Asus UX305 CA series laptop from 2015 (the one I use since the creation of this blog) and applied the thermal pad to the heat producing components : CPU cooler, RAM chips, SSD… Then I removed the plastic sticker of the aluminium bottom shell of the computer and closed it with the thermal pad touching directly this aluminium external shell.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="imageblock"&gt;
&lt;div class="content"&gt;
&lt;img src="/files/20241206_181647_.jpg" alt="20241206 181647 "&gt;
&lt;/div&gt;
&lt;div class="title"&gt;Figure 1. Light blue thermal pad applied on copper heat pipe inside an opened Asus UX305 laptop&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I even did not got the computer out of it sleeping state (s2idle) doing so. The CPU temperature became lower than 35°C (instead of 45°) while idling awake.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Then I tried a stress test of the CPU (just the &lt;code&gt;yes&lt;/code&gt; command) and watched for temperatures raise. As the results where good I rushed to the &lt;code&gt;/etc/intel-undervolt.conf&lt;/code&gt; file and focused on the &lt;code&gt;power package&lt;/code&gt; line.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;My default settings here where like : &lt;code&gt;power package 15/0.002 7/28&lt;/code&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Meaning 15w allowed for 2ms and 7w allowed for 28s, then temperature-throttling regime.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I tested several configurations in a progressive manner to reach a virtually fully unlimiting configuration : &lt;code&gt;power package 30/32 20/192&lt;/code&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;For a 15w CPU it fills unlimited.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Then I restarted my stress test and witnessed that the temperatures don&amp;#8217;t go upper than 79°C. It is noticeable on the leg that support the machine (the lap-top), but not unbearable.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;The result ? The CPU runs indefinitely at 2,4GHz instead 1,4GHz. My best overclocking, ever.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Then I remembered the CPU scaling governor existence and switched it from &lt;code&gt;powersave&lt;/code&gt; to &lt;code&gt;performance&lt;/code&gt; (having no other choices available) and got the machine running at the official 3,1GHz when doing nothing, then 2,90GHz for around 30s (reaching 90°C) and then slowly decreasing to 2,60GHz to maintain the 90°C (on temperature throttling regime).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Now, sure, we&amp;#8217;re at pick performance, and I only regret not having done this before, long before… (and to be true, the computer emits a small &lt;a href="https://en.wikipedia.org/wiki/Electromagnetically_induced_acoustic_noise"&gt;coil whine&lt;/a&gt; so I keep using the &lt;code&gt;powersave&lt;/code&gt; governor, no luck).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;# cat /sys/devices/system/cpu/cpufreq/policy3/scaling_governor &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
powersave performance
# echo powersave &amp;gt; /sys/devices/system/cpu/cpufreq/policy3/scaling_governor &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;List possible scaling governors (it exists policy{0,3} don&amp;#8217;t know why it&amp;#8217;s 3 that works)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Tells the kernel we want the &lt;code&gt;powersave&lt;/code&gt; CPU energy policy&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Bonus: Now, when waking the machine from a long enough sleep, I get the room temperature as CPU temperature.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_version_fr"&gt;2. version : fr&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;3 ans après le &lt;a href="/2021/intel_undervolt.html"&gt;sous-voltage&lt;/a&gt; de mon portable (qui avait amélioré les performances) j&amp;#8217;ai finalement mis la main sur des morceaux de feuilles de gélatine thermique (&lt;em&gt;thermal pad&lt;/em&gt;) : il s&amp;#8217;agit d&amp;#8217;un matériaux souple comme du silicone et un peu collant, présenté sous forme de petites plaques et agissant comme de la pâte thermique épaisse.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Je me suis alors décidé à ouvrir mon Asus UX305 série CA de 2015 (celui que j&amp;#8217;utilise depuis la création de ce blog) et coller les "gélatines" thermiques sur les parties chauffantes : le cuivre du radiateur du CPU, les puces de la RAM, le SSD… J&amp;#8217;ai également retiré la feuille plastique collée à l&amp;#8217;intérieur de la coque en aluminium de la machine avant de la refermer, plaquée sur les "gélatines" thermiques.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="imageblock"&gt;
&lt;div class="content"&gt;
&lt;img src="/files/20241206_181647_.jpg" alt="20241206 181647 "&gt;
&lt;/div&gt;
&lt;div class="title"&gt;Figure 2. Gélatines thermiques bleues ciels appliquées sur le caloduc en cuivre d&amp;#8217;un ordinateur portable Asus UX305 ouvert&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Je n&amp;#8217;ai même pas pris la peine d&amp;#8217;éteindre la machine pour faire ça, elle est restée en veille (s2idle). En sortie de veille la température de la machine au repos étaient passées de 45°C à 35°C.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;J&amp;#8217;ai alors lancé un petit test de montée en charge (en lançant un &lt;code&gt;yes&lt;/code&gt; dans une console) et observé attentivement la température du CPU qui montait. Comme le résultat était très bon, je me suis précipité sur le fichier &lt;code&gt;/etc/intel-undervolt.conf&lt;/code&gt; en me concentrant sur la liste &lt;code&gt;power package&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Le réglage par défaut était : &lt;code&gt;power package 15/0.002 7/28&lt;/code&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Ce qui signifie que 15w sont autorisés pendant 2ms puis 7w pendant 28s, avant de débouché sur une limite plus guidée que par la température.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;J&amp;#8217;ai testé progressivement plusieurs configurations jusqu&amp;#8217;à arriver à une configuration virtuellement illimitée : &lt;code&gt;power package 30/32 20/192&lt;/code&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Pour un CPU de 15w c&amp;#8217;est sensé ne rien brider.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;J&amp;#8217;ai alors relancé le test de montée en charge et j&amp;#8217;ai pu constater que la température du CPU ne dépassait pas 79°C ce qui reste supportable une fois arrivé sur ma cuisse.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Le résultat ? Le CPU tourne indéfiniment à 2,4GHz au lieu de 1,4GHz. Mon meilleur &lt;em&gt;overclocking&lt;/em&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Et puis je me suis souvenu de l&amp;#8217;existence des politique de multi-fréquences des micro-processeurs et ai basculé la mienne de &lt;code&gt;powersave&lt;/code&gt; à &lt;code&gt;performance&lt;/code&gt; (vu que je n&amp;#8217;ai aucun choix intermédiaire sur cette machine) et j&amp;#8217;ai enfin revu les 3,1GHz officiels du CPU (qui reste coincé à cette fréquence même quand il ne fait rien pour ne pas perdre de temps à ré-accélérer quand il y a besoin), puis j&amp;#8217;ai obtenu du 2,9GHz pendant environ 30s, jusqu&amp;#8217;à atteindre 90°C et que le CPU retrouve un équilibre à 2,60GHz et 90°C.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Cette fois c&amp;#8217;est sûr, on est au top des performances de la machine et je regrette amèrement de ne pas avoir fais ça plus tôt (toutefois, je suis repassé en politique &lt;code&gt;powersave&lt;/code&gt; pour m&amp;#8217;éviter le &lt;a href="https://en.wikipedia.org/wiki/Electromagnetically_induced_acoustic_noise"&gt;couinement&lt;/a&gt; émis par la machine quand le CPU tourne à 3,10GHz).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;# cat /sys/devices/system/cpu/cpufreq/policy3/scaling_governor &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
powersave performance
# echo powersave &amp;gt; /sys/devices/system/cpu/cpufreq/policy3/scaling_governor &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Liste les politiques énergétiques disponibles pour le CPU (il existe des policy{0,3} je ne sais pas pourquoi c&amp;#8217;est la 3 qui fonctionne)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Indique au noyau d&amp;#8217;activer le mode &lt;code&gt;powersave&lt;/code&gt; du CPU&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Bonus : Désormais la température du CPU en sortie d&amp;#8217;une longue veille est tout simplement la température de la pièce.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</content><category term="Articles"/><category term="hardware"/><category term="optimization"/></entry><entry><title>Auto reload a server on file change</title><link href="https://grimoire.d12s.fr/2024/auto_reload_server_on_file_change.html" rel="alternate"/><published>2024-10-25T00:00:00+02:00</published><updated>2024-10-25T00:00:00+02:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2024-10-25:/2024/auto_reload_server_on_file_change.html</id><summary type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Recharger automatiquement un serveur web quand le code source d&amp;#8217;un projet change. L&amp;#8217;idée est de lancer ce script dans une instance du logiciel screen sur la machine utilisée pour le développement dans le cas où cette machine est un serveur web au plus proche d&amp;#8217;un environnement de …&lt;/em&gt;&lt;/p&gt;&lt;/div&gt;</summary><content type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Recharger automatiquement un serveur web quand le code source d&amp;#8217;un projet change. L&amp;#8217;idée est de lancer ce script dans une instance du logiciel screen sur la machine utilisée pour le développement dans le cas où cette machine est un serveur web au plus proche d&amp;#8217;un environnement de production.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="shell"&gt;#!/bin/bash
cd $1
inotifywait --quiet --monitor --event create -r source_code_folder |
while read; do
        echo "`date`: systemctl reload apache2"
        systemctl reload apache2
done;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Another exemple with Django collectstatic.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="shell"&gt;cd $1
source ../venv_dev/bin/activate
inotifywait -q -m -e create -r app/static |
while read; do
        echo "`date`: collectstatic"
        ./do.sh collectstatic
done;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Inspired by : &lt;a href="https://superuser.com/questions/181517/how-to-execute-a-command-whenever-a-file-changes" class="bare"&gt;https://superuser.com/questions/181517/how-to-execute-a-command-whenever-a-file-changes&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;</content><category term="Commandes"/><category term="shell"/><category term="code"/><category term="adminsys"/></entry><entry><title>Many shades of git diff</title><link href="https://grimoire.d12s.fr/2024/git_word_diff.html" rel="alternate"/><published>2024-09-13T00:00:00+02:00</published><updated>2024-09-13T00:00:00+02:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2024-09-13:/2024/git_word_diff.html</id><summary type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;`git diff` peut se faire plus précis pour repérer des changements au milieu de grandes lignes.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Git can compute finer diffs than the default line-by-line one. With &lt;code&gt;--word-diff=color&lt;/code&gt; it can highlight differences inside long lines.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;$ git diff &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
$ git diff --word-diff=color &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;
$ git diff --word-diff=color --word-diff-regex=.&lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;(3 …&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;</summary><content type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;`git diff` peut se faire plus précis pour repérer des changements au milieu de grandes lignes.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Git can compute finer diffs than the default line-by-line one. With &lt;code&gt;--word-diff=color&lt;/code&gt; it can highlight differences inside long lines.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;$ git diff &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
$ git diff --word-diff=color &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;
$ git diff --word-diff=color --word-diff-regex=.&lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;(3)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Shows the default comparison between the known copy and the local work, line by line.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Shows only removed and added words (red for removed, green for added, by default).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Shows only removed and added letters.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;You can define aliases as shortcuts for the different &lt;code&gt;git diff&lt;/code&gt; options.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;$ vi ~/.zshrc
alias wd='git diff --word-diff=color'
alias wd.='git diff --word-diff=color --word-diff-regex=.'
:wq
$ source ~/.zshrc
$ wd.&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;You can also configure &lt;code&gt;git&lt;/code&gt; to spend more time computing smaller and sharper diffs.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;$ vi ~/.gitconfig
[diff]
	algorithm = minimal
:wq&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;</content><category term="Commandes"/><category term="shell"/><category term="comfort"/><category term="code"/><category term="adminsys"/><category term="metadata"/><category term="Git"/></entry><entry><title>If pamac fails to update the Artix system</title><link href="https://grimoire.d12s.fr/2024/unlock_pacman.html" rel="alternate"/><published>2024-08-13T00:00:00+02:00</published><updated>2024-08-13T00:00:00+02:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2024-08-13:/2024/unlock_pacman.html</id><summary type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Si pamac échoue à mettre à jour un système Artix&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;$ sudo rm /var/lib/pacman/db.lck &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
$ sudo pacman -Sy &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;
$ sudo pacman -S archlinux-keyring artix-keyring  &lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;(3)&lt;/b&gt;
$ sudo pacman -Su &lt;i class="conum" data-value="4"&gt;&lt;/i&gt;&lt;b&gt;(4)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Unlock pacman removing its lock / mutex / semaphore file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Update the catalog of packages&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Try to …&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;</summary><content type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Si pamac échoue à mettre à jour un système Artix&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;$ sudo rm /var/lib/pacman/db.lck &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
$ sudo pacman -Sy &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;
$ sudo pacman -S archlinux-keyring artix-keyring  &lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;(3)&lt;/b&gt;
$ sudo pacman -Su &lt;i class="conum" data-value="4"&gt;&lt;/i&gt;&lt;b&gt;(4)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Unlock pacman removing its lock / mutex / semaphore file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Update the catalog of packages&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Try to update the keyring packages first to allow the system to recognize some new packages. Those packages might already be up-to-date.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="4"&gt;&lt;/i&gt;&lt;b&gt;4&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Update the system from command line&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Actually, in our case, &lt;code&gt;pamac&lt;/code&gt; was faulty, with an apparent freeze during catalog refresh masking a segfault behind. The solution was to update &lt;code&gt;/etc/pacman.d/mirrorlist-arch&lt;/code&gt; commenting the 1st repositories and uncommenting the 4 firsts of your geographic locality.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;To get an updated &lt;code&gt;mirrorlist-arch&lt;/code&gt; fetch it from their Github : &lt;code&gt;sudo wget &lt;a href="https://github.com/archlinux/svntogit-packages/raw/packages/pacman-mirrorlist/trunk/mirrorlist" class="bare"&gt;https://github.com/archlinux/svntogit-packages/raw/packages/pacman-mirrorlist/trunk/mirrorlist&lt;/a&gt; -O /etc/pacman.d/mirrorlist-arch&lt;/code&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;$ pamac checkupdates
$ pamac update
==== AUTHENTICATING FOR org.manjaro.pamac.commit ====
Une authentification est requise pour installer, mettre à jour ou supprimer
des paquets
Authenticating as: ***
Password:
==== AUTHENTICATION COMPLETE ====
Checking keyring...                                                 [186/186]
Checking integrity...                                               [186/186]
Loading packages files...                                           [186/186]
Checking file conflicts...                                          [186/186]
Checking available disk space...                                    [186/186]
Running pre-transaction hooks...
Removing linux initcpios...                                             [1/2]
Removing old entries from the info directory file...                    [2/2]
Upgrading tzdata (2024a-2 -&amp;gt; 2024b-2)...                              [1/186]
Upgrading openssl (3.3.1-1 -&amp;gt; 3.3.2-1)...                             [2/186]
Upgrading gcc-libs (14.2.1+r32
…&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;</content><category term="Commandes"/><category term="shell"/></entry><entry><title>numfmt : human readable number formating</title><link href="https://grimoire.d12s.fr/2024/numfmt.html" rel="alternate"/><published>2024-07-15T00:00:00+02:00</published><updated>2024-07-15T00:00:00+02:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2024-07-15:/2024/numfmt.html</id><summary type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Choisir le format d&amp;#8217;affichage d&amp;#8217;un nombre et son préfixe d&amp;#8217;échelle d&amp;#8217;unité : système international (SI), commission électronique internationale (IEC)…&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;$&lt;/span&gt; &lt;span class="tok-nb"&gt;echo&lt;/span&gt; &lt;span class="tok-m"&gt;12345678&lt;/span&gt; &lt;span class="tok-p"&gt;|&lt;/span&gt; numfmt --to&lt;span class="tok-o"&gt;=&lt;/span&gt;si &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
&lt;span class="tok-go"&gt;13M&lt;/span&gt;
&lt;span class="tok-gp"&gt;$&lt;/span&gt; &lt;span class="tok-nb"&gt;echo&lt;/span&gt; &lt;span class="tok-m"&gt;4096&lt;/span&gt; &lt;span class="tok-p"&gt;|&lt;/span&gt; numfmt --to&lt;span class="tok-o"&gt;=&lt;/span&gt;iec
&lt;span class="tok-go"&gt;4.0K&lt;/span&gt;
&lt;span class="tok-gp"&gt;#&lt;/span&gt; &lt;span class="tok-nb"&gt;echo&lt;/span&gt; &lt;span class="tok-m"&gt;4096&lt;/span&gt; &lt;span class="tok-p"&gt;|&lt;/span&gt; numfmt --to&lt;span class="tok-o"&gt;=&lt;/span&gt;si
&lt;span class="tok-go"&gt;4.1K&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;The &lt;code&gt;numfmt&lt;/code&gt; commande comes from the …&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;</summary><content type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Choisir le format d&amp;#8217;affichage d&amp;#8217;un nombre et son préfixe d&amp;#8217;échelle d&amp;#8217;unité : système international (SI), commission électronique internationale (IEC)…&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;$&lt;/span&gt; &lt;span class="tok-nb"&gt;echo&lt;/span&gt; &lt;span class="tok-m"&gt;12345678&lt;/span&gt; &lt;span class="tok-p"&gt;|&lt;/span&gt; numfmt --to&lt;span class="tok-o"&gt;=&lt;/span&gt;si &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
&lt;span class="tok-go"&gt;13M&lt;/span&gt;
&lt;span class="tok-gp"&gt;$&lt;/span&gt; &lt;span class="tok-nb"&gt;echo&lt;/span&gt; &lt;span class="tok-m"&gt;4096&lt;/span&gt; &lt;span class="tok-p"&gt;|&lt;/span&gt; numfmt --to&lt;span class="tok-o"&gt;=&lt;/span&gt;iec
&lt;span class="tok-go"&gt;4.0K&lt;/span&gt;
&lt;span class="tok-gp"&gt;#&lt;/span&gt; &lt;span class="tok-nb"&gt;echo&lt;/span&gt; &lt;span class="tok-m"&gt;4096&lt;/span&gt; &lt;span class="tok-p"&gt;|&lt;/span&gt; numfmt --to&lt;span class="tok-o"&gt;=&lt;/span&gt;si
&lt;span class="tok-go"&gt;4.1K&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;The &lt;code&gt;numfmt&lt;/code&gt; commande comes from the &lt;code&gt;coreutils&lt;/code&gt; Debian package&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;You can pipe values from &lt;code&gt;du&lt;/code&gt; to &lt;code&gt;numfmt&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Based on an original toot from @ddrake : https://mamot.fr/@ddrake@mathstodon.xyz/112784707327300170&lt;/p&gt;
&lt;/div&gt;</content><category term="Commandes"/><category term="shell"/><category term="comfort"/></entry><entry><title>Display hardware status in screen sessions</title><link href="https://grimoire.d12s.fr/2024/display_hardware_status_in_screen.html" rel="alternate"/><published>2024-06-05T00:00:00+02:00</published><updated>2024-06-05T00:00:00+02:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2024-06-05:/2024/display_hardware_status_in_screen.html</id><summary type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Afficher des informations sur le matériel de la machine (occupation CPU et mémoire) dans la ligne d&amp;#8217;état de &lt;code&gt;screen&lt;/code&gt;. Ça peut aider à diagnostiquer rapidement pourquoi la machine ne vous rend pas la main par exemple (est-elle occupée ou est-ce une panne réseau ?).&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Screen can display a permanent status …&lt;/p&gt;&lt;/div&gt;</summary><content type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Afficher des informations sur le matériel de la machine (occupation CPU et mémoire) dans la ligne d&amp;#8217;état de &lt;code&gt;screen&lt;/code&gt;. Ça peut aider à diagnostiquer rapidement pourquoi la machine ne vous rend pas la main par exemple (est-elle occupée ou est-ce une panne réseau ?).&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Screen can display a permanent status line with various informations. It might look like this (with various colors) :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code&gt; 3 &amp;lt;hostname&amp;gt;               Load: 0,88 0,21 0,08  Mem: 1 / 3 G  2024-06-05 10:44&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Here is how to get this :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;$ vi ~/.screenrc&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Add the following lines in the file (that might not exist before and can contain other useful settings) :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="sh"&gt;# backtick id lifespan autorefresh cmd args...
backtick 1 2 2 /bin/bash -c 'a=$(uptime | awk '\''{print $3" "$4}'\'' | sed s/,//); echo ${a}'
backtick 2 2 2 /bin/bash -c 'a=$(uptime | awk '\''{print $10" "$11" "$12}'\''); echo ${a}'
backtick 3 2 2 /bin/bash -c 'a=$(free -g | grep Mem |awk '\''{print $3"/"$2}'\'');echo "${a} G"' &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;

hardstatus alwayslastline &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;
hardstatus string '%{wk} %n %H %= %{Yk} up: %1`  load: %2` %{Mk} mem: %3` %{wk} %Y-%m-%d %c ' &lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;(3)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;This creates a new replacement token for the status line definition. Here it&amp;#8217;s a shell oneliner to extract the current RAM usage from the &lt;code&gt;free&lt;/code&gt; command&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Here we tell screen to display the status line, and to do it on the bottom of the &lt;code&gt;screen&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Here we define what to display in the status line :
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;%{wk}&lt;/code&gt; is a replacement token that adds the necessary terminal escape sequence to write in white text on black background&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;%n %H&lt;/code&gt; is the buffer number in the screen session followed by the host name&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;%=&lt;/code&gt; is an expendable white space&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;%{Yk}&lt;/code&gt; changes the color of the next characters to bright yellow text on black background&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;%l&lt;/code&gt; is the machine load averages&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt; %1` &lt;/code&gt; is the  result of our &lt;code&gt;backtick&lt;/code&gt; defined command&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;… (read &lt;code&gt;man screen&lt;/code&gt; for more escape sequences)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;To test this settings you can start a new screen session or reload the settings of your current session via : &lt;span class="keyseq"&gt;&lt;kbd&gt;CTRL&lt;/kbd&gt;+&lt;kbd&gt;A&lt;/kbd&gt;&lt;/span&gt; &lt;kbd&gt;:&lt;/kbd&gt; &lt;code&gt;source ~/.screenrc&lt;/code&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;To finish, it exists at least &lt;a href="https://github.com/thewtex/screen-cpu-mem"&gt;screen-cpu-mem&lt;/a&gt; and &lt;a href="https://github.com/creaktive/rainbarf"&gt;rainbarf&lt;/a&gt; to create better &lt;code&gt;backtick&lt;/code&gt; tokens for your status line with graphical levels or charts of CPU and memory usage.&lt;/p&gt;
&lt;/div&gt;</content><category term="Commandes"/><category term="shell"/><category term="adminsys"/><category term="comfort"/></entry><entry><title>Create a static clone of a website</title><link href="https://grimoire.d12s.fr/2024/create_static_clone_of_a_website.html" rel="alternate"/><published>2024-03-04T00:00:00+01:00</published><updated>2024-03-04T00:00:00+01:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2024-03-04:/2024/create_static_clone_of_a_website.html</id><summary type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Cloner un site web sur son disque dur. La copie sera gelée, on ne peut pas la mettre à jour.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;To miror a website with a local static copy, the better is to use &lt;code&gt;httrack&lt;/code&gt; :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;$&lt;/span&gt; httrack -n http://… &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
&lt;span class="tok-gp"&gt;$&lt;/span&gt; wget -mk http://… &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;The &lt;code&gt;-n&lt;/code&gt; option tells &lt;code&gt;httrack&lt;/code&gt; to …&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;</summary><content type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Cloner un site web sur son disque dur. La copie sera gelée, on ne peut pas la mettre à jour.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;To miror a website with a local static copy, the better is to use &lt;code&gt;httrack&lt;/code&gt; :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;$&lt;/span&gt; httrack -n http://… &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
&lt;span class="tok-gp"&gt;$&lt;/span&gt; wget -mk http://… &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;The &lt;code&gt;-n&lt;/code&gt; option tells &lt;code&gt;httrack&lt;/code&gt; to download also "near" files, such as images linked from the HTML documents.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;The &lt;code&gt;-mk&lt;/code&gt; options are for &lt;code&gt;-mirror&lt;/code&gt; and &lt;code&gt;-convert-links&lt;/code&gt; activating all the options to create a miror website and to convert the links in the webpages to point locally to the downloaded ressources&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Cloning a WordPress blog, &lt;code&gt;httrack&lt;/code&gt; gave better results regarding CSS.
Both commandes caught all the images on disk.&lt;/p&gt;
&lt;/div&gt;</content><category term="Commandes"/><category term="adminsys"/></entry><entry><title>Multi-page watermarking via convert</title><link href="https://grimoire.d12s.fr/2023/watermarking_multipage.html" rel="alternate"/><published>2023-11-18T00:00:00+01:00</published><updated>2023-11-18T00:00:00+01:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2023-11-18:/2023/watermarking_multipage.html</id><summary type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Si quelqu’un veut faire du watermarking avec des documents multipages :&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="bash"&gt;&lt;span&gt;&lt;/span&gt;$ convert &lt;span class="tok-se"&gt;\&lt;/span&gt;
-density &lt;span class="tok-s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="tok-nv"&gt;$DENSITY&lt;/span&gt;&lt;span class="tok-s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="tok-s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="tok-nv"&gt;$INPUT&lt;/span&gt;&lt;span class="tok-s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="tok-se"&gt;\&lt;/span&gt;
-write mpr:base &lt;span class="tok-se"&gt;\&lt;/span&gt;
&lt;span class="tok-se"&gt;\(&lt;/span&gt; &lt;span class="tok-se"&gt;\&lt;/span&gt;
    -density &lt;span class="tok-s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="tok-nv"&gt;$DENSITY&lt;/span&gt;&lt;span class="tok-s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="tok-se"&gt;\&lt;/span&gt;
    -background none &lt;span class="tok-se"&gt;\&lt;/span&gt;
    -fill &lt;span class="tok-s2"&gt;&amp;quot;#ff000030&amp;quot;&lt;/span&gt; &lt;span class="tok-se"&gt;\&lt;/span&gt;
    -gravity center label:&lt;span class="tok-s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="tok-nv"&gt;$TEXT&lt;/span&gt;&lt;span class="tok-s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="tok-se"&gt;\&lt;/span&gt;
    -trim &lt;span class="tok-se"&gt;\&lt;/span&gt;
    -rotate -10 &lt;span class="tok-se"&gt;\&lt;/span&gt;
    -write mpr:tile &lt;span class="tok-se"&gt;\&lt;/span&gt;
    +delete &lt;span class="tok-se"&gt;\&lt;/span&gt;
&lt;span class="tok-se"&gt;\)&lt;/span&gt; &lt;span class="tok-se"&gt;\(&lt;/span&gt; &lt;span class="tok-se"&gt;\&lt;/span&gt;
    -clone &lt;span class="tok-m"&gt;0&lt;/span&gt;--1 &lt;span class="tok-se"&gt;\&lt;/span&gt;
    -tile mpr:tile &lt;span class="tok-se"&gt;\&lt;/span&gt;
    -draw &lt;span class="tok-s1"&gt;&amp;#39;color 0,0 reset&amp;#39;&lt;/span&gt; &lt;span class="tok-se"&gt;\&lt;/span&gt;
    -write mpr:wm &lt;span class="tok-se"&gt;\&lt;/span&gt;
    -delete …&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;</summary><content type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Si quelqu’un veut faire du watermarking avec des documents multipages :&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="bash"&gt;&lt;span&gt;&lt;/span&gt;$ convert &lt;span class="tok-se"&gt;\&lt;/span&gt;
-density &lt;span class="tok-s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="tok-nv"&gt;$DENSITY&lt;/span&gt;&lt;span class="tok-s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="tok-s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="tok-nv"&gt;$INPUT&lt;/span&gt;&lt;span class="tok-s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="tok-se"&gt;\&lt;/span&gt;
-write mpr:base &lt;span class="tok-se"&gt;\&lt;/span&gt;
&lt;span class="tok-se"&gt;\(&lt;/span&gt; &lt;span class="tok-se"&gt;\&lt;/span&gt;
    -density &lt;span class="tok-s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="tok-nv"&gt;$DENSITY&lt;/span&gt;&lt;span class="tok-s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="tok-se"&gt;\&lt;/span&gt;
    -background none &lt;span class="tok-se"&gt;\&lt;/span&gt;
    -fill &lt;span class="tok-s2"&gt;&amp;quot;#ff000030&amp;quot;&lt;/span&gt; &lt;span class="tok-se"&gt;\&lt;/span&gt;
    -gravity center label:&lt;span class="tok-s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="tok-nv"&gt;$TEXT&lt;/span&gt;&lt;span class="tok-s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="tok-se"&gt;\&lt;/span&gt;
    -trim &lt;span class="tok-se"&gt;\&lt;/span&gt;
    -rotate -10 &lt;span class="tok-se"&gt;\&lt;/span&gt;
    -write mpr:tile &lt;span class="tok-se"&gt;\&lt;/span&gt;
    +delete &lt;span class="tok-se"&gt;\&lt;/span&gt;
&lt;span class="tok-se"&gt;\)&lt;/span&gt; &lt;span class="tok-se"&gt;\(&lt;/span&gt; &lt;span class="tok-se"&gt;\&lt;/span&gt;
    -clone &lt;span class="tok-m"&gt;0&lt;/span&gt;--1 &lt;span class="tok-se"&gt;\&lt;/span&gt;
    -tile mpr:tile &lt;span class="tok-se"&gt;\&lt;/span&gt;
    -draw &lt;span class="tok-s1"&gt;&amp;#39;color 0,0 reset&amp;#39;&lt;/span&gt; &lt;span class="tok-se"&gt;\&lt;/span&gt;
    -write mpr:wm &lt;span class="tok-se"&gt;\&lt;/span&gt;
    -delete &lt;span class="tok-m"&gt;0&lt;/span&gt;--1 &lt;span class="tok-se"&gt;\&lt;/span&gt;
&lt;span class="tok-se"&gt;\)&lt;/span&gt; &lt;span class="tok-se"&gt;\&lt;/span&gt;
-delete &lt;span class="tok-m"&gt;0&lt;/span&gt;--1 &lt;span class="tok-se"&gt;\&lt;/span&gt;
mpr:wm null: mpr:base &lt;span class="tok-se"&gt;\&lt;/span&gt;
-compose overlay &lt;span class="tok-se"&gt;\&lt;/span&gt;
-layers composite &lt;span class="tok-s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="tok-nv"&gt;$OUTPUT&lt;/span&gt;&lt;span class="tok-s2"&gt;&amp;quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;From this @aeris original content : https://mamot.fr/@aeris@firefish.imirhil.fr/111426717282466669&lt;/p&gt;
&lt;/div&gt;</content><category term="Commandes"/><category term="adminsys"/><category term="code"/></entry><entry><title>Rsync sync exactly (propagate suppressions)</title><link href="https://grimoire.d12s.fr/2023/rsync_avh_delete.html" rel="alternate"/><published>2023-10-11T00:00:00+02:00</published><updated>2023-10-11T00:00:00+02:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2023-10-11:/2023/rsync_avh_delete.html</id><content type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Propager les suppressions de fichiers d&amp;#8217;une source vers une destination synchronisée via Rsync.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;$&lt;/span&gt; rsync -avh source/ dest/ --delete&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;</content><category term="Commandes"/><category term="adminsys"/></entry><entry><title>Assume your passwords (Mutt, SMTP)</title><link href="https://grimoire.d12s.fr/2023/mutt_smtp_assume_your_passwords.html" rel="alternate"/><published>2023-06-13T00:00:00+02:00</published><updated>2023-06-13T00:00:00+02:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2023-06-13:/2023/mutt_smtp_assume_your_passwords.html</id><summary type="html">&lt;div id="toc" class="toc"&gt;
&lt;div id="toctitle"&gt;Index&lt;/div&gt;
&lt;ul class="sectlevel1"&gt;
&lt;li&gt;&lt;a href="#_version_en"&gt;1. version : en&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_version_fr"&gt;2. version : fr&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_version_en"&gt;1. version : en&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Here is the story of how I lost (again) an afternoon…&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I need to send emails via there respective SMTP servers now that a big email hoster refuse emails without SPF or DMarc authentication.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;With &lt;code&gt;mutt&lt;/code&gt; this is achieved with …&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</summary><content type="html">&lt;div id="toc" class="toc"&gt;
&lt;div id="toctitle"&gt;Index&lt;/div&gt;
&lt;ul class="sectlevel1"&gt;
&lt;li&gt;&lt;a href="#_version_en"&gt;1. version : en&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_version_fr"&gt;2. version : fr&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_version_en"&gt;1. version : en&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Here is the story of how I lost (again) an afternoon…&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I need to send emails via there respective SMTP servers now that a big email hoster refuse emails without SPF or DMarc authentication.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;With &lt;code&gt;mutt&lt;/code&gt; this is achieved with the following configuration &lt;code&gt;~/.muttrc&lt;/code&gt; :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-go"&gt;smtp_url&lt;/span&gt;
&lt;span class="tok-go"&gt;          Type: string&lt;/span&gt;
&lt;span class="tok-go"&gt;          Default: “”&lt;/span&gt;

&lt;span class="tok-go"&gt;          Defines the SMTP smarthost where sent messages should relayed&lt;/span&gt;
&lt;span class="tok-go"&gt;          for delivery. This should take the form of an SMTP URL, e.g.:&lt;/span&gt;


&lt;span class="tok-go"&gt;          smtp[s]://[user[:pass]@]host[:port]&lt;/span&gt;


&lt;span class="tok-go"&gt;          where “[...]” denotes an optional part.  Setting this variable&lt;/span&gt;
&lt;span class="tok-go"&gt;          overrides the value of the $sendmail variable.&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Everything is here, in the official documentation thou shalt read.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;So you can specify your SMTP server, user and password via the &lt;code&gt;smtp_url&lt;/code&gt; configuration variable and an &lt;code&gt;smtps://&lt;/code&gt; URL pattern… except if you password contains slashes (/).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;In this case you can possibly escape your slashes, or specify the password in another mutt configuration variable called : &lt;code&gt;smtp_pass&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-go"&gt;set smtp_url = &amp;quot;smtps://contact@heroncendre.com@mail.infomaniak.com&amp;quot;&lt;/span&gt;
&lt;span class="tok-go"&gt;set smtp_pass = &amp;quot;pass/with/slashes&amp;quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Great, but what if it still fails ?&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;You might have a strong password like : &lt;code&gt;/7k91$ehFLbYGJPGv6FDMP32N/uvXYG..$iosAR&lt;/code&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;You might have notice, in the last line of the &lt;code&gt;smtp_url&lt;/code&gt; Mutt&amp;#8217;s configuration variable documentation, the usage of &lt;code&gt;$sendmail&lt;/code&gt; ?&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;In mutt configuration file, like in most shell environments &lt;code&gt;$something&lt;/code&gt; is pre-processed and replaced by the content of the &lt;code&gt;something&lt;/code&gt; variable, or by nothing if it&amp;#8217;s an undefined variable, still your &lt;code&gt;$&lt;/code&gt; disappears from the string that was containing it.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;So the dollars in my password was silently replaced by nothing by Mutt and my SMTP sessions failed to authenticate with a poetic message like : &lt;code&gt;SASL authentication failed&lt;/code&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;To finish, as I use many email addresses from many providers, I instructed Mutt to use the right SMTP server for the right identity.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-go"&gt;folder-hook . &amp;#39;set smtp_url = &amp;quot;smtps://default_user@default_SMTP_server&amp;quot;&amp;#39;&lt;/span&gt;
&lt;span class="tok-go"&gt;folder-hook . &amp;#39;set smtp_pass = default_password_with_escaped_\$_signs_and_/&amp;#39;&lt;/span&gt;
&lt;span class="tok-go"&gt;folder-hook =HeronCendre &amp;#39;set smtp_url = &amp;quot;smtps://contact@heroncendre.com@mail.infomaniak.com&amp;quot;&amp;#39;&lt;/span&gt;
&lt;span class="tok-go"&gt;folder-hook =HeronCendre &amp;#39;set smtp_pass = /7k91\$ehFLbYGJPGv6FDMP32N/uvXYG..\$iosAR&amp;#39;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;With those directives, whenever I enter a folder I get the default configuration, and if I enter the &lt;code&gt;HeronCendre&lt;/code&gt; folder I override this configuration with what is correct for &lt;code&gt;HeronCendre&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_version_fr"&gt;2. version : fr&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Voici comment j&amp;#8217;ai (encore) perdu une après midi…&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Il se trouve que j&amp;#8217;ai besoin d&amp;#8217;envoyer mes courriel via leurs serveurs SMTP respectifs, vu qu&amp;#8217;un gros hébergeur d&amp;#8217;adresses email refuse désormais les messages non authentifiés (SPF, DMarc).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Avec &lt;code&gt;mutt&lt;/code&gt; on peut obtenir ce résultat en précisant quel serveur utiliser dans la configuration &lt;code&gt;~/.muttrc&lt;/code&gt; :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-go"&gt;smtp_url&lt;/span&gt;
&lt;span class="tok-go"&gt;          Type: string&lt;/span&gt;
&lt;span class="tok-go"&gt;          Default: “”&lt;/span&gt;

&lt;span class="tok-go"&gt;          Defines the SMTP smarthost where sent messages should relayed&lt;/span&gt;
&lt;span class="tok-go"&gt;          for delivery. This should take the form of an SMTP URL, e.g.:&lt;/span&gt;


&lt;span class="tok-go"&gt;          smtp[s]://[user[:pass]@]host[:port]&lt;/span&gt;


&lt;span class="tok-go"&gt;          where “[...]” denotes an optional part.  Setting this variable&lt;/span&gt;
&lt;span class="tok-go"&gt;          overrides the value of the $sendmail variable.&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Tout est dit ici, dans la documentation officielle du projet.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;On peut donc spécifier un serveur SMTP à utiliser (ainsi qu&amp;#8217;un utilisateur et un mot de passe) via un variable de configuration Mutt nommée &lt;code&gt;smtp_url&lt;/code&gt;. On y renseigne une chaîne de caractère contenant une URL. C&amp;#8217;est chouette, mais déjà, prenez garde si votre mot de passe contient des barres obliques ('/' ou &lt;em&gt;slashes&lt;/em&gt;). Ce symbole est utilisé comme délimiteur de champs dans une URL et cette dernière serait donc mal interprétée. Il doit être possible d&amp;#8217;échapper les barres obliques, mais il est également possible de préciser le mot de passe dans une seconde variable de configuration de Mutt nommée : &lt;code&gt;smtp_pass&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-go"&gt;set smtp_url = &amp;quot;smtps://contact@heroncendre.com@mail.infomaniak.com&amp;quot;&lt;/span&gt;
&lt;span class="tok-go"&gt;set smtp_pass = &amp;quot;pass/with/slashes&amp;quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Super, mais que faire si l&amp;#8217;authentification échoue ?&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Votre mot de passe ressemble peut être à : &lt;code&gt;/7k91$ehFLbYGJPGv6FDMP32N/uvXYG..$iosAR&lt;/code&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Et vous avez peut être remarqué, sur la dernière ligne de la documentation de la variable &lt;code&gt;smtp_url&lt;/code&gt;, l&amp;#8217;exemple d&amp;#8217;utilisation de la syntaxe : &lt;code&gt;$sendmail&lt;/code&gt; ?&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Dans un fichier de configuration de Mutt (comme dans la plupart des &lt;em&gt;shell&lt;/em&gt;) &lt;code&gt;$quelquechose&lt;/code&gt; est remplacé, avant l&amp;#8217;exécution de la commande, par la valeur de la variable &lt;code&gt;quelquechose&lt;/code&gt; ou par un vide si elle n&amp;#8217;est pas définie. Du coup le &lt;code&gt;$&lt;/code&gt; disparait de la chaîne de caractère où il était présent.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Donc les dollars de mon mot de passe étaient silencieusement remplacés par du rien par Mutt et l&amp;#8217;authentification de mes sessions SMTP échouait avec un message d&amp;#8217;erreur comme : &lt;code&gt;SASL authentication failed&lt;/code&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Pour finir sur une note plus positive, j&amp;#8217;utilise plusieurs adresses de courriel de plusieurs fournisseurs et il est assez simple d&amp;#8217;instruire Mutt pour qu&amp;#8217;il utilise le bon serveur SMTP pour chaque identité.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-go"&gt;folder-hook . &amp;#39;set smtp_url = &amp;quot;smtps://default_user@default_SMTP_server&amp;quot;&amp;#39;&lt;/span&gt;
&lt;span class="tok-go"&gt;folder-hook . &amp;#39;set smtp_pass = default_password_with_escaped_\$_signs_and_/&amp;#39;&lt;/span&gt;
&lt;span class="tok-go"&gt;folder-hook =HeronCendre &amp;#39;set smtp_url = &amp;quot;smtps://contact@heroncendre.com@mail.infomaniak.com&amp;quot;&amp;#39;&lt;/span&gt;
&lt;span class="tok-go"&gt;folder-hook =HeronCendre &amp;#39;set smtp_pass = /7k91\$ehFLbYGJPGv6FDMP32N/uvXYG..\$iosAR&amp;#39;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Avec ces directives de configuration, chaque fois que j&amp;#8217;entre dans un dossier j&amp;#8217;obtiens la configuration SMTP par défaut, et si j&amp;#8217;entre dans le dossier &lt;code&gt;HeronCendre&lt;/code&gt; cette configuration est écrasée par celle correspondant à l&amp;#8217;identité associée à &lt;code&gt;HeronCendre&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</content><category term="Commandes"/><category term="mutt"/><category term="adminsys"/><category term="security"/><category term="shell"/></entry><entry><title>Firefox contenteditable bloc-note</title><link href="https://grimoire.d12s.fr/2023/firefox_blocnote_data_content_editable.html" rel="alternate"/><published>2023-05-10T00:00:00+02:00</published><updated>2023-05-10T00:00:00+02:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2023-05-10:/2023/firefox_blocnote_data_content_editable.html</id><summary type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Astuce partagée par &lt;a href="https://mamot.fr/%40goofy%40framapiaf.org/110339332546234673"&gt;Goofy&lt;/a&gt; : Vous avez besoin d&amp;#8217;un petit « bloc-notes » pendant que vous naviguez sur le web avec Firefox ? Ouvrez un onglet avec :&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Need a notepad while browsing the web with Firefox ? Open a new tab with :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code&gt;&lt;span&gt;&lt;/span&gt;data:text/html, &amp;lt;html contenteditable&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;And pin it to keep it around …&lt;/p&gt;&lt;/div&gt;</summary><content type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Astuce partagée par &lt;a href="https://mamot.fr/%40goofy%40framapiaf.org/110339332546234673"&gt;Goofy&lt;/a&gt; : Vous avez besoin d&amp;#8217;un petit « bloc-notes » pendant que vous naviguez sur le web avec Firefox ? Ouvrez un onglet avec :&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Need a notepad while browsing the web with Firefox ? Open a new tab with :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code&gt;&lt;span&gt;&lt;/span&gt;data:text/html, &amp;lt;html contenteditable&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;And pin it to keep it around.&lt;/p&gt;
&lt;/div&gt;</content><category term="Commandes"/><category term="Firefox"/></entry><entry><title>After photorec</title><link href="https://grimoire.d12s.fr/2023/after_photorec.html" rel="alternate"/><published>2023-04-28T00:00:00+02:00</published><updated>2023-04-28T00:00:00+02:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2023-04-28:/2023/after_photorec.html</id><summary type="html">&lt;div id="toc" class="toc"&gt;
&lt;div id="toctitle"&gt;Index&lt;/div&gt;
&lt;ul class="sectlevel1"&gt;
&lt;li&gt;&lt;a href="#_version_en"&gt;1. version : en&lt;/a&gt;
&lt;ul class="sectlevel2"&gt;
&lt;li&gt;&lt;a href="#_lost_files"&gt;1.1. Lost files&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_and_now_what"&gt;1.2. And now what ?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_removing_programming_files"&gt;1.3. Removing programming files&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_counting_files_by_type"&gt;1.4. Counting files by type&lt;/a&gt;
&lt;ul class="sectlevel3"&gt;
&lt;li&gt;&lt;a href="#_counting_files_with_recovered_names"&gt;1.4.1. Counting files with recovered names&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_sorting_files_by_extension"&gt;1.4.2. Sorting files by extension&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#_removing_jpeg_thumbnails"&gt;1.5. Removing JPEG thumbnails&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_fclones_to_find_redundant_files"&gt;1.6. fclones to find redundant …&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;</summary><content type="html">&lt;div id="toc" class="toc"&gt;
&lt;div id="toctitle"&gt;Index&lt;/div&gt;
&lt;ul class="sectlevel1"&gt;
&lt;li&gt;&lt;a href="#_version_en"&gt;1. version : en&lt;/a&gt;
&lt;ul class="sectlevel2"&gt;
&lt;li&gt;&lt;a href="#_lost_files"&gt;1.1. Lost files&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_and_now_what"&gt;1.2. And now what ?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_removing_programming_files"&gt;1.3. Removing programming files&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_counting_files_by_type"&gt;1.4. Counting files by type&lt;/a&gt;
&lt;ul class="sectlevel3"&gt;
&lt;li&gt;&lt;a href="#_counting_files_with_recovered_names"&gt;1.4.1. Counting files with recovered names&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_sorting_files_by_extension"&gt;1.4.2. Sorting files by extension&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#_removing_jpeg_thumbnails"&gt;1.5. Removing JPEG thumbnails&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_fclones_to_find_redundant_files"&gt;1.6. fclones to find redundant files&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_removing_empty_folders"&gt;1.7. Removing empty folders&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_find_the_recent_files"&gt;1.8. Find the recent files&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_conclusion"&gt;1.9. Conclusion&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_after_thoughs"&gt;1.10. After thoughs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#_version_fr"&gt;2. version : fr&lt;/a&gt;
&lt;ul class="sectlevel2"&gt;
&lt;li&gt;&lt;a href="#_fichiers_perdus"&gt;2.1. Fichiers perdus&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_et_maintenant"&gt;2.2. Et maintenant ?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_retirer_les_fichiers_de_programmation"&gt;2.3. Retirer les fichiers de programmation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_compter_les_fichiers_par_type"&gt;2.4. Compter les fichiers par type&lt;/a&gt;
&lt;ul class="sectlevel3"&gt;
&lt;li&gt;&lt;a href="#_compter_les_fichiers_dont_le_noms_a_été_retrouvé"&gt;2.4.1. Compter les fichiers dont le noms a été retrouvé&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_ranger_les_fichiers_par_extension"&gt;2.4.2. Ranger les fichiers par extension&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#_supprimer_les_miniatures_jpeg"&gt;2.5. Supprimer les miniatures JPEG&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_fclones_pour_trouver_les_fichiers_redondants"&gt;2.6. fclones pour trouver les fichiers redondants&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_retrait_des_dossiers_vides"&gt;2.7. Retrait des dossiers vides&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_retrouver_les_fichiers_récents"&gt;2.8. Retrouver les fichiers récents&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_conclusion_2"&gt;2.9. Conclusion&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_pensées_pour_la_prochaine_fois"&gt;2.10. Pensées pour la prochaine fois&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_version_en"&gt;1. version : en&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_lost_files"&gt;1.1. Lost files&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;At the last &lt;a href="https://www.repaircafe.org/en/cafe/repair-cafe-pougne-herisson/"&gt;Repair Café of Pougne-Hérisson&lt;/a&gt; a friend came to me with an USB hard drive of 1TB he claimed it would not mount itself on Linux…&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Dead hardware ? I plug it, it mounts.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Ah… the friend though it tested it on Linux, but the drive only fails to mount on Windows.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;OK, the hardware is still here.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I show the content of the drive, 3 empty folders with unknown names to the friend (data, storage, work).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I point out the creation date of those empty folders : last Friday at 18h43. Can you remember whet you were doing that evening ?&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Ah, memories came back : the family wanted to record a movie on TV, with their paying TV service Canal+ and its dedicated box, which needs an external hard drive to record things. It appears the box just formats any new disk (to Ext4) without enough disclaimer and warnings.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;So the disk was not recognized by Windows anymore… and the files were lost.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;After a Testdisk check, I was left with Photorec. It took 22h and got back 432GB of data, 150 159 files in 238 folders.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;A lot more than what the friend was aware he created.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;PS: This post can be looked at as the second episode after : &lt;a href="/2018/save_data_from_lost_partitions_on_hard_drive.html"&gt;Saving data from lost partition on a hard drive&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_and_now_what"&gt;1.2. And now what ?&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I would like to reduce this file number to help the friend exploring it. I know he is most interested in recent files (has he have other backups).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;First, lets check what &lt;code&gt;ncdu&lt;/code&gt; can tell us :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt; 53.9 GiB [#############] /recup_dir.233
 50.1 GiB [############ ] /recup_dir.232
 21.2 GiB [#####        ] /recup_dir.2
 16.7 GiB [####         ] /recup_dir.234
 15.9 GiB [###          ] /recup_dir.1
 13.7 GiB [###          ] /recup_dir.229
  8.1 GiB [#            ] /recup_dir.182
  8.1 GiB [#            ] /recup_dir.205
  6.6 GiB [#            ] /recup_dir.180
  6.3 GiB [#            ] /recup_dir.237
  6.1 GiB [#            ] /recup_dir.228
  5.9 GiB [#            ] /recup_dir.227
  5.2 GiB [#            ] /recup_dir.204
  5.2 GiB [#            ] /recup_dir.179
  5.0 GiB [#            ] /recup_dir.224
  4.9 GiB [#            ] /recup_dir.187
  4.7 GiB [#            ] /recup_dir.4
  4.5 GiB [#            ] /recup_dir.3
  4.2 GiB [#            ] /recup_dir.186
  4.1 GiB [             ] /recup_dir.222
  4.0 GiB [             ] /recup_dir.215
[…]&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;Total disk usage: 431.7 GiB  Apparent size: 428.6 GiB  Items: 150 159&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I can confirm the file number with :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;$ rg -uuu --files --iglob * | wc -l
149682
$ python -c 'print(149682+(238*2))'  # adding folders
150158 &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Seem folders are counting for 2 items as per &lt;code&gt;ncdu&lt;/code&gt; count, and we&amp;#8217;re still missing 1 item…&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_removing_programming_files"&gt;1.3. Removing programming files&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Exploring some folders I sees C and Python programming files. Let&amp;#8217;s count them :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;$ rg -uuu --files --iglob "*.c" Recup | wc -l &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
21348

# Nombre de fichiers Pythons :
$ rg -uuu --files --iglob "*.py" Recup | wc -l
4363&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;I told &lt;code&gt;photorec&lt;/code&gt; to write things in a &lt;code&gt;Recup&lt;/code&gt; folder&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;So I can create a folder "poubelle" and move those files out of the way :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;$ mkdir poubelle
$ for a in `seq 238`; do mkdir "poubelle/recup_dir.$a"; done; &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
$ rg -uuu --files --iglob "**py" . | xargs -I {} mv {} poubelle/{} &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Creating 238 subfolders in the "poubelle" folder.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Moving the Python files there.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;But how many other programming languages are represented ?&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;$ for a in `rg --type-list | cut -f 1 -d ':'`; do echo "$a: `rg --files -t $a | wc -l`"; done; &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;For each file type known by &lt;code&gt;rg&lt;/code&gt; (currently 169) print the number of files of this type &lt;code&gt;rg&lt;/code&gt; can count&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code&gt;fortran: 14 &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
h: 1642
html: 292
java: 219
config: 3
pdf: 14536
perl: 12
php: 9
sh: 11
svg: 377
txt: 8645&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;I kept here only the non-empty results.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Well, it shows PDF files but I&amp;#8217;m missing the ODT ones for instance and exact file extensions are not listed.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_counting_files_by_type"&gt;1.4. Counting files by type&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Let&amp;#8217;s create a better content summary, sorted by file extensions, as &lt;code&gt;photorec&lt;/code&gt; saved them.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;$ rg -uuu --files --iglob "*" Recup &amp;gt; 122552_filenames.txt  &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;I was still with 122552 files at that stage. The command took around 15s.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="sect3"&gt;
&lt;h4 id="_counting_files_with_recovered_names"&gt;1.4.1. Counting files with recovered names&lt;/h4&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;$ rg '.{42,}' 122552_filenames.txt &amp;gt; liste_fichiers_avec_nom.txt
$ wc -l liste_fichiers_avec_nom.txt
4566 &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;This represents 3,7% of the 122k files we still have.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Example of long names to skip :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Recup/recup_dir.10/f136265448.sqlite&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Recup/recup_dir.194/f936769224_ftyp.mov&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Recup/recup_dir.36/f179430256_PAY18E.pdf&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Let&amp;#8217;s list all the file&amp;#8217;s mime-types :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;$ file --mime-type -f 122552_filenames.txt &amp;gt; 122552_file_mime-types.txt &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
$ sed -r 's/\s+/ /g' ../122552_file_mime-types.txt | cut -f 3,4,5,6,7 -d '.' | sort | uniq -c | sort -r -n &amp;gt; ../122552_file_ext_mime-type_summary.txt &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Takes 2h with a modern plates hard drive&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;This remove some spaces in the file, removes the beginning of the lines (two 1st dotted parts), then sort by file extension and count how many of each we have, finally sorting the biggest count firsts&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code&gt;  72429 jpg: image/jpeg
  14544 pdf: application/pdf
   7513 txt: text/plain
   6576 png: image/png
   5198 odt: application/vnd.oasis.opendocument.text
   3430 mpg: video/mpeg
   1795 avi: video/x-msvideo
   1369 elf: application/x-sharedlib
   1219 mp3: audio/mpeg
   1199 apple: application/octet-stream
    739 txt: application/octet-stream
    […] &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;There were still 77 file types (after I removed already C, H, Python, Java and some other programming language files&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;We can move &lt;code&gt;elf&lt;/code&gt; and so called &lt;code&gt;apple&lt;/code&gt; files, but the big deal is about &lt;code&gt;jpg&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect3"&gt;
&lt;h4 id="_sorting_files_by_extension"&gt;1.4.2. Sorting files by extension&lt;/h4&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;A friend used this post to recover files and decided to stop here, sorting his 10k files by extention using the following script :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="bash"&gt;#!/bin/bash

# Utilisation du premier argument comme répertoire source
source_dir="$1"

if [ -z "$source_dir" ]; then
    echo "Usage: $0 &amp;lt;source_directory&amp;gt;"
    exit 1
fi

# Fonction récursive pour traiter les fichiers d'un répertoire
process_directory() {
    local dir="$1"

    for ext in $(find "$dir" -type f | sed -n 's/.*\.\(.*\)/\1/p' | sort -u); do
        ext_dir="${ext}_files"
        # Création du répertoire d'extension s'il n'existe pas déjà
        mkdir -p "$ext_dir"

        # Déplacer les fichiers de l'extension vers le répertoire d'extension
        find "$dir" -type f -wholename "*.$ext" -exec mv {} "$ext_dir" \;
    done
}

# Appel initial pour le répertoire source
process_directory "$source_dir"&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_removing_jpeg_thumbnails"&gt;1.5. Removing JPEG thumbnails&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Lets explore a random folder for it&amp;#8217;s images :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;$ find . -name "*.jpg" | wc -l
89
find . -name "*.jpg" -size -35k | wc -l
68
find . -name "*.jpg" -size -50k | wc -l
69
find . -name "*.jpg" -size -100k | wc -l
71
find . -name "*.jpg" -size -150k | wc -l
78
find . -name "*.jpg" -size -1500k | wc -l
78
find . -name "*.jpg" -size -1800k | wc -l
79&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;We can see that there is a lot of small pictures, mainly thumbnails of real photos, created by various software (file explorer, photo viewer…) on various operating systems.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;We can also see that there is a large no man&amp;#8217;s land between 150 and 1500ko. Bigger files might be real photos. I decided to cat at &lt;code&gt;300ko&lt;/code&gt; :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;find Recup -name "*.jpg" -size -300k | wc -l
43414
find Recup -name "*.jpg" -size -300k | xargs -I {} mv {} poubelle/{} &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Took around 1 minute&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Here we can count 72635 files left and 414 GO so 50% of the file number for 96% of the size.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_fclones_to_find_redundant_files"&gt;1.6. fclones to find redundant files&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I decided to try &lt;a href="/2020/find_duplicate_files.html"&gt;fclones&lt;/a&gt; to find duplicates in remaining files.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;$ fclones group --cache /tmp &amp;gt; /tmp/fclones.group.txt &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt; &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;
fclones:  info: Found 48416 (149.9 GB) redundant files
$ fclones move poubelle &amp;lt; /tmp/fclones.group.txt
Deduplicating 17252 groups
fclones:  info: Processed 48416 files and reclaimed 149.9 GB space &lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;(3)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;The cache option saves the file hashes on the filesystem to eventually reuse them (if you miss-spelled something in the way) keeping what&amp;#8217;s long to compute&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;It took 2h38&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Took 10 minutes&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;We&amp;#8217;re now at 24220 files and 273 GO. It 16% of the initial file number and 63% of the size.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_removing_empty_folders"&gt;1.7. Removing empty folders&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Easy part :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;$ rmdir Recup/*
$ exa -l | wc -l
199 &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;So 39 folders less (16%)&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_find_the_recent_files"&gt;1.8. Find the recent files&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Unfortunately &lt;code&gt;photorec&lt;/code&gt; is only able to restore file creation date and times for some photos and office documents. Around a third of the initial documents.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;We can find the recent documents among all the ones which date were not recovered via :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;$ find . -newermt $(date +%Y-%m-%d -d '4 months ago') -type f -print &amp;gt; recent_file_list.txt &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt; &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;To get the file that are not older than 4 months&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Here we get ~100k file names&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;We can remove from the list the files dating from the recovery via &lt;code&gt;photorec&lt;/code&gt; :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;$ find . -newermt $(date +%Y-%m-%d -d '4 months ago') ! -newermt $(date +%Y-%m-%d -d '1 week ago') -type f -print &amp;gt; liste_incomplete_fichiers_recents.txt &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Here we get 453 files ; 4 ODT ; 0 with a recovered name&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;To get the existing files (after our big cleanup) :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;$ for a in `cat ~/liste_des_fichiers_recents.txt` ; do if test -f $a; then echo $a &amp;gt;&amp;gt; ~/liste_des_fichiers_recents_existants.txt ; fi; done&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;We get 17 122 files, 144 DOC, 76 ODT…&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_conclusion"&gt;1.9. Conclusion&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;code&gt;photorec&lt;/code&gt; is a great tool but it&amp;#8217;s not easy to do something with the numerous files it retrieves from a storage.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;In this post, we walked from 150k to 17k recent recovered files.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;We seen that &lt;code&gt;photorec&lt;/code&gt; might get your precious report out of a dying drive, but it might get it several times and also all it&amp;#8217;s previous or deleted versions… it will save your photos, but also their thumbnails and even with all the hints detailed in this post you will still have a huge amount work to do to get familiar with all those "unsorted" files.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_after_thoughs"&gt;1.10. After thoughs&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I should have created a disk image via the &lt;code&gt;dd&lt;/code&gt; command and worked on it, to allow recovering from mistakes.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_version_fr"&gt;2. version : fr&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_fichiers_perdus"&gt;2.1. Fichiers perdus&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Lors du dernier &lt;a href="https://www.repaircafe.org/en/cafe/repair-cafe-pougne-herisson/"&gt;Repair Café de Pougne-Hérisson&lt;/a&gt; un ami est venu m&amp;#8217;apporter un disque dur USB d'1TO en m&amp;#8217;expliquant que ce dernier n&amp;#8217;était plus reconnu par ces ordinateurs, Windows ou Linux.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Matériel défectueux ? Je le branche, il se monte.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Ah… l&amp;#8217;ami pensait l&amp;#8217;avoir testé aussi sous Linux, mais le disque n&amp;#8217;échoue à se monter que sous Windows du coup.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Bon, bah au moins c&amp;#8217;est pas matériel.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Je lui montre alors le contenu du disque, il y a 3 dossiers vides (data, storage, work) que l&amp;#8217;ami ne reconnait pas.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Je lui précise la date de création des dossiers : vendredi dernier à 18h43. Que faisait-il dans la nuit du vendredi en début de soirée (dans le bureau, avec un chandelier) ?&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;La mémoire lui revient, la famille voulait enregistrer un film via la nouvelle Box Canal+, or cette dernière réclamait un disque dur pour pouvoir enregistrer quelque chose. Il semble bien que la Box en question a juste formaté le disque qu&amp;#8217;on lui présentait (en Ext4) sans prévenir suffisamment explicitement que les données existantes seraient perdues.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Le disque n&amp;#8217;était donc plus reconnus par les ordinateurs tournant sous Windows… et les fichiers furent joyeusement supprimés par la Box.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Bon, après une vérification via testdisk je me retrouvais à lancer photorec. Ça a pris 22h et je me suis retrouvé avec 432 GO de données, en 150 159 fichiers répartis en 238 dossiers.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Bien plus que ce que l&amp;#8217;ami imaginais avoir comme données.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;PS: Ce billet peut être vu comme un second épisode après le sauvetage précédent : &lt;a href="/2018/save_data_from_lost_partitions_on_hard_drive.html#_version_fr"&gt;Saving data from lost partition on a hard drive&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_et_maintenant"&gt;2.2. Et maintenant ?&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Rendu là, j&amp;#8217;aimerai réduire cette masse de fichiers pour aider mon ami à l&amp;#8217;explorer et y retrouver son travail récent. (il a d&amp;#8217;autres sauvegardes, mais plus anciennes)&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Lançons tout d&amp;#8217;abord un &lt;code&gt;ncdu&lt;/code&gt; pour voir ce qu&amp;#8217;il peut nous en dire :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;53.9 GiB [#############] /recup_dir.233
50.1 GiB [############ ] /recup_dir.232
21.2 GiB [#####        ] /recup_dir.2
16.7 GiB [####         ] /recup_dir.234
15.9 GiB [###          ] /recup_dir.1
13.7 GiB [###          ] /recup_dir.229
 8.1 GiB [#            ] /recup_dir.182
 8.1 GiB [#            ] /recup_dir.205
 6.6 GiB [#            ] /recup_dir.180
 6.3 GiB [#            ] /recup_dir.237
 6.1 GiB [#            ] /recup_dir.228
 5.9 GiB [#            ] /recup_dir.227
 5.2 GiB [#            ] /recup_dir.204
 5.2 GiB [#            ] /recup_dir.179
 5.0 GiB [#            ] /recup_dir.224
 4.9 GiB [#            ] /recup_dir.187
 4.7 GiB [#            ] /recup_dir.4
 4.5 GiB [#            ] /recup_dir.3
 4.2 GiB [#            ] /recup_dir.186
 4.1 GiB [             ] /recup_dir.222
 4.0 GiB [             ] /recup_dir.215
 […]&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;Total disk usage: 431.7 GiB  Apparent size: 428.6 GiB  Items: 150 159&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Je peux confirmer ce nombre de fichiers via :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;$ rg -uuu --files --iglob * | wc -l
149682
$ python -c 'print(149682+(238*2))'  # adding folders
150158 &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Il semble que chaque dossier compte pour 2 items (tels que les compte &lt;code&gt;ncdu&lt;/code&gt;), et encore il en manque toujours 1…&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_retirer_les_fichiers_de_programmation"&gt;2.3. Retirer les fichiers de programmation&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;En explorant quelques dossiers, je constate qu&amp;#8217;il y a beaucoup de fichiers C et Python parmi les fichiers récupérés. Combien exactement ?&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;$ rg -uuu --files --iglob "*.c" Recup | wc -l &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
21348

# Nombre de fichiers Pythons :
$ rg -uuu --files --iglob "*.py" Recup | wc -l
4363&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;photorec&lt;/code&gt; était configuré pour écrire dans le dossier &lt;code&gt;Recup&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Bon, alors je peux créer un dossier "poubelle" et y déclarer ces fichiers, mon amis n&amp;#8217;est pas un programmeur.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;$ mkdir poubelle
$ for a in `seq 238`; do mkdir "poubelle/recup_dir.$a"; done; &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
$ rg -uuu --files --iglob "**py" . | xargs -I {} mv {} poubelle/{} &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Création de 238 sous dossiers dans "poubelle" folder.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Déplacement des fichiers Python.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Mais combien y a-t-il de langages de programmation représentés ?&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;$ for a in `rg --type-list | cut -f 1 -d ':'`; do echo "$a: `rg --files -t $a | wc -l`"; done; &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Pour chaque type de fichier reconnu par &lt;code&gt;rg&lt;/code&gt; (169 en l&amp;#8217;occurrence) afficher le nombre de fichier qu&amp;#8217;rg peut en compter&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code&gt;fortran: 14 &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
h: 1642
html: 292
java: 219
config: 3
pdf: 14536
perl: 12
php: 9
sh: 11
svg: 377
txt: 8645&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Je n&amp;#8217;ai gardé là que les types effectivement présents&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Tiens, ça liste également des PDF mais pas d&amp;#8217;ODT et puis on a pas les extensions fichiers exactes pour chaque type…&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_compter_les_fichiers_par_type"&gt;2.4. Compter les fichiers par type&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Lançons nous dans un meilleur aperçu de la répartition des fichiers par type, en comptant les fichiers par type mime et par extension (du moins celle que &lt;code&gt;photorec&lt;/code&gt; a attribué aux fichiers).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;$ rg -uuu --files --iglob "*" Recup &amp;gt; 122552_filenames.txt  &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;J&amp;#8217;en étais encore à 122552 fichiers. La commande dura 15s.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="sect3"&gt;
&lt;h4 id="_compter_les_fichiers_dont_le_noms_a_été_retrouvé"&gt;2.4.1. Compter les fichiers dont le noms a été retrouvé&lt;/h4&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;$ rg '.{42,}' 122552_filenames.txt &amp;gt; liste_fichiers_avec_nom.txt
$ wc -l liste_fichiers_avec_nom.txt
4566 &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Cela représente 3,7% des 122k fichiers restant&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Voici quelques exemples de long nom de fichier à éviter quand même :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Recup/recup_dir.10/f136265448.sqlite&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Recup/recup_dir.194/f936769224_ftyp.mov&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Recup/recup_dir.36/f179430256_PAY18E.pdf&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Listons maintenant tous les fichiers par type mime et par extension :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;$ file --mime-type -f 122552_filenames.txt &amp;gt; 122552_file_mime-types.txt &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
$ sed -r 's/\s+/ /g' ../122552_file_mime-types.txt | cut -f 3,4,5,6,7 -d '.' | sort | uniq -c | sort -r -n &amp;gt; ../122552_file_ext_mime-type_summary.txt &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Bon là ça prend 2h sur ce disque dur à plateau d&amp;#8217;une grande marque et relativement moderne&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Cette ligne retire des espaces dans chaque ligne, puis retire le début de chaque ligne (jusqu&amp;#8217;au 2e point), puis tri le fichier et compte les lignes identiques avant de les trier par nombre d&amp;#8217;occurrences.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code&gt;  72429 jpg: image/jpeg
  14544 pdf: application/pdf
   7513 txt: text/plain
   6576 png: image/png
   5198 odt: application/vnd.oasis.opendocument.text
   3430 mpg: video/mpeg
   1795 avi: video/x-msvideo
   1369 elf: application/x-sharedlib
   1219 mp3: audio/mpeg
   1199 apple: application/octet-stream
    739 txt: application/octet-stream
    […] &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Il y avait encore 77 types de fichiers à ce moment là (après le retrait des fichiers C, H, Python, Java et quelques autres).&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;On note qu&amp;#8217;il est intéressant de retirer les fichiers &lt;code&gt;elf&lt;/code&gt; et &lt;code&gt;apple&lt;/code&gt; mais que le gros morceau reste les &lt;code&gt;jpg&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect3"&gt;
&lt;h4 id="_ranger_les_fichiers_par_extension"&gt;2.4.2. Ranger les fichiers par extension&lt;/h4&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Un ami a utilisé ce billet de blog pour récupérer des fichiers perdus dans un Windows 11 sur support de stockage NVME. Il a décidé de s&amp;#8217;arrêter à cette étape, après avoir rangé les 10k fichiers par extension. Voilà le script qu&amp;#8217;il a utilisé :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="bash"&gt;#!/bin/bash

# Utilisation du premier argument comme répertoire source
source_dir="$1"

if [ -z "$source_dir" ]; then
    echo "Usage: $0 &amp;lt;source_directory&amp;gt;"
    exit 1
fi

# Fonction récursive pour traiter les fichiers d'un répertoire
process_directory() {
    local dir="$1"

    for ext in $(find "$dir" -type f | sed -n 's/.*\.\(.*\)/\1/p' | sort -u); do
        ext_dir="${ext}_files"
        # Création du répertoire d'extension s'il n'existe pas déjà
        mkdir -p "$ext_dir"

        # Déplacer les fichiers de l'extension vers le répertoire d'extension
        find "$dir" -type f -wholename "*.$ext" -exec mv {} "$ext_dir" \;
    done
}

# Appel initial pour le répertoire source
process_directory "$source_dir"&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_supprimer_les_miniatures_jpeg"&gt;2.5. Supprimer les miniatures JPEG&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Explorer un dossier au hasard pour voir ce qu&amp;#8217;il contient comme images :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;$ find . -name "*.jpg" | wc -l
89
find . -name "*.jpg" -size -35k | wc -l
68
find . -name "*.jpg" -size -50k | wc -l
69
find . -name "*.jpg" -size -100k | wc -l
71
find . -name "*.jpg" -size -150k | wc -l
78
find . -name "*.jpg" -size -1500k | wc -l
78
find . -name "*.jpg" -size -1800k | wc -l
79&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;On constate qu&amp;#8217;il y a plein de petites images, principalement des miniatures de vraies photos, créées par divers logiciels (explorateur de fichier, visionneur de photo…) sur divers systèmes d&amp;#8217;exploitation.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;On remarque également qu&amp;#8217;il y a un grand trou dans la répartition des images entre 150ko et 1500ko. Les photos plus grosses auront toutes les chances d&amp;#8217;être des vraies. Pour ma part j&amp;#8217;ai décidé de couper à &lt;code&gt;300ko&lt;/code&gt; :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;find Recup -name "*.jpg" -size -300k | wc -l
43414
find Recup -name "*.jpg" -size -300k | xargs -I {} mv {} poubelle/{} &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Cela prend environ 1 minute&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Arrivé là on en est à 72635 fichiers et 414 GO soit 50% du nombre de fichiers du départ mais toujours 96% de l&amp;#8217;occupation disque.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_fclones_pour_trouver_les_fichiers_redondants"&gt;2.6. fclones pour trouver les fichiers redondants&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;J&amp;#8217;ai alors décidé d&amp;#8217;essayer &lt;a href="/2020/find_duplicate_files.html"&gt;fclones&lt;/a&gt; pour tenter de trouver des fichiers qui seraient présents en plusieurs exemplaires parmi les fichiers restants.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;$ fclones group --cache /tmp &amp;gt; /tmp/fclones.group.txt &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt; &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;
fclones:  info: Found 48416 (149.9 GB) redundant files
$ fclones move poubelle &amp;lt; /tmp/fclones.group.txt
Deduplicating 17252 groups
fclones:  info: Processed 48416 files and reclaimed 149.9 GB space &lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;(3)&lt;/b&gt; &lt;i class="conum" data-value="4"&gt;&lt;/i&gt;&lt;b&gt;(4)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;L&amp;#8217;option &lt;code&gt;--cache&lt;/code&gt; permet de sauver l&amp;#8217;index des hash de fichier sur le disque dur (ici rangé dans le dossier &lt;code&gt;/tmp&lt;/code&gt;), cela permettrait de le réutiliser si on avait à relancer la commande rapidement suite à une erreur, sans avoir à recalculer tous les hash&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;L&amp;#8217;exécution a pris 2h38&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Cette dernière phase a pris 10 min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="4"&gt;&lt;/i&gt;&lt;b&gt;4&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Il aurait probablement été préférable de faire des liens symboliques avant de déplacer les fichiers redondants&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Nous voilà rendus à 24220 fichiers et 273 GO soit 16% du nombre initial de fichiers et 63% de la taille considérée.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_retrait_des_dossiers_vides"&gt;2.7. Retrait des dossiers vides&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Une partie rapide :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;$ rmdir Recup/*
$ exa -l | wc -l
199 &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Donc 39 dossiers vides retirés (16%)&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_retrouver_les_fichiers_récents"&gt;2.8. Retrouver les fichiers récents&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Malheureusement &lt;code&gt;photorec&lt;/code&gt; ne sait pas restaurer toutes les dates de création de fichier (mais, comme pour les noms, seulement celles retrouvables dans les métadonnées internes d&amp;#8217;un fichier). Quand la date est inconnue, c&amp;#8217;est la date du jour qui est utilisée.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Un tiers des documents ont pu être éliminés comme étant trop vieux (plus de 4 mois).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Voici la commande utilisée pour retrouver les fichiers récents :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;$ find . -newermt $(date +%Y-%m-%d -d '4 months ago') -type f -print &amp;gt; recent_file_list.txt &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt; &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Retrouver les fichiers qui ont moins de 4 mois&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Environ 100k fichiers furent trouvés sur les 150k du départ&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;On peut retirer de cette liste les fichiers datant du jour de la récupération pour une liste plus courte (et donc plus facile à consulter) :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;$ find . -newermt $(date +%Y-%m-%d -d '4 months ago') ! -newermt $(date +%Y-%m-%d -d '1 week ago') -type f -print &amp;gt; liste_incomplete_fichiers_recents.txt &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Là on tombe à 453 fichiers ; 4 ODT ; 0 avec son nom d&amp;#8217;origine&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Vu que je suis reparti de la liste intégrale des fichiers, on peut en retirer tous les fichiers éliminés ou dédoublonnés :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;$ for a in `cat ~/liste_des_fichiers_recents.txt` ; do if test -f $a; then echo $a &amp;gt;&amp;gt; ~/liste_des_fichiers_recents_existants.txt ; fi; done&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;On en arrive à 17 122 fichiers, dont 144 DOC, 76 ODT…&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_conclusion_2"&gt;2.9. Conclusion&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;code&gt;photorec&lt;/code&gt; est un outil très précieux mais il n&amp;#8217;est pas facile de s&amp;#8217;y retrouver dans tous les fichiers qu&amp;#8217;il retrouve.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Dans ce billet, nous sommes passés de 150k à 17k fichiers récents et uniques retrouvés.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Nous avons vu que &lt;code&gt;photorec&lt;/code&gt; peut vous aider à retrouver votre précieux rapport perdu sur un support mourant, mais il risque de le retrouver plusieurs fois, accompagné de toutes ses versions précédentes et/ou supprimées… vos photos serons sauvées, mais également leurs miniatures et même avec toutes les techniques illustrées ici pour raffiner les données récupérées, il vous faudra encore beaucoup de travail pour vous réapproprier cette montagne de fichiers&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_pensées_pour_la_prochaine_fois"&gt;2.10. Pensées pour la prochaine fois&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;J&amp;#8217;aurais pu commencer par faire une copie bit à bit du support via &lt;code&gt;dd&lt;/code&gt; pour pouvoir éventuellement revenir à une étape précédente en cas de fausse manip.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</content><category term="Articles"/><category term="storage"/><category term="repair"/><category term="adminsys"/></entry><entry><title>Cron to schedule computer shutdown on 2023, march the 7th</title><link href="https://grimoire.d12s.fr/2023/cron_to_schedule_computer_shutdown.html" rel="alternate"/><published>2023-03-02T00:00:00+01:00</published><updated>2023-03-02T00:00:00+01:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2023-03-02:/2023/cron_to_schedule_computer_shutdown.html</id><summary type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Utiliser CRON pour programmer l&amp;#8217;extinction d&amp;#8217;une machine le 7 mars 2023 à minuit.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="admonitionblock warning"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class="icon"&gt;
&lt;i class="fa icon-warning" title="Warning"&gt;&lt;/i&gt;
&lt;/td&gt;
&lt;td class="content"&gt;
Il s&amp;#8217;agit de plaisanteries, éteindre un server d&amp;#8217;entreprise peut être qualifié de faute lourde. Voici les conseils de Solidaire Informatique relatifs au &lt;a href="https://solidairesinformatique.org/vos-droits/droit-de-greve/"&gt;droit de grève&lt;/a&gt; ainsi que le tract concernant la grève du …&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;</summary><content type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Utiliser CRON pour programmer l&amp;#8217;extinction d&amp;#8217;une machine le 7 mars 2023 à minuit.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="admonitionblock warning"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class="icon"&gt;
&lt;i class="fa icon-warning" title="Warning"&gt;&lt;/i&gt;
&lt;/td&gt;
&lt;td class="content"&gt;
Il s&amp;#8217;agit de plaisanteries, éteindre un server d&amp;#8217;entreprise peut être qualifié de faute lourde. Voici les conseils de Solidaire Informatique relatifs au &lt;a href="https://solidairesinformatique.org/vos-droits/droit-de-greve/"&gt;droit de grève&lt;/a&gt; ainsi que le tract concernant la grève du &lt;a href="https://solidairesinformatique.org/wp-content/uploads/2023/02/2023-03-07_GreveGenerale2.pdf"&gt;7 mars 2023&lt;/a&gt;.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;code&gt;crontab -e&lt;/code&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="shell"&gt;0 0 7 3 * test $(/bin/date +\%Y) = "2023" &amp;amp;&amp;amp;  /sbin/shutdown now &amp;gt;/dev/null 2&amp;gt;&amp;amp;1 &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;The command &lt;code&gt;test …&lt;/code&gt; if the current year is 2023 and if so shutdowns the machine&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Original idea from &lt;a href="https://mamot.fr/@SolInfoNat@syndicat.solidaires.org/109952856290917935"&gt;Solidaire Informatique&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;# echo "/sbin/shutdown now" | at -t 03070000 &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://syndicat.solidaires.org/@framasky@framapiaf.org/109952968598460016"&gt;Framasky&lt;/a&gt;'s version&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;</content><category term="Commandes"/><category term="adminsys"/><category term="security"/></entry><entry><title>Zsh : Edit and repeat the last command</title><link href="https://grimoire.d12s.fr/2023/zsh_edit_and_repeat_last_command.html" rel="alternate"/><published>2023-02-01T00:00:00+01:00</published><updated>2023-02-01T00:00:00+01:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2023-02-01:/2023/zsh_edit_and_repeat_last_command.html</id><summary type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Répéter une version éditée de la dernière commande entrée, à l&amp;#8217;aide de la syntax sed / vim de remplacement de chaîne de caractères.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;You can repeat your last command with &lt;code&gt;!!&lt;/code&gt; in Zsh and you can substitute an element of this laste command via the sed / vim-like syntax &lt;code&gt;:s/to-remove/replace-by-this …&lt;/code&gt;&lt;/p&gt;&lt;/div&gt;</summary><content type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Répéter une version éditée de la dernière commande entrée, à l&amp;#8217;aide de la syntax sed / vim de remplacement de chaîne de caractères.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;You can repeat your last command with &lt;code&gt;!!&lt;/code&gt; in Zsh and you can substitute an element of this laste command via the sed / vim-like syntax &lt;code&gt;:s/to-remove/replace-by-this&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;#&lt;/span&gt; cfdisk /dev/sda
&lt;span class="tok-gp"&gt;#&lt;/span&gt; !!:s/sda/md127 &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
&lt;span class="tok-gp"&gt;#&lt;/span&gt; cfdisk /dev/md127&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Re-run the &lt;code&gt;cfdisk&lt;/code&gt; command modifying the matching part of the path&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;And as reported by Copenhas on Coderwall in 2017 :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;you can apply several substitutions :&lt;/p&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;:s/aaa/bbb/:s/bbb/ccc&lt;/code&gt; will chain the calls and end up with 'ccc'&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;:gs/aaa/bbb&lt;/code&gt; will replace all occurences of 'aaa'&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;you can apply substitutions on shell variable content&lt;/p&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;echo ${PATH:gs/bin/sbin/}&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;you can use a simpler notation for substitution on 1st match only&lt;/p&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;^aaa^bbb&lt;/code&gt; will achieve the same than : &lt;code&gt;:s/aaa/bbb&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;</content><category term="Commandes"/><category term="shell"/><category term="vim"/></entry><entry><title>Brightnessctl : control screen backlight</title><link href="https://grimoire.d12s.fr/2023/brightnessctl.html" rel="alternate"/><published>2023-01-03T00:00:00+01:00</published><updated>2023-01-03T00:00:00+01:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2023-01-03:/2023/brightnessctl.html</id><summary type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Contrôler la puissance du rétro-éclairage de votre écran d&amp;#8217;ordinateur&lt;/em&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Read here : &lt;a href="https://mamot.fr/@vidister@chaos.social/109794861459586034" class="bare"&gt;https://mamot.fr/@vidister@chaos.social/109794861459586034&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Almost all computer screens made in the last decade support DDC/CI. (The Display Data Channel Command Interface).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;You can use it to control stuff like the backlight brightness without fiddling …&lt;/p&gt;&lt;/div&gt;</summary><content type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Contrôler la puissance du rétro-éclairage de votre écran d&amp;#8217;ordinateur&lt;/em&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Read here : &lt;a href="https://mamot.fr/@vidister@chaos.social/109794861459586034" class="bare"&gt;https://mamot.fr/@vidister@chaos.social/109794861459586034&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Almost all computer screens made in the last decade support DDC/CI. (The Display Data Channel Command Interface).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;You can use it to control stuff like the backlight brightness without fiddling with the awful screen buttons and OSD.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;On Linux once you load the &lt;code&gt;ddcci&lt;/code&gt; kernel module the screens appear in &lt;code&gt;/sys/class/backlights&lt;/code&gt; and can be controlled like a laptop screen.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;With Artix Linux on a DELL XPS 9710 laptop the module was not found, but not needed.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;$ sudo pacman -Ss brightnessctl &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
galaxy/brightnessctl 0.5.1-2.2
    Lightweight brightness control tool
$ sudo pacman -S brightnessctl &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;
		[…]
:: Traitement des changements du paquet…
(1/1) installation de brightnessctl                       [###############################] 100%
:: Exécution des crochets (« hooks ») de post-transaction…
(1/1) Reloading device manager configuration...&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Search for the paquet &lt;code&gt;brightnessctl&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Installation of the paquet (only the end of the log is reproduced here)&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="sh"&gt;$ sudo brightnessctl --list &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
Available devices:
Device 'intel_backlight' of class 'backlight': &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;
	Current brightness: 102 (20%) &lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;(3)&lt;/b&gt;
	Max brightness: 512 &lt;i class="conum" data-value="4"&gt;&lt;/i&gt;&lt;b&gt;(4)&lt;/b&gt;

Device 'phy0-led' of class 'leds': &lt;i class="conum" data-value="5"&gt;&lt;/i&gt;&lt;b&gt;(5)&lt;/b&gt;
	Current brightness: 1 (100%) &lt;i class="conum" data-value="6"&gt;&lt;/i&gt;&lt;b&gt;(6)&lt;/b&gt;
	Max brightness: 1 &lt;i class="conum" data-value="7"&gt;&lt;/i&gt;&lt;b&gt;(7)&lt;/b&gt;

Device 'input3::numlock' of class 'leds':
	Current brightness: 0 (0%)
	Max brightness: 1

Device 'input3::capslock' of class 'leds': &lt;i class="conum" data-value="8"&gt;&lt;/i&gt;&lt;b&gt;(8)&lt;/b&gt;
	Current brightness: 0 (0%) &lt;i class="conum" data-value="9"&gt;&lt;/i&gt;&lt;b&gt;(9)&lt;/b&gt;
	Max brightness: 1

Device 'input3::scrolllock' of class 'leds':
	Current brightness: 0 (0%)
	Max brightness: 1

Device 'dell::kbd_backlight' of class 'leds':
	Current brightness: 0 (0%)
	Max brightness: 2 &lt;i class="conum" data-value="10"&gt;&lt;/i&gt;&lt;b&gt;(10)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;List all available devices and controls&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;This line starts a device section in the output and its the screen backlight&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;This is the current state of the device&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="4"&gt;&lt;/i&gt;&lt;b&gt;4&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;This indicates the maximum integer value that can be set&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="5"&gt;&lt;/i&gt;&lt;b&gt;5&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Here we can control a single led (somewhere else, and I don&amp;#8217;t where to be true)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="6"&gt;&lt;/i&gt;&lt;b&gt;6&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;It is reported as turned on&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="7"&gt;&lt;/i&gt;&lt;b&gt;7&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;It can only be off (0) or on (1)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="8"&gt;&lt;/i&gt;&lt;b&gt;8&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Here we have the led that shows the capslock keyboard state&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="9"&gt;&lt;/i&gt;&lt;b&gt;9&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;It is reported as off (and I can verify it)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="10"&gt;&lt;/i&gt;&lt;b&gt;10&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Here we can see that the keyboard backlight has 2 possible levels (and it&amp;#8217;s true)&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="sh"&gt;$ sudo brightnessctl --device 'input3::capslock' s 1 &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
Updated device 'input3::capslock':
Device 'input3::capslock' of class 'leds':
	Current brightness: 1 (100%) &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;
	Max brightness: 1&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Here I set to &lt;code&gt;1&lt;/code&gt; the capslock led state&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;So it&amp;#8217;s now reported as "on" and I confirm it (despite the funny fact that
letters are still minus typed)&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;We can notice that for this computer, we can&amp;#8217;t get the webcam led lying like the capslock one.&lt;/p&gt;
&lt;/div&gt;</content><category term="Commandes"/><category term="comfort"/><category term="hardware"/></entry><entry><title>lnav : log navigator (and illuminator)</title><link href="https://grimoire.d12s.fr/2022/lnav_log_navigator.html" rel="alternate"/><published>2022-12-09T00:00:00+01:00</published><updated>2022-12-09T00:00:00+01:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2022-12-09:/2022/lnav_log_navigator.html</id><summary type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Le navigateur de journaux système, tire parti de chaque bribe d&amp;#8217;information pour illuminer les logs par sa coloration syntaxique. Outre les erreurs en rouge et l&amp;#8217;horodatage démarqué, différentes adresses IP (ou différents PID) se retrouvent chacun·es avec leur couleur ! Le tout dans un utilitaire ncurses largement configurable …&lt;/em&gt;&lt;/p&gt;&lt;/div&gt;</summary><content type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Le navigateur de journaux système, tire parti de chaque bribe d&amp;#8217;information pour illuminer les logs par sa coloration syntaxique. Outre les erreurs en rouge et l&amp;#8217;horodatage démarqué, différentes adresses IP (ou différents PID) se retrouvent chacun·es avec leur couleur ! Le tout dans un utilitaire ncurses largement configurable et qui facilite déplacements et recherches. lnav a exactement le comportement que vim devrait avoir quand on ouvre un fichier de log.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-go"&gt;lnav /var/log/everything.log&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;</content><category term="Commandes"/><category term="comfort"/><category term="adminsys"/></entry><entry><title>Vim : go back to previous position after a jump</title><link href="https://grimoire.d12s.fr/2022/vim_go_back_to_previous_position_after_a_jump.html" rel="alternate"/><published>2022-11-28T00:00:00+01:00</published><updated>2022-11-28T00:00:00+01:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2022-11-28:/2022/vim_go_back_to_previous_position_after_a_jump.html</id><content type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Retourner à la précédente position après un saut.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;In normal mode :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="vim"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Usefull when you&amp;#8217;re going from a search occurence to another, and missed the
wanted one. Else, in this case, you can still search in reverse order with
&lt;code&gt;?pattern&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;</content><category term="Commandes"/><category term="Vim"/></entry><entry><title>command-not-found: which package to install then ? (and variations)</title><link href="https://grimoire.d12s.fr/2022/command-not-found.html" rel="alternate"/><published>2022-11-21T00:00:00+01:00</published><updated>2022-11-21T00:00:00+01:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2022-11-21:/2022/command-not-found.html</id><summary type="html">&lt;div id="toc" class="toc"&gt;
&lt;div id="toctitle"&gt;Index&lt;/div&gt;
&lt;ul class="sectlevel1"&gt;
&lt;li&gt;&lt;a href="#_command_not_found_package"&gt;1. &lt;code&gt;command-not-found&lt;/code&gt; package&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_debian_packages_search_engine"&gt;2. Debian packages search engine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_packagesearch_command"&gt;3. &lt;code&gt;packagesearch&lt;/code&gt; command&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id="preamble"&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Chercher dans quel paquet trouver la commande manquante que l&amp;#8217;on vient d&amp;#8217;entrer.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_command_not_found_package"&gt;1. &lt;code&gt;command-not-found&lt;/code&gt; package&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;#&lt;/span&gt; apt install command-not-found
&lt;span class="tok-gp"&gt;#&lt;/span&gt; update-command-not-found &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;$&lt;/span&gt; &lt;span class="tok-nb"&gt;echo&lt;/span&gt; &lt;span class="tok-s2"&gt;&amp;quot;. /etc/zsh_command_not_fonud&amp;quot;&lt;/span&gt; &amp;gt;&amp;gt; ~/.zshrc &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;command-not-found&lt;/code&gt; needs its own list of packages (explained in &lt;code&gt;/usr …&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</summary><content type="html">&lt;div id="toc" class="toc"&gt;
&lt;div id="toctitle"&gt;Index&lt;/div&gt;
&lt;ul class="sectlevel1"&gt;
&lt;li&gt;&lt;a href="#_command_not_found_package"&gt;1. &lt;code&gt;command-not-found&lt;/code&gt; package&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_debian_packages_search_engine"&gt;2. Debian packages search engine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_packagesearch_command"&gt;3. &lt;code&gt;packagesearch&lt;/code&gt; command&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id="preamble"&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Chercher dans quel paquet trouver la commande manquante que l&amp;#8217;on vient d&amp;#8217;entrer.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_command_not_found_package"&gt;1. &lt;code&gt;command-not-found&lt;/code&gt; package&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;#&lt;/span&gt; apt install command-not-found
&lt;span class="tok-gp"&gt;#&lt;/span&gt; update-command-not-found &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;$&lt;/span&gt; &lt;span class="tok-nb"&gt;echo&lt;/span&gt; &lt;span class="tok-s2"&gt;&amp;quot;. /etc/zsh_command_not_fonud&amp;quot;&lt;/span&gt; &amp;gt;&amp;gt; ~/.zshrc &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;command-not-found&lt;/code&gt; needs its own list of packages (explained in &lt;code&gt;/usr/share/doc/command-not-found/README.Debian&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Instruct your shell about « command not found » new reaction. Exists also in &lt;code&gt;bash&lt;/code&gt; version as explained in &lt;code&gt;/usr/share/doc/command-not-found/README&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;The &lt;code&gt;2ping&lt;/code&gt; command is missing on my system, if I try to invoke it :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;$&lt;/span&gt; 2ping
&lt;span class="tok-go"&gt;zsh: correct &amp;#39;2ping&amp;#39; to &amp;#39;ping&amp;#39; [nyae]? n &lt;/span&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
&lt;span class="tok-go"&gt;zsh: command not found: 2ping &lt;/span&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;
&lt;span class="tok-go"&gt;The program &amp;#39;2ping&amp;#39; is currently not installed.  To run &amp;#39;2ping&amp;#39; please ask your administrator to install the package &amp;#39;2ping&amp;#39; &lt;/span&gt;&lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;(3)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;zsh&lt;/code&gt; offers a correction (as I have &lt;code&gt;ENABLE_CORRECTION="true"&lt;/code&gt; in my &lt;code&gt;~/.zshrc&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;But the command I really want does not exist.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;command-not-found&lt;/code&gt; list the package that installs the command.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Limitation : it&amp;#8217;s only working with packages from the &lt;code&gt;main&lt;/code&gt; archive.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_debian_packages_search_engine"&gt;2. Debian packages search engine&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;a href="https://www.debian.org/distrib/packages" class="bare"&gt;https://www.debian.org/distrib/packages&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;There is a "Search the contents of packages" part in the page with an option "packages that contain files named like this".&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;This search engine can be added to Firefox default search engines.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_packagesearch_command"&gt;3. &lt;code&gt;packagesearch&lt;/code&gt; command&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;code&gt;packagesearch&lt;/code&gt; is GUI for searching packages and viewing package information&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;There&amp;#8217;s a filter to search in file names of packages.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</content><category term="Commandes"/><category term="Debian"/><category term="shell"/><category term="metadata"/><category term="comfort"/></entry><entry><title>Nim js fib benchmark</title><link href="https://grimoire.d12s.fr/2022/nim_js_benchmark.html" rel="alternate"/><published>2022-11-11T00:00:00+01:00</published><updated>2022-11-11T00:00:00+01:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2022-11-11:/2022/nim_js_benchmark.html</id><summary type="html">&lt;div id="toc" class="toc"&gt;
&lt;div id="toctitle"&gt;Index&lt;/div&gt;
&lt;ul class="sectlevel1"&gt;
&lt;li&gt;&lt;a href="#_nim_interpretation"&gt;1. Nim interpretation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_native_nim_compilation"&gt;2. Native Nim compilation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_javascript_nim_compilation"&gt;3. JavaScript Nim compilation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_native_javascript_solution"&gt;4. Native JavaScript solution&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_benchmark_hardware"&gt;5. Benchmark hardware&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id="preamble"&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Mesure de performance du code JavaScript compilé par Nim.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Here is the code of a &lt;a href="https://nim-lang.org"&gt;Nim&lt;/a&gt; version of the &lt;em&gt;drujensen&lt;/em&gt;'s &lt;a href="https://github.com/drujensen/fib"&gt;Recursive Fibonacci Benchmark&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="nim"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-k"&gt;proc &lt;/span&gt;&lt;span class="tok-nf"&gt;fib&lt;/span&gt;&lt;span class="tok-p"&gt;(&lt;/span&gt;&lt;span class="tok-n"&gt;n&lt;/span&gt;&lt;span class="tok-p"&gt;:&lt;/span&gt; &lt;span class="tok-kt"&gt;int&lt;/span&gt;&lt;span class="tok-p"&gt;):&lt;/span&gt; &lt;span class="tok-kt"&gt;int&lt;/span&gt; &lt;span class="tok-o"&gt;=&lt;/span&gt;
  &lt;span class="tok-k"&gt;if&lt;/span&gt; &lt;span class="tok-n"&gt;n …&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</summary><content type="html">&lt;div id="toc" class="toc"&gt;
&lt;div id="toctitle"&gt;Index&lt;/div&gt;
&lt;ul class="sectlevel1"&gt;
&lt;li&gt;&lt;a href="#_nim_interpretation"&gt;1. Nim interpretation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_native_nim_compilation"&gt;2. Native Nim compilation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_javascript_nim_compilation"&gt;3. JavaScript Nim compilation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_native_javascript_solution"&gt;4. Native JavaScript solution&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_benchmark_hardware"&gt;5. Benchmark hardware&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id="preamble"&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Mesure de performance du code JavaScript compilé par Nim.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Here is the code of a &lt;a href="https://nim-lang.org"&gt;Nim&lt;/a&gt; version of the &lt;em&gt;drujensen&lt;/em&gt;'s &lt;a href="https://github.com/drujensen/fib"&gt;Recursive Fibonacci Benchmark&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="nim"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-k"&gt;proc &lt;/span&gt;&lt;span class="tok-nf"&gt;fib&lt;/span&gt;&lt;span class="tok-p"&gt;(&lt;/span&gt;&lt;span class="tok-n"&gt;n&lt;/span&gt;&lt;span class="tok-p"&gt;:&lt;/span&gt; &lt;span class="tok-kt"&gt;int&lt;/span&gt;&lt;span class="tok-p"&gt;):&lt;/span&gt; &lt;span class="tok-kt"&gt;int&lt;/span&gt; &lt;span class="tok-o"&gt;=&lt;/span&gt;
  &lt;span class="tok-k"&gt;if&lt;/span&gt; &lt;span class="tok-n"&gt;n&lt;/span&gt; &lt;span class="tok-o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="tok-mi"&gt;1&lt;/span&gt;&lt;span class="tok-p"&gt;:&lt;/span&gt;
    &lt;span class="tok-k"&gt;return&lt;/span&gt; &lt;span class="tok-n"&gt;n&lt;/span&gt;
  &lt;span class="tok-k"&gt;return&lt;/span&gt; &lt;span class="tok-n"&gt;fib&lt;/span&gt;&lt;span class="tok-p"&gt;(&lt;/span&gt;&lt;span class="tok-n"&gt;n&lt;/span&gt; &lt;span class="tok-o"&gt;-&lt;/span&gt; &lt;span class="tok-mi"&gt;1&lt;/span&gt;&lt;span class="tok-p"&gt;)&lt;/span&gt; &lt;span class="tok-o"&gt;+&lt;/span&gt; &lt;span class="tok-n"&gt;fib&lt;/span&gt;&lt;span class="tok-p"&gt;(&lt;/span&gt;&lt;span class="tok-n"&gt;n&lt;/span&gt; &lt;span class="tok-o"&gt;-&lt;/span&gt; &lt;span class="tok-mi"&gt;2&lt;/span&gt;&lt;span class="tok-p"&gt;)&lt;/span&gt;

&lt;span class="tok-n"&gt;echo&lt;/span&gt; &lt;span class="tok-n"&gt;fib&lt;/span&gt;&lt;span class="tok-p"&gt;(&lt;/span&gt;&lt;span class="tok-mi"&gt;47&lt;/span&gt;&lt;span class="tok-p"&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;The expected result is &lt;code&gt;2 971 215 073&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_nim_interpretation"&gt;1. Nim interpretation&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;$&lt;/span&gt; &lt;span class="tok-nb"&gt;time&lt;/span&gt; nim e fib.nim
&lt;span class="tok-go"&gt;2971215073&lt;/span&gt;
&lt;span class="tok-go"&gt;nim e fib.nim  6288,83s user 1,40s system 99% cpu 1:45:08,73 total &lt;/span&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Interpreted Nim is not meant for high speed, but it allows to replace Makefiles and adminsys scripting without developper mind-context change. A &lt;a href="https://github.com/andreaferretti/memo"&gt;memoized&lt;/a&gt; version is interpreted in 0,40s.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_native_nim_compilation"&gt;2. Native Nim compilation&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;$&lt;/span&gt; &lt;span class="tok-nb"&gt;time&lt;/span&gt; nim c -d:release -r fib.nim &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
&lt;span class="tok-go"&gt;2971215073&lt;/span&gt;
&lt;span class="tok-go"&gt;nim c -d:release -r fib.nim  7,95s user 0,07s system 100% cpu 7,973 total &lt;/span&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;
&lt;span class="tok-gp"&gt;$&lt;/span&gt; &lt;span class="tok-nb"&gt;time&lt;/span&gt; ./fib
&lt;span class="tok-go"&gt;2971215073&lt;/span&gt;
&lt;span class="tok-go"&gt;./fib  4,63s user 0,00s system 99% cpu 4,635 total&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Nim Compiler Version 1.6.6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Every measures have been made 5x, where consistant and are faithfully represented by the shown outputs.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_javascript_nim_compilation"&gt;3. JavaScript Nim compilation&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;$&lt;/span&gt; &lt;span class="tok-nb"&gt;time&lt;/span&gt; nim js -d:release -o:fib.nim.release.js fib.nim &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
&lt;span class="tok-go"&gt;nim js -d:release -o:fib.nim.release.js fib.nim  0,29s user 0,03s system 99% cpu 0,322 total&lt;/span&gt;
&lt;span class="tok-gp"&gt;$&lt;/span&gt; &lt;span class="tok-nb"&gt;time&lt;/span&gt; node fib.nim.release.js &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;
&lt;span class="tok-go"&gt;node fib.nim.release.js  71,53s user 0,03s system 99% cpu 1:11,71 total&lt;/span&gt;
&lt;span class="tok-gp"&gt;$&lt;/span&gt; &lt;span class="tok-nb"&gt;time&lt;/span&gt; js78 fib.nim.release.js &lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;(3)&lt;/b&gt;
&lt;span class="tok-go"&gt;js78 fib.nim.release.js  34,48s user 0,01s system 99% cpu 34,510 total&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Produces a &lt;code&gt;fib.nim.release.js&lt;/code&gt; of 15ko. Would be 4,8ko with &lt;code&gt;-d:danger&lt;/code&gt; with no difference in performances.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Well, to be true I had to use &lt;code&gt;uint64&lt;/code&gt; instead of simple &lt;code&gt;int&lt;/code&gt; to avoid an &lt;code&gt;OverflowDefect&lt;/code&gt; exception&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Surprisingly Mozilla Firefox&amp;#8217;s &lt;code&gt;js78&lt;/code&gt; JavaScript engine is twice as fast as Google Chrome&amp;#8217;s &lt;code&gt;nodejs&lt;/code&gt; v19.0.0 engine.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_native_javascript_solution"&gt;4. Native JavaScript solution&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="JavaScript"&gt;&lt;span&gt;&lt;/span&gt;function fib(n) {
  if (n &amp;lt;= 1)
		return n
  return fib(n - 1) + fib(n - 2)
}

console.log(fib(47))&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Size of the file is 100 octets.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;$&lt;/span&gt; &lt;span class="tok-nb"&gt;time&lt;/span&gt; node fib.node.js
&lt;span class="tok-go"&gt;2971215073&lt;/span&gt;
&lt;span class="tok-go"&gt;node fib.node.js  65,16s user 0,01s system 99% cpu 1:05,21 total&lt;/span&gt;
&lt;span class="tok-gp"&gt;$&lt;/span&gt; &lt;span class="tok-nb"&gt;time&lt;/span&gt; js78 fib.node.js
&lt;span class="tok-go"&gt;2971215073&lt;/span&gt;
&lt;span class="tok-go"&gt;js78 fib.node.js  33,77s user 0,01s system 99% cpu 33,808 total&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Again, &lt;code&gt;js78&lt;/code&gt; uses 50% of the time needed by &lt;code&gt;node&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;What&amp;#8217;s interesting here is that Nim generated JavaScript is not loosing in
performance compared to native JavaScrip code, despite the expension rate of
the code itself (mostly runtime checks added by Nim compilator I assume).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;To be honest, if I use &lt;code&gt;uint64&lt;/code&gt; everywhere for the Nim version I achieve
comparable results with &lt;em&gt;drujensen&lt;/em&gt;'s benchmark with my Intel&amp;#174; Core&amp;#8482;
m7-6Y75 compared to its Intel Xeon 3.1Ghz (AWS EC2 - m5.large 2 vCPU,
2022-01-18) (both running at the same peak performance max speed), and he
measures ±30s for &lt;code&gt;node&lt;/code&gt; v17.3.0. So I can&amp;#8217;t explain the horrible performance I
get here with node.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_benchmark_hardware"&gt;5. Benchmark hardware&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;The computer used for this tests is an Asus UX305CA, Intel Core i7 M (6Y75 /
600MHz - 3,1GHz), 8Go DDR3 1866MHz.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;A lot more hardware info is available here : &lt;a href="/2018/memo_10.html"&gt;Memo_10&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</content><category term="Commandes"/><category term="Nim"/><category term="benchmark"/></entry><entry><title>JavaScript traps</title><link href="https://grimoire.d12s.fr/2022/javascript_traps.html" rel="alternate"/><published>2022-10-24T00:00:00+02:00</published><updated>2022-10-24T00:00:00+02:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2022-10-24:/2022/javascript_traps.html</id><summary type="html">&lt;div id="toc" class="toc"&gt;
&lt;div id="toctitle"&gt;Index&lt;/div&gt;
&lt;ul class="sectlevel1"&gt;
&lt;li&gt;&lt;a href="#_bugs"&gt;1. Bugs&lt;/a&gt;
&lt;ul class="sectlevel2"&gt;
&lt;li&gt;&lt;a href="#_sort"&gt;1.1. Sort&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_attributes"&gt;1.2. Attributes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#_type_conversions"&gt;2. Type conversions&lt;/a&gt;
&lt;ul class="sectlevel2"&gt;
&lt;li&gt;&lt;a href="#_boolean"&gt;2.1. Boolean&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_number"&gt;2.2. Number&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_string"&gt;2.3. String&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_array"&gt;2.4. Array&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#_comparisons"&gt;3. Comparisons&lt;/a&gt;
&lt;ul class="sectlevel2"&gt;
&lt;li&gt;&lt;a href="#_equality"&gt;3.1. Equality&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_math"&gt;3.2. Math&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#_for_in"&gt;4. for (… in …)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_undefined"&gt;5. undefined&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_operators"&gt;6. Operators&lt;/a&gt;
&lt;ul class="sectlevel2"&gt;
&lt;li&gt;&lt;a href="#"&gt;6.1. +&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#_sources"&gt;7. Sources&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_explore_later"&gt;8. Explore later&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id="preamble"&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Quand JavaScript se montre …&lt;/em&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</summary><content type="html">&lt;div id="toc" class="toc"&gt;
&lt;div id="toctitle"&gt;Index&lt;/div&gt;
&lt;ul class="sectlevel1"&gt;
&lt;li&gt;&lt;a href="#_bugs"&gt;1. Bugs&lt;/a&gt;
&lt;ul class="sectlevel2"&gt;
&lt;li&gt;&lt;a href="#_sort"&gt;1.1. Sort&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_attributes"&gt;1.2. Attributes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#_type_conversions"&gt;2. Type conversions&lt;/a&gt;
&lt;ul class="sectlevel2"&gt;
&lt;li&gt;&lt;a href="#_boolean"&gt;2.1. Boolean&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_number"&gt;2.2. Number&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_string"&gt;2.3. String&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_array"&gt;2.4. Array&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#_comparisons"&gt;3. Comparisons&lt;/a&gt;
&lt;ul class="sectlevel2"&gt;
&lt;li&gt;&lt;a href="#_equality"&gt;3.1. Equality&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_math"&gt;3.2. Math&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#_for_in"&gt;4. for (… in …)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_undefined"&gt;5. undefined&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_operators"&gt;6. Operators&lt;/a&gt;
&lt;ul class="sectlevel2"&gt;
&lt;li&gt;&lt;a href="#"&gt;6.1. +&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#_sources"&gt;7. Sources&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_explore_later"&gt;8. Explore later&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id="preamble"&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Quand JavaScript se montre contre-intuitif.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_bugs"&gt;1. Bugs&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_sort"&gt;1.1. Sort&lt;/h3&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="javascript"&gt;&amp;gt;&amp;gt;  [3, 23, 1].sort()
Array(3) [ 1, 23, 3 ] &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt; &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Should be &lt;code&gt;[1, 3, 23]&lt;/code&gt;. Still buggy on Firefox Nightly ASAN 108.0a1 (2022-10-23) (64-bit)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;From : &lt;a href="https://solarpunk.moe/@alilly/109219021262612201" class="bare"&gt;https://solarpunk.moe/@alilly/109219021262612201&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_attributes"&gt;1.2. Attributes&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;a href="/2022/javascript_access_html_time_datetime.html"&gt;Access datetime attribute of HTML time tag via JavaScript&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_type_conversions"&gt;2. Type conversions&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_boolean"&gt;2.1. Boolean&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Everything is converted to &lt;code&gt;true&lt;/code&gt; except :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="javascript"&gt;    false
    null
    undefined
    NaN
    0
    ""&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="javascript"&gt;&amp;gt;&amp;gt; Boolean(-1)
true
&amp;gt;&amp;gt; Boolean('false')
true
&amp;gt;&amp;gt; Boolean(new Boolean(false)) &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
true&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;typeof new Boolean(false)&lt;/code&gt; &amp;#8594; &lt;code&gt;'object'&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="javascript"&gt;&amp;gt;&amp;gt; true + true &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
2
&amp;gt;&amp;gt; true + true + '' &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;
"2"
&amp;gt;&amp;gt; '' + true + true &lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;(3)&lt;/b&gt;
"truetrue"&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt; is converted to &lt;code&gt;1&lt;/code&gt; in this context&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;The expression is successively &lt;code&gt;Boolean&lt;/code&gt;, then converted to &lt;code&gt;Number&lt;/code&gt; then converted to &lt;code&gt;String&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;The &lt;code&gt;Boolean&lt;/code&gt; values gets converted to &lt;code&gt;String&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="javascript"&gt;&amp;gt;&amp;gt; !'true' === !'false'
true&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_number"&gt;2.2. Number&lt;/h3&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="javascript"&gt;&amp;gt;&amp;gt; Number(undefined)
NaN
&amp;gt;&amp;gt; Number(null)
0
&amp;gt;&amp;gt; Number(false)
0
&amp;gt;&amp;gt; Number(true)
1
&amp;gt;&amp;gt; Number("")
0
&amp;gt;&amp;gt; Number("23.23e+2")
2323
&amp;gt;&amp;gt; Number("23.23s")
NaN&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="javascript"&gt;&amp;gt;&amp;gt; typeof(NaN)
"number"&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_string"&gt;2.3. String&lt;/h3&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="javascript"&gt;&amp;gt;&amp;gt; String(undefined)
'undefined'
&amp;gt;&amp;gt; String(null)
'null'
&amp;gt;&amp;gt; String(false)
'false'
&amp;gt;&amp;gt; String(true)
'true'
&amp;gt;&amp;gt; String(23.23e+2)
'2323'
&amp;gt;&amp;gt; String(222e22)
'2.22e+24'&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_array"&gt;2.4. Array&lt;/h3&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="javascript"&gt;&amp;gt;&amp;gt; let arr = ['a', 'b', 'c']
&amp;gt;&amp;gt; arr.length--
&amp;gt;&amp;gt; arr
[ 'a', 'b' ]
&amp;gt;&amp;gt; arr.length++
[ 'a', 'b', &amp;lt;1 empty slot&amp;gt; ] &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Firefox Nightly ASAN 108.0a1 (2022-10-23) (64-bit).&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="javascript"&gt;&amp;gt;&amp;gt; Array(16)
,,,,,,,,,,,,,,,, &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
&amp;gt;&amp;gt; Array(16).join("wat")
watwatwatwatwatwatwatwatwatwatwatwatwatwatwatwat &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;
&amp;gt;&amp;gt; Array(16).joint("wat" + 1)
wat1wat1wat1wat1wat1wat1wat1wat1wat1wat1wat1wat1wat1wat1wat1wat1 &lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;(3)&lt;/b&gt;
&amp;gt;&amp;gt; Array(16).joint("wat" - 1) + " Batman!"
NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN Batman!&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Empty array of 16 elements (what element ?) represented by comas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Join 16 strings "wat"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;+ for strings is a concatenation in JavaScript&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="4"&gt;&lt;/i&gt;&lt;b&gt;4&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;- for strings gives NaN (Not a Number)&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_comparisons"&gt;3. Comparisons&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_equality"&gt;3.1. Equality&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Why should you use &lt;code&gt;===&lt;/code&gt; in JavaScript ? Because &lt;code&gt;==&lt;/code&gt; implies non evident implicit conversions.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="javascript"&gt;&amp;gt;&amp;gt; 1 == '1'
true
&amp;gt;&amp;gt; null == undefined
true
&amp;gt;&amp;gt; null == false
false
&amp;gt;&amp;gt; NaN == NaN
false
&amp;gt;&amp;gt; "2" == true
false
&amp;gt;&amp;gt; "2" == false
false&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="javascript"&gt;&amp;gt;&amp;gt; 1 === 1
true
&amp;gt;&amp;gt; 1 === '1'
false
&amp;gt;&amp;gt; null === undefined
false
&amp;gt;&amp;gt; NaN === NaN
false&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_math"&gt;3.2. Math&lt;/h3&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="javascript"&gt;&amp;gt;&amp;gt; Math.max() &amp;gt; Math.min()
false
&amp;gt;&amp;gt; Math.min()
Infinity
&amp;gt;&amp;gt; Math.max()
-Infinity&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_for_in"&gt;4. for (… in …)&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Iterates through object keys, not values. Use &lt;code&gt;for (… of …)&lt;/code&gt; instead.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="javascript"&gt;&amp;gt;&amp;gt; let obj = {
	'0': "1st",
	'1': "2nd",
	'2': "3rd",
	'length': 3
}
&amp;gt;&amp;gt; for (let p = 0; p &amp;lt; obj.length; p++) console.log(obj[p])
1st
2nd
3rd &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
&amp;gt;&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Stops at &lt;code&gt;p === 3&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_undefined"&gt;5. undefined&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="javascript"&gt;&amp;gt;&amp;gt; undefined = true
true
&amp;gt;&amp;gt; undefined
undefined &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;undefined&lt;/code&gt; used to be overridable. Firefox Nightly ASAN 108.0a1 (2022-10-23) (64-bit).&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_operators"&gt;6. Operators&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="sect2"&gt;
&lt;h3 id=""&gt;6.1. +&lt;/h3&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="javascript"&gt;&amp;gt;&amp;gt; [] + []
&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
&amp;gt;&amp;gt; [] + {}
[object Object]
&amp;gt;&amp;gt; {} + []
0
&amp;gt;&amp;gt; {} + {}
NaN&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;It gives and empty string&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_sources"&gt;7. Sources&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://solarpunk.moe/@alilly/109219021262612201" class="bare"&gt;https://solarpunk.moe/@alilly/109219021262612201&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://eamodeorubio.github.io/thejshorrorshow/" class="bare"&gt;https://eamodeorubio.github.io/thejshorrorshow/&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://www.geeksforgeeks.org/most-five-weird-behavior-of-javascript/" class="bare"&gt;https://www.geeksforgeeks.org/most-five-weird-behavior-of-javascript/&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="http://crockford.com/javascript/survey.html" class="bare"&gt;http://crockford.com/javascript/survey.html&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;"Wat" conference by @garybernhardt&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_explore_later"&gt;8. Explore later&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;"Some broken functions in the library: parseInt, Date"  - &lt;a href="https://eamodeorubio.github.io/thejshorrorshow" class="bare"&gt;https://eamodeorubio.github.io/thejshorrorshow&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;a href="https://nim-lang.org/"&gt;Nim&lt;/a&gt; can compile to JavaScript.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</content><category term="Commandes"/><category term="JavaScript"/><category term="code"/></entry><entry><title>CSS units</title><link href="https://grimoire.d12s.fr/2022/css_units.html" rel="alternate"/><published>2022-10-17T00:00:00+02:00</published><updated>2022-10-17T00:00:00+02:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2022-10-17:/2022/css_units.html</id><summary type="html">&lt;div id="toc" class="toc"&gt;
&lt;div id="toctitle"&gt;Index&lt;/div&gt;
&lt;ul class="sectlevel1"&gt;
&lt;li&gt;&lt;a href="#_absolute"&gt;1. Absolute&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_relative"&gt;2. Relative&lt;/a&gt;
&lt;ul class="sectlevel2"&gt;
&lt;li&gt;&lt;a href="#_to_the_font_size"&gt;2.1. to the font size&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_to_the_viewport_size"&gt;2.2. to the viewport size&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#_examples"&gt;3. Examples&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id="preamble"&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Révision sur les différentes unités disponibles pour définir une longueur en CSS.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Source : &lt;a href="https://developer.mozilla.org/en-US/docs/Learn/CSS/Building_blocks/Values_and_units" class="bare"&gt;https://developer.mozilla.org/en-US/docs/Learn/CSS/Building_blocks/Values_and_units&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_absolute"&gt;1. Absolute&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;table class="tableblock frame-all grid-all stretch"&gt;
&lt;colgroup&gt;
&lt;col style="width: 33.3333%;"&gt;
&lt;col style="width: 33.3333%;"&gt;
&lt;col style="width: 33.3334%;"&gt;
&lt;/colgroup&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;Unit&lt;/p&gt;&lt;/td&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;Name&lt;/p&gt;&lt;/td&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;Equivalent to&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;cm&lt;/p&gt;&lt;/td&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;Centimeters …&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;</summary><content type="html">&lt;div id="toc" class="toc"&gt;
&lt;div id="toctitle"&gt;Index&lt;/div&gt;
&lt;ul class="sectlevel1"&gt;
&lt;li&gt;&lt;a href="#_absolute"&gt;1. Absolute&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_relative"&gt;2. Relative&lt;/a&gt;
&lt;ul class="sectlevel2"&gt;
&lt;li&gt;&lt;a href="#_to_the_font_size"&gt;2.1. to the font size&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_to_the_viewport_size"&gt;2.2. to the viewport size&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#_examples"&gt;3. Examples&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id="preamble"&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Révision sur les différentes unités disponibles pour définir une longueur en CSS.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Source : &lt;a href="https://developer.mozilla.org/en-US/docs/Learn/CSS/Building_blocks/Values_and_units" class="bare"&gt;https://developer.mozilla.org/en-US/docs/Learn/CSS/Building_blocks/Values_and_units&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_absolute"&gt;1. Absolute&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;table class="tableblock frame-all grid-all stretch"&gt;
&lt;colgroup&gt;
&lt;col style="width: 33.3333%;"&gt;
&lt;col style="width: 33.3333%;"&gt;
&lt;col style="width: 33.3334%;"&gt;
&lt;/colgroup&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;Unit&lt;/p&gt;&lt;/td&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;Name&lt;/p&gt;&lt;/td&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;Equivalent to&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;cm&lt;/p&gt;&lt;/td&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;Centimeters&lt;/p&gt;&lt;/td&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;1cm = 37.8px = 25.2/64in&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;mm&lt;/p&gt;&lt;/td&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;Millimeters&lt;/p&gt;&lt;/td&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;1mm = 1/10th of 1cm&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;Q&lt;/p&gt;&lt;/td&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;Quarter-millimeters&lt;/p&gt;&lt;/td&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;1Q = 1/40th of 1cm&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;in&lt;/p&gt;&lt;/td&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;Inches&lt;/p&gt;&lt;/td&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;1in = 2.54cm = 96px&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;pc&lt;/p&gt;&lt;/td&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;Picas&lt;/p&gt;&lt;/td&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;1pc = 1/6th of 1in&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;&lt;strong&gt;pt&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;Points&lt;/p&gt;&lt;/td&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;1pt = 1/72nd of 1in&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;&lt;strong&gt;px&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;Pixel&lt;/p&gt;&lt;/td&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;1px = 1/96th of 1in&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_relative"&gt;2. Relative&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_to_the_font_size"&gt;2.1. to the font size&lt;/h3&gt;
&lt;table class="tableblock frame-all grid-all stretch"&gt;
&lt;colgroup&gt;
&lt;col style="width: 50%;"&gt;
&lt;col style="width: 50%;"&gt;
&lt;/colgroup&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;Unit&lt;/p&gt;&lt;/td&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;Relative to&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;em&lt;/p&gt;&lt;/td&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;Font size of the parent for &lt;code&gt;font-size&lt;/code&gt; and of the element itself for &lt;code&gt;width&lt;/code&gt;.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;&lt;strong&gt;ex&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;x-height of the element&amp;#8217;s font.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;ch&lt;/p&gt;&lt;/td&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;The advance measure (width) of the glyph "0" of the element&amp;#8217;s font.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;rem&lt;/p&gt;&lt;/td&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;Font size of the root element.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;lh&lt;/p&gt;&lt;/td&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;Line height of the element.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;rlh&lt;/p&gt;&lt;/td&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;Line height of the root element (initial value).&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_to_the_viewport_size"&gt;2.2. to the viewport size&lt;/h3&gt;
&lt;table class="tableblock frame-all grid-all stretch"&gt;
&lt;colgroup&gt;
&lt;col style="width: 50%;"&gt;
&lt;col style="width: 50%;"&gt;
&lt;/colgroup&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;&lt;strong&gt;vw&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;&lt;strong&gt;1% of the viewport&amp;#8217;s width.&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;&lt;strong&gt;vh&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;&lt;strong&gt;1% of the viewport&amp;#8217;s height.&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;vmin&lt;/p&gt;&lt;/td&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;1% of the viewport&amp;#8217;s smaller dimension.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;vmax&lt;/p&gt;&lt;/td&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;1% of the viewport&amp;#8217;s larger dimension.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;vb&lt;/p&gt;&lt;/td&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;1% of the size of the initial containing block […]&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;vi&lt;/p&gt;&lt;/td&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;1% of the size of the initial containing block […]&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;svw, svh&lt;/p&gt;&lt;/td&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;1% of the small viewport&amp;#8217;s width and height, respectively.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;lvw, lvh&lt;/p&gt;&lt;/td&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;1% of the large viewport&amp;#8217;s width and height, respectively.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;dvw, dvh&lt;/p&gt;&lt;/td&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;1% of the dynamic viewport&amp;#8217;s width and height, respectively.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_examples"&gt;3. Examples&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="css"&gt;&lt;span&gt;&lt;/span&gt;  &lt;span class="tok-nt"&gt;margin-left&lt;/span&gt;&lt;span class="tok-o"&gt;:&lt;/span&gt; &lt;span class="tok-nt"&gt;50vw&lt;/span&gt;&lt;span class="tok-o"&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="css"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-p"&gt;@&lt;/span&gt;&lt;span class="tok-k"&gt;media&lt;/span&gt; &lt;span class="tok-nt"&gt;only&lt;/span&gt; &lt;span class="tok-nt"&gt;screen&lt;/span&gt; &lt;span class="tok-nt"&gt;and&lt;/span&gt; &lt;span class="tok-o"&gt;(&lt;/span&gt;&lt;span class="tok-nt"&gt;max-width&lt;/span&gt;&lt;span class="tok-o"&gt;:&lt;/span&gt; &lt;span class="tok-nt"&gt;445px&lt;/span&gt;&lt;span class="tok-o"&gt;)&lt;/span&gt; &lt;span class="tok-p"&gt;{&lt;/span&gt;
  &lt;span class="tok-p"&gt;#&lt;/span&gt;&lt;span class="tok-nn"&gt;mp_query&lt;/span&gt; &lt;span class="tok-p"&gt;{&lt;/span&gt;
    &lt;span class="tok-k"&gt;width&lt;/span&gt;&lt;span class="tok-p"&gt;:&lt;/span&gt; &lt;span class="tok-nb"&gt;calc&lt;/span&gt;&lt;span class="tok-p"&gt;(&lt;/span&gt;&lt;span class="tok-mi"&gt;100&lt;/span&gt;&lt;span class="tok-kt"&gt;%&lt;/span&gt; &lt;span class="tok-o"&gt;-&lt;/span&gt; &lt;span class="tok-mi"&gt;60&lt;/span&gt;&lt;span class="tok-kt"&gt;px&lt;/span&gt;&lt;span class="tok-p"&gt;);&lt;/span&gt;
  &lt;span class="tok-p"&gt;}&lt;/span&gt;
  &lt;span class="tok-p"&gt;#&lt;/span&gt;&lt;span class="tok-nn"&gt;mp_submit&lt;/span&gt; &lt;span class="tok-p"&gt;{&lt;/span&gt;
    &lt;span class="tok-k"&gt;min-width&lt;/span&gt;&lt;span class="tok-p"&gt;:&lt;/span&gt; &lt;span class="tok-mi"&gt;60&lt;/span&gt;&lt;span class="tok-kt"&gt;px&lt;/span&gt;&lt;span class="tok-p"&gt;;&lt;/span&gt;
  &lt;span class="tok-p"&gt;}&lt;/span&gt;
&lt;span class="tok-p"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</content><category term="Commandes"/><category term="code"/></entry><entry><title>Lock Apache web folder with htaccess</title><link href="https://grimoire.d12s.fr/2022/lock_web_folder_with_htaccess.html" rel="alternate"/><published>2022-10-10T00:00:00+02:00</published><updated>2022-10-10T00:00:00+02:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2022-10-10:/2022/lock_web_folder_with_htaccess.html</id><summary type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Protéger par mot de passe l&amp;#8217;accès à un dossier servi sur le web via le serveur web Apache.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Hacking this requires to hack the Apache web server or the hosting machine and not "only" a web application.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;This keeps web crawlers away while a &lt;code&gt;robots.txt&lt;/code&gt; file is just …&lt;/p&gt;&lt;/div&gt;</summary><content type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Protéger par mot de passe l&amp;#8217;accès à un dossier servi sur le web via le serveur web Apache.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Hacking this requires to hack the Apache web server or the hosting machine and not "only" a web application.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;This keeps web crawlers away while a &lt;code&gt;robots.txt&lt;/code&gt; file is just a mention you put on an open door.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;This can also protect your web application from security breach crawlers if you are with an "intranet" style scenario.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;We need to add 2 files in the folder : &lt;code&gt;.htaccess&lt;/code&gt; &lt;code&gt;.htpasswd&lt;/code&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;$&lt;/span&gt; &lt;span class="tok-nb"&gt;cd&lt;/span&gt; /var/www/web-folder-to-protect
&lt;span class="tok-gp"&gt;$&lt;/span&gt; vi .htaccess&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="sh"&gt;&lt;span&gt;&lt;/span&gt;AuthUserFile /…/.htpasswd &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
AuthName &lt;span class="tok-s2"&gt;&amp;quot;Dites ami et entrez&amp;quot;&lt;/span&gt; &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;
AuthType Basic
require valid-user&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Absolute path to a readable &lt;code&gt;.htpasswd&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Facultative&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code&gt;&lt;span&gt;&lt;/span&gt;$ pacman -S whois &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
$ mkpasswd
Mot de passe : &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;
$y$j9T$PiRPvEKe86T6/hH/Rdlh90$eQbrTxlziyxQL3CTAlCFS5BmzMysCcAi5Dd/HYkTqL8 &lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;(3)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;If you don&amp;#8217;t have the &lt;code&gt;mkpasswd&lt;/code&gt; command available, you might install it this way on Artix Linux&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Here you can type the wanted password, it won&amp;#8217;t be visible on the screen (won&amp;#8217;t be echo&amp;#8217;ed)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Here is an example of returned hashed password&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;$&lt;/span&gt; vi .htpasswd&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;lucy:$y$j9T$PiRPvEKe86T6/hH/Rdlh90$&lt;/span&gt;eQbrTxlziyxQL3CTAlCFS5BmzMysCcAi5Dd/HYkTqL8 &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;This line allows the user named &lt;code&gt;lucy&lt;/code&gt; to authenticate via the password that produce this hash&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Reload your page (or folder) from your web browser to verify that it really asks for credentials. If not, you might not be using Apache / Apache2, you might have bad file rights or file path.&lt;/p&gt;
&lt;/div&gt;</content><category term="Commandes"/><category term="adminsys"/><category term="security"/></entry><entry><title>JavaScript : detect broken images</title><link href="https://grimoire.d12s.fr/2022/javascript_detect_if_image_loaded.html" rel="alternate"/><published>2022-10-03T00:00:00+02:00</published><updated>2022-10-03T00:00:00+02:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2022-10-03:/2022/javascript_detect_if_image_loaded.html</id><summary type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Détecter les images dont le chargement a échoué.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;1st method: testing for &lt;code&gt;.naturalWidth&lt;/code&gt; property of an image HTML node.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="javascript"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-k"&gt;if&lt;/span&gt; &lt;span class="tok-p"&gt;(&lt;/span&gt;&lt;span class="tok-nx"&gt;img&lt;/span&gt;&lt;span class="tok-p"&gt;.&lt;/span&gt;&lt;span class="tok-nx"&gt;naturalWidth&lt;/span&gt; &lt;span class="tok-o"&gt;===&lt;/span&gt; &lt;span class="tok-mi"&gt;0&lt;/span&gt;&lt;span class="tok-p"&gt;)&lt;/span&gt;
	&lt;span class="tok-k"&gt;throw&lt;/span&gt; &lt;span class="tok-sb"&gt;`&lt;/span&gt;&lt;span class="tok-si"&gt;${&lt;/span&gt;&lt;span class="tok-nx"&gt;src&lt;/span&gt;&lt;span class="tok-si"&gt;}&lt;/span&gt;&lt;span class="tok-sb"&gt; -&amp;gt; naturalWidth === 0`&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;2nd method: testing for &lt;code&gt;.decode()&lt;/code&gt; execution.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="javascript"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-k"&gt;try&lt;/span&gt; &lt;span class="tok-p"&gt;{&lt;/span&gt;
	&lt;span class="tok-nx"&gt;await&lt;/span&gt; &lt;span class="tok-nx"&gt;img&lt;/span&gt;&lt;span class="tok-p"&gt;.&lt;/span&gt;&lt;span class="tok-nx"&gt;decode&lt;/span&gt;&lt;span class="tok-p"&gt;()&lt;/span&gt;
&lt;span class="tok-p"&gt;}&lt;/span&gt; &lt;span class="tok-k"&gt;catch&lt;/span&gt; &lt;span class="tok-p"&gt;(&lt;/span&gt;&lt;span class="tok-nx"&gt;exc&lt;/span&gt;&lt;span class="tok-p"&gt;)&lt;/span&gt; &lt;span class="tok-p"&gt;{&lt;/span&gt;
	&lt;span class="tok-k"&gt;throw&lt;/span&gt; &lt;span class="tok-sb"&gt;`&lt;/span&gt;&lt;span class="tok-si"&gt;${&lt;/span&gt;&lt;span class="tok-nx"&gt;src&lt;/span&gt;&lt;span class="tok-si"&gt;}&lt;/span&gt;&lt;span class="tok-sb"&gt; -&amp;gt; can&amp;#39;t .decode()`&lt;/span&gt;
&lt;span class="tok-p"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Testing all images:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="javascript"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-kr"&gt;const&lt;/span&gt; &lt;span class="tok-nx"&gt;imgs&lt;/span&gt; &lt;span class="tok-o"&gt;=&lt;/span&gt; &lt;span class="tok-nb"&gt;document …&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;</summary><content type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Détecter les images dont le chargement a échoué.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;1st method: testing for &lt;code&gt;.naturalWidth&lt;/code&gt; property of an image HTML node.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="javascript"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-k"&gt;if&lt;/span&gt; &lt;span class="tok-p"&gt;(&lt;/span&gt;&lt;span class="tok-nx"&gt;img&lt;/span&gt;&lt;span class="tok-p"&gt;.&lt;/span&gt;&lt;span class="tok-nx"&gt;naturalWidth&lt;/span&gt; &lt;span class="tok-o"&gt;===&lt;/span&gt; &lt;span class="tok-mi"&gt;0&lt;/span&gt;&lt;span class="tok-p"&gt;)&lt;/span&gt;
	&lt;span class="tok-k"&gt;throw&lt;/span&gt; &lt;span class="tok-sb"&gt;`&lt;/span&gt;&lt;span class="tok-si"&gt;${&lt;/span&gt;&lt;span class="tok-nx"&gt;src&lt;/span&gt;&lt;span class="tok-si"&gt;}&lt;/span&gt;&lt;span class="tok-sb"&gt; -&amp;gt; naturalWidth === 0`&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;2nd method: testing for &lt;code&gt;.decode()&lt;/code&gt; execution.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="javascript"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-k"&gt;try&lt;/span&gt; &lt;span class="tok-p"&gt;{&lt;/span&gt;
	&lt;span class="tok-nx"&gt;await&lt;/span&gt; &lt;span class="tok-nx"&gt;img&lt;/span&gt;&lt;span class="tok-p"&gt;.&lt;/span&gt;&lt;span class="tok-nx"&gt;decode&lt;/span&gt;&lt;span class="tok-p"&gt;()&lt;/span&gt;
&lt;span class="tok-p"&gt;}&lt;/span&gt; &lt;span class="tok-k"&gt;catch&lt;/span&gt; &lt;span class="tok-p"&gt;(&lt;/span&gt;&lt;span class="tok-nx"&gt;exc&lt;/span&gt;&lt;span class="tok-p"&gt;)&lt;/span&gt; &lt;span class="tok-p"&gt;{&lt;/span&gt;
	&lt;span class="tok-k"&gt;throw&lt;/span&gt; &lt;span class="tok-sb"&gt;`&lt;/span&gt;&lt;span class="tok-si"&gt;${&lt;/span&gt;&lt;span class="tok-nx"&gt;src&lt;/span&gt;&lt;span class="tok-si"&gt;}&lt;/span&gt;&lt;span class="tok-sb"&gt; -&amp;gt; can&amp;#39;t .decode()`&lt;/span&gt;
&lt;span class="tok-p"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Testing all images:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="javascript"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-kr"&gt;const&lt;/span&gt; &lt;span class="tok-nx"&gt;imgs&lt;/span&gt; &lt;span class="tok-o"&gt;=&lt;/span&gt; &lt;span class="tok-nb"&gt;document&lt;/span&gt;&lt;span class="tok-p"&gt;.&lt;/span&gt;&lt;span class="tok-nx"&gt;querySelectorAll&lt;/span&gt;&lt;span class="tok-p"&gt;(&lt;/span&gt;&lt;span class="tok-s1"&gt;&amp;#39;img&amp;#39;&lt;/span&gt;&lt;span class="tok-p"&gt;)&lt;/span&gt;
&lt;span class="tok-kd"&gt;let&lt;/span&gt; &lt;span class="tok-nx"&gt;src&lt;/span&gt;
&lt;span class="tok-k"&gt;for&lt;/span&gt; &lt;span class="tok-p"&gt;(&lt;/span&gt;&lt;span class="tok-kr"&gt;const&lt;/span&gt; &lt;span class="tok-nx"&gt;i&lt;/span&gt; &lt;span class="tok-k"&gt;of&lt;/span&gt; &lt;span class="tok-nx"&gt;imgs&lt;/span&gt;&lt;span class="tok-p"&gt;)&lt;/span&gt; &lt;span class="tok-p"&gt;{&lt;/span&gt;
	&lt;span class="tok-nx"&gt;src&lt;/span&gt; &lt;span class="tok-o"&gt;=&lt;/span&gt; &lt;span class="tok-nx"&gt;i&lt;/span&gt;&lt;span class="tok-p"&gt;.&lt;/span&gt;&lt;span class="tok-nx"&gt;attributes&lt;/span&gt;&lt;span class="tok-p"&gt;.&lt;/span&gt;&lt;span class="tok-nx"&gt;src&lt;/span&gt;&lt;span class="tok-p"&gt;.&lt;/span&gt;&lt;span class="tok-nx"&gt;value&lt;/span&gt;
	&lt;span class="tok-k"&gt;if&lt;/span&gt; &lt;span class="tok-p"&gt;(&lt;/span&gt;&lt;span class="tok-o"&gt;!&lt;/span&gt;&lt;span class="tok-nx"&gt;src&lt;/span&gt; &lt;span class="tok-o"&gt;||&lt;/span&gt; &lt;span class="tok-o"&gt;!&lt;/span&gt;&lt;span class="tok-nx"&gt;i&lt;/span&gt;&lt;span class="tok-p"&gt;.&lt;/span&gt;&lt;span class="tok-nx"&gt;attributes&lt;/span&gt;&lt;span class="tok-p"&gt;.&lt;/span&gt;&lt;span class="tok-nx"&gt;alt&lt;/span&gt;&lt;span class="tok-p"&gt;.&lt;/span&gt;&lt;span class="tok-nx"&gt;value&lt;/span&gt;&lt;span class="tok-p"&gt;)&lt;/span&gt;
		&lt;span class="tok-k"&gt;throw&lt;/span&gt; &lt;span class="tok-sb"&gt;`missing required attribute src= or alt= for &amp;lt;img id=&amp;quot;&lt;/span&gt;&lt;span class="tok-si"&gt;${&lt;/span&gt;&lt;span class="tok-nx"&gt;i&lt;/span&gt;&lt;span class="tok-p"&gt;.&lt;/span&gt;&lt;span class="tok-nx"&gt;id&lt;/span&gt;&lt;span class="tok-si"&gt;}&lt;/span&gt;&lt;span class="tok-sb"&gt;&amp;quot; class=&amp;quot;&lt;/span&gt;&lt;span class="tok-si"&gt;${&lt;/span&gt;&lt;span class="tok-nx"&gt;i&lt;/span&gt;&lt;span class="tok-p"&gt;.&lt;/span&gt;&lt;span class="tok-nx"&gt;classList&lt;/span&gt;&lt;span class="tok-si"&gt;}&lt;/span&gt;&lt;span class="tok-sb"&gt;&amp;quot;`&lt;/span&gt;
	&lt;span class="tok-k"&gt;if&lt;/span&gt; &lt;span class="tok-p"&gt;(&lt;/span&gt;&lt;span class="tok-nx"&gt;i&lt;/span&gt;&lt;span class="tok-p"&gt;.&lt;/span&gt;&lt;span class="tok-nx"&gt;naturalWidth&lt;/span&gt; &lt;span class="tok-o"&gt;===&lt;/span&gt; &lt;span class="tok-mi"&gt;0&lt;/span&gt;&lt;span class="tok-p"&gt;)&lt;/span&gt;
		&lt;span class="tok-k"&gt;throw&lt;/span&gt; &lt;span class="tok-sb"&gt;`&lt;/span&gt;&lt;span class="tok-si"&gt;${&lt;/span&gt;&lt;span class="tok-nx"&gt;src&lt;/span&gt;&lt;span class="tok-si"&gt;}&lt;/span&gt;&lt;span class="tok-sb"&gt; -&amp;gt; naturalWidth === 0`&lt;/span&gt;
	&lt;span class="tok-k"&gt;try&lt;/span&gt; &lt;span class="tok-p"&gt;{&lt;/span&gt;
		&lt;span class="tok-nx"&gt;await&lt;/span&gt; &lt;span class="tok-nx"&gt;i&lt;/span&gt;&lt;span class="tok-p"&gt;.&lt;/span&gt;&lt;span class="tok-nx"&gt;decode&lt;/span&gt;&lt;span class="tok-p"&gt;()&lt;/span&gt;
	&lt;span class="tok-p"&gt;}&lt;/span&gt; &lt;span class="tok-k"&gt;catch&lt;/span&gt; &lt;span class="tok-p"&gt;(&lt;/span&gt;&lt;span class="tok-nx"&gt;exc&lt;/span&gt;&lt;span class="tok-p"&gt;)&lt;/span&gt; &lt;span class="tok-p"&gt;{&lt;/span&gt;
		&lt;span class="tok-k"&gt;throw&lt;/span&gt; &lt;span class="tok-sb"&gt;`&lt;/span&gt;&lt;span class="tok-si"&gt;${&lt;/span&gt;&lt;span class="tok-nx"&gt;src&lt;/span&gt;&lt;span class="tok-si"&gt;}&lt;/span&gt;&lt;span class="tok-sb"&gt; -&amp;gt; can&amp;#39;t .decode()`&lt;/span&gt;
	&lt;span class="tok-p"&gt;}&lt;/span&gt;
&lt;span class="tok-p"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;</content><category term="Commandes"/><category term="JavaScript"/><category term="code"/></entry><entry><title>Nim : CamelCase vs slug_style</title><link href="https://grimoire.d12s.fr/2022/nim_camelcase_vs_slug_style.html" rel="alternate"/><published>2022-09-26T00:00:00+02:00</published><updated>2022-09-26T00:00:00+02:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2022-09-26:/2022/nim_camelcase_vs_slug_style.html</id><summary type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Le langage de programmation Nim a réglé la question du style de nommage des variables en adoptant un fonctionnement qui rend le débat inutile.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="quoteblock"&gt;
&lt;blockquote&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;There are only two hard things in computer science: cache invalidation and naming things.
— Phil Karlton&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Except for the first letter, identifiers in Nim are compared …&lt;/p&gt;&lt;/div&gt;</summary><content type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Le langage de programmation Nim a réglé la question du style de nommage des variables en adoptant un fonctionnement qui rend le débat inutile.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="quoteblock"&gt;
&lt;blockquote&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;There are only two hard things in computer science: cache invalidation and naming things.
— Phil Karlton&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Except for the first letter, identifiers in Nim are compared in a case-insensitive manner, and underscores are ignored.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="javascript"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-kr"&gt;const&lt;/span&gt; &lt;span class="tok-nx"&gt;useHttps&lt;/span&gt; &lt;span class="tok-o"&gt;=&lt;/span&gt; &lt;span class="tok-kc"&gt;true&lt;/span&gt;
&lt;span class="tok-nx"&gt;assert&lt;/span&gt; &lt;span class="tok-nx"&gt;useHttps&lt;/span&gt; &lt;span class="tok-o"&gt;==&lt;/span&gt; &lt;span class="tok-nx"&gt;useHttps&lt;/span&gt;
&lt;span class="tok-nx"&gt;assert&lt;/span&gt; &lt;span class="tok-nx"&gt;useHTTPS&lt;/span&gt; &lt;span class="tok-o"&gt;==&lt;/span&gt; &lt;span class="tok-nx"&gt;useHttps&lt;/span&gt;
&lt;span class="tok-nx"&gt;assert&lt;/span&gt; &lt;span class="tok-nx"&gt;use_https&lt;/span&gt; &lt;span class="tok-o"&gt;==&lt;/span&gt; &lt;span class="tok-nx"&gt;useHttps&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Nim_(programming_language" class="bare"&gt;https://en.wikipedia.org/wiki/Nim_(programming_language&lt;/a&gt;)&lt;/p&gt;
&lt;/div&gt;</content><category term="Commandes"/><category term="Nim"/><category term="code"/></entry><entry><title>Vim : colors like Firefox devtools debugger</title><link href="https://grimoire.d12s.fr/2022/vim_colors_like_firefox_debugger.html" rel="alternate"/><published>2022-09-21T00:00:00+02:00</published><updated>2022-09-21T00:00:00+02:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2022-09-21:/2022/vim_colors_like_firefox_debugger.html</id><summary type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Rapprocher la coloration syntaxique de vim de celle du debugger des outils de développeur de Firefox en mode sombre.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Pour avoir pas mal travaillé de nuit dernièrement, j&amp;#8217;ai trouvé la coloration syntaxique du debugger de Firefox confortable.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;code&gt;$ vim ~/.vimrc&lt;/code&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="vim"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-c"&gt;&amp;quot; …&lt;/span&gt;
&lt;span class="tok-nb"&gt;syntax&lt;/span&gt; &lt;span class="tok-k"&gt;on&lt;/span&gt; &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
&lt;span class="tok-k"&gt;set&lt;/span&gt; &lt;span class="tok-nb"&gt;t_Co&lt;/span&gt;&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;256&lt;/span&gt; &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;
&lt;span class="tok-k"&gt;colorscheme&lt;/span&gt; molokai_devtools &lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;(3 …&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;</summary><content type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Rapprocher la coloration syntaxique de vim de celle du debugger des outils de développeur de Firefox en mode sombre.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Pour avoir pas mal travaillé de nuit dernièrement, j&amp;#8217;ai trouvé la coloration syntaxique du debugger de Firefox confortable.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;code&gt;$ vim ~/.vimrc&lt;/code&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="vim"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-c"&gt;&amp;quot; …&lt;/span&gt;
&lt;span class="tok-nb"&gt;syntax&lt;/span&gt; &lt;span class="tok-k"&gt;on&lt;/span&gt; &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
&lt;span class="tok-k"&gt;set&lt;/span&gt; &lt;span class="tok-nb"&gt;t_Co&lt;/span&gt;&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;256&lt;/span&gt; &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;
&lt;span class="tok-k"&gt;colorscheme&lt;/span&gt; molokai_devtools &lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;(3)&lt;/b&gt;
&lt;span class="tok-c"&gt;&amp;quot; …&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Enable syntax coloration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Set color scale to 256&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Point to : &lt;code&gt;~/.vim/colors/dolokai_devtools.vim&lt;/code&gt; colorscheme file definition&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;code&gt;$ vim ~/.vim/colors/dolokai_devtools.vim&lt;/code&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="vim"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-c"&gt;&amp;quot; Vim color file&lt;/span&gt;
&lt;span class="tok-c"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="tok-c"&gt;&amp;quot; Author: Tomas Restrepo - https://github.com/tomasr/molokai&lt;/span&gt;
&lt;span class="tok-c"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="tok-c"&gt;&amp;quot; Mod by Siltaar - https://grimoire-command.es/2022/vim_colors_like_firefox_debugger.html&lt;/span&gt;
&lt;span class="tok-c"&gt;&amp;quot; Droped GUI colorscheme support&lt;/span&gt;
&lt;span class="tok-c"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="tok-k"&gt;hi&lt;/span&gt; clear
&lt;span class="tok-k"&gt;if&lt;/span&gt; version &lt;span class="tok-p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="tok-m"&gt;580&lt;/span&gt;
&lt;span class="tok-c"&gt;    &amp;quot; no guarantees for version 5.8 and below, but this makes it stop&lt;/span&gt;
&lt;span class="tok-c"&gt;    &amp;quot; complaining&lt;/span&gt;
    &lt;span class="tok-k"&gt;hi&lt;/span&gt; clear
    &lt;span class="tok-k"&gt;if&lt;/span&gt; exists&lt;span class="tok-p"&gt;(&lt;/span&gt;&lt;span class="tok-s2"&gt;&amp;quot;syntax_on&amp;quot;&lt;/span&gt;&lt;span class="tok-p"&gt;)&lt;/span&gt;
        &lt;span class="tok-nb"&gt;syntax&lt;/span&gt; reset
    &lt;span class="tok-k"&gt;endif&lt;/span&gt;
&lt;span class="tok-k"&gt;endif&lt;/span&gt;
&lt;span class="tok-k"&gt;let&lt;/span&gt; &lt;span class="tok-k"&gt;g&lt;/span&gt;:colors_name&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-s2"&gt;&amp;quot;molokai_devtools&amp;quot;&lt;/span&gt;
&lt;span class="tok-c"&gt;&amp;quot; Support for 256-color terminal&lt;/span&gt;
&lt;span class="tok-c"&gt;&amp;quot; green : 112&lt;/span&gt;
&lt;span class="tok-c"&gt;&amp;quot; pink : 212&lt;/span&gt;
&lt;span class="tok-c"&gt;&amp;quot; purple : 141&lt;/span&gt;
&lt;span class="tok-c"&gt;&amp;quot; blue : 81&lt;/span&gt;
&lt;span class="tok-k"&gt;if&lt;/span&gt; &amp;amp;&lt;span class="tok-nb"&gt;t_Co&lt;/span&gt; &lt;span class="tok-p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="tok-m"&gt;255&lt;/span&gt;
   &lt;span class="tok-k"&gt;hi&lt;/span&gt; CursorLineNr ctermfg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;208&lt;/span&gt;               cterm&lt;span class="tok-p"&gt;=&lt;/span&gt;none
   &lt;span class="tok-k"&gt;hi&lt;/span&gt; CursorLine               ctermbg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;236&lt;/span&gt;   cterm&lt;span class="tok-p"&gt;=&lt;/span&gt;none
   &lt;span class="tok-k"&gt;hi&lt;/span&gt; Normal          ctermfg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;252&lt;/span&gt;   ctermbg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;233&lt;/span&gt;
   &lt;span class="tok-k"&gt;hi&lt;/span&gt; Boolean         ctermfg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;212&lt;/span&gt;
   &lt;span class="tok-k"&gt;hi&lt;/span&gt; Character       ctermfg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;144&lt;/span&gt;
   &lt;span class="tok-k"&gt;hi&lt;/span&gt; Number          ctermfg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;208&lt;/span&gt;
   &lt;span class="tok-k"&gt;hi&lt;/span&gt; String          ctermfg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;69&lt;/span&gt;
   &lt;span class="tok-k"&gt;hi&lt;/span&gt; Conditional     ctermfg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;212&lt;/span&gt;
   &lt;span class="tok-k"&gt;hi&lt;/span&gt; Constant        ctermfg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;141&lt;/span&gt;
   &lt;span class="tok-k"&gt;hi&lt;/span&gt; Cursor          ctermfg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;16&lt;/span&gt;  ctermbg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;252&lt;/span&gt;
   &lt;span class="tok-k"&gt;hi&lt;/span&gt; Debug           ctermfg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;225&lt;/span&gt;
   &lt;span class="tok-k"&gt;hi&lt;/span&gt; Define          ctermfg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;81&lt;/span&gt;
   &lt;span class="tok-k"&gt;hi&lt;/span&gt; Delimiter       ctermfg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;241&lt;/span&gt;
&lt;span class="tok-c"&gt;   &amp;quot;&lt;/span&gt;
   &lt;span class="tok-k"&gt;hi&lt;/span&gt; DiffAdd                     ctermbg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;24&lt;/span&gt;
   &lt;span class="tok-k"&gt;hi&lt;/span&gt; DiffChange      ctermfg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;181&lt;/span&gt; ctermbg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;239&lt;/span&gt;
   &lt;span class="tok-k"&gt;hi&lt;/span&gt; DiffDelete      ctermfg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;162&lt;/span&gt; ctermbg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;53&lt;/span&gt;
   &lt;span class="tok-k"&gt;hi&lt;/span&gt; DiffText                    ctermbg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;102&lt;/span&gt;
&lt;span class="tok-c"&gt;   &amp;quot;&lt;/span&gt;
   &lt;span class="tok-k"&gt;hi&lt;/span&gt; Directory       ctermfg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;212&lt;/span&gt;
   &lt;span class="tok-k"&gt;hi&lt;/span&gt; Error           ctermfg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;219&lt;/span&gt; ctermbg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;89&lt;/span&gt;
   &lt;span class="tok-k"&gt;hi&lt;/span&gt; ErrorMsg        ctermfg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;199&lt;/span&gt; ctermbg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;16&lt;/span&gt;
   &lt;span class="tok-k"&gt;hi&lt;/span&gt; Exception       ctermfg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;112&lt;/span&gt;
   &lt;span class="tok-k"&gt;hi&lt;/span&gt; Float           ctermfg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;135&lt;/span&gt;
   &lt;span class="tok-k"&gt;hi&lt;/span&gt; FoldColumn      ctermfg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;67&lt;/span&gt;  ctermbg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;16&lt;/span&gt;
   &lt;span class="tok-k"&gt;hi&lt;/span&gt; Folded          ctermfg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;67&lt;/span&gt;  ctermbg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;16&lt;/span&gt;
   &lt;span class="tok-k"&gt;hi&lt;/span&gt; Function        ctermfg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;81&lt;/span&gt;
   &lt;span class="tok-k"&gt;hi&lt;/span&gt; Identifier      ctermfg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;81&lt;/span&gt;               cterm&lt;span class="tok-p"&gt;=&lt;/span&gt;none
   &lt;span class="tok-k"&gt;hi&lt;/span&gt; Ignore          ctermfg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;244&lt;/span&gt; ctermbg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;232&lt;/span&gt;
   &lt;span class="tok-k"&gt;hi&lt;/span&gt; IncSearch       ctermfg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;193&lt;/span&gt; ctermbg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;16&lt;/span&gt;
&lt;span class="tok-c"&gt;   &amp;quot;&lt;/span&gt;
   &lt;span class="tok-k"&gt;hi&lt;/span&gt; keyword         ctermfg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;212&lt;/span&gt;
   &lt;span class="tok-k"&gt;hi&lt;/span&gt; Label           ctermfg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;112&lt;/span&gt;               cterm&lt;span class="tok-p"&gt;=&lt;/span&gt;none
   &lt;span class="tok-k"&gt;hi&lt;/span&gt; Macro           ctermfg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;193&lt;/span&gt;
   &lt;span class="tok-k"&gt;hi&lt;/span&gt; SpecialKey      ctermfg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;81&lt;/span&gt;
&lt;span class="tok-c"&gt;   &amp;quot;&lt;/span&gt;
   &lt;span class="tok-k"&gt;hi&lt;/span&gt; MatchParen      ctermfg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;233&lt;/span&gt;  ctermbg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;208&lt;/span&gt;
   &lt;span class="tok-k"&gt;hi&lt;/span&gt; ModeMsg         ctermfg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;112&lt;/span&gt;
   &lt;span class="tok-k"&gt;hi&lt;/span&gt; MoreMsg         ctermfg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;112&lt;/span&gt;
   &lt;span class="tok-k"&gt;hi&lt;/span&gt; Noise           ctermfg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;252&lt;/span&gt;
   &lt;span class="tok-k"&gt;hi&lt;/span&gt; Operator        ctermfg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;252&lt;/span&gt;
&lt;span class="tok-c"&gt;   &amp;quot; complete menu&lt;/span&gt;
   &lt;span class="tok-k"&gt;hi&lt;/span&gt; Pmenu           ctermfg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;81&lt;/span&gt;  ctermbg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;16&lt;/span&gt;
   &lt;span class="tok-k"&gt;hi&lt;/span&gt; PmenuSel        ctermfg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;255&lt;/span&gt; ctermbg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;242&lt;/span&gt;
   &lt;span class="tok-k"&gt;hi&lt;/span&gt; PmenuSbar                   ctermbg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;235&lt;/span&gt;
   &lt;span class="tok-k"&gt;hi&lt;/span&gt; PmenuThumb      ctermfg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;81&lt;/span&gt;
&lt;span class="tok-c"&gt;   &amp;quot;&lt;/span&gt;
   &lt;span class="tok-k"&gt;hi&lt;/span&gt; PreCondit       ctermfg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;212&lt;/span&gt;
   &lt;span class="tok-k"&gt;hi&lt;/span&gt; PreProc         ctermfg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;212&lt;/span&gt;
   &lt;span class="tok-k"&gt;hi&lt;/span&gt; Question        ctermfg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;81&lt;/span&gt;
   &lt;span class="tok-k"&gt;hi&lt;/span&gt; Repeat          ctermfg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;212&lt;/span&gt;
   &lt;span class="tok-k"&gt;hi&lt;/span&gt; Search          ctermfg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;0&lt;/span&gt;   ctermbg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;179&lt;/span&gt;   cterm&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-nb"&gt;NONE&lt;/span&gt;
&lt;span class="tok-c"&gt;   &amp;quot; marks column&lt;/span&gt;
   &lt;span class="tok-k"&gt;hi&lt;/span&gt; SignColumn      ctermfg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;112&lt;/span&gt; ctermbg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;235&lt;/span&gt;
   &lt;span class="tok-k"&gt;hi&lt;/span&gt; SpecialChar     ctermfg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;212&lt;/span&gt;
   &lt;span class="tok-k"&gt;hi&lt;/span&gt; SpecialComment  ctermfg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;245&lt;/span&gt;
   &lt;span class="tok-k"&gt;hi&lt;/span&gt; Special         ctermfg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;81&lt;/span&gt;
&lt;span class="tok-c"&gt;	 &amp;quot; for spell&lt;/span&gt;
	 &lt;span class="tok-k"&gt;hi&lt;/span&gt; SpellBad                ctermbg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;52&lt;/span&gt;
   &lt;span class="tok-k"&gt;hi&lt;/span&gt; SpellCap                ctermbg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;17&lt;/span&gt;
   &lt;span class="tok-k"&gt;hi&lt;/span&gt; SpellLocal              ctermbg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;17&lt;/span&gt;
   &lt;span class="tok-k"&gt;hi&lt;/span&gt; SpellRare  ctermfg&lt;span class="tok-p"&gt;=&lt;/span&gt;none ctermbg&lt;span class="tok-p"&gt;=&lt;/span&gt;none  cterm&lt;span class="tok-p"&gt;=&lt;/span&gt;reverse
   &lt;span class="tok-k"&gt;hi&lt;/span&gt; Statement       ctermfg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;212&lt;/span&gt;
&lt;span class="tok-c"&gt;&amp;quot;   hi StatusLine      ctermfg=238 ctermbg=253&lt;/span&gt;
&lt;span class="tok-c"&gt;&amp;quot;   hi StatusLineNC    ctermfg=244 ctermbg=232&lt;/span&gt;
&lt;span class="tok-c"&gt;   &amp;quot; let const…&lt;/span&gt;
   &lt;span class="tok-k"&gt;hi&lt;/span&gt; StorageClass    ctermfg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;212&lt;/span&gt;
   &lt;span class="tok-k"&gt;hi&lt;/span&gt; Structure       ctermfg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;212&lt;/span&gt;
   &lt;span class="tok-k"&gt;hi&lt;/span&gt; Tag             ctermfg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;212&lt;/span&gt;
   &lt;span class="tok-k"&gt;hi&lt;/span&gt; Title           ctermfg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;166&lt;/span&gt;
   &lt;span class="tok-k"&gt;hi&lt;/span&gt; Todo            ctermfg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;231&lt;/span&gt; ctermbg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;235&lt;/span&gt;
&lt;span class="tok-c"&gt;   &amp;quot;&lt;/span&gt;
   &lt;span class="tok-k"&gt;hi&lt;/span&gt; Typedef         ctermfg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;81&lt;/span&gt;
   &lt;span class="tok-k"&gt;hi&lt;/span&gt; Type            ctermfg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;81&lt;/span&gt;                cterm&lt;span class="tok-p"&gt;=&lt;/span&gt;none
   &lt;span class="tok-k"&gt;hi&lt;/span&gt; Underlined      ctermfg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;244&lt;/span&gt;               cterm&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-nb"&gt;underline&lt;/span&gt;
&lt;span class="tok-c"&gt;   &amp;quot;&lt;/span&gt;
   &lt;span class="tok-k"&gt;hi&lt;/span&gt; VertSplit       ctermfg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;244&lt;/span&gt; ctermbg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;236&lt;/span&gt;
   &lt;span class="tok-k"&gt;hi&lt;/span&gt; VisualNOS                   ctermbg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;238&lt;/span&gt;
   &lt;span class="tok-k"&gt;hi&lt;/span&gt; Visual                      ctermbg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;236&lt;/span&gt;
   &lt;span class="tok-k"&gt;hi&lt;/span&gt; WarningMsg      ctermfg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;231&lt;/span&gt; ctermbg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;238&lt;/span&gt;
   &lt;span class="tok-k"&gt;hi&lt;/span&gt; WildMenu        ctermfg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;81&lt;/span&gt;  ctermbg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;16&lt;/span&gt;
&lt;span class="tok-c"&gt;   &amp;quot;&lt;/span&gt;
   &lt;span class="tok-k"&gt;hi&lt;/span&gt; Comment         ctermfg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;59&lt;/span&gt;
   &lt;span class="tok-k"&gt;hi&lt;/span&gt; CursorColumn                ctermbg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;236&lt;/span&gt;
   &lt;span class="tok-k"&gt;hi&lt;/span&gt; ColorColumn                 ctermbg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;236&lt;/span&gt;
   &lt;span class="tok-k"&gt;hi&lt;/span&gt; LineNr          ctermfg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;250&lt;/span&gt; ctermbg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;236&lt;/span&gt;
   &lt;span class="tok-k"&gt;hi&lt;/span&gt; NonText         ctermfg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;59&lt;/span&gt;
&lt;span class="tok-c"&gt;   &amp;quot;&lt;/span&gt;
   &lt;span class="tok-k"&gt;hi&lt;/span&gt; SpecialKey      ctermfg&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;59&lt;/span&gt;
&lt;span class="tok-k"&gt;end&lt;/span&gt;
&lt;span class="tok-c"&gt;&amp;quot; Must be at the end, because of ctermbg=234 bug.&lt;/span&gt;
&lt;span class="tok-c"&gt;&amp;quot; https://groups.google.com/forum/#!msg/vim_dev/afPqwAFNdrU/nqh6tOM87QUJ&lt;/span&gt;
&lt;span class="tok-k"&gt;set&lt;/span&gt; &lt;span class="tok-nb"&gt;background&lt;/span&gt;&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-nb"&gt;dark&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;In this previous file, if you define the default category &lt;code&gt;Normal&lt;/code&gt; in green,
you get very close to Firefox Devtools colorscheme when editing JavaScript… But
every normal text stays green, so I kept it white.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Last, but not least, we can improve the way vim analyzes JavaScript (creating the &lt;code&gt;Noise&lt;/code&gt; category for instance) :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;code&gt;# vim /usr/share/vim/vim90/syntax/javascript.vim&lt;/code&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="vim"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-c"&gt;&amp;quot; Vim syntax file&lt;/span&gt;
&lt;span class="tok-c"&gt;&amp;quot; Language:     JavaScript&lt;/span&gt;
&lt;span class="tok-c"&gt;&amp;quot; Maintainer:   vim-javascript community&lt;/span&gt;
&lt;span class="tok-c"&gt;&amp;quot; URL:          https://github.com/pangloss/vim-javascript&lt;/span&gt;
&lt;span class="tok-c"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="tok-c"&gt;&amp;quot; … ~400 lines of definition of code categories&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;</content><category term="Commandes"/><category term="Vim"/><category term="Firefox"/><category term="comfort"/></entry><entry><title>Git : checkout a file previous state</title><link href="https://grimoire.d12s.fr/2022/git_checkout_old_state_of_a_file.html" rel="alternate"/><published>2022-09-08T00:00:00+02:00</published><updated>2022-09-08T00:00:00+02:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2022-09-08:/2022/git_checkout_old_state_of_a_file.html</id><content type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Récupérer une précédente version de fichier.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;$&lt;/span&gt; rm file_a.py
&lt;span class="tok-gp"&gt;$&lt;/span&gt; git checkout file_a.py &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Restore &lt;code&gt;file_a.py&lt;/code&gt; at its last committed state&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;$&lt;/span&gt; git checkout c5f567 -- file1/to/restore file2/to/restore &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Restore several files to their state as per commit reference &lt;code&gt;c5f567&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;</content><category term="Commandes"/><category term="Git"/><category term="code"/></entry><entry><title>Vim : read binary file as hexadecimal</title><link href="https://grimoire.d12s.fr/2022/vim_read_binary_file_as_hexadecimal.html" rel="alternate"/><published>2022-09-01T00:00:00+02:00</published><updated>2022-09-01T00:00:00+02:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2022-09-01:/2022/vim_read_binary_file_as_hexadecimal.html</id><content type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Lire un fichier binaire en hexadecimal, et inversement&lt;/em&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="vim"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-p"&gt;:&lt;/span&gt;%xxd &lt;span class="tok-p"&gt;-&lt;/span&gt;&lt;span class="tok-k"&gt;c&lt;/span&gt; &lt;span class="tok-m"&gt;96&lt;/span&gt; &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
&lt;span class="tok-p"&gt;:&lt;/span&gt;%xxd &lt;span class="tok-p"&gt;-&lt;/span&gt;&lt;span class="tok-k"&gt;r&lt;/span&gt; &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Convert the content of the vim buffer to hexadecimal via the external command &lt;code&gt;xxd&lt;/code&gt; (and set it to adapt the display to 96 columns)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Revert to binary&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;</content><category term="Commandes"/><category term="Vim"/></entry><entry><title>Pelican / jinja full featured blog pagination</title><link href="https://grimoire.d12s.fr/2022/pelican_pagination.html" rel="alternate"/><published>2022-07-04T00:00:00+02:00</published><updated>2022-07-04T00:00:00+02:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2022-07-04:/2022/pelican_pagination.html</id><summary type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Pagination pour Pelican, codée avec le langage de templates Jinja. Elle comporte : page suivante, page précédente, accès direct aux 5 pages suivantes (ou précédentes) et accès direct à n&amp;#8217;importe quelle page quand on clique sur les points de suspension, via dialogue JavaScript. C&amp;#8217;est la pagination mise en place …&lt;/em&gt;&lt;/p&gt;&lt;/div&gt;</summary><content type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Pagination pour Pelican, codée avec le langage de templates Jinja. Elle comporte : page suivante, page précédente, accès direct aux 5 pages suivantes (ou précédentes) et accès direct à n&amp;#8217;importe quelle page quand on clique sur les points de suspension, via dialogue JavaScript. C&amp;#8217;est la pagination mise en place pour ce blog.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Pagination for Pelican, made with Jinja. It features : page next, previous page, direct access to the 5 next pages (or previous) and direct access to every pages when clicking on the '…' via JavaScript dialog. It&amp;#8217;s the pagination of this blog.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="jinja"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-cp"&gt;{%&lt;/span&gt; &lt;span class="tok-k"&gt;if&lt;/span&gt; &lt;span class="tok-nv"&gt;DEFAULT_PAGINATION&lt;/span&gt; &lt;span class="tok-k"&gt;and&lt;/span&gt; &lt;span class="tok-nv"&gt;articles_paginator&lt;/span&gt; &lt;span class="tok-k"&gt;and&lt;/span&gt; &lt;span class="tok-nv"&gt;articles_paginator.num_pages&lt;/span&gt; &lt;span class="tok-o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="tok-m"&gt;1&lt;/span&gt; &lt;span class="tok-cp"&gt;%}&lt;/span&gt;&lt;span class="tok-x"&gt;&lt;/span&gt;
&lt;span class="tok-cp"&gt;{%&lt;/span&gt; &lt;span class="tok-k"&gt;set&lt;/span&gt; &lt;span class="tok-nv"&gt;first_page&lt;/span&gt; &lt;span class="tok-o"&gt;=&lt;/span&gt; &lt;span class="tok-nv"&gt;articles_paginator.page&lt;/span&gt;&lt;span class="tok-o"&gt;(&lt;/span&gt;&lt;span class="tok-m"&gt;1&lt;/span&gt;&lt;span class="tok-o"&gt;)&lt;/span&gt; &lt;span class="tok-cp"&gt;%}&lt;/span&gt;&lt;span class="tok-x"&gt;&lt;/span&gt;
&lt;span class="tok-cp"&gt;{%&lt;/span&gt; &lt;span class="tok-k"&gt;set&lt;/span&gt; &lt;span class="tok-nv"&gt;second_page&lt;/span&gt; &lt;span class="tok-o"&gt;=&lt;/span&gt; &lt;span class="tok-nv"&gt;articles_paginator.page&lt;/span&gt;&lt;span class="tok-o"&gt;(&lt;/span&gt;&lt;span class="tok-m"&gt;2&lt;/span&gt;&lt;span class="tok-o"&gt;)&lt;/span&gt; &lt;span class="tok-cp"&gt;%}&lt;/span&gt;&lt;span class="tok-x"&gt;&lt;/span&gt;
&lt;span class="tok-cp"&gt;{%&lt;/span&gt; &lt;span class="tok-k"&gt;set&lt;/span&gt; &lt;span class="tok-nv"&gt;last_page&lt;/span&gt; &lt;span class="tok-o"&gt;=&lt;/span&gt; &lt;span class="tok-nv"&gt;articles_paginator.page&lt;/span&gt;&lt;span class="tok-o"&gt;(&lt;/span&gt;&lt;span class="tok-nv"&gt;articles_paginator.num_pages&lt;/span&gt;&lt;span class="tok-o"&gt;)&lt;/span&gt; &lt;span class="tok-cp"&gt;%}&lt;/span&gt;&lt;span class="tok-x"&gt;&lt;/span&gt;

&lt;span class="tok-cp"&gt;{%&lt;/span&gt; &lt;span class="tok-k"&gt;set&lt;/span&gt; &lt;span class="tok-nv"&gt;next_2&lt;/span&gt; &lt;span class="tok-o"&gt;=&lt;/span&gt; &lt;span class="tok-nv"&gt;articles_page.number&lt;/span&gt; &lt;span class="tok-o"&gt;+&lt;/span&gt; &lt;span class="tok-m"&gt;2&lt;/span&gt; &lt;span class="tok-cp"&gt;%}&lt;/span&gt;&lt;span class="tok-x"&gt;&lt;/span&gt;
&lt;span class="tok-cp"&gt;{%&lt;/span&gt; &lt;span class="tok-k"&gt;set&lt;/span&gt; &lt;span class="tok-nv"&gt;next_3&lt;/span&gt; &lt;span class="tok-o"&gt;=&lt;/span&gt; &lt;span class="tok-nv"&gt;articles_page.number&lt;/span&gt; &lt;span class="tok-o"&gt;+&lt;/span&gt; &lt;span class="tok-m"&gt;3&lt;/span&gt; &lt;span class="tok-cp"&gt;%}&lt;/span&gt;&lt;span class="tok-x"&gt;&lt;/span&gt;
&lt;span class="tok-cp"&gt;{%&lt;/span&gt; &lt;span class="tok-k"&gt;set&lt;/span&gt; &lt;span class="tok-nv"&gt;next_4&lt;/span&gt; &lt;span class="tok-o"&gt;=&lt;/span&gt; &lt;span class="tok-nv"&gt;articles_page.number&lt;/span&gt; &lt;span class="tok-o"&gt;+&lt;/span&gt; &lt;span class="tok-m"&gt;4&lt;/span&gt; &lt;span class="tok-cp"&gt;%}&lt;/span&gt;&lt;span class="tok-x"&gt;&lt;/span&gt;
&lt;span class="tok-cp"&gt;{%&lt;/span&gt; &lt;span class="tok-k"&gt;set&lt;/span&gt; &lt;span class="tok-nv"&gt;next_5&lt;/span&gt; &lt;span class="tok-o"&gt;=&lt;/span&gt; &lt;span class="tok-nv"&gt;articles_page.number&lt;/span&gt; &lt;span class="tok-o"&gt;+&lt;/span&gt; &lt;span class="tok-m"&gt;5&lt;/span&gt; &lt;span class="tok-cp"&gt;%}&lt;/span&gt;&lt;span class="tok-x"&gt;&lt;/span&gt;

&lt;span class="tok-cp"&gt;{%&lt;/span&gt; &lt;span class="tok-k"&gt;set&lt;/span&gt; &lt;span class="tok-nv"&gt;prev_2&lt;/span&gt; &lt;span class="tok-o"&gt;=&lt;/span&gt; &lt;span class="tok-nv"&gt;articles_page.number&lt;/span&gt; &lt;span class="tok-o"&gt;-&lt;/span&gt; &lt;span class="tok-m"&gt;2&lt;/span&gt; &lt;span class="tok-cp"&gt;%}&lt;/span&gt;&lt;span class="tok-x"&gt;&lt;/span&gt;
&lt;span class="tok-cp"&gt;{%&lt;/span&gt; &lt;span class="tok-k"&gt;set&lt;/span&gt; &lt;span class="tok-nv"&gt;prev_3&lt;/span&gt; &lt;span class="tok-o"&gt;=&lt;/span&gt; &lt;span class="tok-nv"&gt;articles_page.number&lt;/span&gt; &lt;span class="tok-o"&gt;-&lt;/span&gt; &lt;span class="tok-m"&gt;3&lt;/span&gt; &lt;span class="tok-cp"&gt;%}&lt;/span&gt;&lt;span class="tok-x"&gt;&lt;/span&gt;
&lt;span class="tok-cp"&gt;{%&lt;/span&gt; &lt;span class="tok-k"&gt;set&lt;/span&gt; &lt;span class="tok-nv"&gt;prev_4&lt;/span&gt; &lt;span class="tok-o"&gt;=&lt;/span&gt; &lt;span class="tok-nv"&gt;articles_page.number&lt;/span&gt; &lt;span class="tok-o"&gt;-&lt;/span&gt; &lt;span class="tok-m"&gt;4&lt;/span&gt; &lt;span class="tok-cp"&gt;%}&lt;/span&gt;&lt;span class="tok-x"&gt;&lt;/span&gt;
&lt;span class="tok-cp"&gt;{%&lt;/span&gt; &lt;span class="tok-k"&gt;set&lt;/span&gt; &lt;span class="tok-nv"&gt;prev_5&lt;/span&gt; &lt;span class="tok-o"&gt;=&lt;/span&gt; &lt;span class="tok-nv"&gt;articles_page.number&lt;/span&gt; &lt;span class="tok-o"&gt;-&lt;/span&gt; &lt;span class="tok-m"&gt;5&lt;/span&gt; &lt;span class="tok-cp"&gt;%}&lt;/span&gt;&lt;span class="tok-x"&gt;&lt;/span&gt;

&lt;span class="tok-cp"&gt;{%&lt;/span&gt; &lt;span class="tok-k"&gt;if&lt;/span&gt; &lt;span class="tok-nv"&gt;articles_paginator.num_pages&lt;/span&gt; &lt;span class="tok-o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="tok-nv"&gt;next_2&lt;/span&gt; &lt;span class="tok-cp"&gt;%}&lt;/span&gt;&lt;span class="tok-x"&gt;&lt;/span&gt;
&lt;span class="tok-x"&gt;  &lt;/span&gt;&lt;span class="tok-cp"&gt;{%&lt;/span&gt; &lt;span class="tok-k"&gt;set&lt;/span&gt; &lt;span class="tok-nv"&gt;next_2pg&lt;/span&gt; &lt;span class="tok-o"&gt;=&lt;/span&gt; &lt;span class="tok-nv"&gt;articles_paginator.page&lt;/span&gt;&lt;span class="tok-o"&gt;(&lt;/span&gt;&lt;span class="tok-nv"&gt;next_2&lt;/span&gt;&lt;span class="tok-o"&gt;)&lt;/span&gt; &lt;span class="tok-cp"&gt;%}&lt;/span&gt;&lt;span class="tok-x"&gt;&lt;/span&gt;
&lt;span class="tok-cp"&gt;{%&lt;/span&gt; &lt;span class="tok-k"&gt;endif&lt;/span&gt; &lt;span class="tok-cp"&gt;%}&lt;/span&gt;&lt;span class="tok-x"&gt;&lt;/span&gt;
&lt;span class="tok-cp"&gt;{%&lt;/span&gt; &lt;span class="tok-k"&gt;if&lt;/span&gt; &lt;span class="tok-nv"&gt;articles_paginator.num_pages&lt;/span&gt; &lt;span class="tok-o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="tok-nv"&gt;next_3&lt;/span&gt; &lt;span class="tok-cp"&gt;%}&lt;/span&gt;&lt;span class="tok-x"&gt;&lt;/span&gt;
&lt;span class="tok-x"&gt;  &lt;/span&gt;&lt;span class="tok-cp"&gt;{%&lt;/span&gt; &lt;span class="tok-k"&gt;set&lt;/span&gt; &lt;span class="tok-nv"&gt;next_3pg&lt;/span&gt; &lt;span class="tok-o"&gt;=&lt;/span&gt; &lt;span class="tok-nv"&gt;articles_paginator.page&lt;/span&gt;&lt;span class="tok-o"&gt;(&lt;/span&gt;&lt;span class="tok-nv"&gt;next_3&lt;/span&gt;&lt;span class="tok-o"&gt;)&lt;/span&gt; &lt;span class="tok-cp"&gt;%}&lt;/span&gt;&lt;span class="tok-x"&gt;&lt;/span&gt;
&lt;span class="tok-cp"&gt;{%&lt;/span&gt; &lt;span class="tok-k"&gt;endif&lt;/span&gt; &lt;span class="tok-cp"&gt;%}&lt;/span&gt;&lt;span class="tok-x"&gt;&lt;/span&gt;
&lt;span class="tok-cp"&gt;{%&lt;/span&gt; &lt;span class="tok-k"&gt;if&lt;/span&gt; &lt;span class="tok-nv"&gt;articles_paginator.num_pages&lt;/span&gt; &lt;span class="tok-o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="tok-nv"&gt;next_4&lt;/span&gt; &lt;span class="tok-cp"&gt;%}&lt;/span&gt;&lt;span class="tok-x"&gt;&lt;/span&gt;
&lt;span class="tok-x"&gt;  &lt;/span&gt;&lt;span class="tok-cp"&gt;{%&lt;/span&gt; &lt;span class="tok-k"&gt;set&lt;/span&gt; &lt;span class="tok-nv"&gt;next_4pg&lt;/span&gt; &lt;span class="tok-o"&gt;=&lt;/span&gt; &lt;span class="tok-nv"&gt;articles_paginator.page&lt;/span&gt;&lt;span class="tok-o"&gt;(&lt;/span&gt;&lt;span class="tok-nv"&gt;next_4&lt;/span&gt;&lt;span class="tok-o"&gt;)&lt;/span&gt; &lt;span class="tok-cp"&gt;%}&lt;/span&gt;&lt;span class="tok-x"&gt;&lt;/span&gt;
&lt;span class="tok-cp"&gt;{%&lt;/span&gt; &lt;span class="tok-k"&gt;endif&lt;/span&gt; &lt;span class="tok-cp"&gt;%}&lt;/span&gt;&lt;span class="tok-x"&gt;&lt;/span&gt;
&lt;span class="tok-cp"&gt;{%&lt;/span&gt; &lt;span class="tok-k"&gt;if&lt;/span&gt; &lt;span class="tok-nv"&gt;articles_paginator.num_pages&lt;/span&gt; &lt;span class="tok-o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="tok-nv"&gt;next_5&lt;/span&gt; &lt;span class="tok-cp"&gt;%}&lt;/span&gt;&lt;span class="tok-x"&gt;&lt;/span&gt;
&lt;span class="tok-x"&gt;  &lt;/span&gt;&lt;span class="tok-cp"&gt;{%&lt;/span&gt; &lt;span class="tok-k"&gt;set&lt;/span&gt; &lt;span class="tok-nv"&gt;next_5pg&lt;/span&gt; &lt;span class="tok-o"&gt;=&lt;/span&gt; &lt;span class="tok-nv"&gt;articles_paginator.page&lt;/span&gt;&lt;span class="tok-o"&gt;(&lt;/span&gt;&lt;span class="tok-nv"&gt;next_5&lt;/span&gt;&lt;span class="tok-o"&gt;)&lt;/span&gt; &lt;span class="tok-cp"&gt;%}&lt;/span&gt;&lt;span class="tok-x"&gt;&lt;/span&gt;
&lt;span class="tok-cp"&gt;{%&lt;/span&gt; &lt;span class="tok-k"&gt;endif&lt;/span&gt; &lt;span class="tok-cp"&gt;%}&lt;/span&gt;&lt;span class="tok-x"&gt;&lt;/span&gt;

&lt;span class="tok-cp"&gt;{%&lt;/span&gt; &lt;span class="tok-k"&gt;if&lt;/span&gt; &lt;span class="tok-nv"&gt;prev_2&lt;/span&gt; &lt;span class="tok-o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="tok-m"&gt;0&lt;/span&gt; &lt;span class="tok-cp"&gt;%}&lt;/span&gt;&lt;span class="tok-x"&gt;&lt;/span&gt;
&lt;span class="tok-x"&gt;  &lt;/span&gt;&lt;span class="tok-cp"&gt;{%&lt;/span&gt; &lt;span class="tok-k"&gt;set&lt;/span&gt; &lt;span class="tok-nv"&gt;prev_2pg&lt;/span&gt; &lt;span class="tok-o"&gt;=&lt;/span&gt; &lt;span class="tok-nv"&gt;articles_paginator.page&lt;/span&gt;&lt;span class="tok-o"&gt;(&lt;/span&gt;&lt;span class="tok-nv"&gt;prev_2&lt;/span&gt;&lt;span class="tok-o"&gt;)&lt;/span&gt; &lt;span class="tok-cp"&gt;%}&lt;/span&gt;&lt;span class="tok-x"&gt;&lt;/span&gt;
&lt;span class="tok-cp"&gt;{%&lt;/span&gt; &lt;span class="tok-k"&gt;endif&lt;/span&gt; &lt;span class="tok-cp"&gt;%}&lt;/span&gt;&lt;span class="tok-x"&gt;&lt;/span&gt;
&lt;span class="tok-cp"&gt;{%&lt;/span&gt; &lt;span class="tok-k"&gt;if&lt;/span&gt; &lt;span class="tok-nv"&gt;prev_3&lt;/span&gt; &lt;span class="tok-o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="tok-m"&gt;0&lt;/span&gt; &lt;span class="tok-cp"&gt;%}&lt;/span&gt;&lt;span class="tok-x"&gt;&lt;/span&gt;
&lt;span class="tok-x"&gt;  &lt;/span&gt;&lt;span class="tok-cp"&gt;{%&lt;/span&gt; &lt;span class="tok-k"&gt;set&lt;/span&gt; &lt;span class="tok-nv"&gt;prev_3pg&lt;/span&gt; &lt;span class="tok-o"&gt;=&lt;/span&gt; &lt;span class="tok-nv"&gt;articles_paginator.page&lt;/span&gt;&lt;span class="tok-o"&gt;(&lt;/span&gt;&lt;span class="tok-nv"&gt;prev_3&lt;/span&gt;&lt;span class="tok-o"&gt;)&lt;/span&gt; &lt;span class="tok-cp"&gt;%}&lt;/span&gt;&lt;span class="tok-x"&gt;&lt;/span&gt;
&lt;span class="tok-cp"&gt;{%&lt;/span&gt; &lt;span class="tok-k"&gt;endif&lt;/span&gt; &lt;span class="tok-cp"&gt;%}&lt;/span&gt;&lt;span class="tok-x"&gt;&lt;/span&gt;
&lt;span class="tok-cp"&gt;{%&lt;/span&gt; &lt;span class="tok-k"&gt;if&lt;/span&gt; &lt;span class="tok-nv"&gt;prev_4&lt;/span&gt; &lt;span class="tok-o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="tok-m"&gt;0&lt;/span&gt; &lt;span class="tok-cp"&gt;%}&lt;/span&gt;&lt;span class="tok-x"&gt;&lt;/span&gt;
&lt;span class="tok-x"&gt;  &lt;/span&gt;&lt;span class="tok-cp"&gt;{%&lt;/span&gt; &lt;span class="tok-k"&gt;set&lt;/span&gt; &lt;span class="tok-nv"&gt;prev_4pg&lt;/span&gt; &lt;span class="tok-o"&gt;=&lt;/span&gt; &lt;span class="tok-nv"&gt;articles_paginator.page&lt;/span&gt;&lt;span class="tok-o"&gt;(&lt;/span&gt;&lt;span class="tok-nv"&gt;prev_4&lt;/span&gt;&lt;span class="tok-o"&gt;)&lt;/span&gt; &lt;span class="tok-cp"&gt;%}&lt;/span&gt;&lt;span class="tok-x"&gt;&lt;/span&gt;
&lt;span class="tok-cp"&gt;{%&lt;/span&gt; &lt;span class="tok-k"&gt;endif&lt;/span&gt; &lt;span class="tok-cp"&gt;%}&lt;/span&gt;&lt;span class="tok-x"&gt;&lt;/span&gt;
&lt;span class="tok-cp"&gt;{%&lt;/span&gt; &lt;span class="tok-k"&gt;if&lt;/span&gt; &lt;span class="tok-nv"&gt;prev_5&lt;/span&gt; &lt;span class="tok-o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="tok-m"&gt;0&lt;/span&gt; &lt;span class="tok-cp"&gt;%}&lt;/span&gt;&lt;span class="tok-x"&gt;&lt;/span&gt;
&lt;span class="tok-x"&gt;  &lt;/span&gt;&lt;span class="tok-cp"&gt;{%&lt;/span&gt; &lt;span class="tok-k"&gt;set&lt;/span&gt; &lt;span class="tok-nv"&gt;prev_5pg&lt;/span&gt; &lt;span class="tok-o"&gt;=&lt;/span&gt; &lt;span class="tok-nv"&gt;articles_paginator.page&lt;/span&gt;&lt;span class="tok-o"&gt;(&lt;/span&gt;&lt;span class="tok-nv"&gt;prev_5&lt;/span&gt;&lt;span class="tok-o"&gt;)&lt;/span&gt; &lt;span class="tok-cp"&gt;%}&lt;/span&gt;&lt;span class="tok-x"&gt;&lt;/span&gt;
&lt;span class="tok-cp"&gt;{%&lt;/span&gt; &lt;span class="tok-k"&gt;endif&lt;/span&gt; &lt;span class="tok-cp"&gt;%}&lt;/span&gt;&lt;span class="tok-x"&gt;&lt;/span&gt;

&lt;span class="tok-x"&gt;&amp;lt;ul class=&amp;quot;uk-pagination&amp;quot;&amp;gt;&lt;/span&gt;
&lt;span class="tok-x"&gt;  &lt;/span&gt;&lt;span class="tok-cp"&gt;{%&lt;/span&gt; &lt;span class="tok-k"&gt;if&lt;/span&gt; &lt;span class="tok-nv"&gt;articles_page.number&lt;/span&gt; &lt;span class="tok-o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="tok-m"&gt;1&lt;/span&gt; &lt;span class="tok-cp"&gt;%}&lt;/span&gt;&lt;span class="tok-x"&gt;&lt;/span&gt;
&lt;span class="tok-x"&gt;  &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;/&lt;/span&gt;&lt;span class="tok-cp"&gt;{{&lt;/span&gt; &lt;span class="tok-nv"&gt;articles_previous_page.url&lt;/span&gt; &lt;span class="tok-cp"&gt;}}&lt;/span&gt;&lt;span class="tok-x"&gt;&amp;quot;&amp;gt;«&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
&lt;span class="tok-x"&gt;  &lt;/span&gt;&lt;span class="tok-cp"&gt;{%&lt;/span&gt; &lt;span class="tok-k"&gt;endif&lt;/span&gt; &lt;span class="tok-cp"&gt;%}&lt;/span&gt;&lt;span class="tok-x"&gt;&lt;/span&gt;
&lt;span class="tok-x"&gt;  &lt;/span&gt;&lt;span class="tok-cp"&gt;{%&lt;/span&gt; &lt;span class="tok-k"&gt;if&lt;/span&gt; &lt;span class="tok-nv"&gt;articles_page.number&lt;/span&gt; &lt;span class="tok-o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="tok-m"&gt;6&lt;/span&gt; &lt;span class="tok-cp"&gt;%}&lt;/span&gt;&lt;span class="tok-x"&gt;&lt;/span&gt;
&lt;span class="tok-x"&gt;  &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;/&lt;/span&gt;&lt;span class="tok-cp"&gt;{{&lt;/span&gt; &lt;span class="tok-nv"&gt;first_page.url&lt;/span&gt; &lt;span class="tok-cp"&gt;}}&lt;/span&gt;&lt;span class="tok-x"&gt;&amp;quot;&amp;gt;&lt;/span&gt;&lt;span class="tok-cp"&gt;{{&lt;/span&gt; &lt;span class="tok-nv"&gt;first_page.number&lt;/span&gt; &lt;span class="tok-cp"&gt;}}&lt;/span&gt;&lt;span class="tok-x"&gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
&lt;span class="tok-x"&gt;  &lt;/span&gt;&lt;span class="tok-cp"&gt;{%&lt;/span&gt; &lt;span class="tok-k"&gt;endif&lt;/span&gt; &lt;span class="tok-cp"&gt;%}&lt;/span&gt;&lt;span class="tok-x"&gt;&lt;/span&gt;
&lt;span class="tok-x"&gt;  &lt;/span&gt;&lt;span class="tok-cp"&gt;{%&lt;/span&gt; &lt;span class="tok-k"&gt;if&lt;/span&gt; &lt;span class="tok-nv"&gt;articles_page.number&lt;/span&gt; &lt;span class="tok-o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="tok-m"&gt;7&lt;/span&gt; &lt;span class="tok-cp"&gt;%}&lt;/span&gt;&lt;span class="tok-x"&gt;&lt;/span&gt;
&lt;span class="tok-x"&gt;  &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;javascript:choose_your_page()&amp;quot;&amp;gt;…&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
&lt;span class="tok-x"&gt;  &lt;/span&gt;&lt;span class="tok-cp"&gt;{%&lt;/span&gt; &lt;span class="tok-k"&gt;endif&lt;/span&gt; &lt;span class="tok-cp"&gt;%}&lt;/span&gt;&lt;span class="tok-x"&gt;&lt;/span&gt;
&lt;span class="tok-x"&gt;  &lt;/span&gt;&lt;span class="tok-cp"&gt;{%&lt;/span&gt; &lt;span class="tok-k"&gt;if&lt;/span&gt; &lt;span class="tok-nv"&gt;prev_5pg&lt;/span&gt; &lt;span class="tok-cp"&gt;%}&lt;/span&gt;&lt;span class="tok-x"&gt;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;/&lt;/span&gt;&lt;span class="tok-cp"&gt;{{&lt;/span&gt; &lt;span class="tok-nv"&gt;prev_5pg.url&lt;/span&gt; &lt;span class="tok-cp"&gt;}}&lt;/span&gt;&lt;span class="tok-x"&gt;&amp;quot;&amp;gt;&lt;/span&gt;&lt;span class="tok-cp"&gt;{{&lt;/span&gt; &lt;span class="tok-nv"&gt;prev_5pg.number&lt;/span&gt; &lt;span class="tok-cp"&gt;}}&lt;/span&gt;&lt;span class="tok-x"&gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;/span&gt;&lt;span class="tok-cp"&gt;{%&lt;/span&gt; &lt;span class="tok-k"&gt;endif&lt;/span&gt; &lt;span class="tok-cp"&gt;%}&lt;/span&gt;&lt;span class="tok-x"&gt;&lt;/span&gt;
&lt;span class="tok-x"&gt;  &lt;/span&gt;&lt;span class="tok-cp"&gt;{%&lt;/span&gt; &lt;span class="tok-k"&gt;if&lt;/span&gt; &lt;span class="tok-nv"&gt;prev_4pg&lt;/span&gt; &lt;span class="tok-cp"&gt;%}&lt;/span&gt;&lt;span class="tok-x"&gt;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;/&lt;/span&gt;&lt;span class="tok-cp"&gt;{{&lt;/span&gt; &lt;span class="tok-nv"&gt;prev_4pg.url&lt;/span&gt; &lt;span class="tok-cp"&gt;}}&lt;/span&gt;&lt;span class="tok-x"&gt;&amp;quot;&amp;gt;&lt;/span&gt;&lt;span class="tok-cp"&gt;{{&lt;/span&gt; &lt;span class="tok-nv"&gt;prev_4pg.number&lt;/span&gt; &lt;span class="tok-cp"&gt;}}&lt;/span&gt;&lt;span class="tok-x"&gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;/span&gt;&lt;span class="tok-cp"&gt;{%&lt;/span&gt; &lt;span class="tok-k"&gt;endif&lt;/span&gt; &lt;span class="tok-cp"&gt;%}&lt;/span&gt;&lt;span class="tok-x"&gt;&lt;/span&gt;
&lt;span class="tok-x"&gt;  &lt;/span&gt;&lt;span class="tok-cp"&gt;{%&lt;/span&gt; &lt;span class="tok-k"&gt;if&lt;/span&gt; &lt;span class="tok-nv"&gt;prev_3pg&lt;/span&gt; &lt;span class="tok-cp"&gt;%}&lt;/span&gt;&lt;span class="tok-x"&gt;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;/&lt;/span&gt;&lt;span class="tok-cp"&gt;{{&lt;/span&gt; &lt;span class="tok-nv"&gt;prev_3pg.url&lt;/span&gt; &lt;span class="tok-cp"&gt;}}&lt;/span&gt;&lt;span class="tok-x"&gt;&amp;quot;&amp;gt;&lt;/span&gt;&lt;span class="tok-cp"&gt;{{&lt;/span&gt; &lt;span class="tok-nv"&gt;prev_3pg.number&lt;/span&gt; &lt;span class="tok-cp"&gt;}}&lt;/span&gt;&lt;span class="tok-x"&gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;/span&gt;&lt;span class="tok-cp"&gt;{%&lt;/span&gt; &lt;span class="tok-k"&gt;endif&lt;/span&gt; &lt;span class="tok-cp"&gt;%}&lt;/span&gt;&lt;span class="tok-x"&gt;&lt;/span&gt;
&lt;span class="tok-x"&gt;  &lt;/span&gt;&lt;span class="tok-cp"&gt;{%&lt;/span&gt; &lt;span class="tok-k"&gt;if&lt;/span&gt; &lt;span class="tok-nv"&gt;prev_2pg&lt;/span&gt; &lt;span class="tok-cp"&gt;%}&lt;/span&gt;&lt;span class="tok-x"&gt;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;/&lt;/span&gt;&lt;span class="tok-cp"&gt;{{&lt;/span&gt; &lt;span class="tok-nv"&gt;prev_2pg.url&lt;/span&gt; &lt;span class="tok-cp"&gt;}}&lt;/span&gt;&lt;span class="tok-x"&gt;&amp;quot;&amp;gt;&lt;/span&gt;&lt;span class="tok-cp"&gt;{{&lt;/span&gt; &lt;span class="tok-nv"&gt;prev_2pg.number&lt;/span&gt; &lt;span class="tok-cp"&gt;}}&lt;/span&gt;&lt;span class="tok-x"&gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;/span&gt;&lt;span class="tok-cp"&gt;{%&lt;/span&gt; &lt;span class="tok-k"&gt;endif&lt;/span&gt; &lt;span class="tok-cp"&gt;%}&lt;/span&gt;&lt;span class="tok-x"&gt;&lt;/span&gt;
&lt;span class="tok-x"&gt;  &lt;/span&gt;&lt;span class="tok-cp"&gt;{%&lt;/span&gt; &lt;span class="tok-k"&gt;if&lt;/span&gt; &lt;span class="tok-nv"&gt;articles_previous_page&lt;/span&gt; &lt;span class="tok-cp"&gt;%}&lt;/span&gt;&lt;span class="tok-x"&gt;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;/&lt;/span&gt;&lt;span class="tok-cp"&gt;{{&lt;/span&gt; &lt;span class="tok-nv"&gt;articles_previous_page.url&lt;/span&gt; &lt;span class="tok-cp"&gt;}}&lt;/span&gt;&lt;span class="tok-x"&gt;&amp;quot;&amp;gt;&lt;/span&gt;&lt;span class="tok-cp"&gt;{{&lt;/span&gt; &lt;span class="tok-nv"&gt;articles_previous_page.number&lt;/span&gt; &lt;span class="tok-cp"&gt;}}&lt;/span&gt;&lt;span class="tok-x"&gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;/span&gt;&lt;span class="tok-cp"&gt;{%&lt;/span&gt; &lt;span class="tok-k"&gt;endif&lt;/span&gt; &lt;span class="tok-cp"&gt;%}&lt;/span&gt;&lt;span class="tok-x"&gt;&lt;/span&gt;
&lt;span class="tok-x"&gt;  &amp;lt;li class=&amp;quot;uk-active&amp;quot;&amp;gt;&amp;lt;span&amp;gt;&lt;/span&gt;&lt;span class="tok-cp"&gt;{{&lt;/span&gt; &lt;span class="tok-nv"&gt;articles_page.number&lt;/span&gt; &lt;span class="tok-cp"&gt;}}&lt;/span&gt;&lt;span class="tok-x"&gt;&amp;lt;/span&amp;gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
&lt;span class="tok-x"&gt;  &lt;/span&gt;&lt;span class="tok-cp"&gt;{%&lt;/span&gt; &lt;span class="tok-k"&gt;if&lt;/span&gt; &lt;span class="tok-nv"&gt;articles_next_page&lt;/span&gt; &lt;span class="tok-cp"&gt;%}&lt;/span&gt;&lt;span class="tok-x"&gt;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;/&lt;/span&gt;&lt;span class="tok-cp"&gt;{{&lt;/span&gt; &lt;span class="tok-nv"&gt;articles_next_page.url&lt;/span&gt; &lt;span class="tok-cp"&gt;}}&lt;/span&gt;&lt;span class="tok-x"&gt;&amp;quot;&amp;gt;&lt;/span&gt;&lt;span class="tok-cp"&gt;{{&lt;/span&gt; &lt;span class="tok-nv"&gt;articles_next_page.number&lt;/span&gt; &lt;span class="tok-cp"&gt;}}&lt;/span&gt;&lt;span class="tok-x"&gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;/span&gt;&lt;span class="tok-cp"&gt;{%&lt;/span&gt; &lt;span class="tok-k"&gt;endif&lt;/span&gt; &lt;span class="tok-cp"&gt;%}&lt;/span&gt;&lt;span class="tok-x"&gt;&lt;/span&gt;
&lt;span class="tok-x"&gt;  &lt;/span&gt;&lt;span class="tok-cp"&gt;{%&lt;/span&gt; &lt;span class="tok-k"&gt;if&lt;/span&gt; &lt;span class="tok-nv"&gt;next_2pg&lt;/span&gt; &lt;span class="tok-cp"&gt;%}&lt;/span&gt;&lt;span class="tok-x"&gt;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;/&lt;/span&gt;&lt;span class="tok-cp"&gt;{{&lt;/span&gt; &lt;span class="tok-nv"&gt;next_2pg.url&lt;/span&gt; &lt;span class="tok-cp"&gt;}}&lt;/span&gt;&lt;span class="tok-x"&gt;&amp;quot;&amp;gt;&lt;/span&gt;&lt;span class="tok-cp"&gt;{{&lt;/span&gt; &lt;span class="tok-nv"&gt;next_2pg.number&lt;/span&gt; &lt;span class="tok-cp"&gt;}}&lt;/span&gt;&lt;span class="tok-x"&gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;/span&gt;&lt;span class="tok-cp"&gt;{%&lt;/span&gt; &lt;span class="tok-k"&gt;endif&lt;/span&gt; &lt;span class="tok-cp"&gt;%}&lt;/span&gt;&lt;span class="tok-x"&gt;&lt;/span&gt;
&lt;span class="tok-x"&gt;  &lt;/span&gt;&lt;span class="tok-cp"&gt;{%&lt;/span&gt; &lt;span class="tok-k"&gt;if&lt;/span&gt; &lt;span class="tok-nv"&gt;next_3pg&lt;/span&gt; &lt;span class="tok-cp"&gt;%}&lt;/span&gt;&lt;span class="tok-x"&gt;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;/&lt;/span&gt;&lt;span class="tok-cp"&gt;{{&lt;/span&gt; &lt;span class="tok-nv"&gt;next_3pg.url&lt;/span&gt; &lt;span class="tok-cp"&gt;}}&lt;/span&gt;&lt;span class="tok-x"&gt;&amp;quot;&amp;gt;&lt;/span&gt;&lt;span class="tok-cp"&gt;{{&lt;/span&gt; &lt;span class="tok-nv"&gt;next_3pg.number&lt;/span&gt; &lt;span class="tok-cp"&gt;}}&lt;/span&gt;&lt;span class="tok-x"&gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;/span&gt;&lt;span class="tok-cp"&gt;{%&lt;/span&gt; &lt;span class="tok-k"&gt;endif&lt;/span&gt; &lt;span class="tok-cp"&gt;%}&lt;/span&gt;&lt;span class="tok-x"&gt;&lt;/span&gt;
&lt;span class="tok-x"&gt;  &lt;/span&gt;&lt;span class="tok-cp"&gt;{%&lt;/span&gt; &lt;span class="tok-k"&gt;if&lt;/span&gt; &lt;span class="tok-nv"&gt;next_4pg&lt;/span&gt; &lt;span class="tok-cp"&gt;%}&lt;/span&gt;&lt;span class="tok-x"&gt;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;/&lt;/span&gt;&lt;span class="tok-cp"&gt;{{&lt;/span&gt; &lt;span class="tok-nv"&gt;next_4pg.url&lt;/span&gt; &lt;span class="tok-cp"&gt;}}&lt;/span&gt;&lt;span class="tok-x"&gt;&amp;quot;&amp;gt;&lt;/span&gt;&lt;span class="tok-cp"&gt;{{&lt;/span&gt; &lt;span class="tok-nv"&gt;next_4pg.number&lt;/span&gt; &lt;span class="tok-cp"&gt;}}&lt;/span&gt;&lt;span class="tok-x"&gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;/span&gt;&lt;span class="tok-cp"&gt;{%&lt;/span&gt; &lt;span class="tok-k"&gt;endif&lt;/span&gt; &lt;span class="tok-cp"&gt;%}&lt;/span&gt;&lt;span class="tok-x"&gt;&lt;/span&gt;
&lt;span class="tok-x"&gt;  &lt;/span&gt;&lt;span class="tok-cp"&gt;{%&lt;/span&gt; &lt;span class="tok-k"&gt;if&lt;/span&gt; &lt;span class="tok-nv"&gt;next_5pg&lt;/span&gt; &lt;span class="tok-cp"&gt;%}&lt;/span&gt;&lt;span class="tok-x"&gt;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;/&lt;/span&gt;&lt;span class="tok-cp"&gt;{{&lt;/span&gt; &lt;span class="tok-nv"&gt;next_5pg.url&lt;/span&gt; &lt;span class="tok-cp"&gt;}}&lt;/span&gt;&lt;span class="tok-x"&gt;&amp;quot;&amp;gt;&lt;/span&gt;&lt;span class="tok-cp"&gt;{{&lt;/span&gt; &lt;span class="tok-nv"&gt;next_5pg.number&lt;/span&gt; &lt;span class="tok-cp"&gt;}}&lt;/span&gt;&lt;span class="tok-x"&gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;/span&gt;&lt;span class="tok-cp"&gt;{%&lt;/span&gt; &lt;span class="tok-k"&gt;endif&lt;/span&gt; &lt;span class="tok-cp"&gt;%}&lt;/span&gt;&lt;span class="tok-x"&gt;&lt;/span&gt;
&lt;span class="tok-x"&gt;  &lt;/span&gt;&lt;span class="tok-cp"&gt;{%&lt;/span&gt; &lt;span class="tok-k"&gt;if&lt;/span&gt; &lt;span class="tok-nv"&gt;articles_page.number&lt;/span&gt; &lt;span class="tok-o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="tok-nv"&gt;last_page.number&lt;/span&gt; &lt;span class="tok-o"&gt;-&lt;/span&gt; &lt;span class="tok-m"&gt;5&lt;/span&gt; &lt;span class="tok-cp"&gt;%}&lt;/span&gt;&lt;span class="tok-x"&gt;&lt;/span&gt;
&lt;span class="tok-x"&gt;  &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;javascript:choose_your_page()&amp;quot;&amp;gt;…&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
&lt;span class="tok-x"&gt;  &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;/&lt;/span&gt;&lt;span class="tok-cp"&gt;{{&lt;/span&gt; &lt;span class="tok-nv"&gt;last_page.url&lt;/span&gt; &lt;span class="tok-cp"&gt;}}&lt;/span&gt;&lt;span class="tok-x"&gt;&amp;quot;&amp;gt;&lt;/span&gt;&lt;span class="tok-cp"&gt;{{&lt;/span&gt; &lt;span class="tok-nv"&gt;last_page.number&lt;/span&gt; &lt;span class="tok-cp"&gt;}}&lt;/span&gt;&lt;span class="tok-x"&gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
&lt;span class="tok-x"&gt;  &lt;/span&gt;&lt;span class="tok-cp"&gt;{%&lt;/span&gt; &lt;span class="tok-k"&gt;endif&lt;/span&gt; &lt;span class="tok-cp"&gt;%}&lt;/span&gt;&lt;span class="tok-x"&gt;&lt;/span&gt;
&lt;span class="tok-x"&gt;  &lt;/span&gt;&lt;span class="tok-cp"&gt;{%&lt;/span&gt; &lt;span class="tok-k"&gt;if&lt;/span&gt; &lt;span class="tok-nv"&gt;articles_page.number&lt;/span&gt; &lt;span class="tok-o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="tok-nv"&gt;last_page.number&lt;/span&gt; &lt;span class="tok-cp"&gt;%}&lt;/span&gt;&lt;span class="tok-x"&gt;&lt;/span&gt;
&lt;span class="tok-x"&gt;  &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;/&lt;/span&gt;&lt;span class="tok-cp"&gt;{{&lt;/span&gt; &lt;span class="tok-nv"&gt;articles_next_page.url&lt;/span&gt;&lt;span class="tok-cp"&gt;}}&lt;/span&gt;&lt;span class="tok-x"&gt;&amp;quot;&amp;gt;»&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
&lt;span class="tok-x"&gt;  &lt;/span&gt;&lt;span class="tok-cp"&gt;{%&lt;/span&gt; &lt;span class="tok-k"&gt;endif&lt;/span&gt; &lt;span class="tok-cp"&gt;%}&lt;/span&gt;&lt;span class="tok-x"&gt;&lt;/span&gt;
&lt;span class="tok-x"&gt;&amp;lt;/ul&amp;gt;&lt;/span&gt;
&lt;span class="tok-x"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
&lt;span class="tok-x"&gt;  if (typeof choose_your_page === &amp;#39;undefined&amp;#39;)&lt;/span&gt;
&lt;span class="tok-x"&gt;    function choose_your_page () {&lt;/span&gt;
&lt;span class="tok-x"&gt;        let p_nb=prompt(&amp;#39;# page&amp;#39;)&lt;/span&gt;
&lt;span class="tok-x"&gt;        if (p_nb == 1)&lt;/span&gt;
&lt;span class="tok-x"&gt;          return location.href=(&amp;#39;&lt;/span&gt;&lt;span class="tok-cp"&gt;{{&lt;/span&gt; &lt;span class="tok-nv"&gt;first_page.url&lt;/span&gt; &lt;span class="tok-cp"&gt;}}&lt;/span&gt;&lt;span class="tok-x"&gt;&amp;#39;)&lt;/span&gt;
&lt;span class="tok-x"&gt;        if (p_nb &amp;gt; 1 &amp;amp;&amp;amp; p_nb &amp;lt;= &lt;/span&gt;&lt;span class="tok-cp"&gt;{{&lt;/span&gt; &lt;span class="tok-nv"&gt;articles_paginator.num_pages&lt;/span&gt; &lt;span class="tok-cp"&gt;}}&lt;/span&gt;&lt;span class="tok-x"&gt;)&lt;/span&gt;
&lt;span class="tok-x"&gt;          location.href=(&amp;#39;&lt;/span&gt;&lt;span class="tok-cp"&gt;{{&lt;/span&gt; &lt;span class="tok-nv"&gt;second_page.url&lt;/span&gt; &lt;span class="tok-cp"&gt;}}&lt;/span&gt;&lt;span class="tok-x"&gt;&amp;#39;.replace(/2\.html/, `${p_nb}.html`))&lt;/span&gt;
&lt;span class="tok-x"&gt;        else&lt;/span&gt;
&lt;span class="tok-x"&gt;          alert(&amp;#39;/!\\ Impossible /!\\&amp;#39;)&lt;/span&gt;
&lt;span class="tok-x"&gt;    }&lt;/span&gt;
&lt;span class="tok-x"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="tok-cp"&gt;{%&lt;/span&gt; &lt;span class="tok-k"&gt;endif&lt;/span&gt; &lt;span class="tok-cp"&gt;%}&lt;/span&gt;&lt;span class="tok-x"&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;</content><category term="Commandes"/><category term="code"/><category term="JavaScript"/></entry><entry><title>Split big files</title><link href="https://grimoire.d12s.fr/2022/split_files.html" rel="alternate"/><published>2022-06-27T00:00:00+02:00</published><updated>2022-06-27T00:00:00+02:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2022-06-27:/2022/split_files.html</id><summary type="html">&lt;div id="preamble"&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Découper un gros fichier en plusieurs tranches. Pratique pour transporter un fichier plus gros que le support disponible, ou pour copier sur une clé en FAT32, un film de plus de 4Go.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_unix_destination"&gt;1. Unix destination&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;$&lt;/span&gt; split -b 4095m &lt;span class="tok-s2"&gt;&amp;quot;source-file&amp;quot;&lt;/span&gt; &lt;span class="tok-s2"&gt;&amp;quot;dest-file.part-&amp;quot;&lt;/span&gt;
&lt;span class="tok-gp"&gt;$&lt;/span&gt; cat dest-file.part-* &amp;gt; &lt;span class="tok-s2"&gt;&amp;quot;copy-of-source-file&amp;quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_non_unix_destination_and_zip_compression"&gt;2. Non-unix destination (and zip …&lt;/h2&gt;&lt;/div&gt;</summary><content type="html">&lt;div id="preamble"&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Découper un gros fichier en plusieurs tranches. Pratique pour transporter un fichier plus gros que le support disponible, ou pour copier sur une clé en FAT32, un film de plus de 4Go.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_unix_destination"&gt;1. Unix destination&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;$&lt;/span&gt; split -b 4095m &lt;span class="tok-s2"&gt;&amp;quot;source-file&amp;quot;&lt;/span&gt; &lt;span class="tok-s2"&gt;&amp;quot;dest-file.part-&amp;quot;&lt;/span&gt;
&lt;span class="tok-gp"&gt;$&lt;/span&gt; cat dest-file.part-* &amp;gt; &lt;span class="tok-s2"&gt;&amp;quot;copy-of-source-file&amp;quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_non_unix_destination_and_zip_compression"&gt;2. Non-unix destination (and zip compression)&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;$&lt;/span&gt; zip -r -s 4095m dest-file.zip source-dir/&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Then simply open the file with &lt;code&gt;7zip&lt;/code&gt; on the destination machine.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</content><category term="Commandes"/><category term="shell"/><category term="storage"/></entry><entry><title>Mutt set opportunistic encryption</title><link href="https://grimoire.d12s.fr/2022/mutt_opportunistic_encrypt.html" rel="alternate"/><published>2022-06-20T00:00:00+02:00</published><updated>2022-06-20T00:00:00+02:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2022-06-20:/2022/mutt_opportunistic_encrypt.html</id><content type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Utiliser le mode de chiffrement opportuniste de Mutt : quand un destinataire est dans votre trousseau GPG, il active le chiffrement automatiquement. Ça évite d&amp;#8217;oublier.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;$&lt;/span&gt; vi .muttrc
&lt;span class="tok-go"&gt;set crypt_opportunistic_encrypt = yes&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;</content><category term="Commandes"/><category term="comfort"/><category term="mutt"/><category term="security"/></entry><entry><title>Python local HTTP server starting fast</title><link href="https://grimoire.d12s.fr/2022/python_httpserver.html" rel="alternate"/><published>2022-06-13T00:00:00+02:00</published><updated>2022-06-13T00:00:00+02:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2022-06-13:/2022/python_httpserver.html</id><summary type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Lancer rapidement un serveur web local.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;$ python -m http.server --bind 127.0.0.1 8000&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Details :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;$ python -m http.server \ &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
		--bind 127.0.0.1 \ &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;
			8000 &lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;(3)&lt;/b&gt;
Serving HTTP on 127.0.0.1 port 8000 (http://127.0.0.1:8000/) ...&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;This command starts a …&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;</summary><content type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Lancer rapidement un serveur web local.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;$ python -m http.server --bind 127.0.0.1 8000&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Details :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;$ python -m http.server \ &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
		--bind 127.0.0.1 \ &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;
			8000 &lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;(3)&lt;/b&gt;
Serving HTTP on 127.0.0.1 port 8000 (http://127.0.0.1:8000/) ...&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;This command starts a web server on your machine, serving by default the
content of the current folder. It&amp;#8217;s now needed by Firefox to load the CSS of
a local HTML file.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;The command starts instantly, but if you omit the &lt;code&gt;--bind 127.0.0.1&lt;/code&gt;
option, it binds to all local IPs available and it takes 10s on a modern and
strong configuration.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;You can omit the &lt;code&gt;8000&lt;/code&gt; port number (it&amp;#8217;s the
default), but you&amp;#8217;ll need to change it if you want to open another server at
the same time.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="admonitionblock note"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class="icon"&gt;
&lt;i class="fa icon-note" title="Note"&gt;&lt;/i&gt;
&lt;/td&gt;
&lt;td class="content"&gt;
I&amp;#8217;ve been reported normal / fast server launch time even with default settings on &lt;a href="https://queer.hacktivis.me/objects/d0ee9d97-1e0e-4ed8-b230-b202afa997a0"&gt;Mastodon&lt;/a&gt;. I also read other complaints on the net about this slow launch. The mystery persists.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="admonitionblock note"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class="icon"&gt;
&lt;i class="fa icon-note" title="Note"&gt;&lt;/i&gt;
&lt;/td&gt;
&lt;td class="content"&gt;
&lt;a href="https://docs.python.org/3/library/http.server.html" class="bare"&gt;https://docs.python.org/3/library/http.server.html&lt;/a&gt; : By default, the server binds itself to all interfaces. The option -b/--bind specifies a specific address to which it should bind. Both IPv4 and IPv6 addresses are supported. For example, the following command causes the server to bind to localhost only: python -m http.server --bind 127.0.0.1
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;</content><category term="Commandes"/><category term="code"/><category term="adminsys"/><category term="optimization"/><category term="network"/></entry><entry><title>Wait for a file to appear with inotifywait</title><link href="https://grimoire.d12s.fr/2022/wait_for_a_file.html" rel="alternate"/><published>2022-05-30T00:00:00+02:00</published><updated>2022-05-30T00:00:00+02:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2022-05-30:/2022/wait_for_a_file.html</id><summary type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Attendre l&amp;#8217;apparition d&amp;#8217;un fichier. Utile pour bloquer l&amp;#8217;exécution d&amp;#8217;un script jusqu&amp;#8217;à l&amp;#8217;arrivée du fichier créé en parallèle.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;$&lt;/span&gt; inotifywait -e close_write --include &lt;span class="tok-s1"&gt;&amp;#39;file_name&amp;#39;&lt;/span&gt; file/parent_dir/&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;code&gt;inotifywait&lt;/code&gt; waits for a file event. Here we wait for the &lt;code&gt;close_write&lt;/code&gt; event, so the closing of a file opened …&lt;/p&gt;&lt;/div&gt;</summary><content type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Attendre l&amp;#8217;apparition d&amp;#8217;un fichier. Utile pour bloquer l&amp;#8217;exécution d&amp;#8217;un script jusqu&amp;#8217;à l&amp;#8217;arrivée du fichier créé en parallèle.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;$&lt;/span&gt; inotifywait -e close_write --include &lt;span class="tok-s1"&gt;&amp;#39;file_name&amp;#39;&lt;/span&gt; file/parent_dir/&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;code&gt;inotifywait&lt;/code&gt; waits for a file event. Here we wait for the &lt;code&gt;close_write&lt;/code&gt; event, so the closing of a file opened in write mode (but not necessarily written in…). Then we filter the events to consider only the one matching the &lt;code&gt;--include&lt;/code&gt; regex and we watch in the &lt;code&gt;file/parent_dir/&lt;/code&gt; folder (and subfolders).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Usefull to stop a script execution until the file arrives.&lt;/p&gt;
&lt;/div&gt;</content><category term="Commandes"/><category term="shell"/><category term="code"/><category term="adminsys"/></entry><entry><title>Skip to next song in VLC (and other players)</title><link href="https://grimoire.d12s.fr/2022/playerctl_next_vlc.html" rel="alternate"/><published>2022-05-23T00:00:00+02:00</published><updated>2022-05-23T00:00:00+02:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2022-05-23:/2022/playerctl_next_vlc.html</id><summary type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Passer à la chanson suivant, depuis une console, avec VLC et d&amp;#8217;autres lecteurs multimédias. Pratique pour ajouter un raccourci clavier s&amp;#8217;il n&amp;#8217;est pas déjà prévu, moi j&amp;#8217;avais F9 de libre.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;$&lt;/span&gt; playerctl next vlc&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;The command &lt;code&gt;playerctl&lt;/code&gt; is found (in Artix Arch-based distributions) in the eponymous package …&lt;/p&gt;&lt;/div&gt;</summary><content type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Passer à la chanson suivant, depuis une console, avec VLC et d&amp;#8217;autres lecteurs multimédias. Pratique pour ajouter un raccourci clavier s&amp;#8217;il n&amp;#8217;est pas déjà prévu, moi j&amp;#8217;avais F9 de libre.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;$&lt;/span&gt; playerctl next vlc&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;The command &lt;code&gt;playerctl&lt;/code&gt; is found (in Artix Arch-based distributions) in the eponymous package.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Allows you to create a key shortcut if you don&amp;#8217;t have it already setup. I had F9 with icon yet…&lt;/p&gt;
&lt;/div&gt;</content><category term="Commandes"/><category term="comfort"/></entry><entry><title>comm : compare two sorted files line by line</title><link href="https://grimoire.d12s.fr/2022/comm_compare_files.html" rel="alternate"/><published>2022-05-16T00:00:00+02:00</published><updated>2022-05-16T00:00:00+02:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2022-05-16:/2022/comm_compare_files.html</id><summary type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;`comm` produit 3 colonnes séparées par des tabulations : - une colonne avec
les lignes qui ne sont présentes que dans le premier fichier, - une colonne
avec les lignes du 2nd seulement, - et une 3e colonne avec les lignes communes
aux deux.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;code&gt;comm&lt;/code&gt; produces three tab-separated columns:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;lines only in first file …&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;</summary><content type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;`comm` produit 3 colonnes séparées par des tabulations : - une colonne avec
les lignes qui ne sont présentes que dans le premier fichier, - une colonne
avec les lignes du 2nd seulement, - et une 3e colonne avec les lignes communes
aux deux.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;code&gt;comm&lt;/code&gt; produces three tab-separated columns:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;lines only in first file&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;lines only in second file&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;and common lines&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;$&lt;/span&gt; comm config_file config_file.old

&lt;span class="tok-go"&gt;New line in config_file&lt;/span&gt;
&lt;span class="tok-go"&gt;	Line of old file dropped in the new file&lt;/span&gt;
&lt;span class="tok-go"&gt;		Rest of the configuration that did not move&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;A graphical alternative would be &lt;a href="https://meldmerge.org/"&gt;Meld&lt;/a&gt; : a visual diff
and merge tool targeted at developers.&lt;/p&gt;
&lt;/div&gt;</content><category term="Commandes"/><category term="adminsys"/><category term="code"/></entry><entry><title>Convert system from BIOS boot to UEFI</title><link href="https://grimoire.d12s.fr/2022/convert_system_from_bios_boot_to_uefi.html" rel="alternate"/><published>2022-04-11T00:00:00+02:00</published><updated>2022-04-11T00:00:00+02:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2022-04-11:/2022/convert_system_from_bios_boot_to_uefi.html</id><summary type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Prendre un système qui a été installé sur un ordinateur en mode BIOS
et le copier sur un ordi en mode UEFI&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Add to &lt;code&gt;fstab&lt;/code&gt; the line corresponding to the EFI partition.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="fstab"&gt;&lt;span&gt;&lt;/span&gt;UUID=E7XX-23XX /boot/efi       vfat    umask=0077      0       1&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Be sure to set the correct UUID.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Create the …&lt;/p&gt;&lt;/div&gt;</summary><content type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Prendre un système qui a été installé sur un ordinateur en mode BIOS
et le copier sur un ordi en mode UEFI&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Add to &lt;code&gt;fstab&lt;/code&gt; the line corresponding to the EFI partition.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="fstab"&gt;&lt;span&gt;&lt;/span&gt;UUID=E7XX-23XX /boot/efi       vfat    umask=0077      0       1&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Be sure to set the correct UUID.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Create the &lt;code&gt;/boot/efi&lt;/code&gt; folder with the correct rights :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;#&lt;/span&gt; mkdir /boot/efi
&lt;span class="tok-gp"&gt;#&lt;/span&gt; chmod &lt;span class="tok-m"&gt;775&lt;/span&gt; /boot/efi&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Mount the corresponding partition : &lt;code&gt;mount -a&lt;/code&gt; (as our &lt;em&gt;fstab&lt;/em&gt; is up to date).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Get the right &lt;em&gt;grub&lt;/em&gt; for UEFI :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;#&lt;/span&gt; apt remove grub-pc grub-common
&lt;span class="tok-gp"&gt;#&lt;/span&gt; apt install grub-efi-amd64&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Reinstall &lt;em&gt;grub&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;#&lt;/span&gt; grub-install /dev/sdx &lt;span class="tok-o"&gt;(&lt;/span&gt;remplacer le x en fonction de la machine ou on est&lt;span class="tok-o"&gt;)&lt;/span&gt;
&lt;span class="tok-gp"&gt;#&lt;/span&gt; update grub&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Reboot the system.&lt;/p&gt;
&lt;/div&gt;</content><category term="Commandes"/><category term="adminsys"/></entry><entry><title>Access datetime attribute of HTML time tag via JavaScript</title><link href="https://grimoire.d12s.fr/2022/javascript_access_html_time_datetime.html" rel="alternate"/><published>2022-04-07T00:00:00+02:00</published><updated>2022-04-07T00:00:00+02:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2022-04-07:/2022/javascript_access_html_time_datetime.html</id><summary type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Accès à l&amp;#8217;attribut datetime de la balise HTML time via JavaScript&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="javascript"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="tok-kd"&gt;var&lt;/span&gt; &lt;span class="tok-nx"&gt;a&lt;/span&gt; &lt;span class="tok-o"&gt;=&lt;/span&gt; &lt;span class="tok-nb"&gt;document&lt;/span&gt;&lt;span class="tok-p"&gt;.&lt;/span&gt;&lt;span class="tok-nx"&gt;querySelector&lt;/span&gt;&lt;span class="tok-p"&gt;(&lt;/span&gt;&lt;span class="tok-s1"&gt;&amp;#39;time&amp;#39;&lt;/span&gt;&lt;span class="tok-p"&gt;)&lt;/span&gt;
&lt;span class="tok-o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="tok-nx"&gt;console&lt;/span&gt;&lt;span class="tok-p"&gt;.&lt;/span&gt;&lt;span class="tok-nx"&gt;log&lt;/span&gt;&lt;span class="tok-p"&gt;(&lt;/span&gt;&lt;span class="tok-nx"&gt;a&lt;/span&gt;&lt;span class="tok-p"&gt;)&lt;/span&gt;
&lt;span class="tok-o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tok-nx"&gt;time&lt;/span&gt; &lt;span class="tok-nx"&gt;datetime&lt;/span&gt;&lt;span class="tok-o"&gt;=&lt;/span&gt;&lt;span class="tok-s2"&gt;&amp;quot;2022-03-29T14:17:57+02:00&amp;quot;&lt;/span&gt;&lt;span class="tok-o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="tok-o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="tok-nx"&gt;a&lt;/span&gt;&lt;span class="tok-p"&gt;.&lt;/span&gt;&lt;span class="tok-nx"&gt;getAttribute&lt;/span&gt;&lt;span class="tok-p"&gt;(&lt;/span&gt;&lt;span class="tok-s1"&gt;&amp;#39;datetime&amp;#39;&lt;/span&gt;&lt;span class="tok-p"&gt;)&lt;/span&gt;
&lt;span class="tok-s2"&gt;&amp;quot;2022-03-29T14:17:57+02:00&amp;quot;&lt;/span&gt;
&lt;span class="tok-o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="tok-nx"&gt;a&lt;/span&gt;&lt;span class="tok-p"&gt;[&lt;/span&gt;&lt;span class="tok-s1"&gt;&amp;#39;datetime&amp;#39;&lt;/span&gt;&lt;span class="tok-p"&gt;]&lt;/span&gt; &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
&lt;span class="tok-kc"&gt;undefined&lt;/span&gt; &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;
&lt;span class="tok-o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="tok-nx"&gt;a&lt;/span&gt;&lt;span class="tok-p"&gt;[&lt;/span&gt;&lt;span class="tok-s1"&gt;&amp;#39;dateTime&amp;#39;&lt;/span&gt;&lt;span class="tok-p"&gt;]&lt;/span&gt; &lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;(3)&lt;/b&gt;
&lt;span class="tok-s2"&gt;&amp;quot;2022-03-29T14:17:57+02:00&amp;quot;&lt;/span&gt;
&lt;span class="tok-o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="tok-nx"&gt;a&lt;/span&gt;&lt;span class="tok-p"&gt;.&lt;/span&gt;&lt;span class="tok-nx"&gt;attributes …&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;</summary><content type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Accès à l&amp;#8217;attribut datetime de la balise HTML time via JavaScript&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="javascript"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="tok-kd"&gt;var&lt;/span&gt; &lt;span class="tok-nx"&gt;a&lt;/span&gt; &lt;span class="tok-o"&gt;=&lt;/span&gt; &lt;span class="tok-nb"&gt;document&lt;/span&gt;&lt;span class="tok-p"&gt;.&lt;/span&gt;&lt;span class="tok-nx"&gt;querySelector&lt;/span&gt;&lt;span class="tok-p"&gt;(&lt;/span&gt;&lt;span class="tok-s1"&gt;&amp;#39;time&amp;#39;&lt;/span&gt;&lt;span class="tok-p"&gt;)&lt;/span&gt;
&lt;span class="tok-o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="tok-nx"&gt;console&lt;/span&gt;&lt;span class="tok-p"&gt;.&lt;/span&gt;&lt;span class="tok-nx"&gt;log&lt;/span&gt;&lt;span class="tok-p"&gt;(&lt;/span&gt;&lt;span class="tok-nx"&gt;a&lt;/span&gt;&lt;span class="tok-p"&gt;)&lt;/span&gt;
&lt;span class="tok-o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tok-nx"&gt;time&lt;/span&gt; &lt;span class="tok-nx"&gt;datetime&lt;/span&gt;&lt;span class="tok-o"&gt;=&lt;/span&gt;&lt;span class="tok-s2"&gt;&amp;quot;2022-03-29T14:17:57+02:00&amp;quot;&lt;/span&gt;&lt;span class="tok-o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="tok-o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="tok-nx"&gt;a&lt;/span&gt;&lt;span class="tok-p"&gt;.&lt;/span&gt;&lt;span class="tok-nx"&gt;getAttribute&lt;/span&gt;&lt;span class="tok-p"&gt;(&lt;/span&gt;&lt;span class="tok-s1"&gt;&amp;#39;datetime&amp;#39;&lt;/span&gt;&lt;span class="tok-p"&gt;)&lt;/span&gt;
&lt;span class="tok-s2"&gt;&amp;quot;2022-03-29T14:17:57+02:00&amp;quot;&lt;/span&gt;
&lt;span class="tok-o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="tok-nx"&gt;a&lt;/span&gt;&lt;span class="tok-p"&gt;[&lt;/span&gt;&lt;span class="tok-s1"&gt;&amp;#39;datetime&amp;#39;&lt;/span&gt;&lt;span class="tok-p"&gt;]&lt;/span&gt; &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
&lt;span class="tok-kc"&gt;undefined&lt;/span&gt; &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;
&lt;span class="tok-o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="tok-nx"&gt;a&lt;/span&gt;&lt;span class="tok-p"&gt;[&lt;/span&gt;&lt;span class="tok-s1"&gt;&amp;#39;dateTime&amp;#39;&lt;/span&gt;&lt;span class="tok-p"&gt;]&lt;/span&gt; &lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;(3)&lt;/b&gt;
&lt;span class="tok-s2"&gt;&amp;quot;2022-03-29T14:17:57+02:00&amp;quot;&lt;/span&gt;
&lt;span class="tok-o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="tok-nx"&gt;a&lt;/span&gt;&lt;span class="tok-p"&gt;.&lt;/span&gt;&lt;span class="tok-nx"&gt;attributes&lt;/span&gt;&lt;span class="tok-p"&gt;[&lt;/span&gt;&lt;span class="tok-s1"&gt;&amp;#39;datetime&amp;#39;&lt;/span&gt;&lt;span class="tok-p"&gt;].&lt;/span&gt;&lt;span class="tok-nx"&gt;value&lt;/span&gt; &lt;i class="conum" data-value="4"&gt;&lt;/i&gt;&lt;b&gt;(4)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;The Array notation is faster to access attributes (and compact)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;But this attribute is suddenly undefined ?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;It has an alternative name when you access it this way (note the 'T' instead of &lt;em&gt;t&lt;/em&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="4"&gt;&lt;/i&gt;&lt;b&gt;4&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Regular HTML tag attributes are stored in the &lt;code&gt;attributes&lt;/code&gt; property. &lt;code&gt;dateTime&lt;/code&gt; is just an exception. A better notation, the one preferred in Meta-Press.es is : &lt;code&gt;a.attributes.datetime.value&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;</content><category term="Commandes"/><category term="Firefox"/><category term="JavaScript"/><category term="code"/><category term="date"/><category term="metadata"/></entry><entry><title>Initialisation Android 12</title><link href="https://grimoire.d12s.fr/2022/initialisation_android_2022.html" rel="alternate"/><published>2022-03-09T00:00:00+01:00</published><updated>2022-03-09T00:00:00+01:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2022-03-09:/2022/initialisation_android_2022.html</id><summary type="html">&lt;div id="toc" class="toc"&gt;
&lt;div id="toctitle"&gt;Index&lt;/div&gt;
&lt;ul class="sectlevel1"&gt;
&lt;li&gt;&lt;a href="#_version_en"&gt;1. version : en&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_version_fr"&gt;2. version : fr&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_version_en"&gt;1. version : en&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Did you experienced an Android initialization procedure on a brand new Samsung smartphone computer lastly ?&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;It&amp;#8217;s a &lt;strong&gt;long&lt;/strong&gt; process !&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Google, than Samsung try to force you into the creation of accounts over their respective servers using the worse DarkPatterns …&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</summary><content type="html">&lt;div id="toc" class="toc"&gt;
&lt;div id="toctitle"&gt;Index&lt;/div&gt;
&lt;ul class="sectlevel1"&gt;
&lt;li&gt;&lt;a href="#_version_en"&gt;1. version : en&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_version_fr"&gt;2. version : fr&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_version_en"&gt;1. version : en&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Did you experienced an Android initialization procedure on a brand new Samsung smartphone computer lastly ?&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;It&amp;#8217;s a &lt;strong&gt;long&lt;/strong&gt; process !&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Google, than Samsung try to force you into the creation of accounts over their respective servers using the worse DarkPatterns…&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;For example : in Android 12 there is no calculator, you have to create an account on Google Play Store to find such a simple tool.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;And to ensure you won&amp;#8217;t forget, a permanent notification announce that the configuration is not finished yet as long as you did not yield… &lt;sup class="footnote"&gt;[&lt;a id="_footnoteref_1" class="footnote" href="#_footnotedef_1" title="View footnote."&gt;1&lt;/a&gt;]&lt;/sup&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Or else the smartphone downloads and announces a possible component update from the main menu, but you won&amp;#8217;t be able to deploy it without a Samsung account…&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;There is still as much &lt;a href="/2021/uninstall_android_bloatware.html"&gt;&lt;em&gt;bloatware&lt;/em&gt;&lt;/a&gt; now even soldered into the system… It started with clouds or drives with their official system menu entries, and now on you&amp;#8217;ll find Spotify integration to the alarm app, to find original ringtones !&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;And to finish, the boot process of this machine are now festive with two error messages :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;a Warning you unlocked your bootloader, it&amp;#8217;s bad, it&amp;#8217;s dangerous (written in yellow) ;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;a Warning you&amp;#8217;re not running the official system (that we bloated with love&amp;#8201;&amp;#8212;&amp;#8201;of the money), it&amp;#8217;s bad, it&amp;#8217;s dangerous (written in red !)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Both with their small Warning danger signs : /!\ &lt;sup class="footnote"&gt;[&lt;a id="_footnoteref_2" class="footnote" href="#_footnotedef_2" title="View footnote."&gt;2&lt;/a&gt;]&lt;/sup&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_version_fr"&gt;2. version : fr&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Avez-vous acheté un téléphone neuf sous Android récemment ? La procédure d&amp;#8217;initialisation est longue !&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Google, puis Samsung tentent de vous forcer à créer un compte sur leurs serveurs en usant des pires DarkPatterns…&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Par exemple : dans Android 12 il n&amp;#8217;y a pas de calculatrice, il faut créer un compte Google Play Store pour retrouver ce simple outil.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Et pour ne pas passer à côté, une notification permanente annonce que la configuration de l&amp;#8217;appareil n&amp;#8217;est pas terminée tant que vous n&amp;#8217;avez pas cédé… &lt;sup class="footnote"&gt;[&lt;a id="_footnoteref_3" class="footnote" href="#_footnotedef_3" title="View footnote."&gt;3&lt;/a&gt;]&lt;/sup&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Ou alors le téléphone qui télécharge et annonce depuis le menu des paramètres, une mise à jour possible pour un composant, qui ne se mettra à jour que si vous créez un compte Samsung…&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Sans parler du &lt;a href="/2021/uninstall_android_bloatware.html"&gt;&lt;em&gt;bloatware&lt;/em&gt;&lt;/a&gt; soudé dans le système… Ça a commencé par les "clouds" et autre "drives" Google ou Samsung qui avaient leur propre entrée dans le menu des paramètres. Mais désormais on retrouve Spotify comme fournisseur officiel de sonnerie pour le réveil !&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Et puis les démarrages de cette machine sont désormais égayés par deux messages d&amp;#8217;erreur :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;le Attention vous avez débloqué votre bootloader, c&amp;#8217;est pas bien c&amp;#8217;est dangereux, écrit en jaune ;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;suivi de près du Attention vous n&amp;#8217;utilisez pas le système officiel tout pourri par nos soins, c&amp;#8217;est pas bien c&amp;#8217;est dangereux, écrit en rouge !&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Les deux avec leurs petits panneaux "attention danger" : /!\ &lt;sup class="footnote"&gt;[&lt;a id="_footnoteref_4" class="footnote" href="#_footnotedef_4" title="View footnote."&gt;4&lt;/a&gt;]&lt;/sup&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="footnotes"&gt;
&lt;hr&gt;
&lt;div class="footnote" id="_footnotedef_1"&gt;
&lt;a href="#_footnoteref_1"&gt;1&lt;/a&gt;. This is a system builtin notification that you can&amp;#8217;t dismiss, reduce nor hide. To get rid of it, you must connect your device to internet and refuse once more to open Google and Samsung accounts, then the procedure send something online and Android accepts to hide it at last.
&lt;/div&gt;
&lt;div class="footnote" id="_footnotedef_2"&gt;
&lt;a href="#_footnoteref_2"&gt;2&lt;/a&gt;. It comes from good intention, to warn users against rootkits. But it&amp;#8217;s such a shame that we can&amp;#8217;t validate ourselves the system we want. It&amp;#8217;s like an unfinished job. Still, for someone willing to endure the system as sold, it protects against intrusions.
&lt;/div&gt;
&lt;div class="footnote" id="_footnotedef_3"&gt;
&lt;a href="#_footnoteref_3"&gt;3&lt;/a&gt;. Cette notification émane du système lui-même et vous ne pouvez ni la fermer, ni la réduire, ni la masquer. Pour s&amp;#8217;en débarasser, il faut connecter la machine à internet et repasser la procédure d&amp;#8217;initialisation en refusant à nouveau la création des comptes Google et Samsung, une information est alors envoyée sur le net et Android accepte enfin de fermer la notification.
&lt;/div&gt;
&lt;div class="footnote" id="_footnotedef_4"&gt;
&lt;a href="#_footnoteref_4"&gt;4&lt;/a&gt;. Ça part d&amp;#8217;une bonne intention, ça permet de détecter des rootkits. Mais c’est dommage qu’on ne puisse pas valider nous-mêmes une installation donnée. Ça ne fait pas très "fini". Après, pour une personne qui souhaite endurer le système tel qu&amp;#8217;il est vendu, ça aide à détecter une intrusion grave.
&lt;/div&gt;
&lt;/div&gt;</content><category term="Articles"/><category term="adminsys"/><category term="install"/><category term="android"/></entry><entry><title>Git : revert commits (reset, amend, rebase)</title><link href="https://grimoire.d12s.fr/2022/git_reset_rebase_amend.html" rel="alternate"/><published>2022-03-07T00:00:00+01:00</published><updated>2022-03-07T00:00:00+01:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2022-03-07:/2022/git_reset_rebase_amend.html</id><summary type="html">&lt;div id="preamble"&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Plusieurs méthodes pour annuler des modifications non commitées ou des commits
non envoyés avec &lt;code&gt;git&lt;/code&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_reset"&gt;1. Reset&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-go"&gt;git reset --hard HEAD  &lt;/span&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt; &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;This will revert your repository to the distant state&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;Permet de revenir à l&amp;#8217;état distant du dépôt&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-go"&gt;git reset --soft HEAD~  &lt;/span&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt; &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1 …&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</summary><content type="html">&lt;div id="preamble"&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Plusieurs méthodes pour annuler des modifications non commitées ou des commits
non envoyés avec &lt;code&gt;git&lt;/code&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_reset"&gt;1. Reset&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-go"&gt;git reset --hard HEAD  &lt;/span&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt; &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;This will revert your repository to the distant state&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;Permet de revenir à l&amp;#8217;état distant du dépôt&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-go"&gt;git reset --soft HEAD~  &lt;/span&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt; &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Cancel the last local (non-pushed) commit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;Annuler le dernier commit local (non-envoyé)&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_amend"&gt;2. Amend&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-go"&gt;git commit --amend  &lt;/span&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt; &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Add new modifications to your previous local commit (if not pushed yet)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;Ajouter de nouvelles modifications à votre précédent commit local (non-envoyé)&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_rebase"&gt;3. Rebase&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-go"&gt;git rebase -i HEAD~2  &lt;/span&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt; &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Squash your last two commits&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;Fusionner vos deux derniers commits&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;This is an edge case of the &lt;code&gt;git rebase&lt;/code&gt; command that can do bigger operations
on trees and branches.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</content><category term="Commandes"/><category term="Git"/><category term="code"/></entry><entry><title>Git : create repository</title><link href="https://grimoire.d12s.fr/2022/git_create_repository.html" rel="alternate"/><published>2022-02-28T00:00:00+01:00</published><updated>2022-02-28T00:00:00+01:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2022-02-28:/2022/git_create_repository.html</id><summary type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Création d&amp;#8217;un dépôt &lt;code&gt;git&lt;/code&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;$&lt;/span&gt; &lt;span class="tok-nb"&gt;cd&lt;/span&gt; project/
&lt;span class="tok-gp"&gt;$&lt;/span&gt; git init
&lt;span class="tok-gp"&gt;$&lt;/span&gt; git add *
&lt;span class="tok-gp"&gt;$&lt;/span&gt; git commit&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;But where to &lt;code&gt;git push&lt;/code&gt; to ?&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;$&lt;/span&gt; git clone --bare . name_of_project.git
&lt;span class="tok-gp"&gt;$&lt;/span&gt; scp -r name_of_project.git distant.machine.tld:&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Then you can create a new working copy (maybe on another machine) with :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;$&lt;/span&gt; git clone ssh://distant.machine.tld …&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;</summary><content type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Création d&amp;#8217;un dépôt &lt;code&gt;git&lt;/code&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;$&lt;/span&gt; &lt;span class="tok-nb"&gt;cd&lt;/span&gt; project/
&lt;span class="tok-gp"&gt;$&lt;/span&gt; git init
&lt;span class="tok-gp"&gt;$&lt;/span&gt; git add *
&lt;span class="tok-gp"&gt;$&lt;/span&gt; git commit&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;But where to &lt;code&gt;git push&lt;/code&gt; to ?&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;$&lt;/span&gt; git clone --bare . name_of_project.git
&lt;span class="tok-gp"&gt;$&lt;/span&gt; scp -r name_of_project.git distant.machine.tld:&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Then you can create a new working copy (maybe on another machine) with :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;$&lt;/span&gt; git clone ssh://distant.machine.tld:/path/to/name_of_project.git
&lt;span class="tok-gp"&gt;$&lt;/span&gt; &lt;span class="tok-nb"&gt;cd&lt;/span&gt; name_of_project/
&lt;span class="tok-go"&gt; [edit]&lt;/span&gt;
&lt;span class="tok-gp"&gt;$&lt;/span&gt; git commit -am &lt;span class="tok-s2"&gt;&amp;quot;edit&amp;quot;&lt;/span&gt;
&lt;span class="tok-gp"&gt;$&lt;/span&gt; git push&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;</content><category term="Commandes"/><category term="Git"/><category term="code"/></entry><entry><title>Initialisation Windows 10</title><link href="https://grimoire.d12s.fr/2022/initialisation_windows_2022.html" rel="alternate"/><published>2022-02-22T00:00:00+01:00</published><updated>2022-02-22T00:00:00+01:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2022-02-22:/2022/initialisation_windows_2022.html</id><summary type="html">&lt;div id="toc" class="toc"&gt;
&lt;div id="toctitle"&gt;Index&lt;/div&gt;
&lt;ul class="sectlevel1"&gt;
&lt;li&gt;&lt;a href="#_version_en"&gt;1. version : en&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_version_fr"&gt;2. version : fr&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_version_en"&gt;1. version : en&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Did you experienced a Windows initialization procedure on a brand new HP laptop computer lastly ?&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;It&amp;#8217;s a &lt;strong&gt;long&lt;/strong&gt; process !&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Windows deploy the maximum bad will it can via it&amp;#8217;s interface to force you into the creation of an …&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</summary><content type="html">&lt;div id="toc" class="toc"&gt;
&lt;div id="toctitle"&gt;Index&lt;/div&gt;
&lt;ul class="sectlevel1"&gt;
&lt;li&gt;&lt;a href="#_version_en"&gt;1. version : en&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_version_fr"&gt;2. version : fr&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_version_en"&gt;1. version : en&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Did you experienced a Windows initialization procedure on a brand new HP laptop computer lastly ?&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;It&amp;#8217;s a &lt;strong&gt;long&lt;/strong&gt; process !&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Windows deploy the maximum bad will it can via it&amp;#8217;s interface to force you into the creation of an account on their servers then asks 4 times in a raw for the permission to send various personnal machine usage statistics.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;And once you got rid of the Microsoft interrogatory, it&amp;#8217;s HP that continues with a synchronised bad faith to asks the sames things : account creation and statistics collections (legal spying).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;When you&amp;#8217;re new virtual desk is finally displayed, 20 minutes later, it is full of &lt;a href="/2021/uninstall_android_bloatware.html"&gt;bloatware&lt;/a&gt;, worse than a Samsung smartphone !&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;A dozen paying softwares, pre-installed on open shareware trial period, to remove one by one because Windows still can&amp;#8217;t remove many softwares at once (in 2022).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;As an example of what struggle with, the second antivirus of the system asks you if you&amp;#8217;re sure you want to remove it despite the running valid (testing) offer you have !?&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;So the bootstrap procedure takes over 1h full of wild darkpatterns…&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;strong&gt;Windows, you buy it at the store and it spits you in the face once at home !&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Sometimes, when I struggle to install an old printer under GNU+Linux during benevolant hour at &lt;a href="https://www.gebull.org"&gt;GEBULL LUG&lt;/a&gt; on thursday evenings, I wonders if it&amp;#8217;s really the way to go : encouraging users (I mean people uninterested by computers) to use free libres softwares. It clearly requires a minimum of implication and DIY willingness.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;strong&gt;But nothing replaces the trust-worthiness of free softwares.&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Windows, Facebook, Google… they&amp;#8217;re just human mousetraps.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_version_fr"&gt;2. version : fr&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Avez-vous eu l&amp;#8217;occasion d&amp;#8217;assister à la mise en service d&amp;#8217;un ordinateur HP sous Windows dernièrement ?&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;La procédure est LONGUE !&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Windows emploi la plus grande mauvaise foi dans son interface pour forcer la création d&amp;#8217;un compte sur leurs serveurs puis demande 4x de suite la permission d&amp;#8217;envoyer diverses statistiques sur votre utilisation de la machine.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Et une fois débarrassé de l&amp;#8217;interrogatoire Microsoft, c&amp;#8217;est HP qui prend le relais avec une mauvaise foi coordonnée, pour demander les mêmes choses : création de compte, espionage légal (enfin envoi de stats…)&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Quand enfin le bureau s&amp;#8217;affiche, 20 min plus tard, c&amp;#8217;est pourri de &lt;a href="/2021/uninstall_android_bloatware.html"&gt;&lt;em&gt;bloatware&lt;/em&gt;&lt;/a&gt; (du pourriciel) pire qu&amp;#8217;un téléphone Samsung !&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Une dizaine de logiciels payants, pré-installés en période d&amp;#8217;essai, à virer un par un car Windows ne sait toujours pas en enlever plusieurs en parallèles (ni en groupe) (en 2022).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Le 2e antivirus du système demande si vous êtes bien sûr de vouloir le désinstaller malgré l&amp;#8217;offre en cours de validité !?&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Bref la "mise en route" c&amp;#8217;est 1h de &lt;em&gt;darkpattern&lt;/em&gt; en folie.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;strong&gt;Windows vous le payez à l&amp;#8217;achat et il vous crache encore copieusement au visage à l&amp;#8217;usage !&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Des fois quand je lutte pour installer bénévolement une imprimante sous un GNU+Linux à &lt;a href="https://www.gebull.org"&gt;GEBULL&lt;/a&gt; le jeudi soir, je me demande si c&amp;#8217;est bien raisonnable d&amp;#8217;encourager des utilisateurs pas intéressés par l&amp;#8217;informatique à utiliser des logiciels libres. Ça demande un minimum d&amp;#8217;implication et de débrouillardise.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;strong&gt;Mais rien ne vaut l&amp;#8217;honnêteté des logiciels libres.&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Windows, Facebook, Google… c&amp;#8217;est juste des souricières à humain.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</content><category term="Articles"/><category term="adminsys"/><category term="install"/></entry><entry><title>vim : remove empty lines</title><link href="https://grimoire.d12s.fr/2022/vim_remove_empty_lines.html" rel="alternate"/><published>2022-02-13T00:00:00+01:00</published><updated>2022-02-13T00:00:00+01:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2022-02-13:/2022/vim_remove_empty_lines.html</id><summary type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Supprimer les lignes vides d&amp;#8217;un fichier texte avec &lt;code&gt;vi&lt;/code&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="vim"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-p"&gt;:&lt;/span&gt;&lt;span class="tok-k"&gt;g&lt;/span&gt;&lt;span class="tok-sr"&gt;/^$/&lt;/span&gt;&lt;span class="tok-k"&gt;d&lt;/span&gt;   &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt; &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt; &lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;(3)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;g&lt;/code&gt; executes an Ex command on a pattern-matched text, search in a range (&lt;code&gt;%g&lt;/code&gt; for instance, default to whole file).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;The regex here is &lt;code&gt;^$&lt;/code&gt; it matches lines that starts and ends with nothing …&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;</summary><content type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Supprimer les lignes vides d&amp;#8217;un fichier texte avec &lt;code&gt;vi&lt;/code&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="vim"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-p"&gt;:&lt;/span&gt;&lt;span class="tok-k"&gt;g&lt;/span&gt;&lt;span class="tok-sr"&gt;/^$/&lt;/span&gt;&lt;span class="tok-k"&gt;d&lt;/span&gt;   &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt; &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt; &lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;(3)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;g&lt;/code&gt; executes an Ex command on a pattern-matched text, search in a range (&lt;code&gt;%g&lt;/code&gt; for instance, default to whole file).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;The regex here is &lt;code&gt;^$&lt;/code&gt; it matches lines that starts and ends with nothing in between.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;d&lt;/code&gt; is the delete command&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;More info about the '&lt;a href="https://vim.fandom.com/wiki/Power_of_g"&gt;power of g&lt;/a&gt;' here : &lt;a href="https://vim.fandom.com/wiki/Power_of_g" class="bare"&gt;https://vim.fandom.com/wiki/Power_of_g&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;</content><category term="Commandes"/><category term="Vim"/><category term="regex"/></entry><entry><title>Piper to configure gaming mouse</title><link href="https://grimoire.d12s.fr/2022/gaming_mouse.html" rel="alternate"/><published>2022-01-31T00:00:00+01:00</published><updated>2022-01-31T00:00:00+01:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2022-01-31:/2022/gaming_mouse.html</id><summary type="html">&lt;div id="toc" class="toc"&gt;
&lt;div id="toctitle"&gt;Index&lt;/div&gt;
&lt;ul class="sectlevel1"&gt;
&lt;li&gt;&lt;a href="#_version_en"&gt;1. version : en&lt;/a&gt;
&lt;ul class="sectlevel2"&gt;
&lt;li&gt;&lt;a href="#_buttons"&gt;1.1. Buttons&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_dpi"&gt;1.2. DPI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_supported_acceleration"&gt;1.3. Supported acceleration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_polling_rates"&gt;1.4. Polling rates&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_profiles"&gt;1.5. Profiles&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#_version_fr"&gt;2. version : fr&lt;/a&gt;
&lt;ul class="sectlevel2"&gt;
&lt;li&gt;&lt;a href="#_boutons"&gt;2.1. Boutons&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_dpi_2"&gt;2.2. DPI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_accélération_supportée"&gt;2.3. Accélération supportée&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_vitesse_de_communication"&gt;2.4. Vitesse de communication&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_profils"&gt;2.5. Profils&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_version_en"&gt;1. version : en&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Gaming mice might be tracked …&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</summary><content type="html">&lt;div id="toc" class="toc"&gt;
&lt;div id="toctitle"&gt;Index&lt;/div&gt;
&lt;ul class="sectlevel1"&gt;
&lt;li&gt;&lt;a href="#_version_en"&gt;1. version : en&lt;/a&gt;
&lt;ul class="sectlevel2"&gt;
&lt;li&gt;&lt;a href="#_buttons"&gt;1.1. Buttons&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_dpi"&gt;1.2. DPI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_supported_acceleration"&gt;1.3. Supported acceleration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_polling_rates"&gt;1.4. Polling rates&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_profiles"&gt;1.5. Profiles&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#_version_fr"&gt;2. version : fr&lt;/a&gt;
&lt;ul class="sectlevel2"&gt;
&lt;li&gt;&lt;a href="#_boutons"&gt;2.1. Boutons&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_dpi_2"&gt;2.2. DPI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_accélération_supportée"&gt;2.3. Accélération supportée&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_vitesse_de_communication"&gt;2.4. Vitesse de communication&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_profils"&gt;2.5. Profils&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_version_en"&gt;1. version : en&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Gaming mice might be tracked down as appeared twenty years ago, following First
Person Shoot (FPS) / shoot them up game success (Doom, Quake, Counter-Strike…).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;In those combat games, humans were confronting over their speed and accuracy to
use a mouse. In this context mouse performances started to make differences,
while the previous metrics was more or less : is it working on my desk ? (or
will I have to use a mouse pad or a sheet of paper) It was rarely working on
glass desks…&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;The first "performance" mouse I heard of was the Logitech MouseMan Dual Optical
was the first mouse to use two optical sensors reaching sensibility of 800 DPI
with 4 buttons onboard in late 2001.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_buttons"&gt;1.1. Buttons&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Regarding buttons, the first computer mice had 3 buttons (for 3 fingers), but
some brands went for less, two buttons for Microsoft or even only one for Apple.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;For gaming purpose more and more buttons were added, up to 20, but you end up
with a keyboard under your thumb and it&amp;#8217;s easy to miss-type something with it.
Modern gaming mice have around 10 buttons :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;two for fingers&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;the clickable wheel (with also side direction clics scrolling web pages)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;two for the thumb (backward and forward actions, in browser history for instance)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;and one or two for DPI management&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;2020 gaming mice have buttons supporting tens of millions of actuations (as per
manufacturer statements, some use actuators from medical manufacturer, like
Omron).&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_dpi"&gt;1.2. DPI&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;DPI ? It stands for Dot Per Inch and reflects the accuracy of the optical
sensor by the quantity of pixels the computer cursor can be moved onscreen when
the mouse moves one inch (2,54 cm) on the desk. Values were at 400 DPI before
the dual sensor mouse of Logitech and raised regularly since.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;But only for gaming mice. The DPI of early optical mice were not enough for big
screen resolutions and every operating systems implemented an acceleration
factor for mouse movements. This way, 800 DPI are still enough for everyday
use. But in a quest of sharpness, recent mice brag out with 25 600 DPI. To be
able to use such mouse resolutions you&amp;#8217;ll have to disable your operating system
mouse acceleration.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Every GNU+Linux based desktop environment allows this from setting panels, but
it can also be achieved via &lt;code&gt;Xorg&lt;/code&gt; configuration :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;code&gt;# vim /etc/X11/xorg.conf.d/50-mouse-acceleration.conf&lt;/code&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="X11"&gt;Section "InputClass"
    Identifier "My Mouse"
    Driver "libinput"
    MatchIsPointer "yes"
    Option "AccelProfile" "flat"
    Option "AccelSpeed" "0"
EndSection&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Without software acceleration, 16 000 DPI becomes an acceptable setting for 4k
screen resolutions (3840px wide), and this way, your cursor will move at
constant proportional speed regarding mouse movements, it&amp;#8217;s easier to tame.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_supported_acceleration"&gt;1.3. Supported acceleration&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Early optical mice were a bit slow filming your desk to compute the shift
between two images and report that vector to the computer. This resulted in
lost tracks and a still cursor if you moved the mouse too fast. A real problem
for gamers.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;The limit was at 2 m/s until the Logitech G500 in 2005. It raised at 4,7 m/s
(and no more problem for a majority of users) with the G500S 4 years after.
It&amp;#8217;s now (2022) 10 m/s, the equivalent of 40G of acceleration for the G502 HERO
high performance. It represents 400 IPS (Image Per Seconds).&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_polling_rates"&gt;1.4. Polling rates&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Another evolution over the last decade was about the communication rate.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Traditional plug-n-play mice report their position 125 times by second to the
computer (when a movement is made, polling at 12 Hz else). Gaming mice raised
this rate to 1 kHz. It&amp;#8217;s not so impressive in the world of computers and
Gigahertz, but when introduced, it could raise the CPU usage of a modern
computer to 60%, just shaking the mouse. This looks overkill now but it allows
to report a mouse movement up to 8 ms faster than a traditional mouse.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;For comparison, &lt;a href="https://www.neuroxtrain.com/article/64662/"&gt;the Tülin et al.
2013 study&lt;/a&gt; reports :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;around 420 ms of reaction time for average people&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;and around 340 ms for trained athletes&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;With single stimulus, and an advantage of only 10 ms (to 70 ms) for judokas over
everyone else in multiple stimuli context (when other people are slow down by
100 to 200 ms).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;In the context of virtual combats, it might represent a 2% faster reaction from
the player. So, even if it&amp;#8217;s ridiculous to load your computer with a task as
basic as mouse tracking, it makes a significant difference during competitions.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Other manufacturers tried to push further like Razer with its Viper mouse at 8
kHz available since early 2021. This time its about a gain of 1 ms, harder to
defend regarding the computing cost. The initiative made no children yet, the
other mouse manufacturers focusing in making lighter devices.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_profiles"&gt;1.5. Profiles&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;It leads us to the last improvement of gaming mice : the embedded user profiles.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;With adjustable DPI, polling rates and button bindings ; gaming mice can be
configured for different tasks and contexts. To help at this they can now embed
multiple setting profiles that you can cycle through (via one of the buttons).
This allows to set a slow polling rate for everyday use and a fast one for
gaming, without launching the configuration tool in between.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;With GNU+Linux, a configuration tool exists for the mainstream gaming mice
(including Logitech G502 ones) : it is called &lt;code&gt;piper&lt;/code&gt;
&lt;sup class="footnote"&gt;[&lt;a id="_footnoteref_1" class="footnote" href="#_footnotedef_1" title="View footnote."&gt;1&lt;/a&gt;]&lt;/sup&gt; (the mouse trap).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;# pacman -Ss piper
$ piper&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Or &lt;code&gt;apt install piper&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;It even allows to configure (including turning off) the onboard RGB decorative
LED, that might find a use for team colors during competitions, but are a waste
of energy from my point of view in everyday use.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;To finish, I still search for office use cases of gaming mice… even with a 16
000 DPI mouse the width of a column in LibreOffice calc can&amp;#8217;t be set by 0,01 cm
steps…&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_version_fr"&gt;2. version : fr&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Les souris pour jeu vidéo sont apparues il y a 20 ans, embrayant le pas des FPS
(&lt;em&gt;First Person Shoot&lt;/em&gt;) à succès tels que Doom, Quake ou Counter-Strike…&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Dans ces jeux de combat, les humains s&amp;#8217;affrontent principalement à la souris et
leur habileté à manier cet engin s&amp;#8217;en trouve mise en exergue. C&amp;#8217;est dans ce
contexte que les performances des souris &lt;em&gt;gamers&lt;/em&gt; ont commencées à compter,
alors que jusque là on s&amp;#8217;intéressait surtout à savoir si une souris allait
fonctionner directement sur son bureau ou non (auquel cas il faudrait s&amp;#8217;équiper
d&amp;#8217;un tapis de souris, ou intercaler une feuille A4). Ça marchait d&amp;#8217;ailleurs
rarement sur un bureau en verre ou un motif imprimé uni…&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;La première souris "haute performance" dont j&amp;#8217;ai entendu parler fut la Logitech
MouseMan Dual Optical, c&amp;#8217;était la première a utiliser deux capteurs optiques,
atteignant une sensibilité de 800 DPI accompagnée de 4 boutons, fin 2001.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_boutons"&gt;2.1. Boutons&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Avant de revenir aux DPI, un mot sur les boutons. Les premières souris
d&amp;#8217;ordinateur avaient 3 boutons, un par doigt posé sur la souris. Certains
constructeurs choisirent d&amp;#8217;en retirer. Ainsi les souris Microsoft n&amp;#8217;en avaient
que deux et Apple n&amp;#8217;en mit qu&amp;#8217;un seul.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Les souris pour joueurs furent elles équipées de plus de boutons, parfois
jusqu&amp;#8217;à 20, ce qui n&amp;#8217;est en fait pas très pratique. Les souris actuelles ont
autour de 10 boutons :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;deux pour les doigts&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;la molette cliquable (y compris latéralement pour faire défiler une page web par exemple) ;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;deux au pouce (pour se déplacer en arrière ou en avant dans l&amp;#8217;historique de navigation) ;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;et un ou deux pour régler les DPI de la sensibilité…&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Les souris pour joueurs de 2020 ont des boutons qui supportent des dizaines de
millions de clics (d&amp;#8217;après leurs constructeurs).&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_dpi_2"&gt;2.2. DPI&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;DPI ? Ça veut dire &lt;em&gt;Dot Per Inch&lt;/em&gt; (points par pouce, un pouce mesurant 2,54 cm).
Ça reflète la précision du capteur optique de la souris et donc la quantité
de pixels que le curseur de l&amp;#8217;ordinateur peut parcourir sur l&amp;#8217;écran pour un
mouvement de 2,54 cm effectué par la souris sur le bureau. Ces valeurs
tournaient autour de 400 DPI avant l&amp;#8217;apparition de la souris Logitech à double
capteurs et elles ont continué à s&amp;#8217;élever pour les souris de jeu depuis.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Mais seulement pour les souris de joueur. En effet, les DPI des premières
souris n&amp;#8217;étant pas assez élevés pour les écrans de l&amp;#8217;époque, chaque système
d&amp;#8217;exploitation a implémenté un facteur d&amp;#8217;accélération logicielle des mouvements
de souris. Du coup, 800 DPI sont encore largement suffisants aujourd&amp;#8217;hui pour
un usage bureautique, quand la course à la précision abouti à des souris
enregistrant 25 600 DPI. Mais de telles valeurs ne sont utilisables qu&amp;#8217;en
désactivant l&amp;#8217;accélération logicielle de son système d&amp;#8217;exploitation.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Il est possible de régler cette accélération via à peu près n&amp;#8217;importe quel
environnement graphique GNU+Linux, et à l&amp;#8217;aide de la souris justement, mais
c&amp;#8217;est également possible via un fichier de configuration &lt;code&gt;Xorg&lt;/code&gt; :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;code&gt;# vim /etc/X11/xorg.conf.d/50-mouse-acceleration.conf&lt;/code&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="X11"&gt;Section "InputClass"
    Identifier "My Mouse"
    Driver "libinput"
    MatchIsPointer "yes"
    Option "AccelProfile" "flat"
    Option "AccelSpeed" "0"
EndSection&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Une fois débarrassé de l&amp;#8217;accélération logicielle, une valeur de 16 000 DPI est
acceptable pour une résolution d&amp;#8217;écran 4k (de 3840 pixels de large) et votre
curseur se déplace alors avec une vitesse constamment proportionnelle aux
déplacements de la souris, ce qui est confortable et plus facile à maîtriser finement.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_accélération_supportée"&gt;2.3. Accélération supportée&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Les premières souris optiques étaient un peu lentes à filmer votre bureau pour
calculer l&amp;#8217;écart entre deux images et envoyer le vecteur correspondant à
l&amp;#8217;ordinateur. Cela se traduisait par des décrochements lors des mouvements
rapides du joueur et un curseur qui reste sur place. Généralement suivi de peu
par un &lt;em&gt;frag&lt;/em&gt;, c&amp;#8217;est à dire une défaite rapide et cuisante, un adversaire
tirant parti de votre soudaine immobilité pour vous tirer dessus. Un vrai
problème donc.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;La limite se situait autour de 2 m/s pour les souris laser jusqu&amp;#8217;à
l&amp;#8217;introduction de la souris G500S de Logitech en 2009 (les technologiques
précédentes, à simple LED, étant souvent plus véloces) qui la repoussa à 4,7
m/s (ce qui réglait le problème pour la grande majorité des joueurs). En 2020
la G502 HERO de Logitech repousse cette limite à 10 m/s, soit une accélération
de 40G, rendue possible par une numérisation de votre bureau en 400 images par
seconde.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_vitesse_de_communication"&gt;2.4. Vitesse de communication&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Une autre évolution notable au court de la dernière décennie concerne la
fréquence de communication entre la souris et l&amp;#8217;ordinateur.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Traditionnellement, les souris plug-n-play indiquent leur position 125x par
seconde à l&amp;#8217;ordinateur (lorsqu&amp;#8217;il y a du mouvement et descendent à 12 Hz
sinon). Les souris pour joueur sont elles capables de communiquer jusqu&amp;#8217;à 1
kHz. Ce n&amp;#8217;est pas très impressionnant dans le monde de l&amp;#8217;informatique et du
Gigahertz, mais quand c&amp;#8217;est sorti, on pouvait occuper jusqu&amp;#8217;à 60% de son CPU
rien qu&amp;#8217;en secouant la souris ! Là ça parait aberrant, mais ça permet de
prendre en compte un déplacement de souris 8 ms plus vite dans le meilleur des
cas.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;À titre de comparaison l&amp;#8217;étude scientifique de
&lt;a href="https://www.neuroxtrain.com/article/64662/"&gt;Tülin et al. parue en 2013&lt;/a&gt; indique
des temps de réaction de l&amp;#8217;ordre de :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;420 ms pour une personne "normale" ;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;340 ms pour un sportif entrainé (à l&amp;#8217;exception des judokas) ;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;dans le cas d&amp;#8217;un seul stimulus, et un avantage de 10 ms à 70 ms pour les
judokas uniquement, dans le cas de multiples stimuli simultanés (cas où tout
le monde est ralenti de 100 à 200 ms).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Dans le contexte de combats virtuels, cette accélération de la fréquence de
communication entre l&amp;#8217;ordinateur et la souris peut représenter un gain de 2% de
la vitesse de réaction du joueur. Alors même si c&amp;#8217;est ridicule de charger sa
machine avec une tâche aussi basique que le suivi de sa souris, ça fait une
différence en compétition.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Un fabricant propose d&amp;#8217;aller plus loin. Razer propose en effet sa souris Viper
en édition 8 kHz. Il s&amp;#8217;agit cette fois de gagner 1 ms et c&amp;#8217;est plus dur à
défendre. L&amp;#8217;initiative n&amp;#8217;a pour l&amp;#8217;instant pas été suivie par les autres
constructeurs qui se sont concentrés sur l&amp;#8217;allègement de leurs souris.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_profils"&gt;2.5. Profils&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Cela nous mène à la dernière amélioration apparue sur les souris de compétition
: les profils utilisateurs embarqués.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Avec des souris dont on peut configurer indépendamment : la sensibilité, la
vitesse de communication ou encore l&amp;#8217;attribution des boutons ; il peut sembler
logique de configurer la souris d&amp;#8217;une manière différente pour chaque jeu et de
revenir à des paramètres plus sobres quand on retourne à un usage bureautique.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Il est donc possible de configurer plusieurs profils d&amp;#8217;utilisation, stockés
dans la souris et de passer d&amp;#8217;un profil à l&amp;#8217;autre via un des boutons de la
souris sans avoir besoin de relancer l&amp;#8217;outil de configuration entre deux.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Avec GNU+Linux, l&amp;#8217;outil de configuration se nomme &lt;code&gt;piper&lt;/code&gt; (pour : tapette à souris).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;# pacman -Ss piper
$ piper&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Ou &lt;code&gt;apt install piper&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Il permet même de configurer (voire éteindre) les DEL multicolores décoratives,
qui ont probablement leur usage pour porter les couleurs d&amp;#8217;une équipe en
compétition, mais gaspillent sinon de l&amp;#8217;énergie pour rien dans la vie de tous
les jours.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Pour finir je suis toujours à la recherche d&amp;#8217;un scénario bureautique tirant
profit d&amp;#8217;une grande sensibilité de souris, vu que même avec 16 000 DPI la
largeur d&amp;#8217;une colonne dans LibreOffice calc n&amp;#8217;est pas ajustable par paliers de
0,01cm…&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="footnotes"&gt;
&lt;hr&gt;
&lt;div class="footnote" id="_footnotedef_1"&gt;
&lt;a href="#_footnoteref_1"&gt;1&lt;/a&gt;. &lt;a href="https://github.com/libratbag/piper/"&gt;Piper&lt;/a&gt; supports (in 2022) 83 mice from various brands : Etekcity, Glorious, GSkill, Logitech, Nubwo, Roccat Kone, Sino Wealth, Steelseries
&lt;/div&gt;
&lt;/div&gt;</content><category term="Articles"/><category term="comfort"/><category term="hardware"/><category term="Xorg"/></entry><entry><title>Mount LVM2_member (NOT available) partitions</title><link href="https://grimoire.d12s.fr/2022/mount_unavailable_lvm2_member_partitions.html" rel="alternate"/><published>2022-01-09T00:00:00+01:00</published><updated>2022-01-09T00:00:00+01:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2022-01-09:/2022/mount_unavailable_lvm2_member_partitions.html</id><summary type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Monter une partition de type LVM2_member signalée comme indisponible par LVM.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;#&lt;/span&gt; mount /dev/sdb2 /mnt/cle
&lt;span class="tok-go"&gt;mount: /mnt/cle: mount: unknown filesystem type LVM2_member &lt;/span&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;In french: &lt;em&gt;type de système de fichiers « LVM2_member » inconnu.&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;#&lt;/span&gt; lvdisplay &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
&lt;span class="tok-go"&gt; … NOT available … &lt;/span&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;
&lt;span class="tok-gp"&gt;#&lt;/span&gt; lvchange -ay /dev/mapper/vg-root &lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;(3)&lt;/b&gt;
&lt;span class="tok-gp"&gt;#&lt;/span&gt; mount /dev/mapper/vg-root …&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;</summary><content type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Monter une partition de type LVM2_member signalée comme indisponible par LVM.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;#&lt;/span&gt; mount /dev/sdb2 /mnt/cle
&lt;span class="tok-go"&gt;mount: /mnt/cle: mount: unknown filesystem type LVM2_member &lt;/span&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;In french: &lt;em&gt;type de système de fichiers « LVM2_member » inconnu.&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;#&lt;/span&gt; lvdisplay &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
&lt;span class="tok-go"&gt; … NOT available … &lt;/span&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;
&lt;span class="tok-gp"&gt;#&lt;/span&gt; lvchange -ay /dev/mapper/vg-root &lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;(3)&lt;/b&gt;
&lt;span class="tok-gp"&gt;#&lt;/span&gt; mount /dev/mapper/vg-root /mnt/cle &lt;i class="conum" data-value="4"&gt;&lt;/i&gt;&lt;b&gt;(4)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;List LVM logical volumes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Your volume may be &lt;code&gt;NOT available&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Turn it available&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="4"&gt;&lt;/i&gt;&lt;b&gt;4&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Finally mount your volume&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;As always, I stumbled upon this myself and record here the success path, but I&amp;#8217;ve
been greatly helped by the following sources :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://ixnfo.com/en/solving-the-error-mount-unknown-filesystem-type-lvm2_member.html" class="bare"&gt;https://ixnfo.com/en/solving-the-error-mount-unknown-filesystem-type-lvm2_member.html&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://www.svennd.be/mount-unknown-filesystem-type-lvm2_member/" class="bare"&gt;https://www.svennd.be/mount-unknown-filesystem-type-lvm2_member/&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://www.xmodulo.com/mount-lvm-partition-linux.html" class="bare"&gt;https://www.xmodulo.com/mount-lvm-partition-linux.html&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;</content><category term="Commandes"/><category term="mount"/><category term="adminsys"/><category term="metadata"/></entry><entry><title>Mutt force HTML view of Content-Type: text/plain;</title><link href="https://grimoire.d12s.fr/2021/mutt_force_html_view.html" rel="alternate"/><published>2021-11-23T00:00:00+01:00</published><updated>2021-11-23T00:00:00+01:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2021-11-23:/2021/mutt_force_html_view.html</id><summary type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Forcer l&amp;#8217;interprétation d&amp;#8217;une partie de courriel en tant que HTML lorsque son
Content-Type est mal renseigné (comme c&amp;#8217;est le cas avec les courriels
d&amp;#8217;HelloAsso, que je suis quand même heureux de recevoir pour &lt;a href="https://www.helloasso.com/associations/meta-press-es/formulaires/1"&gt;Meta-Press.es&lt;/a&gt; !).&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Force HTML view of a mail-part labelled as &lt;code&gt;Content-Type: text/plain …&lt;/code&gt;&lt;/p&gt;&lt;/div&gt;</summary><content type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Forcer l&amp;#8217;interprétation d&amp;#8217;une partie de courriel en tant que HTML lorsque son
Content-Type est mal renseigné (comme c&amp;#8217;est le cas avec les courriels
d&amp;#8217;HelloAsso, que je suis quand même heureux de recevoir pour &lt;a href="https://www.helloasso.com/associations/meta-press-es/formulaires/1"&gt;Meta-Press.es&lt;/a&gt; !).&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Force HTML view of a mail-part labelled as &lt;code&gt;Content-Type: text/plain;&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Edit &lt;code&gt;muttrc&lt;/code&gt; file adding this macro :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-go"&gt;macro attach &amp;quot;h&amp;quot; &amp;quot;|w3m -s -cols 96 -graph -ppc 4.0 -ppl 4.0 -I %{charset} -T text/html \r&amp;quot; &amp;quot;View text/html with w3m&amp;quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Then list the mail parts of your message (with &lt;code&gt;v&lt;/code&gt; in the email list), go on
the mail-part and press &lt;code&gt;h&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;code&gt;w3m&lt;/code&gt; will open your mail-part and present it as for a 96 columns console.&lt;/p&gt;
&lt;/div&gt;</content><category term="Commandes"/><category term="Mutt"/><category term="comfort"/></entry><entry><title>Uninstall Android bloatware</title><link href="https://grimoire.d12s.fr/2021/uninstall_android_bloatware.html" rel="alternate"/><published>2021-11-16T00:00:00+01:00</published><updated>2021-11-16T00:00:00+01:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2021-11-16:/2021/uninstall_android_bloatware.html</id><summary type="html">&lt;div id="toc" class="toc"&gt;
&lt;div id="toctitle"&gt;Index&lt;/div&gt;
&lt;ul class="sectlevel1"&gt;
&lt;li&gt;&lt;a href="#_remove"&gt;1. Remove&lt;/a&gt;
&lt;ul class="sectlevel2"&gt;
&lt;li&gt;&lt;a href="#_uninstall"&gt;1.1. Uninstall&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_disable_if_root"&gt;1.2. Disable (if root)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#_re_install_a_package"&gt;2. Re-install a package&lt;/a&gt;
&lt;ul class="sectlevel2"&gt;
&lt;li&gt;&lt;a href="#_re_install"&gt;2.1. Re-install&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_enable_if_root"&gt;2.2. Enable (if root)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#_what_can_safely_be_uninstalled"&gt;3. What can safely be uninstalled ?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_find_more_packages_to_remove"&gt;4. Find more packages to remove&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id="preamble"&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Désinstaller les pubiciels embarqués de force sur votre terminal Android depuis un ordinateur.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_remove"&gt;1. Remove …&lt;/h2&gt;&lt;/div&gt;</summary><content type="html">&lt;div id="toc" class="toc"&gt;
&lt;div id="toctitle"&gt;Index&lt;/div&gt;
&lt;ul class="sectlevel1"&gt;
&lt;li&gt;&lt;a href="#_remove"&gt;1. Remove&lt;/a&gt;
&lt;ul class="sectlevel2"&gt;
&lt;li&gt;&lt;a href="#_uninstall"&gt;1.1. Uninstall&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_disable_if_root"&gt;1.2. Disable (if root)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#_re_install_a_package"&gt;2. Re-install a package&lt;/a&gt;
&lt;ul class="sectlevel2"&gt;
&lt;li&gt;&lt;a href="#_re_install"&gt;2.1. Re-install&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_enable_if_root"&gt;2.2. Enable (if root)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#_what_can_safely_be_uninstalled"&gt;3. What can safely be uninstalled ?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_find_more_packages_to_remove"&gt;4. Find more packages to remove&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id="preamble"&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Désinstaller les pubiciels embarqués de force sur votre terminal Android depuis un ordinateur.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_remove"&gt;1. Remove&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_uninstall"&gt;1.1. Uninstall&lt;/h3&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;$&lt;/span&gt; adb shell pm uninstall --user &lt;span class="tok-m"&gt;0&lt;/span&gt; com.facebook.services&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect3"&gt;
&lt;h4 id="_adb_shell"&gt;1.1.1. &lt;code&gt;adb shell&lt;/code&gt;&lt;/h4&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;This implies that your first got &lt;code&gt;adb shell&lt;/code&gt; to work for your device. Using
GNU+Linux it may be well packaged in your Artix Linux distribution, or outdated
in a Debian stable. In this second case you can download the lastest
&lt;code&gt;platform-tools&lt;/code&gt; from Google and use &lt;code&gt;platform-tools/adb&lt;/code&gt; binary instead. I
recommand to add your &lt;code&gt;platform-tools/&lt;/code&gt; folder to your current path to allow
scripts to use it : &lt;code&gt;$ export PATH=$PATH:/path/to/unzipped/platform-tools/&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_disable_if_root"&gt;1.2. Disable (if root)&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;You might want to disable only (in a first time) to check if it&amp;#8217;s safe to remove it later…&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;$&lt;/span&gt; adb shell pm disable com.google.android.onetimeinitializer&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;A disabled package is hidden anywhere in your device.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_re_install_a_package"&gt;2. Re-install a package&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_re_install"&gt;2.1. Re-install&lt;/h3&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;$&lt;/span&gt; adb shell pm install --user &lt;span class="tok-m"&gt;0&lt;/span&gt; &lt;span class="tok-k"&gt;$(&lt;/span&gt;pm dump &amp;lt;package name&amp;gt; &lt;span class="tok-p"&gt;|&lt;/span&gt; awk &lt;span class="tok-s1"&gt;&amp;#39;/path/{ print $2 }&amp;#39;&lt;/span&gt;&lt;span class="tok-k"&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;This will locate &lt;code&gt;.apk&lt;/code&gt; of the uninstalled package and search for a line starting with its &lt;code&gt;/path/&lt;/code&gt; (as per this &lt;a href="https://stackoverflow.com/a/56968886"&gt;StackOverflow answer&lt;/a&gt;).&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_enable_if_root"&gt;2.2. Enable (if root)&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;If you just disabled it :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;$&lt;/span&gt; adb shell pm &lt;span class="tok-nb"&gt;enable&lt;/span&gt; com.google.android.onetimeinitializer&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_what_can_safely_be_uninstalled"&gt;3. What can safely be uninstalled ?&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Everything that looks like coming from GAFAM :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-go"&gt;com.facebook.*&lt;/span&gt;
&lt;span class="tok-go"&gt;com.microsoft.*&lt;/span&gt;
&lt;span class="tok-go"&gt;com.linkedin.android&lt;/span&gt;
&lt;span class="tok-go"&gt;com.samsung.knox.*&lt;/span&gt;
&lt;span class="tok-go"&gt;com.samsung.android.voicewakeup&lt;/span&gt;
&lt;span class="tok-go"&gt;com.google.android.youtube&lt;/span&gt;
&lt;span class="tok-go"&gt;com.google.android.googlequicksearchbox&lt;/span&gt;
&lt;span class="tok-go"&gt;…&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I got around an hundred packages out of a Samsung Galaxy A3 2017 needing more
internal space.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Bigger list here : &lt;a href="https://github.com/alex-quiniou/remove-bloatware-galaxy-s10e" class="bare"&gt;https://github.com/alex-quiniou/remove-bloatware-galaxy-s10e&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_find_more_packages_to_remove"&gt;4. Find more packages to remove&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;$&lt;/span&gt; adb shell pm list packages -f &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;You may want to list only system packages with &lt;code&gt;-s&lt;/code&gt;  third party packages with &lt;code&gt;-3&lt;/code&gt; or disabled packages with &lt;code&gt;-d&lt;/code&gt; instead of &lt;code&gt;-f&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</content><category term="Commandes"/><category term="android"/></entry><entry><title>Artix Linux on RAID with full encryption</title><link href="https://grimoire.d12s.fr/2021/artix_linux_on_raid_with_full_encryption.html" rel="alternate"/><published>2021-10-05T00:00:00+02:00</published><updated>2021-10-05T00:00:00+02:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2021-10-05:/2021/artix_linux_on_raid_with_full_encryption.html</id><summary type="html">&lt;div id="toc" class="toc"&gt;
&lt;div id="toctitle"&gt;Index&lt;/div&gt;
&lt;ul class="sectlevel1"&gt;
&lt;li&gt;&lt;a href="#_version_en"&gt;1. version : en&lt;/a&gt;
&lt;ul class="sectlevel2"&gt;
&lt;li&gt;&lt;a href="#_the_objective"&gt;1.1. The objective&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_raid"&gt;1.2. RAID&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_full_luks_encryption"&gt;1.3. Full LUKS encryption&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_the_grub_install_problem_on_raid"&gt;1.4. The &lt;code&gt;grub-install&lt;/code&gt; problem on RAID&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_install_grub"&gt;1.5. Install Grub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_grub_on_raid_diskfilter_writes_are_not_supported"&gt;1.6. GRUB on RAID : Diskfilter writes are not supported&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_a_last_trap_a_missing_img_in_boot"&gt;1.7. A last trap : a missing &lt;code&gt;.img&lt;/code&gt; in &lt;code&gt;/boot&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_update_2022_06_if_mdadm_does_not_mount_the_arrays_raid"&gt;1.8. Update …&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;</summary><content type="html">&lt;div id="toc" class="toc"&gt;
&lt;div id="toctitle"&gt;Index&lt;/div&gt;
&lt;ul class="sectlevel1"&gt;
&lt;li&gt;&lt;a href="#_version_en"&gt;1. version : en&lt;/a&gt;
&lt;ul class="sectlevel2"&gt;
&lt;li&gt;&lt;a href="#_the_objective"&gt;1.1. The objective&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_raid"&gt;1.2. RAID&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_full_luks_encryption"&gt;1.3. Full LUKS encryption&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_the_grub_install_problem_on_raid"&gt;1.4. The &lt;code&gt;grub-install&lt;/code&gt; problem on RAID&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_install_grub"&gt;1.5. Install Grub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_grub_on_raid_diskfilter_writes_are_not_supported"&gt;1.6. GRUB on RAID : Diskfilter writes are not supported&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_a_last_trap_a_missing_img_in_boot"&gt;1.7. A last trap : a missing &lt;code&gt;.img&lt;/code&gt; in &lt;code&gt;/boot&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_update_2022_06_if_mdadm_does_not_mount_the_arrays_raid"&gt;1.8. Update 2022-06 : if mdadm does not mount the arrays RAID&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#_version_fr"&gt;2. version : fr&lt;/a&gt;
&lt;ul class="sectlevel2"&gt;
&lt;li&gt;&lt;a href="#_lobjectif"&gt;2.1. L&amp;#8217;objectif&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_raid_2"&gt;2.2. RAID&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_chiffrement_intégral"&gt;2.3. Chiffrement intégral&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_le_problème_de_grub_install_sur_raid"&gt;2.4. Le problème de &lt;code&gt;grub-install&lt;/code&gt; sur RAID&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_installer_grub"&gt;2.5. Installer Grub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_grub_sur_raid_diskfilter_writes_are_not_supported"&gt;2.6. GRUB sur RAID : Diskfilter writes are not supported&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_un_dernier_piège_le_fichier_img_manquant_dans_boot"&gt;2.7. Un dernier piège : le fichier &lt;code&gt;.img&lt;/code&gt; manquant dans &lt;code&gt;/boot&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_mise_à_jour_2022_06_si_mdadm_ne_monte_plus_les_tableaux_raid"&gt;2.8. Mise à jour 2022-06 : si mdadm ne monte plus les tableaux RAID&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_version_en"&gt;1. version : en&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_the_objective"&gt;1.1. The objective&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I recently installed an Artix Linux
&lt;sup class="footnote"&gt;[&lt;a id="_footnoteref_1" class="footnote" href="#_footnotedef_1" title="View footnote."&gt;1&lt;/a&gt;]&lt;/sup&gt; on a computer equipped with two
roughly equivalent storage units.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I decided to go for a RAID setup but I still wanted to enjoy the Artix
simplicity of storage "full" encryption. Well, it&amp;#8217;s not exactly "full"
encryption because UEFI boot procedure requires a normal FAT32 partition, but
everything else will be encrypted and even this clear partition will be on
RAID.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;With two drives, you can choose between RAID&lt;strong&gt;0&lt;/strong&gt; and RAID&lt;strong&gt;1&lt;/strong&gt; modes. The RAID0 copy
half of each files on each disks and can read them at twice the normal speed
(to simplify things). It can be interesting for gamers, or video-makers, but it&amp;#8217;s
not what I was looking for. With the RAID1 mode, all your data are duplicated
on both drives, and will survive to a single hardware drive failure (you&amp;#8217;ll
just hurry to replace the faulty hardware by a new piece, hopping that the
other won&amp;#8217;t fail at the same time).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;And you can mix the two, with RAID10, which ensure data replication and
improved reading speeds.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;So, after booting from my Artix Linux USB key (so after having disabled the
secure boot setting in the BIOS), and while reading this
&lt;a href="https://wiki.archlinux.org/title/RAID"&gt;Arch wiki page about RAID&lt;/a&gt;, I created two
RAID arrays, and partitioned them respectively in FAT32 and Ext4.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_raid"&gt;1.2. RAID&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;The 1st array was created in RAID1 and the second in RAID10. I would have
prefer to have both in RAID10, and I lost a few hours trying this, before I
re-read that UEFI BIOS currently can&amp;#8217;t read FAIT32 partitions on RAID10 (and
will probably never do). The UEFI BIOS ability to read RAID1 is due to the fact
that with `mdadm&amp;#8217;s Linux RAID array management, RAID1 is really twice your
partition kept sync by software. So while reading a RAID1 the BIOS is not
figuring out that there is another drive under the surface, he sees a regular
FAT32 partition. But the BIOS will mess things up if it tries to write in the
partition, because it would only write on one of the two copies.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;To do so, things are done in three steps :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="olist arabic"&gt;
&lt;ol class="arabic"&gt;
&lt;li&gt;
&lt;p&gt;Partition each storage device individually (but symmetrically)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Assemble the partitions in RAID arrays&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Format the RAID arrays&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;$&lt;/span&gt; sudo cgdisk /dev/nvme0n1  &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
&lt;span class="tok-gp"&gt;$&lt;/span&gt; sudo cgdisk /dev/nvme1n1  &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;
&lt;span class="tok-gp"&gt;$&lt;/span&gt; sudo mdadm --create --verbose --level&lt;span class="tok-o"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;1&lt;/span&gt; --metadata&lt;span class="tok-o"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;1&lt;/span&gt;.0 --raid-devices&lt;span class="tok-o"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;2&lt;/span&gt; /dev/md/uefi_boot /dev/nvme0n1p1 /dev/nvme1n1p1 &lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;(3)&lt;/b&gt;
&lt;span class="tok-gp"&gt;$&lt;/span&gt; sudo mdadm --create --verbose --level&lt;span class="tok-o"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;10&lt;/span&gt; --metadata&lt;span class="tok-o"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;1&lt;/span&gt;.2 --chunk&lt;span class="tok-o"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;512&lt;/span&gt; --raid-devices&lt;span class="tok-o"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;2&lt;/span&gt; --layout&lt;span class="tok-o"&gt;=&lt;/span&gt;f2 /dev/md/main_storage /dev/nvme0n1p2 /dev/nvme1n1p2 &lt;i class="conum" data-value="4"&gt;&lt;/i&gt;&lt;b&gt;(4)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Create a small ±500MO bootable EFI system partition (type EF00) and all
the rest in a regular Linux file system (type 83) partition. Here we need two
partitions, but regarding RAID it&amp;#8217;s advised not to created full-capacity
partitions, as you would need a disk of the same or bigger capacity to replace
a faulty unit, while even from the same line of products of a manufacturer and
even from the same model, capacities may vary from one unit to an other.
Intentionally creating smaller partitions (like 100MO less than nominal storage
capacity) may help to find spare units.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;idem&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Note the &lt;code&gt;--metadata=1.0&lt;/code&gt; this version of metadata is stored at the end of the partitions and so it won&amp;#8217;t get in the way of the BIOS naïvely trying to read a FAT32 boot partition.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="4"&gt;&lt;/i&gt;&lt;b&gt;4&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;More modern options&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Once here, you can check that everything works well with :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;$&lt;/span&gt; cat /proc/mdstat
&lt;span class="tok-go"&gt;Personalities : [raid1] [raid10]&lt;/span&gt;
&lt;span class="tok-go"&gt;md126 : active (auto-read-only) raid1 nvme1n1p1[1] nvme0n1p1[0]&lt;/span&gt;
&lt;span class="tok-go"&gt;      409536 blocks super 1.0 [2/2] [UU]&lt;/span&gt;

&lt;span class="tok-go"&gt;md127 : active raid10 nvme1n1p2[1] nvme0n1p2[0]&lt;/span&gt;
&lt;span class="tok-go"&gt;      976219136 blocks super 1.2 512K chunks 2 far-copies [2/2] [UU]&lt;/span&gt;
&lt;span class="tok-go"&gt;      bitmap: 6/8 pages [24KB], 65536KB chunk&lt;/span&gt;

&lt;span class="tok-go"&gt;unused devices: &amp;lt;none&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;For more explanation I encourage you to read the Arch RAID wiki page.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;In practice, you&amp;#8217;ll have to wait for the devices to synchronise, and this is
very slow because &lt;code&gt;mdadm&lt;/code&gt; is configured to synchronise devices at a maximum
rate of 200ko/s. This can be permanently unlocked via &lt;code&gt;sysctl&lt;/code&gt; :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;$ sudo nano /etc/sysctl.d/99_unlock_mdadm_sync_speed.conf
dev.raid.speed_limit_min = 5000000
dev.raid.speed_limit_max = 5000000000
&lt;span class="keyseq"&gt;&lt;kbd&gt;Ctrl&lt;/kbd&gt;+&lt;kbd&gt;X&lt;/kbd&gt;&lt;/span&gt;
&lt;kbd&gt;Y&lt;/kbd&gt;
$ sudo sysctl -p /etc/sysctl.d/99_unlock_mdadm_sync_speed.conf&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;With modern NVME hardware this will seriously speed up re-sync operations at
the expense of high loads.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Then we format the partitions :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;$&lt;/span&gt; sudo mkfs.fat -n &lt;span class="tok-s1"&gt;&amp;#39;boot&amp;#39;&lt;/span&gt; /dev/md126
&lt;span class="tok-gp"&gt;$&lt;/span&gt; sudo mkfs.ext4 -v -L &lt;span class="tok-s1"&gt;&amp;#39;main_storage_filesystem&amp;#39;&lt;/span&gt; -b &lt;span class="tok-m"&gt;4096&lt;/span&gt; -E &lt;span class="tok-nv"&gt;stride&lt;/span&gt;&lt;span class="tok-o"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;128&lt;/span&gt;,stripe-width&lt;span class="tok-o"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;256&lt;/span&gt; /dev/md127&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_full_luks_encryption"&gt;1.3. Full LUKS encryption&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Then I launched the Artix Linux install application (called &lt;code&gt;calamares&lt;/code&gt; &lt;sup class="footnote"&gt;[&lt;a id="_footnoteref_2" class="footnote" href="#_footnotedef_2" title="View footnote."&gt;2&lt;/a&gt;]&lt;/sup&gt; )
clicking on the desktop icon of the USB live Artix system. I followed the steps
and chose the manual option at the partitioning step. The install wizard showed
the RAID partitions and you can configure them to be used for the installation,
setting the mount points (respectively to &lt;code&gt;/boot/efi&lt;/code&gt; and &lt;code&gt;/&lt;/code&gt;).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;The installation runs for a few minutes (its really fast to install an
Artix Linux, that&amp;#8217;s one of the
&lt;a href="https://framagit.org/gebull/install#user-content-introduction"&gt;reason why&lt;/a&gt; we
chose to install it at Gebull.org), and it spares you a lot of instructions
from this
&lt;a href="https://wiki.artixlinux.org/Main/InstallationWithFullDiskEncryption"&gt;Artix Linux
full encryption&lt;/a&gt; wiki page (that you still can read it to understand how it
works).&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_the_grub_install_problem_on_raid"&gt;1.4. The &lt;code&gt;grub-install&lt;/code&gt; problem on RAID&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;But I would not have wrote this blog post if things would have run too
smoothly. At the end of the installation procedure &lt;code&gt;calamares&lt;/code&gt; detects a
problem and tells that the installation failed. It&amp;#8217;s a bit exaggerated, the
installation mostly succeeded, but it misses a last step : the installation of
GRUB (the boot manager, a piece of software that runs between the BIOS and your
&lt;a href="/2019/unix_init.html"&gt;init&lt;/a&gt; process). So at this point you have a running
system that can&amp;#8217;t boot itself…&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;The error messages is :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-go"&gt;Installation for x86_64-efi platform.&lt;/span&gt;
&lt;span class="tok-go"&gt;efibootmgr: option requires an argument -- &amp;#39;d&amp;#39; &lt;/span&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
&lt;span class="tok-go"&gt;efibootmgr version 17&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;For the record, the &lt;code&gt;-d&lt;/code&gt; option of efibootmgr is : &lt;code&gt;-d|--disk containing loader&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;The official way of installing GRUB (and what &lt;code&gt;calamares&lt;/code&gt; tries) is :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;$&lt;/span&gt; sudo grub-install --target&lt;span class="tok-o"&gt;=&lt;/span&gt;x86_64-efi --efi-directory&lt;span class="tok-o"&gt;=&lt;/span&gt;/boot/efi --bootloader-id&lt;span class="tok-o"&gt;=&lt;/span&gt;Artix --force&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;It&amp;#8217;s this command (in version GRUB 2.06) that tries to run &lt;code&gt;efibootmgr&lt;/code&gt; (in version
17) to create UEFI boot entries in the BIOS itself (it stills looks like a bad
idea &lt;a href="/2018/os_debian_from_old_disk_to_new_disk.html"&gt;even after some more
year&lt;/a&gt;). With RAID arrays it fails because the BIOS must be instructed for a
real hardware to explore in its quest for bootable EFI files in FAT32
partitions (Linux Torvalds called the UEFI system an
&lt;a href="https://yarchive.net/comp/linux/efi.html"&gt;Intel brain damage&lt;/a&gt;).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;The workaround I found was to tell &lt;code&gt;grub-install&lt;/code&gt; not to perform this
&lt;code&gt;efibootmgr&lt;/code&gt; part on one side, and to create entries myself from the BIOS on
the other side.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;In fact I first ensured that GRUB was configured for both RAID and LUKS
encryption via &lt;code&gt;cryptsetup&lt;/code&gt; support.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;So in &lt;code&gt;/etc/default/grub&lt;/code&gt; I checked that those lines (respectively for
encryption and for RAID support) was present :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-go"&gt;GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;quiet cryptdevice=UUID=XXXX-YYYY-…:luks-XXXX-YYYY-… root=/dev/mapper/luks-XXXX-YYYY-…&amp;quot; &lt;/span&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
&lt;span class="tok-go"&gt;GRUB_ENABLE_CRYPTODISK=y &lt;/span&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;The &lt;code&gt;XXXX-YYYY-…&lt;/code&gt; tokens should be real UUIDs (&lt;code&gt;lsblk&lt;/code&gt; &lt;a href="/2019/find_storage_node.html"&gt;can tell them to you&lt;/a&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;This line is at the end of my file&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_install_grub"&gt;1.5. Install Grub&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Then you can install GRUB with this series of commands :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;$&lt;/span&gt; sudo grub-mkconfig -o /boot/grub/grub.cfg &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
&lt;span class="tok-gp"&gt;$&lt;/span&gt; sudo mkinitcpio -p linux &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;
&lt;span class="tok-gp"&gt;$&lt;/span&gt; sudo grub-install --target&lt;span class="tok-o"&gt;=&lt;/span&gt;x86_64-efi --efi-directory&lt;span class="tok-o"&gt;=&lt;/span&gt;/boot/efi --no-nvram --bootloader-id&lt;span class="tok-o"&gt;=&lt;/span&gt;Artix --force &lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;(3)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;This regenerates the GRUB boot-time configuration file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;This regenerates the initramfs (command in version 30)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;This actually installs the GRUB in it&amp;#8217;s &lt;code&gt;/boot/efi/EFI/Artix&lt;/code&gt; folder and partition. Mind the &lt;code&gt;--no-nvram&lt;/code&gt; command line argument, it&amp;#8217;s the trick to avoid &lt;code&gt;grub-install&lt;/code&gt; to fail on &lt;code&gt;efibootmgr&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Don&amp;#8217;t forget to create UEFI entries from your BIOS pointing on your
&lt;code&gt;/boot/efi/EFI/Artix/grubx64.efi&lt;/code&gt;. I made one for each drive. The BIOS should
not write on the disk. If you have options to write of the disk (like a folder
creation or renaming) avoid them at all costs, it would mess with your RAID
array.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_grub_on_raid_diskfilter_writes_are_not_supported"&gt;1.6. GRUB on RAID : Diskfilter writes are not supported&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;At this point your system should boot, but GRUB will complain each time
about unsupported diskfilter writes : &lt;code&gt;diskfilter writes are not supported&lt;/code&gt;.
The boot stops and asks you to press any key to continue.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;,---,---,---,---,---,---,---,---,---,---,---,---,---,-------,
|   |   |   |   |   |   |   |   |   |   |   |   |   | &amp;lt;-    |
|---'-,-'-,-'-,-'-,-'-,-'-,-'-,-'-,-'-,-'-,-'-,-'-,-'-,-----|
| -&amp;gt;| |   |   |   |   |   |   |   |   |   |   |   |   |     |
|-----',--',--',--',----------',--',--',--',--',--',--'|    |
|      |   |   |   |    ANY    |   |   |   |   |   |   |    |
|----,-'-,-'-,-'-,-'-,---,---,-'-,-'-,-'-,-'-,-'-,-'---'----|
|    |   |   |   |   |   |   |   |   |   |   |   |          |
|----'-,-',--'--,'---'---'---'---'---'---'-,-'---',--,------|
|      |  |     |                          |      |  |      |
'------'  '-----'--------------------------'------'  '------'&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;It&amp;#8217;s possible to workaround this and boot without questions. As explain
&lt;a href="https://blog.cykerway.com/posts/2019/12/25/grub2-diskfilter-writes-are-not-supported.html"&gt;here&lt;/a&gt;,
it consists in commenting-out every occurrence of &lt;code&gt;save_env&lt;/code&gt; lines in
&lt;code&gt;/boot/grub/grub.cfg&lt;/code&gt; (and do it after each &lt;code&gt;grub-mkconfig&lt;/code&gt; run).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;$&lt;/span&gt; sudo vim +&lt;span class="tok-s2"&gt;&amp;quot;%s/save_env/# save_env/&amp;quot;&lt;/span&gt; +wq /boot/grub/grub.cfg  &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt; &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Sure, the traditional Unix way of doing this would be with &lt;code&gt;sed&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;If you omit the &lt;code&gt;+wq&lt;/code&gt; you&amp;#8217;ll end up in an open &lt;code&gt;vim&lt;/code&gt; that lets you check if
the result is what you expect before saving it.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_a_last_trap_a_missing_img_in_boot"&gt;1.7. A last trap : a missing &lt;code&gt;.img&lt;/code&gt; in &lt;code&gt;/boot&lt;/code&gt;&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;If you installed both &lt;code&gt;amd-ucode&lt;/code&gt; and &lt;code&gt;intel-ucode&lt;/code&gt; packages &lt;sup class="footnote"&gt;[&lt;a id="_footnoteref_3" class="footnote" href="#_footnotedef_3" title="View footnote."&gt;3&lt;/a&gt;]&lt;/sup&gt; before
regenerating the initramfs of your system (a scenario which should not happen),
and then decided to remove one of the two packages, you&amp;#8217;ll have to regenerate
the initramfs to avoid a boot failure due to a "missing" ucode file.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Surprisingly enough, de-installing one of this packages in Artix (Arch based
GNU+Linux distribution) is not triggering an initramfs regeneration.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_update_2022_06_if_mdadm_does_not_mount_the_arrays_raid"&gt;1.8. Update 2022-06 : if mdadm does not mount the arrays RAID&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;After an update the machine refused to boot. &lt;code&gt;init&lt;/code&gt; was announcing an
unexpected failure and dropping me in an emergency shell &lt;code&gt;ash&lt;/code&gt;. This problem is
usually linked to the fact that the &lt;code&gt;init&lt;/code&gt; process can&amp;#8217;t mount the designated
main storage partition.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I my case, an update of mdadm introduced a new behavior regarding drives and
partitions naming by the tool, resulting in mdadm being unable to auto-detect
RAID arrays during early boot.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I could &lt;code&gt;mdadm --assemble …&lt;/code&gt; my arrays but couldn&amp;#8217;t resume booting as
&lt;code&gt;./init&lt;/code&gt; (even if running fine) could not get me out of the emergency shell (if
you know why, please tell me).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;After some readings in Artix forums I learnt that such problems are not
exceptional and that the official way of dealing with it is to boot from a
live Artix ISO, &lt;code&gt;chroot&lt;/code&gt; from the live ISO to your machine storage via the
&lt;code&gt;artix-chroot&lt;/code&gt; command, and run commands from the &lt;strong&gt;Install grub&lt;/strong&gt; section again
to update the initramfs (and if your partitions did change their naming or you
change your drive and got another UUID you might have to update GRUB
configuration files also).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Note for self : if a RAID disk dies, I probably should regenerate the initramfs
after repairing the array. I think that Debian manage to regenerate its
initramfs when its needed.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;That&amp;#8217;s how what I thought would be an easy install, turned out consuming
probably more time than I can expect to save in case of disk failure ! (and
let&amp;#8217;s forget about the time spent writing this).&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_version_fr"&gt;2. version : fr&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_lobjectif"&gt;2.1. L&amp;#8217;objectif&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;J&amp;#8217;ai récemment installé une Artix Linux sur un ordinateur équipé de deux
unités de stockage de capacités équivalentes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;J&amp;#8217;ai opté pour une installation en RAID mais je voulais également pouvoir
profiter du chiffrement intégral du support en option lors de l&amp;#8217;installation
d&amp;#8217;Artix. Bon, pour commencer ce n&amp;#8217;est pas exactement un chiffrement intégral
car les BIOS UEFI imposent la présence d&amp;#8217;une partition FAT32 non chiffrée
quelque part, mais tout le reste est chiffré et même cette partition
peut être stockée sur un RAID.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Quand on dispose de deux unités de stockage, on a le choix entre du RAID&lt;strong&gt;0&lt;/strong&gt; et du
RAID&lt;strong&gt;1&lt;/strong&gt;. Le RAID0 c&amp;#8217;est grosso-modo un mode de fonctionnement où chaque fichier
est coupé en deux, avec une moitié écrite sur chacun des supports de données,
ce qui permet ensuite de les lire 2x plus vite. Ça peut être intéressant pour
les joueurs ou les monteurs vidéos par exemple, mais ce n&amp;#8217;est pas ce que je
cherchais. Le RAID1 en revanche écrit la même chose sur les deux stockages,
en même temps, de sorte que si un des deux tombe en panne, vous n&amp;#8217;avez pas
perdu vos données (vous allez juste être subitement très pressé de remplacer le
stockage déficient en croisant les doigts pour que le 2e tienne le coup entre
temps).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Enfin il est possible d&amp;#8217;agréger les qualités des deux modes de fonctionnement
avec le RAID&lt;strong&gt;10&lt;/strong&gt;, qui assure à la fois la redondance du stockage et la vitesse de
lecture.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;J&amp;#8217;ai donc commencé par créer des tableaux RAID après avoir démarré sur ma
clé USB d&amp;#8217;installation d&amp;#8217;Artix Linux (et donc avoir désactivé l&amp;#8217;option &lt;em&gt;Secure
Boot&lt;/em&gt; du BIOS). J&amp;#8217;ai attentivement lu la
&lt;a href="https://wiki.archlinux.org/title/RAID"&gt;page du wiki Arch Linux concernant le
RAID&lt;/a&gt; et je me suis lancé dans le partitionnement, le formatage et
l&amp;#8217;assemblage en tableaux RAID de mes supports.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_raid_2"&gt;2.2. RAID&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Le premier tableau RAID fut créé en RAID1 et le second en RAID10. J&amp;#8217;aurais
préféré avoir les deux en RAID10 et ai perdu pas mal de temps à essayer comme
ça avant de réaliser que les BIOS UEFI ne peuvent pas lire leur partition FAT32
sur du RAID10 (et ne le pourront probablement jamais). La capacité d&amp;#8217;un BIOS
UEFI à lire une partition RAID1 vient du fait qu&amp;#8217;avec la gestion des tableaux
RAID sous Linux par &lt;code&gt;mdadm&lt;/code&gt; on a vraiment une duplication de partitions
maintenues à jour logiciellement. Du coup le BIOS arrive à lire la partition
sans se rendre compte qu&amp;#8217;elle fait partie d&amp;#8217;un ensemble plus grand et il
endommagerait le tableau RAID1 s&amp;#8217;il devait écrire dans la partition, car il
n&amp;#8217;écrirait que sur l&amp;#8217;un des deux stockages.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Pour créer ces stockages j&amp;#8217;ai agis en 3 étapes :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="olist arabic"&gt;
&lt;ol class="arabic"&gt;
&lt;li&gt;
&lt;p&gt;Partitionnement des stockages, chacun leur tour mais de manière symétrique&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Assemblage des partitions en tableaux RAID&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Formatage des tableaux&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;$&lt;/span&gt; sudo cgdisk /dev/nvme0n1  &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
&lt;span class="tok-gp"&gt;$&lt;/span&gt; sudo cgdisk /dev/nvme1n1  &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;
&lt;span class="tok-gp"&gt;$&lt;/span&gt; sudo mdadm --create --verbose --level&lt;span class="tok-o"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;1&lt;/span&gt; --metadata&lt;span class="tok-o"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;1&lt;/span&gt;.0 --raid-devices&lt;span class="tok-o"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;2&lt;/span&gt; /dev/md/uefi_boot /dev/nvme0n1p1 /dev/nvme1n1p1 &lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;(3)&lt;/b&gt;
&lt;span class="tok-gp"&gt;$&lt;/span&gt; sudo mdadm --create --verbose --level&lt;span class="tok-o"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;10&lt;/span&gt; --metadata&lt;span class="tok-o"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;1&lt;/span&gt;.2 --chunk&lt;span class="tok-o"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;512&lt;/span&gt; --raid-devices&lt;span class="tok-o"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;2&lt;/span&gt; --layout&lt;span class="tok-o"&gt;=&lt;/span&gt;f2 /dev/md/main_storage /dev/nvme0n1p2 /dev/nvme1n1p2 &lt;i class="conum" data-value="4"&gt;&lt;/i&gt;&lt;b&gt;(4)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;J&amp;#8217;ai donc d&amp;#8217;abord créé une petite partition bootable (±500MO de type EFI&amp;#8201;&amp;#8212;&amp;#8201;EF00) puis une seconde couvrant tout le reste en système de fichier Linux
(type 83). Ici nous avons besoin de deux partitions (pour avoir le &lt;code&gt;/boot&lt;/code&gt;
séparé), mais même en ne considérant que le stockage en tableau RAID, il est tout de
même conseillé de ne pas créer une partition de la taille maximale du support
car il faut ensuite un disque de même capacité (ou plus
grand) pour remplacer une unité défectueuse. Or, même entre deux productions de
même référence chez un constructeur donné, il peut y avoir de petites
différences de capacité effective entre les supports. Il est donc conseillé de
créer ses partitions de stockage en utilisant volontairement moins de place que
la capacité nominale du support (par exemple avec 100MO en moins), pour se
donner plus de chances de retrouver un disque compatible avec le tableau le
moment venu.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;idem&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Notez le &lt;code&gt;--metadata=1.0&lt;/code&gt; cette version des méta-données du tableau RAID est écrite à la fin des partitions et n&amp;#8217;interfère pas avec la lecture naïve de la partition par le BIOS.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="4"&gt;&lt;/i&gt;&lt;b&gt;4&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Ici il y a des options plus modernes&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Une fois arrivé là, vous pouvez vérifier que tout fonctionne bien avec :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;$&lt;/span&gt; cat /proc/mdstat
&lt;span class="tok-go"&gt;Personalities : [raid1] [raid10]&lt;/span&gt;
&lt;span class="tok-go"&gt;md126 : active (auto-read-only) raid1 nvme1n1p1[1] nvme0n1p1[0]&lt;/span&gt;
&lt;span class="tok-go"&gt;      409536 blocks super 1.0 [2/2] [UU]&lt;/span&gt;

&lt;span class="tok-go"&gt;md127 : active raid10 nvme1n1p2[1] nvme0n1p2[0]&lt;/span&gt;
&lt;span class="tok-go"&gt;      976219136 blocks super 1.2 512K chunks 2 far-copies [2/2] [UU]&lt;/span&gt;
&lt;span class="tok-go"&gt;      bitmap: 6/8 pages [24KB], 65536KB chunk&lt;/span&gt;

&lt;span class="tok-go"&gt;unused devices: &amp;lt;none&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Pour plus d&amp;#8217;explications, je vous encourage à nouveau à lire la page de wiki
d&amp;#8217;Arch Linux sur le RAID.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;En pratique il faudra attendre que les supports de stockage se synchronisent et
c&amp;#8217;est long parce que &lt;code&gt;mdadm&lt;/code&gt; est configuré pour synchroniser les périphériques
à une vitesse maximum de 200ko/s. Cette limitation peut être relevée via
&lt;code&gt;sysctl&lt;/code&gt; :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;$ sudo nano /etc/sysctl.d/99_unlock_mdadm_sync_speed.conf
dev.raid.speed_limit_min = 5000000
dev.raid.speed_limit_max = 5000000000
&lt;span class="keyseq"&gt;&lt;kbd&gt;Ctrl&lt;/kbd&gt;+&lt;kbd&gt;X&lt;/kbd&gt;&lt;/span&gt; &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
&lt;kbd&gt;Y&lt;/kbd&gt; &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;
$ sudo sysctl -p /etc/sysctl.d/99_unlock_mdadm_sync_speed.conf&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Avec un NVME moderne il y a des chances d&amp;#8217;atteindre les ±5GO/s au prix d&amp;#8217;une
charge machine importante pendant l&amp;#8217;opération.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Enfin, il faut formater les partitions :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;$&lt;/span&gt; sudo mkfs.fat -n &lt;span class="tok-s1"&gt;&amp;#39;boot&amp;#39;&lt;/span&gt; /dev/md126
&lt;span class="tok-gp"&gt;$&lt;/span&gt; sudo mkfs.ext4 -v -L &lt;span class="tok-s1"&gt;&amp;#39;main_storage_filesystem&amp;#39;&lt;/span&gt; -b &lt;span class="tok-m"&gt;4096&lt;/span&gt; -E &lt;span class="tok-nv"&gt;stride&lt;/span&gt;&lt;span class="tok-o"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;128&lt;/span&gt;,stripe-width&lt;span class="tok-o"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;256&lt;/span&gt; /dev/md127&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_chiffrement_intégral"&gt;2.3. Chiffrement intégral&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;J&amp;#8217;ai ensuite lancé l&amp;#8217;installation d&amp;#8217;Artix Linux en cliquant sur l&amp;#8217;icône du
bureau. Une application (nommée &lt;code&gt;calamares&lt;/code&gt;) se lance et pose quelques
questions puis se charge de l&amp;#8217;installation. Arrivé à l&amp;#8217;étape du choix des
partitions, au lieu de tout laisser en mode automatique j&amp;#8217;ai pu préciser que je
voulais utiliser les partitions RAID (visibles depuis l&amp;#8217;outil) en précisant
leurs points de montage (respectivement &lt;code&gt;/boot/efi&lt;/code&gt; et &lt;code&gt;/&lt;/code&gt;).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;L&amp;#8217;installation se déroule alors en quelques minutes (elle est vraiment rapide,
c&amp;#8217;est &lt;a href="https://framagit.org/gebull/install#user-content-introduction"&gt;une des
raisons&lt;/a&gt; qui nous a encouragé à choisir cette distribution chez Gebull.org), et
elle économise plein de commandes et configuration à passer sinon à la main
pour avoir un système chiffré, comme on les retrouve détaillées sur
&lt;a href="https://wiki.artixlinux.org/Main/InstallationWithFullDiskEncryption"&gt;cette page
de wiki du projet Artix Linux&lt;/a&gt; (que vous pouvez quand même aller lire pour
comprendre comment ça marche).&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_le_problème_de_grub_install_sur_raid"&gt;2.4. Le problème de &lt;code&gt;grub-install&lt;/code&gt; sur RAID&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Toutefois, je n&amp;#8217;aurais probablement pas pris la peine de rédiger tout ça si les
choses s&amp;#8217;étaient passées exactement comme prévu. À la fin de la procédure
d&amp;#8217;installation, &lt;code&gt;calamares&lt;/code&gt; détecte un problème et annonce que l&amp;#8217;installation a
échoué. C&amp;#8217;est un peu exagéré car l&amp;#8217;installation s&amp;#8217;est en fait plutôt bien
déroulée, il n&amp;#8217;y a que sur la dernière commande qui se prend les pieds dans le
tapis et il manque donc GRUB (le gestionnaire de démarrage, un bout de logiciel
qui tourne entre le BIOS et votre processus &lt;a href="/2019/unix_init.html"&gt;init&lt;/a&gt;).
Du coup vous avez un système qui tourne mais qui ne peut pas se lancer tout
seul…&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Le message d&amp;#8217;erreur rencontré est :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-go"&gt;Installation for x86_64-efi platform.&lt;/span&gt;
&lt;span class="tok-go"&gt;efibootmgr: option requires an argument -- &amp;#39;d&amp;#39; &lt;/span&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
&lt;span class="tok-go"&gt;efibootmgr version 17&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Et pour mémoire, l&amp;#8217;option &lt;code&gt;-d&lt;/code&gt; de l&amp;#8217;efibootmgr correspond à : &lt;code&gt;-d|--disk containing loader&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;La manière officielle d&amp;#8217;installer le GRUB (et donc ce que &lt;code&gt;calamares&lt;/code&gt; essaye) est :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;$&lt;/span&gt; sudo grub-install --target&lt;span class="tok-o"&gt;=&lt;/span&gt;x86_64-efi --efi-directory&lt;span class="tok-o"&gt;=&lt;/span&gt;/boot/efi --bootloader-id&lt;span class="tok-o"&gt;=&lt;/span&gt;Artix --force&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;C&amp;#8217;est cette commande qui essaye de lancer &lt;code&gt;efibootmgr&lt;/code&gt; pour créer les
enregistrements de chemin des fichier UEFI du stockage local dans le BIOS (et
ça me semble toujours être une très mauvaise idée
&lt;a href="/2018/os_debian_from_old_disk_to_new_disk.html#version_fr"&gt;même avec
quelques années de recul&lt;/a&gt;). Quand le stockage local est un tableau RAID, la
procédure échoue car le BIOS a besoin d&amp;#8217;être instruit d&amp;#8217;un chemin précis, sur
un disque physique et une partition FAT32 (une façon de faire que Linux
Torvalds a décrite comme résultant d&amp;#8217;une
&lt;a href="https://yarchive.net/comp/linux/efi.html"&gt;attaque cérébrale&lt;/a&gt; chez son
concepteur, Intel).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Pour circonvenir au problème, j&amp;#8217;ai trouvé comment indiquer à &lt;code&gt;grub-install&lt;/code&gt;
d&amp;#8217;éviter l&amp;#8217;étape &lt;code&gt;efibootmgr&lt;/code&gt; d&amp;#8217;une part et je me suis résolu à créer les
entrées dans le BIOS à la main d&amp;#8217;autre part.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;En fait j&amp;#8217;ai d&amp;#8217;abord pris le temps de vérifier que mon GRUB était configuré
pour supporter les tableaux RAID et le chiffrement LUKS via &lt;code&gt;cryptsetup&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Dans le fichier &lt;code&gt;/etc/default/grub&lt;/code&gt; j&amp;#8217;ai vérifié la présence des lignes
suivantes :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-go"&gt;GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;quiet cryptdevice=UUID=XXXX-YYYY-…:luks-XXXX-YYYY-… root=/dev/mapper/luks-XXXX-YYYY-…&amp;quot; &lt;/span&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
&lt;span class="tok-go"&gt;GRUB_ENABLE_CRYPTODISK=y &lt;/span&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Où les jetons &lt;code&gt;XXXX-YYYY-…&lt;/code&gt; doivent être remplacés par l&amp;#8217;UUID de votre partition LUKS (&lt;code&gt;lsblk&lt;/code&gt; &lt;a href="/2019/find_storage_node.html"&gt;peut vous lister l&amp;#8217;UUID en question&lt;/a&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Cette ligne est à la fin du fichier chez moi&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_installer_grub"&gt;2.5. Installer Grub&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Vous pouvez ensuite enfin installer votre GRUB avec la série de commandes
suivantes :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;$&lt;/span&gt; sudo grub-mkconfig -o &lt;span class="tok-s1"&gt;&amp;#39;/boot/grub/grub.cfg&amp;#39;&lt;/span&gt; &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
&lt;span class="tok-gp"&gt;$&lt;/span&gt; sudo mkinitcpio -p &lt;span class="tok-s1"&gt;&amp;#39;linux&amp;#39;&lt;/span&gt; &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;
&lt;span class="tok-gp"&gt;$&lt;/span&gt; sudo grub-install --target&lt;span class="tok-o"&gt;=&lt;/span&gt;&lt;span class="tok-s1"&gt;&amp;#39;x86_64-efi&amp;#39;&lt;/span&gt; --efi-directory&lt;span class="tok-o"&gt;=&lt;/span&gt;&lt;span class="tok-s1"&gt;&amp;#39;/boot/efi&amp;#39;&lt;/span&gt; --no-nvram --bootloader-id&lt;span class="tok-o"&gt;=&lt;/span&gt;&lt;span class="tok-s1"&gt;&amp;#39;Artix&amp;#39;&lt;/span&gt; --force &lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;(3)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Ceci re-génère le fichier de configuration utilisé par GRUB lors du démarrage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Ceci re-génère l&amp;#8217;initramfs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Et enfin ceci installe vraiment le GRUB dans son dossier &lt;code&gt;/boot/efi/EFI/Artix&lt;/code&gt; sur la partition voulue (et montée ! ce qui peut être vérifié via &lt;code&gt;sudo mount | grep /boot&lt;/code&gt;). C&amp;#8217;est sinon l&amp;#8217;argument &lt;code&gt;--no-nvram&lt;/code&gt; qui évite que &lt;code&gt;grub-install&lt;/code&gt; n&amp;#8217;échoue sur &lt;code&gt;efibootmgr&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;N&amp;#8217;oubliez pas ensuite de créer vos entrées UEFI dans le BIOS. Elles doivent
pointer sur le fichier &lt;code&gt;/boot/efi/EFI/Artix/grubx64.efi&lt;/code&gt;. J&amp;#8217;en ai
personnellement créé deux, une pour chaque supportphysique de données. Le BIOS
ne devrait pas écrire sur le disque, mais si des options le permettent (comme
une création de dossier, ou un renommage) évitez les, vraiment.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_grub_sur_raid_diskfilter_writes_are_not_supported"&gt;2.6. GRUB sur RAID : Diskfilter writes are not supported&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Arrivé là, le système devrait démarrer (enfin !), mais le GRUB râle encore à
chaque démarrage à propos d&amp;#8217;écritures non supportées sur le disque :
&lt;code&gt;diskfilter writes are not supported&lt;/code&gt;. Le démarrage s&amp;#8217;arrête et il vous est
demandé d&amp;#8217;appuyer sur une touche pour continuer.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Il est possible d&amp;#8217;éviter ça et de démarrer d&amp;#8217;une traite (une fois le mot de
passe de déverrouillage du stockage saisi ; j&amp;#8217;ai du mal à écrire "du disque"
ici parce qu&amp;#8217;une part on parle d&amp;#8217;un tableau RAID avec deux supports et d&amp;#8217;autre
part les supports NVMe&amp;#8201;&amp;#8212;&amp;#8201;Non-Volatile Memory&amp;#8201;&amp;#8212;&amp;#8201;n&amp;#8217;ont plus aucune pièce
mécanique plate et circulaire, c&amp;#8217;est plus proche d&amp;#8217;une barrette de RAM avec une
pile intégrée… sur le principe).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Comme expliqué
&lt;a href="https://blog.cykerway.com/posts/2019/12/25/grub2-diskfilter-writes-are-not-supported.html"&gt;ici&lt;/a&gt;,
la solution consiste à commenter les lignes &lt;code&gt;save_env&lt;/code&gt; du fichier
&lt;code&gt;/boot/grub/grub.cfg&lt;/code&gt; (et à recommencer à chaque lancement de &lt;code&gt;grub-mkconfig&lt;/code&gt;).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;$&lt;/span&gt; sudo vim +&lt;span class="tok-s2"&gt;&amp;quot;%s/save_env/# save_env/&amp;quot;&lt;/span&gt; +wq /boot/grub/grub.cfg  &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt; &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Certes, la méthode traditionnelle Unix serait plus à base de &lt;code&gt;sed&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Si vous ne mettez pas le &lt;code&gt;+wq&lt;/code&gt;, vous allez vous retrouver dans l&amp;#8217;éditeur de
texte avec les modifications faîtes et la possibilité de vérifier ce qui se
passe avant de sauver le fichier…&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_un_dernier_piège_le_fichier_img_manquant_dans_boot"&gt;2.7. Un dernier piège : le fichier &lt;code&gt;.img&lt;/code&gt; manquant dans &lt;code&gt;/boot&lt;/code&gt;&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Si vous avez installé à la fois les paquets &lt;code&gt;amd-ucode&lt;/code&gt; et &lt;code&gt;intel-ucode&lt;/code&gt;
&lt;sup class="footnote"&gt;[&lt;a id="_footnoteref_4" class="footnote" href="#_footnotedef_4" title="View footnote."&gt;4&lt;/a&gt;]&lt;/sup&gt; avant de re-générer l&amp;#8217;initaramfs de
votre système (un scénario qui ne devrait pas arriver, on est d&amp;#8217;accord…), il
vous faudra re-générer votre initramfs quand vous déciderez de retirer un des
deux paquets pour éviter une incapacité de démarrer à cause d&amp;#8217;un fichier ucode
manquant.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Aussi surprenant que cela puisse paraître, désinstaller un de
ces paquets ne lance pas automatiquement une re-génération de l&amp;#8217;initramfs.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_mise_à_jour_2022_06_si_mdadm_ne_monte_plus_les_tableaux_raid"&gt;2.8. Mise à jour 2022-06 : si mdadm ne monte plus les tableaux RAID&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Après une mise à jour, la machine a refusé de démarrer. Le processus &lt;code&gt;init&lt;/code&gt;
annonçait une erreur inattendue et me laissant une invite de commande d&amp;#8217;urgence
pour inspecter la situation &lt;code&gt;ash&lt;/code&gt;. Ce problème est généralement lié au fait
qu&amp;#8217;init n&amp;#8217;arrive pas à monter la partition désignée pour la racine du système à
démarrer.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Dans mon cas, une mise à jour de &lt;code&gt;mdadm&lt;/code&gt; avait introduit un changement dans le
nommage des disques et partitions par la commande, rendant &lt;code&gt;mdadm&lt;/code&gt; incapable
d&amp;#8217;auto-détecter les tableaux RAID pendant cette phase préliminaire du
démarrage.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Je pouvais monter mes tableaux via &lt;code&gt;mdadm --assemble …&lt;/code&gt; mais pas terminer le
bout en relançant &lt;code&gt;./init&lt;/code&gt;. Ce dernier s&amp;#8217;exécutait désormais sans erreur mais
ne m&amp;#8217;extrayait pas de l&amp;#8217;environnement de récupération sur panne. Si vous savez
pourquoi, n&amp;#8217;hésitez pas à me l&amp;#8217;apprendre.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Après quelques lectures sur le forum et le wiki d&amp;#8217;Artix, j&amp;#8217;ai appris que ce
genre de pannes n&amp;#8217;était pas tout à fait exceptionnelles et que la méthode
officielle pour régler le problème est de démarrer la machine via une ISO
récente d&amp;#8217;Artix en &lt;em&gt;live&lt;/em&gt; sur une clé USB puis de déplacer son environnement
d&amp;#8217;exécution vers le disque de la machine via la commande &lt;code&gt;artix-chroot&lt;/code&gt; et
d&amp;#8217;exécuter à nouveau les commandes de la section &lt;strong&gt;Installation Grub&lt;/strong&gt; pour
mettre à jour l&amp;#8217;initramfs (et si vos partitions ont vraiment changé de nom ou
que vous avez changé de support de stockage et obtenu un nouvel UUID, vous
pouvez aussi avoir à retoucher à la configuration de GRUB).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Note pour plus tard : si un disque RAID devait être changé, il serait
probablement nécessaire de regénérer l&amp;#8217;initramfs après la réparation du
tableau. Il me semble que Debian se débrouille pour regénèrer son initramfs
tout seul quand il y a besoin…&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Voilà comment ce que j&amp;#8217;imaginais comme une installation simple a finalement
consommé probablement plus de temps que ce que j&amp;#8217;espère en sauver en cas de
défaillance matérielle d&amp;#8217;un des supports de stockage ! (et je ne compte pas le
temps passé à rédiger ce billet)&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="footnotes"&gt;
&lt;hr&gt;
&lt;div class="footnote" id="_footnotedef_1"&gt;
&lt;a href="#_footnoteref_1"&gt;1&lt;/a&gt;. artix-xfce-openrc-20210726-x86_64.iso
&lt;/div&gt;
&lt;div class="footnote" id="_footnotedef_2"&gt;
&lt;a href="#_footnoteref_2"&gt;2&lt;/a&gt;. v3.2.39.3
&lt;/div&gt;
&lt;div class="footnote" id="_footnotedef_3"&gt;
&lt;a href="#_footnoteref_3"&gt;3&lt;/a&gt;. Packages that allow to update your CPU firmware in early boot stage, at each boot, to avoid shameful security breaches delivered by manufacturers for instance
&lt;/div&gt;
&lt;div class="footnote" id="_footnotedef_4"&gt;
&lt;a href="#_footnoteref_4"&gt;4&lt;/a&gt;. Paquets qui permettent de mettre à jour le firmware de votre CPU, très tôt à chaque démarrage, pour éviter d&amp;#8217;honteuses failles de sécurité livrées par les constructeur par exemple.
&lt;/div&gt;
&lt;/div&gt;</content><category term="Articles"/><category term="storage"/><category term="Artix"/><category term="install"/><category term="security"/></entry><entry><title>Keep colors in your console : grep | less</title><link href="https://grimoire.d12s.fr/2021/keep_colors_of_grep_pipe_less.html" rel="alternate"/><published>2021-07-29T00:00:00+02:00</published><updated>2021-07-29T00:00:00+02:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2021-07-29:/2021/keep_colors_of_grep_pipe_less.html</id><summary type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Conserver les couleurs d&amp;#8217;un `grep | less`&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Quand on cherche une chaîne de caractères dans plusieurs fichiers, parfois on en trouve trop et ça défile à l&amp;#8217;écran… Il peut alors valoir le coup de paginer l&amp;#8217;affichage de sa recherche. Malheureusement les réglages par défaut de cette combinaison suppriment …&lt;/em&gt;&lt;/p&gt;&lt;/div&gt;</summary><content type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Conserver les couleurs d&amp;#8217;un `grep | less`&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Quand on cherche une chaîne de caractères dans plusieurs fichiers, parfois on en trouve trop et ça défile à l&amp;#8217;écran… Il peut alors valoir le coup de paginer l&amp;#8217;affichage de sa recherche. Malheureusement les réglages par défaut de cette combinaison suppriment la coloration des résultats. Il faut alors dire à &lt;code&gt;grep&lt;/code&gt; (qui cherche) et à &lt;code&gt;less&lt;/code&gt; (qui pagine et permet de remonter la pagination) de garder les couleurs du texte cherché.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;$&lt;/span&gt; rgrep --color&lt;span class="tok-o"&gt;=&lt;/span&gt;always motif &lt;span class="tok-p"&gt;|&lt;/span&gt; less -R  &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt; &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;motif&lt;/code&gt; is the searched text&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;-R&lt;/code&gt; tells less to display ANSI color control characters&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;</content><category term="Commandes"/><category term="shell"/><category term="Debian"/><category term="comfort"/></entry><entry><title>Tor : renew circuits</title><link href="https://grimoire.d12s.fr/2021/tor_renew_circuits.html" rel="alternate"/><published>2021-06-14T00:00:00+02:00</published><updated>2021-06-14T00:00:00+02:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2021-06-14:/2021/tor_renew_circuits.html</id><summary type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;En utilisant le Tor Browser, si t&amp;#8217;as une interruption de connexion internet (ou que tu as changé de connexion) et qu&amp;#8217;il a perdu ses circuits, tu peux en retrouver sans avoir à le relancer en émettant un signal &lt;code&gt;hangup&lt;/code&gt; pour lui demander de refaire ses circuits&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;When using …&lt;/p&gt;&lt;/div&gt;</summary><content type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;En utilisant le Tor Browser, si t&amp;#8217;as une interruption de connexion internet (ou que tu as changé de connexion) et qu&amp;#8217;il a perdu ses circuits, tu peux en retrouver sans avoir à le relancer en émettant un signal &lt;code&gt;hangup&lt;/code&gt; pour lui demander de refaire ses circuits&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;When using the TorBrowser, if your internet connection fails, you can renew your Tor circuits whithout having to restart your TorBrowser, using a &lt;code&gt;hangup&lt;/code&gt; signal on the &lt;code&gt;tor&lt;/code&gt; program.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;#&lt;/span&gt; killall -HUP tor&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;</content><category term="Commandes"/><category term="Firefox"/><category term="Tor"/><category term="network"/></entry><entry><title>Minimal power consumption of an OLED screen</title><link href="https://grimoire.d12s.fr/2021/green_on_black_oled_screen.html" rel="alternate"/><published>2021-05-20T00:00:00+02:00</published><updated>2021-05-20T00:00:00+02:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2021-05-20:/2021/green_on_black_oled_screen.html</id><summary type="html">&lt;div id="toc" class="toc"&gt;
&lt;div id="toctitle"&gt;Index&lt;/div&gt;
&lt;ul class="sectlevel1"&gt;
&lt;li&gt;&lt;a href="#_version_en"&gt;1. version : en&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_version_fr"&gt;2. version : fr&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_version_en"&gt;1. version : en&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;With OLED screens (found in smartphones or laptops) each pixel is an
independent LED (Light Emitting Diode). When a pixel is black, it consumes no
energy.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;That explains why a lot of operating systems integrated dark modes during the
last …&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</summary><content type="html">&lt;div id="toc" class="toc"&gt;
&lt;div id="toctitle"&gt;Index&lt;/div&gt;
&lt;ul class="sectlevel1"&gt;
&lt;li&gt;&lt;a href="#_version_en"&gt;1. version : en&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_version_fr"&gt;2. version : fr&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_version_en"&gt;1. version : en&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;With OLED screens (found in smartphones or laptops) each pixel is an
independent LED (Light Emitting Diode). When a pixel is black, it consumes no
energy.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;That explains why a lot of operating systems integrated dark modes during the
last decade : using a dark background might spare 40% of the screen energy.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;If you want to minimize the screen consumption when displaying text you might
want to use a black background.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Then, if you write on white over this black background, each white dot will in
fact be composed of 3 pixels : one red, one green and one blue. So writing in
pure green over pure black will spare more pixels.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;But why green ? Because it allows to set the screen illumination power to a
minimal, because the human eye sees green with more intensity than red or blue
&lt;sup class="footnote"&gt;[&lt;a id="_footnoteref_1" class="footnote" href="#_footnotedef_1" title="View footnote."&gt;1&lt;/a&gt;]&lt;/sup&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="quoteblock"&gt;
&lt;div class="title"&gt;Also, as stated by &lt;a href="https://mamot.fr/@devnull/106295711019835084"&gt;Dave Null&lt;/a&gt;, green on black setting maximise the contrast of the text :&lt;/div&gt;
&lt;blockquote&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;If you consider pure colors, so red is rgb(255, 0, 0), green is rgb(0, 255, 0),
blue is rgb(0, 0, 255), and black is actually black (not dark gray) thus
rgb(0,0,0).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Colors have the same Saturation (100 in the HSL model) and the same lightness (50
in the HSL model). But contrast on black varies a lot.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Green on Black is 87,8%&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Red on Black 54.3%&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Blue on Black 29,6%…&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;So Blue text on Black background is visible but harder to read.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;To finish, one should also check that its green pixels don&amp;#8217;t consume more the
others. As per &lt;a href="https://www.oled-info.com/google-details-oled-power-consumption-shows-how-androids-dark-mode-can-help-extend-your-battery-life"&gt;Google data from 2016 regarding AMOLED screens&lt;/a&gt; :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Red is smallest energy consumer&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Green is about the same as Red&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Blue consumes more than twice the energy of the others&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_version_fr"&gt;2. version : fr&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Sur un écran OLED (comme on en trouve dans des smartphones ou des ordinateurs)
chaque pixel est une DEL (Diode Électroluminescente) indépendante. Quand un
pixel est noir, il ne consomme pas d&amp;#8217;énergie.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Ceci explique que la plupart des systèmes d&amp;#8217;exploitation aient intégré un mode
d&amp;#8217;affichage à fond sombre dans la dernière décennie : utiliser un fond sombre
pourrait économiser 40% de l&amp;#8217;énergie consommée par l&amp;#8217;écran.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Pour minimiser l&amp;#8217;énergie consommée par l&amp;#8217;écran quand il affiche du texte, il
est intéressant d&amp;#8217;utiliser un fond noir.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;De là, si le texte est affiché en blanc sur noir, chaque point blanc de l&amp;#8217;écran
est en fait composé de trois pixels : un rouge, un vert et un bleu. Écrire en
vert pur sur du noir pur économise donc encore de l&amp;#8217;énergie.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Mais pourquoi vert ? Parce ça permet de réduire au maximum la luminosité de
l&amp;#8217;écran, car
&lt;a href="https://fr.wikipedia.org/wiki/Vision_humaine#Sensibilit%C3%A9_visuelle"&gt;les yeux
humains sont plus sensibles à la lumière verte&lt;/a&gt; &lt;sup class="footnote"&gt;[&lt;a id="_footnoteref_2" class="footnote" href="#_footnotedef_2" title="View footnote."&gt;2&lt;/a&gt;]&lt;/sup&gt; qu&amp;#8217;aux autres
couleurs &lt;sup class="footnote"&gt;[&lt;a id="_footnoteref_3" class="footnote" href="#_footnotedef_3" title="View footnote."&gt;3&lt;/a&gt;]&lt;/sup&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="quoteblock"&gt;
&lt;div class="title"&gt;De plus, comme l&amp;#8217;a indiqué &lt;a href="https://mamot.fr/@devnull/106295711019835084"&gt;Dave Null&lt;/a&gt;, un réglage vert sur noir maximise le contraste de l&amp;#8217;affichage :&lt;/div&gt;
&lt;blockquote&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Si on considère des couleurs pures donc avec du rouge rgb(255, 0, 0), du vert
rgb(0, 255, 0) du  bleu : rgb(0, 0, 255) et du noir : rgb(0, 0, 0).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Les couleurs ont la même saturation (100 suivant le modèle HSL) et la même
luminosité (50 suivant le modèle HSL). Mais le contraste par rapport au noir
varie beaucoup.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;L&amp;#8217;affichage en :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;vert sur noir représente un contraste de 87,8%,&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;quand le rouge sur noir ne représente qu&amp;#8217;un contraste de 54,3%&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;et le bleu sur noir un contraste de 29,6%…&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Un texte bleu sur noir est donc visible mais plus dur à lire.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Pour compléter la réflexion il convient de s&amp;#8217;assurer que les pixels verts de
son écran OLED ne consomment pas plus d&amp;#8217;énergie que les autres. Selon des
&lt;a href="https://www.oled-info.com/google-details-oled-power-consumption-shows-how-androids-dark-mode-can-help-extend-your-battery-life"&gt;données
publiées par Google en 2016 concernant les écrans de type AMOLED&lt;/a&gt; :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;le rouge est le plus économique&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mais le vert a une consommation presque équivalente&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;alors que le bleu consomme plus du double d&amp;#8217;énergie&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="footnotes"&gt;
&lt;hr&gt;
&lt;div class="footnote" id="_footnotedef_1"&gt;
&lt;a href="#_footnoteref_1"&gt;1&lt;/a&gt;. This can be tested with an Android smartphone, and the Cool Reader app from F-Droid.org. Sets the display of an ePub book red on black with 1% of screen light power, you might be unable to read the screen, even in the dark. Idem with blue. Chances are that you&amp;#8217;ll be able to read it with green !
&lt;/div&gt;
&lt;div class="footnote" id="_footnotedef_2"&gt;
&lt;a href="#_footnoteref_2"&gt;2&lt;/a&gt;. Au 2021-05-25 : « La sensibilité maximale correspond à un rayonnement de 555 nm. Une lumière où un tel rayonnement domine se perçoit d&amp;#8217;une couleur vert-jaune. »
&lt;/div&gt;
&lt;div class="footnote" id="_footnotedef_3"&gt;
&lt;a href="#_footnoteref_3"&gt;3&lt;/a&gt;. Pour le vérifier, on peut utiliser un téléphone portable Android avec l&amp;#8217;application Cool Reader d&amp;#8217;F-Droid.org. Régler l&amp;#8217;affichage en rouge sur noir et la luminosité de l&amp;#8217;écran à 1%. Vous n&amp;#8217;arriverez probablement pas à lire le texte (même dans le noir). Idem avec le bleu. Mais il y a fort à parier qu&amp;#8217;avec le texte en vert vous puissez le lire !
&lt;/div&gt;
&lt;/div&gt;</content><category term="Articles"/><category term="android"/><category term="comfort"/><category term="optimization"/><category term="hardware"/></entry><entry><title>vim : vertical selections (and substitutions)</title><link href="https://grimoire.d12s.fr/2021/vim_vertical_selection.html" rel="alternate"/><published>2021-04-22T00:00:00+02:00</published><updated>2021-04-22T00:00:00+02:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2021-04-22:/2021/vim_vertical_selection.html</id><summary type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Faire une sélection verticale dans du texte avec vim, et remplacer d&amp;#8217;un coup cette portion de texte sur chaque ligne concernée.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;To toggle the vertical selection mode, press: &lt;span class="keyseq"&gt;&lt;kbd&gt;CTRL&lt;/kbd&gt;+&lt;kbd&gt;V&lt;/kbd&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code&gt;&lt;span&gt;&lt;/span&gt;➞ ➞ ➞ &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
↓↓ &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;
s &lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;(3)&lt;/b&gt;
&amp;lt;your new text&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Use the right arrow to select some characters on the current …&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;</summary><content type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Faire une sélection verticale dans du texte avec vim, et remplacer d&amp;#8217;un coup cette portion de texte sur chaque ligne concernée.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;To toggle the vertical selection mode, press: &lt;span class="keyseq"&gt;&lt;kbd&gt;CTRL&lt;/kbd&gt;+&lt;kbd&gt;V&lt;/kbd&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code&gt;&lt;span&gt;&lt;/span&gt;➞ ➞ ➞ &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
↓↓ &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;
s &lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;(3)&lt;/b&gt;
&amp;lt;your new text&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Use the right arrow to select some characters on the current line&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Use the down arrow to continue your selection downward (expending the selection to letters of a second line)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;s&lt;/code&gt; triggers the substitution feature which first deletes the selection on each lines, and then allows you to type a new text, ending by an &lt;kbd&gt;Esc&lt;/kbd&gt; strike which propagates the new text to the other (previously) selected lines.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;To finish the substitution, press &lt;kbd&gt;Esc&lt;/kbd&gt;&lt;/p&gt;
&lt;/div&gt;</content><category term="Commandes"/><category term="Vim"/></entry><entry><title>Continue a failed download with : wget -c</title><link href="https://grimoire.d12s.fr/2021/wget_continue_download.html" rel="alternate"/><published>2021-04-08T00:00:00+02:00</published><updated>2021-04-08T00:00:00+02:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2021-04-08:/2021/wget_continue_download.html</id><summary type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Reprendre et continuer un téléchargement échoué.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;$&lt;/span&gt; curl -O https://&lt;span class="tok-nv"&gt;$domain&lt;/span&gt;/&lt;span class="tok-nv"&gt;$file&lt;/span&gt; &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
&lt;span class="tok-gp"&gt;$&lt;/span&gt; wget -c https://&lt;span class="tok-nv"&gt;$domain&lt;/span&gt;/&lt;span class="tok-nv"&gt;$file&lt;/span&gt; &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;If any download fails but let you with a portion of downloaded file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;wget -c&lt;/code&gt; will complete the download of the file&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="admonitionblock warning"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class="icon"&gt;
&lt;i class="fa icon-warning" title="Warning"&gt;&lt;/i&gt;
&lt;/td&gt;
&lt;td class="content"&gt;
You need to ensure that the &lt;code&gt;$file&lt;/code&gt; file …&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;</summary><content type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Reprendre et continuer un téléchargement échoué.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;$&lt;/span&gt; curl -O https://&lt;span class="tok-nv"&gt;$domain&lt;/span&gt;/&lt;span class="tok-nv"&gt;$file&lt;/span&gt; &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
&lt;span class="tok-gp"&gt;$&lt;/span&gt; wget -c https://&lt;span class="tok-nv"&gt;$domain&lt;/span&gt;/&lt;span class="tok-nv"&gt;$file&lt;/span&gt; &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;If any download fails but let you with a portion of downloaded file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;wget -c&lt;/code&gt; will complete the download of the file&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="admonitionblock warning"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class="icon"&gt;
&lt;i class="fa icon-warning" title="Warning"&gt;&lt;/i&gt;
&lt;/td&gt;
&lt;td class="content"&gt;
You need to ensure that the &lt;code&gt;$file&lt;/code&gt; file name of the downloaded portion you have is the correct file name, not a modified one with for instance some kind of suffix : ".part" ; "-partial" ; else &lt;code&gt;wget&lt;/code&gt; wont find it.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;</content><category term="Commandes"/><category term="network"/></entry><entry><title>Delta-Chat one year FAQ</title><link href="https://grimoire.d12s.fr/2021/delta-chat_one_year_faq.html" rel="alternate"/><published>2021-04-02T00:00:00+02:00</published><updated>2021-04-02T00:00:00+02:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2021-04-02:/2021/delta-chat_one_year_faq.html</id><summary type="html">&lt;div id="toc" class="toc"&gt;
&lt;div id="toctitle"&gt;Index&lt;/div&gt;
&lt;ul class="sectlevel1"&gt;
&lt;li&gt;&lt;a href="#_version_en"&gt;1. version : en&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_version_fr"&gt;2. version : fr&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_version_en"&gt;1. version : en&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I use &lt;a href="https://delta.chat"&gt;Delta-Chat&lt;/a&gt; with pleasure since a year. I had, from time to time, some difficult questions from my friends, here are the answers:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;it&amp;#8217;s broken now&lt;/strong&gt;: the user did change his email account password but did not update …&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</summary><content type="html">&lt;div id="toc" class="toc"&gt;
&lt;div id="toctitle"&gt;Index&lt;/div&gt;
&lt;ul class="sectlevel1"&gt;
&lt;li&gt;&lt;a href="#_version_en"&gt;1. version : en&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_version_fr"&gt;2. version : fr&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_version_en"&gt;1. version : en&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I use &lt;a href="https://delta.chat"&gt;Delta-Chat&lt;/a&gt; with pleasure since a year. I had, from time to time, some difficult questions from my friends, here are the answers:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;it&amp;#8217;s broken now&lt;/strong&gt;: the user did change his email account password but did not update his Delta-Chat configuration ;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;I get some messages, but am missing some others&lt;/strong&gt;: it might be that the user is actually deleting the messages from his webmail (or they are sorted as spam), before that Delta-Chat read and sort them in the Delta-Chat folder. It&amp;#8217;s usually possible to configure the webmail to sort Delta-Chat messages directly into the right folder ;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;a message refuses to go&lt;/strong&gt;: this message might include a too big file for your email provider (such a video bigger than 5 MB).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;I got an unreadable message&lt;/strong&gt;: you might have to exchange keys one more time, and to talk to your contact via another channel to determine what happened to the previous keys (one of you may have re-installed it&amp;#8217;s Delta-Chat software forgeting to import a keyed backup…).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_version_fr"&gt;2. version : fr&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;J&amp;#8217;utilise &lt;a href="https://delta.chat"&gt;Delta-Chat&lt;/a&gt; avec bonheur depuis un an. J&amp;#8217;ai
rencontré des étrangetés qui ont toutes été expliquées, par exemple :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;ça ne marche plus&lt;/strong&gt; : l&amp;#8217;utilisateur peut avoir changé le mot de passe de son compte de courriel sans en informer Delta-Chat sur son téléphone ;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;je reçois certains messages et pas d&amp;#8217;autres&lt;/strong&gt; : c&amp;#8217;est généralement parce que l&amp;#8217;utilisateur supprime les messages depuis son webmail (ou que ces derniers arrivent dans les spam), avant que Delat-Chat n&amp;#8217;y accède (et ne les range dans le dossier Delta-Chat). Il est généralement possible de configurer le webmail pour qu&amp;#8217;il range lui aussi les messages de Delta-Chat dans le bon dossier ;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;un message ne part pas&lt;/strong&gt; : il peut s&amp;#8217;agir d&amp;#8217;un message comportant une trop grosse pièce jointe (comme une vidéo de plus de 5 Mo) ;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;j&amp;#8217;ai reçu de la bouillie&lt;/strong&gt; : il faut refaire un échange de clé, et se demander, via un autre canal, s&amp;#8217;il y a une raison à ce nouvel échange de clé… logiquement, l&amp;#8217;un des deux interlocuteurs aura ré-installé l&amp;#8217;application sans importer de sauvegarde…&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</content><category term="Articles"/><category term="security"/><category term="network"/><category term="android"/></entry><entry><title>Why Artix Linux</title><link href="https://grimoire.d12s.fr/2021/why_artix_linux.html" rel="alternate"/><published>2021-03-24T00:00:00+01:00</published><updated>2021-03-24T00:00:00+01:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2021-03-24:/2021/why_artix_linux.html</id><summary type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;J&amp;#8217;ai mis 10 ans à configurer ma Debian comme une Artix Linux par défaut.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;It took me 10 years to configure Debian like a default Artix Linux.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;storage full encryption (just a checkbox at install time)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;/tmp&lt;/code&gt; mounted in RAM&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;an XFC4 modern, with hiDPI support&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;OpenRC as &lt;a href="/2019/unix_init.html"&gt;init …&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;</summary><content type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;J&amp;#8217;ai mis 10 ans à configurer ma Debian comme une Artix Linux par défaut.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;It took me 10 years to configure Debian like a default Artix Linux.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;storage full encryption (just a checkbox at install time)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;/tmp&lt;/code&gt; mounted in RAM&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;an XFC4 modern, with hiDPI support&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;OpenRC as &lt;a href="/2019/unix_init.html"&gt;init&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;That&amp;#8217;s why Artix (Arch based) is now on top of my Unix init distro collection :
&lt;a href="/2019/unix_init.html"&gt;Unix init or not&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;With Artix it was easy to :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="/2021/intel_undervolt.html"&gt;Undervolt my laptop CPU with &lt;code&gt;intel-undervolt&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="/2021/openpgp_16k_rsa_keys.html"&gt;Generate a 16k PGP key with &lt;code&gt;gnupg-large-rsa&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="/2021/ext4_shaker.html"&gt;Defrag an Ext4 filesystem with the &lt;code&gt;shake&lt;/code&gt; command&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Thanks to the AUR (Arch User Repository), which facilitates the creation of
packages for Arch base systems.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;In Arch world packages are fast to install, being compressed using the &lt;code&gt;zstd&lt;/code&gt; algorithm.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Artix suggests good Firefox modules pre-packaged, and it saves time for
repeated installations.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;To finish, here are install notes from a french Linux User Group : &lt;a href="https://framagit.org/gebull/install" class="bare"&gt;https://framagit.org/gebull/install&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Or my little bit more sofisticated &lt;a href="/2021/artix_linux_on_raid_with_full_encryption.html"&gt;Artix Linux on RAID with full encryption&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;</content><category term="Articles"/><category term="Artix"/><category term="Debian"/></entry><entry><title>Defrag Ext4 file system with shake</title><link href="https://grimoire.d12s.fr/2021/ext4_shaker.html" rel="alternate"/><published>2021-03-17T00:00:00+01:00</published><updated>2021-03-17T00:00:00+01:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2021-03-17:/2021/ext4_shaker.html</id><summary type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Les systèmes de fichiers ext3 / ext4 etc. fragmentent. Peu, pas vite, mais au bout de 6 ans ça ralentit l&amp;#8217;ordinateur. Il existe la commande &lt;code&gt;shake&lt;/code&gt; pour défragmenter.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Ext file systems are fragmenting. A little bit, slowly, but after a quite some years it slows down a computer. That&amp;#8217;s …&lt;/p&gt;&lt;/div&gt;</summary><content type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Les systèmes de fichiers ext3 / ext4 etc. fragmentent. Peu, pas vite, mais au bout de 6 ans ça ralentit l&amp;#8217;ordinateur. Il existe la commande &lt;code&gt;shake&lt;/code&gt; pour défragmenter.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Ext file systems are fragmenting. A little bit, slowly, but after a quite some years it slows down a computer. That&amp;#8217;s why it exists the &lt;code&gt;shake&lt;/code&gt; command, to defrag old systems. &lt;code&gt;shake&lt;/code&gt; is a defragmenter that runs in userspace, without the need of patching the kernel and while the system is used (for now, on GNU/Linux only).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Using Arch Linux the &lt;code&gt;shake&lt;/code&gt; command is available as a PKGBBUILD. Using Debian there is a third-party repository (vleu.net/apt) or it&amp;#8217;s easy to compile.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="admonitionblock tip"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class="icon"&gt;
&lt;i class="fa icon-tip" title="Tip"&gt;&lt;/i&gt;
&lt;/td&gt;
&lt;td class="content"&gt;
First, check that your partition is mounted with the &lt;code&gt;user_xattr&lt;/code&gt; option, else edit your &lt;code&gt;/etc/fstab&lt;/code&gt; to add this option then call &lt;code&gt;mount -o remount MY_PARTITION&lt;/code&gt;. Shake can works without them, but will be less efficient (it use &lt;code&gt;xattr&lt;/code&gt; to store information helping incremental use).
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Then, you can check the fragmentation of a directory or a whole unmounted partition with :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;# shake --pretend --verbose --verbose $my_dir &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt; &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;launched as root&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;$my_dir&lt;/code&gt; should be replace with an existing directory&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;And reduce it via :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;# shake $my_dir &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
# find -iname '*.mp3' | sort | shake &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;to defrag the &lt;code&gt;$my_dir&lt;/code&gt; directory&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;to defrag all MP3 in a directory, puting together on the disk those close in lexical order&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="admonitionblock warning"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class="icon"&gt;
&lt;i class="fa icon-warning" title="Warning"&gt;&lt;/i&gt;
&lt;/td&gt;
&lt;td class="content"&gt;
Better avoid shaking : &lt;code&gt;/proc&lt;/code&gt; &lt;code&gt;/sys&lt;/code&gt; &lt;code&gt;/dev&lt;/code&gt; &lt;code&gt;/tmp&lt;/code&gt; or &lt;code&gt;/run&lt;/code&gt; ; it&amp;#8217;s useless
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="admonitionblock warning"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class="icon"&gt;
&lt;i class="fa icon-warning" title="Warning"&gt;&lt;/i&gt;
&lt;/td&gt;
&lt;td class="content"&gt;
SSD storages are less affected (nearly not at all) by fragmentation, it&amp;#8217;s their normal way of operation. But rescue utilities (such as : &lt;code&gt;fsck&lt;/code&gt; or &lt;code&gt;photorec&lt;/code&gt;) are way faster on defragmented filesystems, so better keep it defragmented and let the storage microcontroller manage hardware fragmentation / wear balance.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="admonitionblock note"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class="icon"&gt;
&lt;i class="fa icon-note" title="Note"&gt;&lt;/i&gt;
&lt;/td&gt;
&lt;td class="content"&gt;
More information of the official website of the project : &lt;a href="http://vleu.net/shake/" class="bare"&gt;http://vleu.net/shake/&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;</content><category term="Commandes"/><category term="adminsys"/><category term="optimization"/><category term="repair"/><category term="storage"/></entry><entry><title>Undervolt Intel mobile CPU (Kabylake)</title><link href="https://grimoire.d12s.fr/2021/intel_undervolt.html" rel="alternate"/><published>2021-03-03T00:00:00+01:00</published><updated>2021-03-03T00:00:00+01:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2021-03-03:/2021/intel_undervolt.html</id><summary type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Baisser la tension d&amp;#8217;alimentation de son microprocesseur Intel (génération Kabylake ou plus) pour qu&amp;#8217;il chauffe moins et s&amp;#8217;autorise à fonctionner plus vite.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="quoteblock"&gt;
&lt;blockquote&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;What is “undervolting”? Undervolting means to reduce the voltage a component receives.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Why does this matter? Lowering the voltage, even by relatively small amounts, reduces …&lt;/p&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;/div&gt;</summary><content type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Baisser la tension d&amp;#8217;alimentation de son microprocesseur Intel (génération Kabylake ou plus) pour qu&amp;#8217;il chauffe moins et s&amp;#8217;autorise à fonctionner plus vite.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="quoteblock"&gt;
&lt;blockquote&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;What is “undervolting”? Undervolting means to reduce the voltage a component receives.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Why does this matter? Lowering the voltage, even by relatively small amounts, reduces the power draw of the components (in this case, the CPU) and thus decreases the heat generated while increasing battery life.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;What’s the catch? Actually, there is little to no risk involved. The worst thing that can happen is that if you reduce the voltage too much, the computer may crash, and you will have to decrease your undervolt (that is, give a little more voltage back).&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div class="attribution"&gt;
&amp;#8212; Douglas Black 2019-09-12 https://www.ultrabookreview.com/10167-laptop-undervolting-overcloking/
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;sudo pacman -S intel-undervolt&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Once installed (here in Arch / Artix Linux environment), you can display the
current situation, or apply new settings. The settings are decided in a
&lt;code&gt;/etc/intel-undervolt.conf&lt;/code&gt; file. The file is well documented via comments and
here are the useful lines :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;enable yes
# CPU Undervolting
# Usage: undervolt ${index} ${display_name} ${undervolt_value}
# Example: undervolt 2 'CPU Cache' -25.84
undervolt 0 'CPU' -100 &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
undervolt 1 'GPU' -375 &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;
undervolt 2 'CPU Cache' -50 &lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;(3)&lt;/b&gt;
    […] &lt;i class="conum" data-value="4"&gt;&lt;/i&gt;&lt;b&gt;(4)&lt;/b&gt;
interval 5000
daemon undervolt&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;This line is telling &lt;code&gt;intel-undervolt&lt;/code&gt; to decrease by 100 millivolts the main CPU.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;This looks unprecedented for what I read on forums, too low… and in fact the machine still can run a &lt;code&gt;glxgears&lt;/code&gt; at -600. I chose a safer value by lack of time to explore this parameter more.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Here also, it&amp;#8217;s surprising, because I read on forums that CPU Cache and CPU values was coupled for other reported experiences. Still, my machine crash if I even try -60.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="4"&gt;&lt;/i&gt;&lt;b&gt;4&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;I don&amp;#8217;t bothered making more settings, partly based on this statement from &lt;a href="https://linustechtips.com/topic/934392-throttlestop-what-does-this-stand-for-and-what-does-it-do/"&gt;LinusTechTips&lt;/a&gt; : 6. Analog I/O are things like onboard sensors (Vccio refers to the voltage of this in desktops). System Agent are stuff like the memory controller and PCIe bus controller (as Vccsa in desktops). Both consume little power so there&amp;#8217;s no point in undervolting them and cause problems like crashing or sensor reporting false data.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;To reach the demonstrated values I first set the &lt;code&gt;enable&lt;/code&gt; line to &lt;code&gt;no&lt;/code&gt; and then
edit and applied several values, by steps of 25 mV, until the machine froze.
Then I reboot and set the value to the previous 25 mV step, and repeated for
each values.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;When I checked that the laptop was working well, I enabled the daemon (to get
the wanted undervolting values re-applied at boot time).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;# vi /etc/intel-undervolt.conf
    [edit]
# intel-undervolt read
CPU (0): -0.00 mV
GPU (1): -0.00 mV
CPU Cache (2): -0.00 mV
# intel-undervolt apply
CPU (0): -25.00 mV
GPU (1): -0.00 mV
CPU Cache (2): -0.00 mV
    [repeat with lower values]&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;If you get lucky, your hardware will support a big undervoltage.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="admonitionblock warning"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class="icon"&gt;
&lt;i class="fa icon-warning" title="Warning"&gt;&lt;/i&gt;
&lt;/td&gt;
&lt;td class="content"&gt;
Beware to test your laptop plugged in and on batteries, I had to get
back to values below the extremes to avoid laptop freezing on battery.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;This tweak makes sense because its easy to notice that Intel overvolted their
Kabylake CPU, compared to previous generations, with no obvious reasons.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;code&gt;intel-undervolt&lt;/code&gt; can also change power package limits and critical temperature
offset, but I would not recommend messing with those values, as I found no
incentive about possible Intel over-cautious settings here. Critical
temperature is a parameter that constantly increased since decades and is now
stable at around 100°C in new processors.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Still, the readings that &lt;code&gt;intel-undervolt&lt;/code&gt; can produce about those parameters
are interesting :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code&gt;Short term package power: 15 W, 0.002 s, enabled &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
Long term package power: 7 W, 28.000 s, enabled &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;
tjoffset -10 &lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;(3)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Seems hard to notice that the CPU can run very fast for 2 milliseconds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Not obvious to notice that the CPU will slow down after nearly half a minute
of intensive computation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Here the &lt;code&gt;/etc/intel-undervolting.conf&lt;/code&gt; file recommends a safer value than the default one.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;To finish, does it change something ? I noticed it obviously, but I measured it
also. I launched 4 parallel &lt;code&gt;yes&lt;/code&gt; commands and my CPU &lt;sup class="footnote"&gt;[&lt;a id="_footnoteref_1" class="footnote" href="#_footnotedef_1" title="View footnote."&gt;1&lt;/a&gt;]&lt;/sup&gt; was running at 1.36 GHz before undervolting
and 1.60 GHz after. It was with a -125 mV setting, rather than the -100 mV I
currently use, since running the laptop on battery required less extreme
settings and since I had a computer freeze (crash) after 3 months of usage of
a -112 mV setting.&lt;/p&gt;
&lt;/div&gt;
&lt;div id="footnotes"&gt;
&lt;hr&gt;
&lt;div class="footnote" id="_footnotedef_1"&gt;
&lt;a href="#_footnoteref_1"&gt;1&lt;/a&gt;. Intel&amp;#174; Core&amp;#8482; m7-6Y75 CPU @ 1.20GHz
&lt;/div&gt;
&lt;/div&gt;</content><category term="Commandes"/><category term="hardware"/><category term="optimization"/><category term="benchmark"/></entry><entry><title>Firefox about:about</title><link href="https://grimoire.d12s.fr/2021/firefox_aboutabout.html" rel="alternate"/><published>2021-02-22T00:00:00+01:00</published><updated>2021-02-22T00:00:00+01:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2021-02-22:/2021/firefox_aboutabout.html</id><summary type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Il existe plus de 40 adresses internes à Firefox en &lt;code&gt;about:*&lt;/code&gt; comme la célèbre &lt;code&gt;about:config&lt;/code&gt;. Et il existe une Adresse pour les gouverner toutes, une Adresse pour les trouver, une Adresse pour les amener toutes et dans les ténèbres les lier.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;There is more than 40 internal address in …&lt;/p&gt;&lt;/div&gt;</summary><content type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Il existe plus de 40 adresses internes à Firefox en &lt;code&gt;about:*&lt;/code&gt; comme la célèbre &lt;code&gt;about:config&lt;/code&gt;. Et il existe une Adresse pour les gouverner toutes, une Adresse pour les trouver, une Adresse pour les amener toutes et dans les ténèbres les lier.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;There is more than 40 internal address in Firefox (nightly) in the shape of &lt;code&gt;about:*&lt;/code&gt; like the famous &lt;code&gt;about:config&lt;/code&gt;. And it exists One Address to rule them all, One Address to find them,
One address to bring them all and in the darkness bind them.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code&gt;&lt;span&gt;&lt;/span&gt;about:about&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;For the record I currently have :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code&gt;&lt;span&gt;&lt;/span&gt;    about:about
    about:addons
    about:buildconfig &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
    about:cache &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;
    about:certificate
    about:checkerboard
    about:compat
    about:config
    about:crashes
    about:credits
    about:debugging &lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;(3)&lt;/b&gt;
    about:devtools
    about:downloads
    about:home
    about:license
    about:logins &lt;i class="conum" data-value="4"&gt;&lt;/i&gt;&lt;b&gt;(4)&lt;/b&gt;
    about:loginsimportreport
    about:logo
    about:memory &lt;i class="conum" data-value="5"&gt;&lt;/i&gt;&lt;b&gt;(5)&lt;/b&gt;
    about:mozilla
    about:networking &lt;i class="conum" data-value="6"&gt;&lt;/i&gt;&lt;b&gt;(6)&lt;/b&gt;
    about:newtab
    about:performance &lt;i class="conum" data-value="7"&gt;&lt;/i&gt;&lt;b&gt;(7)&lt;/b&gt;
    about:plugins
    about:policies &lt;i class="conum" data-value="8"&gt;&lt;/i&gt;&lt;b&gt;(8)&lt;/b&gt;
    about:preferences
    about:privatebrowsing
    about:processes &lt;i class="conum" data-value="9"&gt;&lt;/i&gt;&lt;b&gt;(9)&lt;/b&gt;
    about:profiles
    about:profiling
    about:protections
    about:rights
    about:robots
    about:serviceworkers
    about:studies
    about:support
    about:sync-log
    about:telemetry
    about:url-classifier
    about:webrtc
    about:welcome&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Summary of the configuration of your local Firefox build (how it was compiled)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Information about the Network Cache Storage Service&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Allows to load and debug WebExtensions (like &lt;a href="https://meta-press.es"&gt;Meta-Press.es&lt;/a&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="4"&gt;&lt;/i&gt;&lt;b&gt;4&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Allows to manage saved login and passwords&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="5"&gt;&lt;/i&gt;&lt;b&gt;5&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Allows measurments about Firefox memory usage and manual launch of memory minimization routines&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="6"&gt;&lt;/i&gt;&lt;b&gt;6&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Display HTTP, sockets, DNS and WebSockets requests and connexions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="7"&gt;&lt;/i&gt;&lt;b&gt;7&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;List tabs and addons and their corresponding memory and energy impacts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="8"&gt;&lt;/i&gt;&lt;b&gt;8&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;about:preferences&lt;/code&gt; allows to configure Firefox with a regular user interface, &lt;code&gt;about:config&lt;/code&gt; allows to tweak more technical details via registers, &lt;code&gt;about:policies&lt;/code&gt; allows you to configure other parameters directly editing JSON files&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="9"&gt;&lt;/i&gt;&lt;b&gt;9&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Similar to &lt;code&gt;about:performance&lt;/code&gt; but displayed by processes instead of tabs&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;</content><category term="Commandes"/><category term="Firefox"/></entry><entry><title>Convert font file to woff2 format</title><link href="https://grimoire.d12s.fr/2021/convert_font_to_woff2.html" rel="alternate"/><published>2021-02-11T00:00:00+01:00</published><updated>2021-02-11T00:00:00+01:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2021-02-11:/2021/convert_font_to_woff2.html</id><summary type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Convertir une police de caractère vers le format woff2 qui est actuellement le plus comprimé.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;$&lt;/span&gt; pacmac -S python-fonttools python-brotli
&lt;span class="tok-gp"&gt;$&lt;/span&gt; python&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="python"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="tok-kn"&gt;from&lt;/span&gt; &lt;span class="tok-nn"&gt;fontTools.ttLib&lt;/span&gt; &lt;span class="tok-kn"&gt;import&lt;/span&gt; &lt;span class="tok-n"&gt;TTFont&lt;/span&gt;
&lt;span class="tok-o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="tok-n"&gt;f&lt;/span&gt; &lt;span class="tok-o"&gt;=&lt;/span&gt; &lt;span class="tok-n"&gt;TTFont&lt;/span&gt;&lt;span class="tok-p"&gt;(&lt;/span&gt;&lt;span class="tok-s1"&gt;&amp;#39;path/to/fontfile.ttf&amp;#39;&lt;/span&gt;&lt;span class="tok-p"&gt;)&lt;/span&gt; &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
&lt;span class="tok-o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="tok-n"&gt;f&lt;/span&gt;&lt;span class="tok-o"&gt;.&lt;/span&gt;&lt;span class="tok-n"&gt;flavor&lt;/span&gt; &lt;span class="tok-o"&gt;=&lt;/span&gt; &lt;span class="tok-s1"&gt;&amp;#39;woff2&amp;#39;&lt;/span&gt;
&lt;span class="tok-o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="tok-n"&gt;f&lt;/span&gt;&lt;span class="tok-o"&gt;.&lt;/span&gt;&lt;span class="tok-n"&gt;save&lt;/span&gt;&lt;span class="tok-p"&gt;(&lt;/span&gt;&lt;span class="tok-s1"&gt;&amp;#39;path/to/newfontfile.woff2&amp;#39;&lt;/span&gt;&lt;span class="tok-p"&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Any popular format is accepted&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;This allows to …&lt;/p&gt;&lt;/div&gt;</summary><content type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Convertir une police de caractère vers le format woff2 qui est actuellement le plus comprimé.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;$&lt;/span&gt; pacmac -S python-fonttools python-brotli
&lt;span class="tok-gp"&gt;$&lt;/span&gt; python&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="python"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="tok-kn"&gt;from&lt;/span&gt; &lt;span class="tok-nn"&gt;fontTools.ttLib&lt;/span&gt; &lt;span class="tok-kn"&gt;import&lt;/span&gt; &lt;span class="tok-n"&gt;TTFont&lt;/span&gt;
&lt;span class="tok-o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="tok-n"&gt;f&lt;/span&gt; &lt;span class="tok-o"&gt;=&lt;/span&gt; &lt;span class="tok-n"&gt;TTFont&lt;/span&gt;&lt;span class="tok-p"&gt;(&lt;/span&gt;&lt;span class="tok-s1"&gt;&amp;#39;path/to/fontfile.ttf&amp;#39;&lt;/span&gt;&lt;span class="tok-p"&gt;)&lt;/span&gt; &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
&lt;span class="tok-o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="tok-n"&gt;f&lt;/span&gt;&lt;span class="tok-o"&gt;.&lt;/span&gt;&lt;span class="tok-n"&gt;flavor&lt;/span&gt; &lt;span class="tok-o"&gt;=&lt;/span&gt; &lt;span class="tok-s1"&gt;&amp;#39;woff2&amp;#39;&lt;/span&gt;
&lt;span class="tok-o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="tok-n"&gt;f&lt;/span&gt;&lt;span class="tok-o"&gt;.&lt;/span&gt;&lt;span class="tok-n"&gt;save&lt;/span&gt;&lt;span class="tok-p"&gt;(&lt;/span&gt;&lt;span class="tok-s1"&gt;&amp;#39;path/to/newfontfile.woff2&amp;#39;&lt;/span&gt;&lt;span class="tok-p"&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Any popular format is accepted&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;This allows to compress for instance &lt;code&gt;AmaticSC-Regular.ttf&lt;/code&gt; from 151,6 ko to
65,3 ko (the new file occupy only 43% of the first one). This will save some
kilo-bytes for the next release of &lt;a href="https://meta-press.es"&gt;Meta-Press.es&lt;/a&gt; !&lt;/p&gt;
&lt;/div&gt;</content><category term="Commandes"/><category term="shell"/><category term="Python"/><category term="compression"/></entry><entry><title>Install Signal without Google Play</title><link href="https://grimoire.d12s.fr/2021/install_signal_without_google_play.html" rel="alternate"/><published>2021-02-01T00:00:00+01:00</published><updated>2021-02-01T00:00:00+01:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2021-02-01:/2021/install_signal_without_google_play.html</id><summary type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Installer la messagerie sécurisée Signal sur son téléphone mobile sans passer par le magasin d&amp;#8217;application Google Play&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Signal.org prodvide a specific URL (hard to find) to allow downloading of the Signal Android app directly (without creating an account on Google Play). It&amp;#8217;s handy when you use a …&lt;/p&gt;&lt;/div&gt;</summary><content type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Installer la messagerie sécurisée Signal sur son téléphone mobile sans passer par le magasin d&amp;#8217;application Google Play&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Signal.org prodvide a specific URL (hard to find) to allow downloading of the Signal Android app directly (without creating an account on Google Play). It&amp;#8217;s handy when you use a Fairphone or LineageOS without GApps.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;It&amp;#8217;s here : &lt;a href="https://www.signal.org/android/apk" class="bare"&gt;https://www.signal.org/android/apk&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;The Signal app will complain about missing Google Play services, but still it works.&lt;/p&gt;
&lt;/div&gt;</content><category term="Commandes"/><category term="android"/><category term="security"/><category term="Fairphone"/></entry><entry><title>Check CSV delimiter choice</title><link href="https://grimoire.d12s.fr/2021/check_csv_delimiter_choice.html" rel="alternate"/><published>2021-01-28T00:00:00+01:00</published><updated>2021-01-28T00:00:00+01:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2021-01-28:/2021/check_csv_delimiter_choice.html</id><summary type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Vérifier le caractère séparateur de champs d&amp;#8217;un fichier CSV : "," / ";" ?&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;$&lt;/span&gt; wc -l files.csv
&lt;span class="tok-go"&gt;201 &lt;/span&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
&lt;span class="tok-gp"&gt;$&lt;/span&gt; rg &lt;span class="tok-s2"&gt;&amp;quot;(.*;){46}&amp;quot;&lt;/span&gt; file.csv &lt;span class="tok-p"&gt;|&lt;/span&gt; wc -l
&lt;span class="tok-go"&gt;201 &lt;/span&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;
&lt;span class="tok-gp"&gt;$&lt;/span&gt; rg &lt;span class="tok-s2"&gt;&amp;quot;(.*;){47}&amp;quot;&lt;/span&gt; file.csv &lt;span class="tok-p"&gt;|&lt;/span&gt; wc -l
&lt;span class="tok-go"&gt;0 &lt;/span&gt;&lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;(3)&lt;/b&gt;
&lt;span class="tok-gp"&gt;$&lt;/span&gt; rg &lt;span class="tok-s2"&gt;&amp;quot;(.*,){46}&amp;quot;&lt;/span&gt; file.csv &lt;span class="tok-p"&gt;|&lt;/span&gt; wc -l
&lt;span class="tok-go"&gt;0 &lt;/span&gt;&lt;i class="conum" data-value="4"&gt;&lt;/i&gt;&lt;b&gt;(4)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;201 lines in the &lt;code&gt;file.csv&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;201 lines …&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;</summary><content type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Vérifier le caractère séparateur de champs d&amp;#8217;un fichier CSV : "," / ";" ?&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;$&lt;/span&gt; wc -l files.csv
&lt;span class="tok-go"&gt;201 &lt;/span&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
&lt;span class="tok-gp"&gt;$&lt;/span&gt; rg &lt;span class="tok-s2"&gt;&amp;quot;(.*;){46}&amp;quot;&lt;/span&gt; file.csv &lt;span class="tok-p"&gt;|&lt;/span&gt; wc -l
&lt;span class="tok-go"&gt;201 &lt;/span&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;
&lt;span class="tok-gp"&gt;$&lt;/span&gt; rg &lt;span class="tok-s2"&gt;&amp;quot;(.*;){47}&amp;quot;&lt;/span&gt; file.csv &lt;span class="tok-p"&gt;|&lt;/span&gt; wc -l
&lt;span class="tok-go"&gt;0 &lt;/span&gt;&lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;(3)&lt;/b&gt;
&lt;span class="tok-gp"&gt;$&lt;/span&gt; rg &lt;span class="tok-s2"&gt;&amp;quot;(.*,){46}&amp;quot;&lt;/span&gt; file.csv &lt;span class="tok-p"&gt;|&lt;/span&gt; wc -l
&lt;span class="tok-go"&gt;0 &lt;/span&gt;&lt;i class="conum" data-value="4"&gt;&lt;/i&gt;&lt;b&gt;(4)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;201 lines in the &lt;code&gt;file.csv&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;201 lines with 46 ";" characters&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;0 lines with 47 ";" characters&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="4"&gt;&lt;/i&gt;&lt;b&gt;4&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;0 lines with 46 "," characters&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;So the character that separates fields in this CSV file is ";".&lt;/p&gt;
&lt;/div&gt;</content><category term="Commandes"/><category term="shell"/></entry><entry><title>Some Firefox addons</title><link href="https://grimoire.d12s.fr/2021/firefox_addons.html" rel="alternate"/><published>2021-01-13T00:00:00+01:00</published><updated>2021-01-13T00:00:00+01:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2021-01-13:/2021/firefox_addons.html</id><summary type="html">&lt;div id="toc" class="toc"&gt;
&lt;div id="toctitle"&gt;Index&lt;/div&gt;
&lt;ul class="sectlevel1"&gt;
&lt;li&gt;&lt;a href="#_most_recommended"&gt;1. Most recommended&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_personal_preference"&gt;2. Personal preference&lt;/a&gt;
&lt;ul class="sectlevel2"&gt;
&lt;li&gt;&lt;a href="#_very_personal_preferences"&gt;2.1. Very personal preferences&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#_privacy_hardening"&gt;3. Privacy hardening&lt;/a&gt;
&lt;ul class="sectlevel2"&gt;
&lt;li&gt;&lt;a href="#_strong_method"&gt;3.1. Strong method&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_lighter_setup_for_lighter_protection"&gt;3.2. Lighter setup for lighter protection&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#_honorable_mention"&gt;4. Honorable mention&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id="preamble"&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Liste d&amp;#8217;extensions pour Firefox, pratique à avoir sous la main quand on croise un Firefox tout nu.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;To list your …&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</summary><content type="html">&lt;div id="toc" class="toc"&gt;
&lt;div id="toctitle"&gt;Index&lt;/div&gt;
&lt;ul class="sectlevel1"&gt;
&lt;li&gt;&lt;a href="#_most_recommended"&gt;1. Most recommended&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_personal_preference"&gt;2. Personal preference&lt;/a&gt;
&lt;ul class="sectlevel2"&gt;
&lt;li&gt;&lt;a href="#_very_personal_preferences"&gt;2.1. Very personal preferences&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#_privacy_hardening"&gt;3. Privacy hardening&lt;/a&gt;
&lt;ul class="sectlevel2"&gt;
&lt;li&gt;&lt;a href="#_strong_method"&gt;3.1. Strong method&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_lighter_setup_for_lighter_protection"&gt;3.2. Lighter setup for lighter protection&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#_honorable_mention"&gt;4. Honorable mention&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id="preamble"&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Liste d&amp;#8217;extensions pour Firefox, pratique à avoir sous la main quand on croise un Firefox tout nu.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;To list your installed add-ons open a new tab (&lt;span class="keyseq"&gt;&lt;kbd&gt;CTRL&lt;/kbd&gt;+&lt;kbd&gt;T&lt;/kbd&gt;&lt;/span&gt;) and load &lt;code&gt;about:addons&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;To install a new add-on, click on one of the links below and click the big &lt;code&gt;Install&lt;/code&gt; button.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_most_recommended"&gt;1. Most recommended&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/localcdn-fork-of-decentraleyes/"&gt;LocalCDN&lt;/a&gt; : Protects you against tracking through "free", centralized, content delivery. It prevents a lot of requests from reaching networks like Google Hosted Libraries, and serves local files to keep sites from breaking. Complements regular content blockers. Speedup slow internet connections.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;It&amp;#8217;s a living fork of the well known &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/decentraleyes/"&gt;Decentraleyes&lt;/a&gt; that looks dead since 2023-08-30.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/https-everywhere/"&gt;HTTPS Everywhere&lt;/a&gt; : Encrypt the web! HTTPS Everywhere is a Firefox extension to protect your communications by enabling HTTPS encryption automatically on sites that are known to support it, even when you type URLs or follow links that omit the https: prefix.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="admonitionblock tip"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class="icon"&gt;
&lt;i class="fa icon-tip" title="Tip"&gt;&lt;/i&gt;
&lt;/td&gt;
&lt;td class="content"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;It also exists a Firefox setting called &lt;code&gt;HTTPS-Only&lt;/code&gt; in &lt;code&gt;Option &amp;gt; Privacy and Security &amp;gt; Activate HTTPS-Only Mode&lt;/code&gt;. This setting prevents simple HTTP pages from loading, while HTTPS Everywhere allows those pages to load if no HTTPS version is available. So I still prefer HTTPS Everywhere.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/ublock-origin/?utm_source=addons.mozilla.org&amp;amp;utm_medium=referral&amp;amp;utm_content=search"&gt;uBlock Origin&lt;/a&gt; : Efficient wide-spectrum content blocker. Easy on CPU and memory.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_personal_preference"&gt;2. Personal preference&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/noscript/"&gt;NoScript&lt;/a&gt; : Improve the security you can get in a web browser. Allow potentially malicious web content to run only from sites you trust. Protect yourself against XSS other web security exploits.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/history-cleaner/"&gt;History Cleaner&lt;/a&gt; : Deletes browsing history older than a specified number of days.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/i-dont-care-about-cookies/?utm_source=addons.mozilla.org&amp;amp;utm_medium=referral&amp;amp;utm_content=search"&gt;I don&amp;#8217;t care about cookies&lt;/a&gt; : Get rid of cookie warnings from almost all websites!&lt;/p&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_very_personal_preferences"&gt;2.1. Very personal preferences&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/vim-vixen/"&gt;Vim Vixen&lt;/a&gt; : Accelerates your web browsing with &lt;a href="/tag/vim.html"&gt;Vim&lt;/a&gt;-like key bindings.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="admonitionblock tip"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class="icon"&gt;
&lt;i class="fa icon-tip" title="Tip"&gt;&lt;/i&gt;
&lt;/td&gt;
&lt;td class="content"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;When editing an Etherpad, I deactivate Vim Vixen by clicking on its icon. Otherwise your key strokes are interpreted as key shortcuts by Firefox and it goes wild very quickly.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/awesome-rss/"&gt;Awesome RSS&lt;/a&gt; : Puts an RSS/Atom subscribe button back in URL bar. Supports "Live Bookmarks" (built-in), Feedly, &amp;amp; Inoreader&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_privacy_hardening"&gt;3. Privacy hardening&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;To check you web browser privacy protection level you can use this EFF online tool : &lt;a href="https://coveryourtracks.eff.org/" class="bare"&gt;https://coveryourtracks.eff.org/&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;With the following add-ons you can reach an honorable score. And with a few additional &lt;code&gt;about:config&lt;/code&gt; tweaks you break some websites but you can reach close to Tor Browser performances. I won&amp;#8217;t detail those additional tweaks, if you need them use and support &lt;a href="https://www.torproject.org"&gt;Tor Browser&lt;/a&gt; instead &amp;lt;3&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;If you use and like the Tor Browser, you might consider installer &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/torproject-snowflake/"&gt;Snowflake&lt;/a&gt; everywhere on your other browsers to contribute to Tor as an entry point. It helps people in censored countries to bypass censorship.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_strong_method"&gt;3.1. Strong method&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/multi-account-containers/"&gt;Firefox Multi-Account Containers&lt;/a&gt; : Firefox Multi-Account Containers lets you keep parts of your online life separated into color-coded tabs that preserve your privacy. Cookies are separated by container, allowing you to use the web with multiple identities or accounts simultaneously.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/temporary-containers/"&gt;Temporary Containers&lt;/a&gt; : Open tabs, websites, and links in automatically managed disposable containers. Containers isolate data websites store (cookies, storage, and more) from each other, enhancing your privacy and security while you browse.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="admonitionblock tip"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class="icon"&gt;
&lt;i class="fa icon-tip" title="Tip"&gt;&lt;/i&gt;
&lt;/td&gt;
&lt;td class="content"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Using both those add-ons, by default your tabs are open with temporary containers, and you can create new named containers and setting specific domains for them in order to keep wanted sessions alive.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;To keep a session :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Create a new container from Multi-Account Containers menu (next to the [+] new tab button).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Click &lt;code&gt;Reopen in container&lt;/code&gt; in the contextual menu on the wanted tab.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The tab reloads. Then tick the &lt;code&gt;Always open in this container&lt;/code&gt; checkbox of Multi-Account Containers contextual menu on the tab content.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;When you&amp;#8217;ll open this webpage again for the first time, it will ask if you really want to open the webpage in the designated container, and once clicked &lt;code&gt;Ok&lt;/code&gt; it&amp;#8217;s setup for good.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_lighter_setup_for_lighter_protection"&gt;3.2. Lighter setup for lighter protection&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/self-destructing-cookies-webex/"&gt;Self-Destruction Cookies (WebEx)&lt;/a&gt; : Delete cookies when browser is closed or once the tab is closed to prevent possible trackings&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;With this add-on, you don&amp;#8217;t have to configure anything, and all your cookies will be destroyed a few seconds after you close a tab (except for manually white-listed domains for which you want to keep sessions open). So, if you open multiple sessions on untrusted platforms (GAFAM…) at the same time, you&amp;#8217;re not protected, but if you open those sessions with enough seconds of time distance, you are protected regarding cookies.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Note that you can also set up Firefox to delete any personal information at each window closing, giving you a similar control at window closing cost.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_honorable_mention"&gt;4. Honorable mention&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/darkreader/"&gt;Dark Reader&lt;/a&gt; : Dark mode for every website. Take care of your eyes, use dark theme for night and daily browsing.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/video-downloadhelper/"&gt;Video DownloadHelper&lt;/a&gt; : The easy way to download and convert Web videos from hundreds of video-playing sites.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/meta-press-es/"&gt;Meta-Press.es&lt;/a&gt; : The decentralized press meta-search engine I made and you can support &lt;a href="https://patreon.com/metapress"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</content><category term="Commandes"/><category term="Firefox"/><category term="security"/></entry><entry><title>Generating 16k RSA key pairs with GnuPG 2.x</title><link href="https://grimoire.d12s.fr/2021/openpgp_16k_rsa_keys.html" rel="alternate"/><published>2021-01-07T00:00:00+01:00</published><updated>2021-01-07T00:00:00+01:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2021-01-07:/2021/openpgp_16k_rsa_keys.html</id><summary type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Créer une paire de clé OpenPGP / GPG de plus de 4096 bits via GnuPG pour mieux résister au déchiffrement par ordinateur quantique.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;As stated in &lt;a href="https://notepad.patheticcockroach.com/4426/generating-a-large-8kb-key-with-gnupg-2-x/"&gt;Generating a large (&amp;gt;8kb) key with GnuPG 2.x&lt;/a&gt; :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="quoteblock"&gt;
&lt;blockquote&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;strong&gt;Update (2018-08-12)&lt;/strong&gt;: […] a paper titled &lt;a href="https://eprint.iacr.org/2017/598.pdf"&gt;Quantum Resource Estimates for Computing Elliptic Curve Discrete Logarithms&lt;/a&gt;, […] gives some …&lt;/p&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;/div&gt;</summary><content type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Créer une paire de clé OpenPGP / GPG de plus de 4096 bits via GnuPG pour mieux résister au déchiffrement par ordinateur quantique.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;As stated in &lt;a href="https://notepad.patheticcockroach.com/4426/generating-a-large-8kb-key-with-gnupg-2-x/"&gt;Generating a large (&amp;gt;8kb) key with GnuPG 2.x&lt;/a&gt; :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="quoteblock"&gt;
&lt;blockquote&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;strong&gt;Update (2018-08-12)&lt;/strong&gt;: […] a paper titled &lt;a href="https://eprint.iacr.org/2017/598.pdf"&gt;Quantum Resource Estimates for Computing Elliptic Curve Discrete Logarithms&lt;/a&gt;, […] gives some interesting figures, notably solving a 256 bits Elliptic Curve Discrete Logarithm Problem (ECDLP) it would take 2330 qubits, vs 4719 qubits for a 521 bits ECDLP, 6146 qubits for a 3072 bits RSA and 30722 qubits for a 15360 bits RSA.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;It seems useful to make larger than 4k RSA key pairs. Unfortunately, standard
GnuPG (i.e. version 2.2.25) program won&amp;#8217;t allow you to generate them. The
1st link mentioned details how to patch GnuPG to unlock the setting. But if
you don&amp;#8217;t want to take the time to recompile the tool (like me) you can use
Arch / &lt;a href="/tag/artix.html"&gt;Artix&lt;/a&gt; GNU+Linux distribution and install an
&lt;a href="https://aur.archlinux.org/packages"&gt;AUR&lt;/a&gt; package that will patch and compile it
for you.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;#&lt;/span&gt; pacman -S gnupg-large-rsa&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;$&lt;/span&gt; gpg --enable-large-rsa --full-generate-key&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Then select an RSA key type and write &lt;code&gt;16384&lt;/code&gt; as key size.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;It will required quite some entropy, that you can generate via random keyboard
typing for instance, and around 3,5 Go or free RAM. &lt;sup class="footnote"&gt;[&lt;a id="_footnoteref_1" class="footnote" href="#_footnotedef_1" title="View footnote."&gt;1&lt;/a&gt;]&lt;/sup&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Once done, the generated key pair can be used everywhere.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Beware that encrypting a simple text email might take notable seconds (around
3-4s) and deciphering also (around 1s).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I was using 4096 bit keys since over 15 years and I&amp;#8217;ve been taught that
security is not a fact but a process, that have to be continuously reinforced.&lt;/p&gt;
&lt;/div&gt;
&lt;div id="footnotes"&gt;
&lt;hr&gt;
&lt;div class="footnote" id="_footnotedef_1"&gt;
&lt;a href="#_footnoteref_1"&gt;1&lt;/a&gt;. Using a 4 Go notebook, I had to reboot and open nothing else than 2 terminals to keep the RAM free in order to get this many minutes process completed
&lt;/div&gt;
&lt;/div&gt;</content><category term="Commandes"/><category term="Artix"/><category term="security"/></entry><entry><title>GNU+Linux pre-installed laptops</title><link href="https://grimoire.d12s.fr/2020/linux_laptops.html" rel="alternate"/><published>2020-12-01T00:00:00+01:00</published><updated>2020-12-01T00:00:00+01:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2020-12-01:/2020/linux_laptops.html</id><summary type="html">&lt;div id="toc" class="toc"&gt;
&lt;div id="toctitle"&gt;Index&lt;/div&gt;
&lt;ul class="sectlevel1"&gt;
&lt;li&gt;&lt;a href="#_new_wastes"&gt;1. New wastes&lt;/a&gt;
&lt;ul class="sectlevel2"&gt;
&lt;li&gt;&lt;a href="#_ldlc_com_fr"&gt;1.1. &lt;em&gt;LDLC.com (fr)&lt;/em&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_pcw_fr_fr"&gt;1.2. &lt;em&gt;PCW.fr (fr)&lt;/em&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_pine64_org_pinebook_pro"&gt;1.3. Pine64.org (PineBook Pro)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_starlabs"&gt;1.4. StarLabs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_system76"&gt;1.5. System76&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_tuxedo_computers"&gt;1.6. Tuxedo Computers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_ubuntushop_be"&gt;1.7. UbuntuShop.be&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_curated_lists"&gt;1.8. Curated lists&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#_recycled_hardware"&gt;2. Recycled hardware&lt;/a&gt;
&lt;ul class="sectlevel2"&gt;
&lt;li&gt;&lt;a href="#_second_hand_hardware_websites"&gt;2.1. Second hand hardware websites&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_french_linux_user_groups_selling_recycled_hardware"&gt;2.2. &lt;em&gt;French …&lt;/em&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;</summary><content type="html">&lt;div id="toc" class="toc"&gt;
&lt;div id="toctitle"&gt;Index&lt;/div&gt;
&lt;ul class="sectlevel1"&gt;
&lt;li&gt;&lt;a href="#_new_wastes"&gt;1. New wastes&lt;/a&gt;
&lt;ul class="sectlevel2"&gt;
&lt;li&gt;&lt;a href="#_ldlc_com_fr"&gt;1.1. &lt;em&gt;LDLC.com (fr)&lt;/em&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_pcw_fr_fr"&gt;1.2. &lt;em&gt;PCW.fr (fr)&lt;/em&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_pine64_org_pinebook_pro"&gt;1.3. Pine64.org (PineBook Pro)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_starlabs"&gt;1.4. StarLabs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_system76"&gt;1.5. System76&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_tuxedo_computers"&gt;1.6. Tuxedo Computers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_ubuntushop_be"&gt;1.7. UbuntuShop.be&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_curated_lists"&gt;1.8. Curated lists&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#_recycled_hardware"&gt;2. Recycled hardware&lt;/a&gt;
&lt;ul class="sectlevel2"&gt;
&lt;li&gt;&lt;a href="#_second_hand_hardware_websites"&gt;2.1. Second hand hardware websites&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_french_linux_user_groups_selling_recycled_hardware"&gt;2.2. &lt;em&gt;French Linux User Groups selling recycled hardware&lt;/em&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_new_wastes"&gt;1. New wastes&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_ldlc_com_fr"&gt;1.1. &lt;em&gt;LDLC.com (fr)&lt;/em&gt;&lt;/h3&gt;
&lt;div class="quoteblock"&gt;
&lt;blockquote&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;En plus d&amp;#8217;être votre site référence pour l&amp;#8217;achat de tous vos composants informatiques et High-Tech depuis 1996, LDLC.COM vous propose aussi ses propres ordinateurs portables assemblés en France avec les meilleurs composants ! Faire le choix d&amp;#8217;un ordinateur portable LDLC, c&amp;#8217;est faire le choix de la performance et de la stabilité. Avec un large choix de modèles, nous proposons des ordinateurs portables qui seront adaptés aux utilisations et aux besoins de chacun.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;a href="https://www.ldlc.com/informatique/ordinateur-portable/pc-portable/c4265/+fb-C000000888.html?sort=1"&gt;&lt;em&gt;Ordinateurs Clevo revendus sous la marque LDLC et sans OS&lt;/em&gt;&lt;/a&gt; &lt;em&gt;(lien sans affiliation)&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_pcw_fr_fr"&gt;1.2. &lt;em&gt;PCW.fr (fr)&lt;/em&gt;&lt;/h3&gt;
&lt;div class="quoteblock"&gt;
&lt;blockquote&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Windows et MacOS ne sont pas les seuls systèmes d&amp;#8217;exploitation (ou OS) disponibles pour faire fonctionner un ordinateur. Il existe également Linux ! Les systèmes d&amp;#8217;exploitation de type Linux conviennent parfaitement pour un usage simple tels que la bureautique ou surfer sur le net.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Ordinateurs Clevo avec configurateur fin en ligne incluant des options pour le&lt;/em&gt;
&lt;em&gt;choix de la pâte thermique et du radiateur !&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;a href="https://www.pcw.fr/49-portables-pour-linux"&gt;&lt;em&gt;Portables pour Linux&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_pine64_org_pinebook_pro"&gt;1.3. Pine64.org (PineBook Pro)&lt;/h3&gt;
&lt;div class="quoteblock"&gt;
&lt;blockquote&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;A Powerful, Metal and Open Source ARM 64-Bit Laptop for Work, School or Fun&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;The Pinebook Pro is meant to deliver solid day-to-day Linux or *BSD experience and to be a compelling alternative to mid-ranged Chromebooks that people convert into Linux laptops. In contrast to most mid-ranged Chromebooks however, the Pinebook Pro comes with an IPS 1080p 14″ LCD panel, a premium magnesium alloy shell, a 10,000 mAh capacity battery and the modularity / hackability that only an open source project can deliver. The USB-C port on the Pinebook Pro, apart from being able to transmit data and charge the unit, is also capable of digital video output up-to 4K at 60hz.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;a href="https://www.pine64.org/pinebook-pro/" class="bare"&gt;https://www.pine64.org/pinebook-pro/&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_starlabs"&gt;1.4. StarLabs&lt;/h3&gt;
&lt;div class="quoteblock"&gt;
&lt;blockquote&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Built for Linux. Star Labs offer a range of laptops designed and built specifically for Linux. All of our laptops come with a choice of &lt;strong&gt;Ubuntu&lt;/strong&gt;, &lt;strong&gt;elementary OS&lt;/strong&gt;, &lt;strong&gt;Linux Mint&lt;/strong&gt;, &lt;strong&gt;Manjaro&lt;/strong&gt;, &lt;strong&gt;MX Linux&lt;/strong&gt; or &lt;strong&gt;Zorin OS&lt;/strong&gt; pre-installed; regardless of the distribution used, our laptops run flawlessly.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;a href="https://starlabs.systems/?rfsn=5049581.73ac48"&gt;Referral link to StarLabs.systems&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_system76"&gt;1.5. System76&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Clevo computers with dedicated retro-engineered firmwares.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="quoteblock"&gt;
&lt;blockquote&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Who is System76?&lt;/p&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;A) a diverse team of creators, makers, and builders
B) a small company innovating the next big things
C) a group of extremely hard-core nerds
D) all of the above&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Refferal link to come - &lt;a href="https://system76.com" class="bare"&gt;https://system76.com&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_tuxedo_computers"&gt;1.6. Tuxedo Computers&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Clevo computers with battery saving screen blackligth.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="quoteblock"&gt;
&lt;blockquote&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;We build tailor-made hardware and all this with Linux!&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;TUXEDO Computers are individually built computers/PCs and notebooks which are fully Linux compatible, i. e. Linux hardware in tailor-made suit :)
We deliver all TUXEDOs in such a way that you only have to unpack, connect and switch them on!&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Referral link to come - &lt;a href="https://www.tuxedocomputers.com" class="bare"&gt;https://www.tuxedocomputers.com&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_ubuntushop_be"&gt;1.7. UbuntuShop.be&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Clevo computers with pre-installed GNU+Linux distributions.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="quoteblock"&gt;
&lt;blockquote&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Free software notebooks, desktops and servers pre-installed with Ubuntu, Linux Mint, Elementary Os or Debian. Other Distro&amp;#8217;s on request.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Referral link to come - &lt;a href="https://www.ubuntushop.be" class="bare"&gt;https://www.ubuntushop.be&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="sect3"&gt;
&lt;h4 id="_manjarocomputeur_eu"&gt;1.7.1. ManjaroComputeur.eu&lt;/h4&gt;
&lt;div class="quoteblock"&gt;
&lt;blockquote&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Do you get nightmares from Windows 10 updates and / or ransomware attacks?
Go for Manjaro notebooks with our free privacy addons.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;We sell Manjaro OS computers, OEM installed and with our popular Tails Live Boot Option + Tails Updater.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Unique linux computers, shipping worldwide with 2 years hardware warranty (dropoff to postoffice &amp;amp; return with Bpost World Easy Return)&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Referral link to come - &lt;a href="https://www.manjarocomputer.eu" class="bare"&gt;https://www.manjarocomputer.eu&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_curated_lists"&gt;1.8. Curated lists&lt;/h3&gt;
&lt;div class="sect3"&gt;
&lt;h4 id="_linux_preloaded"&gt;1.8.1. Linux Preloaded&lt;/h4&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;A curated list of linux laptop and desktop vendors : &lt;a href="https://linuxpreloaded.com/" class="bare"&gt;https://linuxpreloaded.com/&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_recycled_hardware"&gt;2. Recycled hardware&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_second_hand_hardware_websites"&gt;2.1. Second hand hardware websites&lt;/h3&gt;
&lt;div class="sect3"&gt;
&lt;h4 id="_ebay_com"&gt;2.1.1. Ebay.com&lt;/h4&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Particularly rich in second-hand computers : &lt;a href="https://ebay.com" class="bare"&gt;https://ebay.com&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect3"&gt;
&lt;h4 id="_leboncoin_fr"&gt;2.1.2. &lt;em&gt;LeBonCoin (fr)&lt;/em&gt;&lt;/h4&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;General purpose second-hand stuff website : &lt;a href="https://leboncoin.fr" class="bare"&gt;https://leboncoin.fr&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect3"&gt;
&lt;h4 id="_amazon_com"&gt;2.1.3. Amazon.com&lt;/h4&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Amazon is known to sell brand new stuff, but they also have second-hand offers.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_french_linux_user_groups_selling_recycled_hardware"&gt;2.2. &lt;em&gt;French Linux User Groups selling recycled hardware&lt;/em&gt;&lt;/h3&gt;
&lt;div class="sect3"&gt;
&lt;h4 id="_gebull_fr"&gt;2.2.1. &lt;em&gt;Gebull (fr)&lt;/em&gt;&lt;/h4&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Ordinateurs de la fonction publique recondittionnés avec Artix GNU+Linux à prix
libre (à partir de 50€).&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;a href="http://gebull.org" class="bare"&gt;http://gebull.org&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect3"&gt;
&lt;h4 id="_laplla_fr"&gt;2.2.2. &lt;em&gt;LAPLLA (fr)&lt;/em&gt;&lt;/h4&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Ordinateurs reconditionnés avec GNU+Linux pour 70€.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;a href="http://laplla.net" class="bare"&gt;http://laplla.net&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</content><category term="Articles"/><category term="hardware"/><category term="Debian"/><category term="Artix"/></entry><entry><title>Force ntpdate run</title><link href="https://grimoire.d12s.fr/2020/force_ntp_run.html" rel="alternate"/><published>2020-10-31T00:00:00+01:00</published><updated>2020-10-31T00:00:00+01:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2020-10-31:/2020/force_ntp_run.html</id><summary type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Forcer l&amp;#8217;exécution d'&lt;code&gt;ntp&lt;/code&gt; à la main pour mettre le système à l&amp;#8217;heure.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Install and activate &lt;code&gt;ntp&lt;/code&gt; with Artix Linux :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;#&lt;/span&gt; pacman -Syu &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
&lt;span class="tok-gp"&gt;#&lt;/span&gt; pacman -S ntp-openrc &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;
&lt;span class="tok-gp"&gt;#&lt;/span&gt; rc-update show -v &lt;span class="tok-p"&gt;|&lt;/span&gt; grep ntp &lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;(3)&lt;/b&gt;
&lt;span class="tok-gp"&gt;#&lt;/span&gt; rc-update add ntpd default &lt;i class="conum" data-value="4"&gt;&lt;/i&gt;&lt;b&gt;(4)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Update all the system (Artix / Arch are rolling-release, all …&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;</summary><content type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Forcer l&amp;#8217;exécution d'&lt;code&gt;ntp&lt;/code&gt; à la main pour mettre le système à l&amp;#8217;heure.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Install and activate &lt;code&gt;ntp&lt;/code&gt; with Artix Linux :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;#&lt;/span&gt; pacman -Syu &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
&lt;span class="tok-gp"&gt;#&lt;/span&gt; pacman -S ntp-openrc &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;
&lt;span class="tok-gp"&gt;#&lt;/span&gt; rc-update show -v &lt;span class="tok-p"&gt;|&lt;/span&gt; grep ntp &lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;(3)&lt;/b&gt;
&lt;span class="tok-gp"&gt;#&lt;/span&gt; rc-update add ntpd default &lt;i class="conum" data-value="4"&gt;&lt;/i&gt;&lt;b&gt;(4)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Update all the system (Artix / Arch are rolling-release, all occasions are good to update everything, and it&amp;#8217;s a good habit to start by this)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Install the &lt;code&gt;ntp&lt;/code&gt; package that draws all necessary dependancies and will install OpenRC facilities&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;List services and their machine running states&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="4"&gt;&lt;/i&gt;&lt;b&gt;4&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Add &lt;code&gt;ntdp&lt;/code&gt; service to run at &lt;code&gt;default&lt;/code&gt; machine state&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Force ntp time synchronisation :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;#&lt;/span&gt; ntpdate &lt;span class="tok-m"&gt;0&lt;/span&gt;.in.pool.ntp.org&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;</content><category term="Commandes"/><category term="adminsys"/><category term="repair"/><category term="Artix"/></entry><entry><title>Install GNU+Linux with UEFI Bios InsydeH2O</title><link href="https://grimoire.d12s.fr/2020/install_gnu-linux_with_uefi_bios_insydeh2o.html" rel="alternate"/><published>2020-10-14T00:00:00+02:00</published><updated>2020-10-14T00:00:00+02:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2020-10-14:/2020/install_gnu-linux_with_uefi_bios_insydeh2o.html</id><summary type="html">&lt;div id="toc" class="toc"&gt;
&lt;div id="toctitle"&gt;Index&lt;/div&gt;
&lt;ul class="sectlevel1"&gt;
&lt;li&gt;&lt;a href="#_version_en"&gt;1. version en&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_version_fr"&gt;2. version fr&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id="preamble"&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Installer GNU+Linux sur un ordinateur équipé d&amp;#8217;un BIOS InsydeH2O.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_version_en"&gt;1. version en&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I recently tried to install GNU+Linux on two machines with UEFI Bios InsydeH2O.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;It was complicated. Artix Linux or MX Linux did not boot from a USB Key …&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</summary><content type="html">&lt;div id="toc" class="toc"&gt;
&lt;div id="toctitle"&gt;Index&lt;/div&gt;
&lt;ul class="sectlevel1"&gt;
&lt;li&gt;&lt;a href="#_version_en"&gt;1. version en&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_version_fr"&gt;2. version fr&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id="preamble"&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Installer GNU+Linux sur un ordinateur équipé d&amp;#8217;un BIOS InsydeH2O.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_version_en"&gt;1. version en&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I recently tried to install GNU+Linux on two machines with UEFI Bios InsydeH2O.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;It was complicated. Artix Linux or MX Linux did not boot from a USB Key.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Debian 10.6 did.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;To install Artix Linux (20200506) I burnt the .ISO image on a DVD-RW (using
Xfburn : 984 MO, too big to fit on a CD-RW).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Once installed, you might want to add some softwares to Artix Linux (Firefox,
LibreOffice, VLC…). With Gebull.org we have work on a post-install procedure
here : &lt;a href="https://framagit.org/gebull/install" class="bare"&gt;https://framagit.org/gebull/install&lt;/a&gt; (fr)&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_version_fr"&gt;2. version fr&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;J&amp;#8217;ai récemment essayé d&amp;#8217;installer GNU+Linux sur deux machines équipées de Bios
UEFI Insyde H2O.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Ce fut compliqué. Artix Linux et MX Linux ne se lancent pas depuis une clé USB.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Debian 10.6 si.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Pour installer Artix Linux (20200506) j&amp;#8217;ai dû graver un DVD ré-inscriptible
(via Xfburn : 984 MO, ça ne passe pas sur un CD RW).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Une fois l&amp;#8217;installation terminée, vous aurez peut être envie d&amp;#8217;ajouter des
logiciels à Artix Linux (comme Firefox, LibreOffice, VLC…). Avec Gebull.org
nous avons travaillé à une procédure post-installation listant ces logiciels
ici : &lt;a href="https://framagit.org/gebull/install" class="bare"&gt;https://framagit.org/gebull/install&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</content><category term="Articles"/><category term="install"/><category term="Debian"/><category term="Artix"/><category term="hardware"/></entry><entry><title>Gigabit USB / Ethernet adapter driver</title><link href="https://grimoire.d12s.fr/2020/gigabit_usb_ethernet_adapter.html" rel="alternate"/><published>2020-10-01T00:00:00+02:00</published><updated>2020-10-01T00:00:00+02:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2020-10-01:/2020/gigabit_usb_ethernet_adapter.html</id><summary type="html">&lt;div id="toc" class="toc"&gt;
&lt;div id="toctitle"&gt;Index&lt;/div&gt;
&lt;ul class="sectlevel1"&gt;
&lt;li&gt;&lt;a href="#_linux_kernel_5_15"&gt;1. Linux kernel 5.15&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_linux_kernel_between_4_15_and_5_14"&gt;2. Linux kernel between 4.15 and 5.14&lt;/a&gt;
&lt;ul class="sectlevel2"&gt;
&lt;li&gt;&lt;a href="#_sysbususbdevices_powercontrol"&gt;2.1. &lt;code&gt;/sys/bus/usb/devices/&lt;/code&gt; […] &lt;code&gt;/power/control&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_blacklisting_the_device_via_the_tlp"&gt;2.2. Blacklisting the device via the &lt;code&gt;tlp&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_kernel_boot_command_method"&gt;2.3. kernel boot command method&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#_linux_kernel_prior_to_4_15"&gt;3. Linux kernel prior to 4.15&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id="preamble"&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Utiliser un adaptateur USB / Ethernet gigabit …&lt;/em&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</summary><content type="html">&lt;div id="toc" class="toc"&gt;
&lt;div id="toctitle"&gt;Index&lt;/div&gt;
&lt;ul class="sectlevel1"&gt;
&lt;li&gt;&lt;a href="#_linux_kernel_5_15"&gt;1. Linux kernel 5.15&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_linux_kernel_between_4_15_and_5_14"&gt;2. Linux kernel between 4.15 and 5.14&lt;/a&gt;
&lt;ul class="sectlevel2"&gt;
&lt;li&gt;&lt;a href="#_sysbususbdevices_powercontrol"&gt;2.1. &lt;code&gt;/sys/bus/usb/devices/&lt;/code&gt; […] &lt;code&gt;/power/control&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_blacklisting_the_device_via_the_tlp"&gt;2.2. Blacklisting the device via the &lt;code&gt;tlp&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_kernel_boot_command_method"&gt;2.3. kernel boot command method&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#_linux_kernel_prior_to_4_15"&gt;3. Linux kernel prior to 4.15&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id="preamble"&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Utiliser un adaptateur USB / Ethernet gigabit sans bloquer le système.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Since 5 years I use a laptop with no Ethernet port. On some rare occasions I
needed one and used 3 different USB / Ethernet adapters. Each of them ended up
blocking my Linux kernel after a few hours of usage. The last I&amp;#8217;ve tested was
based on the &lt;code&gt;RTL8153&lt;/code&gt; chip.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_linux_kernel_5_15"&gt;1. Linux kernel 5.15&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Starting from Linux kernel 5.15 a fix has been included improving the
situation. I changed hardware since.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_linux_kernel_between_4_15_and_5_14"&gt;2. Linux kernel between 4.15 and 5.14&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;(2021-06-14) Linux kernel 5.12 RealTek 8153 chip
driver &lt;a href="https://bugzilla.kernel.org/show_bug.cgi?id=198931"&gt;is not supporting USB auto-suspend&lt;/a&gt;, so this powersaving setting have to be disabled.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="admonitionblock warning"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class="icon"&gt;
&lt;i class="fa icon-warning" title="Warning"&gt;&lt;/i&gt;
&lt;/td&gt;
&lt;td class="content"&gt;
There is also a known bug in the Linux kernel since 2018-08-30 that causes close symptoms with RealTek RTL8153 adapters (embeding a USB hub, as for my experience) : &lt;a href="https://bugzilla.kernel.org/show_bug.cgi?id=200977"&gt;Bug 200977 - Daily crash with r8152 driver requiring reboot&lt;/a&gt; ; no kernel fix yet (2020-11-15).
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;If you encounter this kind of log before a series of kernel Call Traces :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-go"&gt;Jun 14 13:39:10 machine kernel: usb 2-3.1: reset SuperSpeed Gen 1 USB device number 17 using xhci_hcd&lt;/span&gt;
&lt;span class="tok-go"&gt;Jun 14 13:42:01 machine kernel: Call Trace:&lt;/span&gt;
&lt;span class="tok-go"&gt;Jun 14 13:42:01 machine kernel:  __schedule+0x2ff/0x8b0&lt;/span&gt;
&lt;span class="tok-go"&gt; […]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;You might want to try one of these solutions.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_sysbususbdevices_powercontrol"&gt;2.1. &lt;code&gt;/sys/bus/usb/devices/&lt;/code&gt; […] &lt;code&gt;/power/control&lt;/code&gt;&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;This can be achieve by writing &lt;code&gt;on&lt;/code&gt; in &lt;code&gt;/sys/bus/usb/devices/2-3/power/control&lt;/code&gt;, as your device is the 3rd of the 2nd bus.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;#&lt;/span&gt; &lt;span class="tok-nb"&gt;echo&lt;/span&gt; on &lt;span class="tok-p"&gt;|&lt;/span&gt; tee /sys/bus/usb/devices/2-3/power/control &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;This line can be added to &lt;code&gt;/etc/rc.local&lt;/code&gt; to have it executed at startup.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_blacklisting_the_device_via_the_tlp"&gt;2.2. Blacklisting the device via the &lt;code&gt;tlp&lt;/code&gt;&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Blacklisting the device via the &lt;code&gt;tlp&lt;/code&gt; powersaving manager should work also, but
have &lt;a href="https://bbs.archlinux.org/viewtopic.php?id=265500"&gt;been reported&lt;/a&gt; as not
fixing the issue on Arch Linux based distributions.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;To try it anyway :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="text"&gt;&lt;span&gt;&lt;/span&gt;$ lsubs
 Bus 002 Device 003: ID &lt;strong&gt;0bda:8153&lt;/strong&gt; Realtek Semiconductor Corp. RTL8153 Gigabit Ethernet Adapter
 […]
# vi /etc/tlp.conf
 […]
 USB_BLACKLIST=&amp;quot;*0bda:8153*&amp;quot;
 […]
# cat /sys/bus/usb/devices/2-3/power/control
on&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_kernel_boot_command_method"&gt;2.3. kernel boot command method&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Another solution is to add &lt;code&gt;usbcore.quirks=0bda:8153:k&lt;/code&gt; to the kernel boot command line.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;As suggested here :
 - &lt;a href="https://www.linuxquestions.org/questions/linux-software-2/kernel-panic-echo-0-proc-sys-kernel-4175629199/" class="bare"&gt;https://www.linuxquestions.org/questions/linux-software-2/kernel-panic-echo-0-proc-sys-kernel-4175629199/&lt;/a&gt;
 - &lt;a href="https://askubuntu.com/questions/1044127/usb-ethernet-adapter-realtek-r8153-keeps-disconnecting#1044128" class="bare"&gt;https://askubuntu.com/questions/1044127/usb-ethernet-adapter-realtek-r8153-keeps-disconnecting#1044128&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_linux_kernel_prior_to_4_15"&gt;3. Linux kernel prior to 4.15&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Older Linux kernels might not have loaded the right driver :
&lt;a href="https://www.pcsuggest.com/install-rtl8153-driver-linux/" class="bare"&gt;https://www.pcsuggest.com/install-rtl8153-driver-linux/&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="quoteblock"&gt;
&lt;blockquote&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;It&amp;#8217;s well supported by the Linux kernel, but the default &lt;code&gt;r8152&lt;/code&gt; module is rarely used, the generic &lt;code&gt;cdc_ether&lt;/code&gt; driver is loaded instead.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div class="attribution"&gt;
&amp;#8212; https://www.pcsuggest.com/install-rtl8153-driver-linux/[Arnab Satapathi]
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;So a radical solution is to blacklist the faulty kernel module to let the &lt;code&gt;r8152&lt;/code&gt; being used. This can be achieved with a configuration file in &lt;code&gt;/etc/modprobe.d&lt;/code&gt; :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;#&lt;/span&gt; vi /etc/modprobe.d/blacklist_cdc_ether.conf
&lt;span class="tok-gp"&gt;#&lt;/span&gt; depmod -a&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="text"&gt;&lt;span&gt;&lt;/span&gt;&lt;strong&gt;blacklist&lt;/strong&gt; cdc_ether&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Another solution is to point out which module to use for your particular peripheral, via &lt;code&gt;udev&lt;/code&gt; :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;#&lt;/span&gt; vi /etc/udev/rules.d/50-usb-realtek-net.rules&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="sh"&gt;&lt;span&gt;&lt;/span&gt;ATTR&lt;span class="tok-o"&gt;{&lt;/span&gt;&lt;strong&gt;idVendor&lt;/strong&gt;&lt;span class="tok-o"&gt;}==&lt;/span&gt;&lt;span class="tok-s2"&gt;&amp;quot;0bda&amp;quot;&lt;/span&gt;, ATTR&lt;span class="tok-o"&gt;{&lt;/span&gt;&lt;strong&gt;idProduct&lt;/strong&gt;&lt;span class="tok-o"&gt;}==&lt;/span&gt;&lt;span class="tok-s2"&gt;&amp;quot;8153&amp;quot;&lt;/span&gt;, ATTR&lt;span class="tok-o"&gt;{&lt;/span&gt;bConfigurationValue&lt;span class="tok-o"&gt;}&lt;/span&gt;!&lt;span class="tok-o"&gt;=&lt;/span&gt;&lt;span class="tok-s2"&gt;&amp;quot;1&amp;quot;&lt;/span&gt;, ATTR&lt;span class="tok-o"&gt;{&lt;/span&gt;bConfigurationValue&lt;span class="tok-o"&gt;}=&lt;/span&gt;&lt;span class="tok-s2"&gt;&amp;quot;1&amp;quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;The &lt;code&gt;idVendor&lt;/code&gt; and &lt;code&gt;idProduct&lt;/code&gt; field values where given by &lt;code&gt;lsusb&lt;/code&gt; :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;$&lt;/span&gt; lsusb&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="text"&gt;&lt;span&gt;&lt;/span&gt;Bus 002 Device 014: ID &lt;strong&gt;0bda&lt;/strong&gt;:&lt;strong&gt;8153&lt;/strong&gt; Realtek Semiconductor Corp. RTL8153 Gigabit Ethernet Adapter
 …&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;The complete &lt;code&gt;50-usb-realtek-net.rules&lt;/code&gt; file can found here : &lt;a href="https://github.com/bb-qq/r8152/blob/master/50-usb-realtek-net.rules" class="bare"&gt;https://github.com/bb-qq/r8152/blob/master/50-usb-realtek-net.rules&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</content><category term="Commandes"/><category term="hardware"/></entry><entry><title>Simulate unplug / replug of USB devices</title><link href="https://grimoire.d12s.fr/2020/simulate_unplug_replug_usb_devices.html" rel="alternate"/><published>2020-09-24T00:00:00+02:00</published><updated>2020-09-24T00:00:00+02:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2020-09-24:/2020/simulate_unplug_replug_usb_devices.html</id><summary type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Simuler le débranchement / rebranchement d&amp;#8217;un periphérique USB.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;$ dmesg | grep usb&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="text"&gt;[…]
[84602.462281] usb &lt;strong&gt;1-1.3&lt;/strong&gt;: New USB device strings: Mfr=1, Product=2, SerialNumber=3 &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
[84602.462291] usb 1-1.3: Product: USB Flash Drive
[84602.462300] usb 1-1.3: Manufacturer: …
[…]&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;So the interesting USB device id is …&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;</summary><content type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Simuler le débranchement / rebranchement d&amp;#8217;un periphérique USB.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;$ dmesg | grep usb&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="text"&gt;[…]
[84602.462281] usb &lt;strong&gt;1-1.3&lt;/strong&gt;: New USB device strings: Mfr=1, Product=2, SerialNumber=3 &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
[84602.462291] usb 1-1.3: Product: USB Flash Drive
[84602.462300] usb 1-1.3: Manufacturer: …
[…]&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;So the interesting USB device id is &lt;code&gt;1-1.3&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;To logically unplug / disconnect it :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;$ sudo sh -c 'echo 1-1.3 &amp;gt; /sys/bus/usb/drivers/usb/unbind'&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;To get the peripheral back / connect or plug it :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;$ sudo sh -c 'echo 1-1.3 &amp;gt; /sys/bus/usb/drivers/usb/bind'&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Source : &lt;a href="https://lists.debian.org/debian-user-french/2019/11/msg00076.html"&gt;debian-user-french@lists.debian.org&lt;/a&gt; 2019-11-16 à 13:32&lt;/p&gt;
&lt;/div&gt;</content><category term="Commandes"/><category term="hardware"/></entry><entry><title>dd buffer size `bs=`</title><link href="https://grimoire.d12s.fr/2020/dd_buffer_size.html" rel="alternate"/><published>2020-09-17T00:00:00+02:00</published><updated>2020-09-17T00:00:00+02:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2020-09-17:/2020/dd_buffer_size.html</id><summary type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Importance du réglage de la taille de buffer lors de l&amp;#8217;utilisation de la commande &lt;code&gt;dd&lt;/code&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="text"&gt;$ sudo dd status=progress if=a_file.iso of=/dev/sdX
1226833920 octets (1,2 GB, 1,1 GiB) copiés, 495,782 s, &lt;strong&gt;2,5 MB/s&lt;/strong&gt;
$ sudo dd bs=1M status=progress if=a_file …&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;</summary><content type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Importance du réglage de la taille de buffer lors de l&amp;#8217;utilisation de la commande &lt;code&gt;dd&lt;/code&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="text"&gt;$ sudo dd status=progress if=a_file.iso of=/dev/sdX
1226833920 octets (1,2 GB, 1,1 GiB) copiés, 495,782 s, &lt;strong&gt;2,5 MB/s&lt;/strong&gt;
$ sudo dd bs=1M status=progress if=a_file.iso of=/dev/sdX
1226833920 octets (1,2 GB, 1,1 GiB) copiés, 138,725 s, &lt;strong&gt;8,8 MB/s&lt;/strong&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Default &lt;code&gt;dd&lt;/code&gt; buffer size is 512 octets.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Most current storage devices have bigger block sizes (such as 4096 octets).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Using a &lt;code&gt;dd&lt;/code&gt; bigger buffer size allow speed up transfers avoiding device block
size splitting overhead.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;In our case we can see that is speed ups transfers by 3.5 times for a 10 years
old USB Key capable of writing at 10 Mo/s. For recent NVME SSD storage, I&amp;#8217;ve
&lt;a href="https://pleroma.lord.re/notice/9zU5Hm3IRiTNty3uXQ"&gt;been reported&lt;/a&gt; performances
from 129 Mo/s to 1,5 Go/s (approx 10x faster).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Some more rigorous test results can be found here : &lt;a href="http://blog.tdg5.com/tuning-dd-block-size/" class="bare"&gt;http://blog.tdg5.com/tuning-dd-block-size/&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;It shows that at a certain extend, using a big buffer size is helpfull, and too
big is not harmless, so &lt;code&gt;1M&lt;/code&gt; is a good compromise for the years to come.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="admonitionblock tip"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class="icon"&gt;
&lt;i class="fa icon-tip" title="Tip"&gt;&lt;/i&gt;
&lt;/td&gt;
&lt;td class="content"&gt;
The Tails team recommands &lt;code&gt;sudo dd if=tails.img of=/dev/sda bs=16M oflag=direct status=progress&lt;/code&gt; This allows a 1.3Go file to be copied in 34s at 38Mo/s (while a regular &lt;code&gt;cp&lt;/code&gt; achieves it in 47s).
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;</content><category term="Commandes"/><category term="shell"/><category term="optimization"/><category term="storage"/><category term="benchmark"/></entry><entry><title>Set systemd max logs size</title><link href="https://grimoire.d12s.fr/2020/systemd_logs_vacuum_size.html" rel="alternate"/><published>2020-09-07T00:00:00+02:00</published><updated>2020-09-07T00:00:00+02:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2020-09-07:/2020/systemd_logs_vacuum_size.html</id><summary type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Vider les journaux de fonctionnement gérés par systemd&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;$&lt;/span&gt; sudo journalctl --disk-usage
&lt;span class="tok-go"&gt;Archived and active journals take up 1.2G in the file system.&lt;/span&gt;
&lt;span class="tok-gp"&gt;$&lt;/span&gt; sudo journalctl --vacuum-size&lt;span class="tok-o"&gt;=&lt;/span&gt;500M
&lt;span class="tok-gp"&gt;$&lt;/span&gt; sudo journalctl --disk-usage
&lt;span class="tok-go"&gt;Archived and active journals take up 488.1M in the file system.&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;cf. &lt;a href="https://unix.stackexchange.com/questions/130786/can-i-remove-files-in-var-log-journal-and-var-cache-abrt-di-usr" class="bare"&gt;https://unix.stackexchange.com/questions/130786/can-i-remove-files-in-var-log-journal-and-var-cache-abrt-di-usr …&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;</summary><content type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Vider les journaux de fonctionnement gérés par systemd&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;$&lt;/span&gt; sudo journalctl --disk-usage
&lt;span class="tok-go"&gt;Archived and active journals take up 1.2G in the file system.&lt;/span&gt;
&lt;span class="tok-gp"&gt;$&lt;/span&gt; sudo journalctl --vacuum-size&lt;span class="tok-o"&gt;=&lt;/span&gt;500M
&lt;span class="tok-gp"&gt;$&lt;/span&gt; sudo journalctl --disk-usage
&lt;span class="tok-go"&gt;Archived and active journals take up 488.1M in the file system.&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;cf. &lt;a href="https://unix.stackexchange.com/questions/130786/can-i-remove-files-in-var-log-journal-and-var-cache-abrt-di-usr" class="bare"&gt;https://unix.stackexchange.com/questions/130786/can-i-remove-files-in-var-log-journal-and-var-cache-abrt-di-usr&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;To set a permanent limit :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;$&lt;/span&gt; sudo vim /etc/systemd/journald.conf&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="ini"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-k"&gt;[Journal]&lt;/span&gt;
&lt;span class="tok-na"&gt;MaxRetentionSec&lt;/span&gt;&lt;span class="tok-o"&gt;=&lt;/span&gt;&lt;span class="tok-s"&gt;1month&lt;/span&gt;
&lt;span class="tok-na"&gt;SystemMaxUse&lt;/span&gt;&lt;span class="tok-o"&gt;=&lt;/span&gt;&lt;span class="tok-s"&gt;50M&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;$&lt;/span&gt; sudo systemctl restart systemd-journald&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;</content><category term="Commandes"/><category term="adminsys"/></entry><entry><title>Read logs with systemd</title><link href="https://grimoire.d12s.fr/2020/read_log_with_systemd.html" rel="alternate"/><published>2020-09-06T00:00:00+02:00</published><updated>2020-09-06T00:00:00+02:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2020-09-06:/2020/read_log_with_systemd.html</id><content type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Accéder aux journaux de fonctionnement avec systemd&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;$&lt;/span&gt; journalctl --since&lt;span class="tok-o"&gt;=&lt;/span&gt;&lt;span class="tok-s2"&gt;&amp;quot;10 minutes ago&amp;quot;&lt;/span&gt; -u &lt;span class="tok-nv"&gt;$my_app&lt;/span&gt;.service&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;</content><category term="Commandes"/><category term="adminsys"/></entry><entry><title>vim : case sensitive search</title><link href="https://grimoire.d12s.fr/2020/vim_case_sensitive_search.html" rel="alternate"/><published>2020-09-02T00:00:00+02:00</published><updated>2020-09-02T00:00:00+02:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2020-09-02:/2020/vim_case_sensitive_search.html</id><summary type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Recherche sensible à la casse (majuscules) ou non.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;By default, a search typed in small letters is case insensitive in vim : results will all be highlighted with or without capital letters in them.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;If you type a capital letter in your search terms, the search becomes case sensitive : only exact …&lt;/p&gt;&lt;/div&gt;</summary><content type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Recherche sensible à la casse (majuscules) ou non.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;By default, a search typed in small letters is case insensitive in vim : results will all be highlighted with or without capital letters in them.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;If you type a capital letter in your search terms, the search becomes case sensitive : only exact match regarding capital letters will be highlighted.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;You can force this conduct with the following syntax :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="vim"&gt;&lt;span&gt;&lt;/span&gt;/\&lt;span class="tok-k"&gt;c&lt;/span&gt; search&lt;span class="tok-p"&gt;-&lt;/span&gt;terms &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
/\C search&lt;span class="tok-p"&gt;-&lt;/span&gt;terms &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Force case insensitive search with a backslash (minus) c&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Force case sensitive search with a backslash (capital) C&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;</content><category term="Commandes"/><category term="Vim"/></entry><entry><title>UV light from blue pixels</title><link href="https://grimoire.d12s.fr/2020/uv_light_from_blue_pixels.html" rel="alternate"/><published>2020-08-25T00:00:00+02:00</published><updated>2020-08-25T00:00:00+02:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2020-08-25:/2020/uv_light_from_blue_pixels.html</id><summary type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Les ultraviolets peuvent être définis comme étant les longueurs d&amp;#8217;ondes de lumière plus courtes que celles du bleu visible &lt;sup class="footnote"&gt;[&lt;a id="_footnoteref_1" class="footnote" href="#_footnotedef_1" title="View footnote."&gt;1&lt;/a&gt;]&lt;/sup&gt;. Il n&amp;#8217;y a pas de limite nette entre les deux (cela varie d&amp;#8217;un individu à l&amp;#8217;autre) il s&amp;#8217;agit d&amp;#8217;un phénomène physique continu. Du coup …&lt;/em&gt;&lt;/p&gt;&lt;/div&gt;</summary><content type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Les ultraviolets peuvent être définis comme étant les longueurs d&amp;#8217;ondes de lumière plus courtes que celles du bleu visible &lt;sup class="footnote"&gt;[&lt;a id="_footnoteref_1" class="footnote" href="#_footnotedef_1" title="View footnote."&gt;1&lt;/a&gt;]&lt;/sup&gt;. Il n&amp;#8217;y a pas de limite nette entre les deux (cela varie d&amp;#8217;un individu à l&amp;#8217;autre) il s&amp;#8217;agit d&amp;#8217;un phénomène physique continu. Du coup, si on allume seulement les pixels bleus d&amp;#8217;un écran d&amp;#8217;ordinateur (ou de téléphone), la lumière obtenue se comporte un peu comme la lumière noire ultraviolette, il est par exemple possible de s&amp;#8217;en servir pour détecteur des faux billets, ou faire briller des scorpions.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;UV can be defined as light with shorter wavelengths than visible blue &lt;sup class="footnote"&gt;[&lt;a id="_footnoteref_2" class="footnote" href="#_footnotedef_2" title="View footnote."&gt;2&lt;/a&gt;]&lt;/sup&gt;. There is no clear limit between the two (as it varies depending on the persons) the physical phenomenum is a continuum. Hence, if you light up all the blue pixels of a computer (or phone) screen, you get a light that will behave a bit like UV light, and you&amp;#8217;ll be able to use it to check paper money (bank note) or to shine up scorpions.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;$&lt;/span&gt; vi bleu.html&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="html"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tok-nt"&gt;html&lt;/span&gt; &lt;span class="tok-na"&gt;style&lt;/span&gt;&lt;span class="tok-o"&gt;=&lt;/span&gt;&lt;span class="tok-s"&gt;&amp;quot;background-color:#0000FF&amp;quot;&lt;/span&gt;&lt;span class="tok-p"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="tok-nt"&gt;html&lt;/span&gt;&lt;span class="tok-p"&gt;&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;$&lt;/span&gt; firefox bleu.html &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;You can press &lt;kbd&gt;F11&lt;/kbd&gt; key to turn Firefox full screen and light up all the blue pixels ; you can also set full screen backlight.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;This is the other side of the blue-light "coin" : &lt;a href="/2018/protect_eyes_from_blue_screen_light.html"&gt;Protect your eyes from screen&amp;#8217;s blue light&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div id="footnotes"&gt;
&lt;hr&gt;
&lt;div class="footnote" id="_footnotedef_1"&gt;
&lt;a href="#_footnoteref_1"&gt;1&lt;/a&gt;. Mais plus longues que celles des rayons X.
&lt;/div&gt;
&lt;div class="footnote" id="_footnotedef_2"&gt;
&lt;a href="#_footnoteref_2"&gt;2&lt;/a&gt;. But longer than X-rays.
&lt;/div&gt;
&lt;/div&gt;</content><category term="Commandes"/><category term="hardware"/></entry><entry><title>iwd : inet wireless daemon</title><link href="https://grimoire.d12s.fr/2020/iwd_inet_wireless_daemon.html" rel="alternate"/><published>2020-08-19T00:00:00+02:00</published><updated>2020-08-19T00:00:00+02:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2020-08-19:/2020/iwd_inet_wireless_daemon.html</id><summary type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Remplacer wpa_supplicant par iwd pour gagner en temps de connexion au WiFi.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Using &lt;code&gt;iwd&lt;/code&gt; in Debian stable 10.x is saving noticiable secondes when establishing the connection. To be true, before (with the &lt;code&gt;wpa_supplicant&lt;/code&gt; backend of &lt;code&gt;NetworkManager&lt;/code&gt;) I was waiting for WiFi connections to establish while starting my laptop or …&lt;/p&gt;&lt;/div&gt;</summary><content type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Remplacer wpa_supplicant par iwd pour gagner en temps de connexion au WiFi.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Using &lt;code&gt;iwd&lt;/code&gt; in Debian stable 10.x is saving noticiable secondes when establishing the connection. To be true, before (with the &lt;code&gt;wpa_supplicant&lt;/code&gt; backend of &lt;code&gt;NetworkManager&lt;/code&gt;) I was waiting for WiFi connections to establish while starting my laptop or getting back from hibernation, now it connects faster than I can check it.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I don&amp;#8217;t get better transfert rates. Even with Debian testing versions of &lt;code&gt;iwd&lt;/code&gt; and &lt;code&gt;NetworkManager&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;# apt install iwd
# nano /etc/NetworkManager/NetworkManager.conf&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Add the following lines at the end :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="ini"&gt; [device]
 wifi.backend=iwd&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code&gt;# systemctl mask --now wpa_supplicant
# systemctl restart NetworkManager&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="admonitionblock warning"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class="icon"&gt;
&lt;i class="fa icon-warning" title="Warning"&gt;&lt;/i&gt;
&lt;/td&gt;
&lt;td class="content"&gt;
Don&amp;#8217;t mess your &lt;code&gt;iwd&lt;/code&gt; and &lt;code&gt;NetworkManager&lt;/code&gt; versions, get it right reading here : &lt;a href="https://iwd.wiki.kernel.org/networkmanager" class="bare"&gt;https://iwd.wiki.kernel.org/networkmanager&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="admonitionblock tip"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class="icon"&gt;
&lt;i class="fa icon-tip" title="Tip"&gt;&lt;/i&gt;
&lt;/td&gt;
&lt;td class="content"&gt;
Hint from : &lt;a href="https://www.blog-libre.org/2020/08/03/iwd-le-daemon-wi-fi-quil-vous-faut/" class="bare"&gt;https://www.blog-libre.org/2020/08/03/iwd-le-daemon-wi-fi-quil-vous-faut/&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;To get back to &lt;code&gt;wpa_supplicant&lt;/code&gt; :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;# nano /etc/NetworkManager/NetworkManager.conf&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Comment the following lines as shown here :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;# [device]
# wifi.backend=iwd&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code&gt;# systemctl unmask wpa_supplicant
# systemctl start wpa_supplicant
# systemctl restart NetworkManager
# apt remove iwd&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;</content><category term="Commandes"/><category term="optimization"/><category term="network"/></entry><entry><title>Reduce ext partition reserved blocks</title><link href="https://grimoire.d12s.fr/2020/reduce_ext_reserved_blocks.html" rel="alternate"/><published>2020-08-10T00:00:00+02:00</published><updated>2020-08-10T00:00:00+02:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2020-08-10:/2020/reduce_ext_reserved_blocks.html</id><summary type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Réduire le nombre de blocks réservés à l&amp;#8217;utilisateur root sur un système de fichier &lt;code&gt;ext&lt;/code&gt;, et récupérer ainsi l&amp;#8217;espace libre pour les utilisateurs.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;On ext (ext2, ext3, ext4) filesystems, 5% of the blocks are reserved by default for the root user. For a 1To disk, it represents 50Go …&lt;/p&gt;&lt;/div&gt;</summary><content type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Réduire le nombre de blocks réservés à l&amp;#8217;utilisateur root sur un système de fichier &lt;code&gt;ext&lt;/code&gt;, et récupérer ainsi l&amp;#8217;espace libre pour les utilisateurs.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;On ext (ext2, ext3, ext4) filesystems, 5% of the blocks are reserved by default for the root user. For a 1To disk, it represents 50Go. It can safely be reduced.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;$ sudo tune2fs -l /dev/mapper/machine--vg-root | rg "Reserved block count" &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
Reserved block count:     6220910 &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;
$ df -h | rg "machine--vg-root" &lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;(3)&lt;/b&gt;
/dev/mapper/machine--vg-root   469G    361G   84G  81% /
$ sudo tune2fs -m 0.1 /dev/mapper/machine--vg-root &lt;i class="conum" data-value="4"&gt;&lt;/i&gt;&lt;b&gt;(4)&lt;/b&gt;
tune2fs 1.45.5 (07-Jan-2020)
Setting reserved blocks percentage to 0.1% (124831 blocks)
$ python -c 'print(124831*4096/1024)' &lt;i class="conum" data-value="5"&gt;&lt;/i&gt;&lt;b&gt;(5)&lt;/b&gt;
499324
$ df -h | rg "machine--vg-root" &lt;i class="conum" data-value="6"&gt;&lt;/i&gt;&lt;b&gt;(6)&lt;/b&gt;
/dev/mapper/machine--vg-root   469G    361G  108G  77% /&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Find how many blocks are reserved on your ext partition, here it&amp;#8217;s around 25Go (for a 512 Go SSD).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;To get the block size : &lt;code&gt;tune2fs -l /dev/mapper/machine&amp;#8212;&amp;#8203;vg-root | rg "Block size"&lt;/code&gt; ; here it&amp;#8217;s 4096 octets. It can also been read via &lt;code&gt;blockdev --getbsz /dev/mapper/machine&amp;#8212;&amp;#8203;vg-root&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Check the free space of this partition (here it&amp;#8217;s 84 Go)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="4"&gt;&lt;/i&gt;&lt;b&gt;4&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Set the reserved blocks percentage to : 0.1 %&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="5"&gt;&lt;/i&gt;&lt;b&gt;5&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Compute the size in kilo-octects, it&amp;#8217;s now around 500 Mo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="6"&gt;&lt;/i&gt;&lt;b&gt;6&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Check the free space of this partition again, it&amp;#8217;s now 108 Go&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="admonitionblock warning"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class="icon"&gt;
&lt;i class="fa icon-warning" title="Warning"&gt;&lt;/i&gt;
&lt;/td&gt;
&lt;td class="content"&gt;
You need to keep some reserved blocks on your root filesystem, else you might brake your system.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;</content><category term="Commandes"/><category term="optimization"/><category term="storage"/></entry><entry><title>Reload Linux kernel modules (for WiFi, webcam or touchpad…)</title><link href="https://grimoire.d12s.fr/2020/reload_kernel_modules.html" rel="alternate"/><published>2020-08-05T00:00:00+02:00</published><updated>2020-08-05T00:00:00+02:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2020-08-05:/2020/reload_kernel_modules.html</id><summary type="html">&lt;div id="preamble"&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Recharcher les modules du noyau Linux (comme celui du WiFi, de la webcam ou de la souris) pour retrouver un comportement normal en cas de blocage, en sortie de veille prolongée par exemple.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Reload kernel modules (such as WiFi, webcam or touchpad) to fix bad behaviors, occuring after hibernation for …&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</summary><content type="html">&lt;div id="preamble"&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Recharcher les modules du noyau Linux (comme celui du WiFi, de la webcam ou de la souris) pour retrouver un comportement normal en cas de blocage, en sortie de veille prolongée par exemple.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Reload kernel modules (such as WiFi, webcam or touchpad) to fix bad behaviors, occuring after hibernation for instance.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;#&lt;/span&gt; modprobe -r elan_i2c &lt;span class="tok-o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; modprobe elan_i2c  &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt; &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;-r&lt;/code&gt; to remove the module if no other modules depends on it and it&amp;#8217;s not being actively used.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;elan_i2c&lt;/code&gt; is a touchpad module&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;code&gt;iwldvm&lt;/code&gt; is an Intel WiFi module.&lt;br&gt;
&lt;code&gt;iwlmvm&lt;/code&gt; is also a WiFi module.&lt;br&gt;
&lt;code&gt;snd-hda-intel&lt;/code&gt; is a sound-card module.&lt;br&gt;
&lt;code&gt;uvcvideo&lt;/code&gt; is a webcam module.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_used_modules"&gt;1. Used modules&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;If &lt;code&gt;modprobe&lt;/code&gt; refuses to remove your module, because other modules depends on it, you can use :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;#&lt;/span&gt; rmmod -f snd-hda-intel &lt;span class="tok-o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; modprobe snd-hda-intel&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;code&gt;rmmod -f&lt;/code&gt; will remove the module anyway. Use it with caution, removing an important module can destabilize your system.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_how_to_find_which_module_to_remove"&gt;2. How to find which module to remove&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;To find which module to remove, you can list loaded modules and search which module name correspond to your need…&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;$&lt;/span&gt; lsmod &lt;span class="tok-p"&gt;|&lt;/span&gt; grep wifi
&lt;span class="tok-go"&gt;iwlwifi               294912  1 iwlmvm&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Removing the &lt;code&gt;iwlwifi&lt;/code&gt; module is not allowed, even using &lt;code&gt;rmmod -f&lt;/code&gt; but reloading &lt;code&gt;iwlmvm&lt;/code&gt; is enough.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</content><category term="Commandes"/><category term="hardware"/><category term="repair"/></entry><entry><title>Advocating a Fairphone mini</title><link href="https://grimoire.d12s.fr/2020/advocating_a_fairphone_mini.html" rel="alternate"/><published>2020-07-04T00:00:00+02:00</published><updated>2020-07-04T00:00:00+02:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2020-07-04:/2020/advocating_a_fairphone_mini.html</id><summary type="html">&lt;div id="toc" class="toc"&gt;
&lt;div id="toctitle"&gt;Index&lt;/div&gt;
&lt;ul class="sectlevel1"&gt;
&lt;li&gt;&lt;a href="#_cases"&gt;1. Cases&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_facts"&gt;2. Facts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_screen_size_tradeoffs"&gt;3. Screen size tradeoffs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_conclusion"&gt;4. Conclusion&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id="preamble"&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Playdoyer pour un Fairphone mini&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;From this original forum post : &lt;a href="https://forum.fairphone.com/t/advocating-a-fp2-mini/15405" class="bare"&gt;https://forum.fairphone.com/t/advocating-a-fp2-mini/15405&lt;/a&gt; (14k views as of 2020-07)&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_cases"&gt;1. Cases&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;2 days ago, I was walking of the street, with big bags of vegetables and …&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</summary><content type="html">&lt;div id="toc" class="toc"&gt;
&lt;div id="toctitle"&gt;Index&lt;/div&gt;
&lt;ul class="sectlevel1"&gt;
&lt;li&gt;&lt;a href="#_cases"&gt;1. Cases&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_facts"&gt;2. Facts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_screen_size_tradeoffs"&gt;3. Screen size tradeoffs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_conclusion"&gt;4. Conclusion&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id="preamble"&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Playdoyer pour un Fairphone mini&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;From this original forum post : &lt;a href="https://forum.fairphone.com/t/advocating-a-fp2-mini/15405" class="bare"&gt;https://forum.fairphone.com/t/advocating-a-fp2-mini/15405&lt;/a&gt; (14k views as of 2020-07)&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_cases"&gt;1. Cases&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;2 days ago, I was walking of the street, with big bags of vegetables and an appointment not to miss. I put all the bags in my left hand and took the FP2 in the right one. I was unable to secure my grip on the phone and pilote OSMand~ at the same time. My fingers are to short to fix the phone in a position allowing the thumb to do something on the other side of the screen. So the phone was, from time to time, in an unstable equilibrium and an involuntary bump would have it falling on the floor, which is a bad feeling speaking about a half thousand euros device. Has my hands stopped growing since a little while now my point of view is that the FP2 is uncomfortably too big.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Another reason is that the battery can’t last more than 2 days, even with no WiFi, even in 2G-only and polling the data only once every 1h (BatteryFu from F-Droid), even with brightness at 33%… With a smaller screen we would be able to actually use the phone and get more autonomy.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;It would definitely help making it cheaper. Cheaper to buy, cheaper to replace screen-module. Currently, most of the people I proudly show the blue-tinted goats of the beast look at it like if I was doing a nice militant action, but off the reality with a so expensive device. Lets meet your market. Currently only company owners are buying it (for whom I convinced to).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Then, if you are to make a compressed model, lets get it non-symetrical, adding striations on one half of the back cover, in order to know in which position you hold the phone right out of your pocket. (I still can’t predict from what side I’m holding the object…)&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Screens are not all getting bigger… Samsung made a Galaxy S4 mini for instance (4.3", thin borders). A great product (running CyanogenMod ;-)).&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_facts"&gt;2. Facts&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Some more statistics mainly from GSMArena.com…&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;strong&gt;Fairphone&lt;/strong&gt; made an excellent FP1 / FP1U with a 4.3" screen size. [edit 2019-03-23 finally got my hands on one and it feels great to use] [edit 2020-07-04 used it as my main drive since]&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;strong&gt;Nokia&lt;/strong&gt;, at its best, offered an N97, and 6 months after an N97 mini.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;N97 screen size : 3.2" (2009)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;N900 screen size : 3,5" (2009)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;N9 screen size : 3,9" (2011) no physical keyboard&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;strong&gt;Samsung&lt;/strong&gt; Galaxy S phones all come with a mini version:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;S3 mini screen size : 4"&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;S4 mini screen size : 4.3"&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;S5 mini screen size : 4,5" (2014)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;S6 mini screen size : ??"&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;S7 mini screen size : 4.6" (rumors)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;strong&gt;Sony&lt;/strong&gt; Compact series:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Z1 compact : 4.3"&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Z3 compact : 4.6"&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Z4 compact : 4.7"&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Z5 compact : 4.6" (2015-10)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Interesting to see that the screen size did reduce between the Z4 and the Z5. Less is better here.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;strong&gt;iPhone&lt;/strong&gt; mainstream series:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;4 : 3.5" (2010 ; Steve Jobs died in 2011-10)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;5 : 4" (2012-09)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;6 : 4.7" (2015-09)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;SE : 4" (2016-03)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Still smaller than FP2.
Newer are smaller again.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;strong&gt;Apple&lt;/strong&gt; on &lt;strong&gt;Steve Jobs&lt;/strong&gt; era conducted experimental researches concluding than the 3.5" will always be the size to be.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Gizmodo (2011) : &lt;a href="https://gizmodo.com/5847981/this-is-why-the-iphones-screen-will-always-be-35-inches"&gt;This Is Why the iPhone’s Screen Will Always Be 3.5 Inches&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;Touching the upper right corner of the screen on the Galaxy S II using one hand, with its 4.27-inch screen, while you’re walking down the street looking at Google Maps, is extremely difficult and frustrating. I pulled out my iPhone 4 to do a quick test, and it turns out that when you hold the iPhone in your left hand and articulate your thumb, you can reach almost exactly to the other side of the screen.&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;strong&gt;Palm Computing&lt;/strong&gt; : it’s also interesting to get the point of view of another person whom spent a lot of time seeking the perfect size for a small computer to carry in pockets. It was Jeff Hawkins, the founder of Palm Computing. He said in an interview that he spent a year with different objects in his pockets to seek the best size. It’s interesting to see that Palms were, during 18 years with 3,7 to 3,9" screens. Looks like a reasonable choice, isn’t it ?&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Other mini series:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Motorola DROID mini : 4.2" (2013)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;HTC One mini 2 : 4.5" (2014-05)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;OnePlus Mini : 4.6" (rumors)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_screen_size_tradeoffs"&gt;3. Screen size tradeoffs&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;The phone thickness can, more or less, be converted in accessible screen area as a thin phone allows a grip in a position where the thumb is dominating a bit more of the screen.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;And, as a matter of completeness, the edge width (around the screen) is also an optimizable variable, but no edge means muscles of the thumb touching the sensitive part of the screen… which must result in erratic movements.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_conclusion"&gt;4. Conclusion&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Phone makers are merely all offering “hand-sized” phone lines, in addition to the bigger and bigger screens presented as mainstream…&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;They might be making bigger screens just because they miss other improvements to announce. Still my hands are not growing anymore and I don’t want to watch videos on my cellphone.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;My opinion on this matter is that a good market positionning for a Fairphone mini would be 3.5" screen size to establish a clear difference (and lets consider 4" again if it’s technically too difficult to achieve 3.5").&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;This would address a clear other segment of the market.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</content><category term="Articles"/><category term="Fairphone"/></entry><entry><title>Install UBports (or Fairphone Open OS) on Fairphone 2</title><link href="https://grimoire.d12s.fr/2020/install_ubports_on_fp2.html" rel="alternate"/><published>2020-06-27T00:00:00+02:00</published><updated>2020-06-27T00:00:00+02:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2020-06-27:/2020/install_ubports_on_fp2.html</id><summary type="html">&lt;div id="preamble"&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Installer UBports sur FP2.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_flash_ubports"&gt;1. Flash UBports&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;$&lt;/span&gt; su &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
&lt;span class="tok-gp"&gt;#&lt;/span&gt; vi /etc/udev/rules.d/51-android.rules &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;
&lt;span class="tok-gp"&gt;#&lt;/span&gt; /etc/init.d/udev reload
&lt;span class="tok-gp"&gt;#&lt;/span&gt; &lt;span class="tok-nb"&gt;exit&lt;/span&gt;
&lt;span class="tok-gp"&gt;$&lt;/span&gt; groups &lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;(3)&lt;/b&gt;
&lt;span class="tok-go"&gt;XXX cdrom floppy audio dip video plugdev netdev lpadmin scanner bluetooth&lt;/span&gt;
&lt;span class="tok-gp"&gt;$&lt;/span&gt; wget https://github.com/ubports/ubports-installer/releases/download/0.4.18-beta/ubports-installer.0.4 …&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</summary><content type="html">&lt;div id="preamble"&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Installer UBports sur FP2.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_flash_ubports"&gt;1. Flash UBports&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;$&lt;/span&gt; su &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
&lt;span class="tok-gp"&gt;#&lt;/span&gt; vi /etc/udev/rules.d/51-android.rules &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;
&lt;span class="tok-gp"&gt;#&lt;/span&gt; /etc/init.d/udev reload
&lt;span class="tok-gp"&gt;#&lt;/span&gt; &lt;span class="tok-nb"&gt;exit&lt;/span&gt;
&lt;span class="tok-gp"&gt;$&lt;/span&gt; groups &lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;(3)&lt;/b&gt;
&lt;span class="tok-go"&gt;XXX cdrom floppy audio dip video plugdev netdev lpadmin scanner bluetooth&lt;/span&gt;
&lt;span class="tok-gp"&gt;$&lt;/span&gt; wget https://github.com/ubports/ubports-installer/releases/download/0.4.18-beta/ubports-installer.0.4.18-beta.AppImage &lt;i class="conum" data-value="4"&gt;&lt;/i&gt;&lt;b&gt;(4)&lt;/b&gt;
&lt;span class="tok-gp"&gt;$&lt;/span&gt; ./ubports-installer.0.4.18-beta.AppImage
&lt;span class="tok-gp"&gt;$&lt;/span&gt; &lt;span class="tok-c1"&gt;# Plug your device and carefully follow the graphical instructions &lt;/span&gt;&lt;i class="conum" data-value="5"&gt;&lt;/i&gt;&lt;b&gt;(5)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Become &lt;code&gt;root&lt;/code&gt;, to add a &lt;code&gt;udev&lt;/code&gt; rule to access your device from a regular user (or stay root)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Add the following line in the file : &lt;code&gt;SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="d00d", MODE="0666", GROUP="plugdev"&lt;/code&gt; check that your &lt;code&gt;idVendor&lt;/code&gt; and &lt;code&gt;idProduct&lt;/code&gt; are the ones found in your &lt;code&gt;/var/log/syslog&lt;/code&gt; while pluging the device (it differs if you&amp;#8217;re booting in &lt;code&gt;fastboot&lt;/code&gt; mode, &lt;code&gt;recovery&lt;/code&gt; / &lt;code&gt;bootloader&lt;/code&gt; mode and regular mode, so you&amp;#8217;ll have to update your file and reload &lt;code&gt;udev&lt;/code&gt; during the installation).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Check that your current unix user is member of the &lt;code&gt;plugdev&lt;/code&gt; group&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="4"&gt;&lt;/i&gt;&lt;b&gt;4&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Check for the last version of the .AppImage here : &lt;a href="https://devices.ubuntu-touch.io/installer/" class="bare"&gt;https://devices.ubuntu-touch.io/installer/&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="5"&gt;&lt;/i&gt;&lt;b&gt;5&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;You&amp;#8217;ll have to reboot the phone in &lt;code&gt;fastboot&lt;/code&gt; mode (holding &lt;code&gt;volume-down&lt;/code&gt; button while booting, and then in &lt;code&gt;bootloader&lt;/code&gt; mode (holding &lt;code&gt;volume-up&lt;/code&gt; button while booting) don&amp;#8217;t mix up !&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;As of 2020-06-28 :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;WiFi and web navigation is working&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Wikipedia offline is proposed via Kiwix, from stock OpenStore&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Offline GPS navigation is proposed (using 3 apps, from stock OpenStore : UT Tweak, OSM Scout, Pure Maps)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;APN is working with stock Camera app, but the flash light is not operated&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;No radio app found&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The stock OpenStore counts 899 apps, in 22 categories (maybe overlapping)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Found : Weather ; Stellarium ; ePub, PDF and ODF readers ; stock terminal with SSH&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Regular desktop application are installable, like &lt;code&gt;deltachat-desktop&lt;/code&gt; (via Libertine Container)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Android apps should run via &lt;code&gt;Anbox&lt;/code&gt; emulation.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_flash_fairphone_open_os"&gt;2. Flash Fairphone Open OS&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Official documentation : &lt;a href="https://code.fairphone.com" class="bare"&gt;https://code.fairphone.com&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;$&lt;/span&gt; wget https://dl.google.com/android/repository/platform-tools-latest-linux.zip &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
&lt;span class="tok-gp"&gt;$&lt;/span&gt; unzip platform-tools-latest-linux.zip
&lt;span class="tok-gp"&gt;$&lt;/span&gt; &lt;span class="tok-nb"&gt;export&lt;/span&gt; &lt;span class="tok-nv"&gt;PATH&lt;/span&gt;&lt;span class="tok-o"&gt;=&lt;/span&gt;&lt;span class="tok-s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="tok-nv"&gt;$PATH&lt;/span&gt;&lt;span class="tok-s2"&gt;:/path/to/unzipped/folder/platform-tools:&amp;quot;&lt;/span&gt; &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;
&lt;span class="tok-gp"&gt;$&lt;/span&gt; wget https://storage.googleapis.com/fairphone-updates/29504e26-999e-48af-8f68-12d1f4b50ae0/fp2-sibon-19.11.2-manual.zip &lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;(3)&lt;/b&gt;
&lt;span class="tok-gp"&gt;$&lt;/span&gt; unzip fp2-sibon-19.11.2-manual.zip
&lt;span class="tok-gp"&gt;$&lt;/span&gt; sh flash-for-unix.sh &lt;i class="conum" data-value="4"&gt;&lt;/i&gt;&lt;b&gt;(4)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;You may have to accept terms and conditions here before : &lt;a href="https://developer.android.com/studio/releases/platform-tools" class="bare"&gt;https://developer.android.com/studio/releases/platform-tools&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Add your newly downloaded &lt;code&gt;fastboot&lt;/code&gt; binary to your &lt;code&gt;$PATH&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Check for the last version here : &lt;a href="https://code.fairphone.com/projects/fp-osos/user/fairphone-open-source-os-downloads.html" class="bare"&gt;https://code.fairphone.com/projects/fp-osos/user/fairphone-open-source-os-downloads.html&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="4"&gt;&lt;/i&gt;&lt;b&gt;4&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;If stuck for more than a minute with no output, something is not going as expected, check &lt;code&gt;/var/log/syslog&lt;/code&gt;, &lt;code&gt;udev&lt;/code&gt; permissions…&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</content><category term="Commandes"/><category term="android"/><category term="Fairphone"/><category term="install"/></entry><entry><title>Directly use a command, even if aliased</title><link href="https://grimoire.d12s.fr/2020/unalias_temporarily.html" rel="alternate"/><published>2020-06-23T00:00:00+02:00</published><updated>2020-06-23T00:00:00+02:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2020-06-23:/2020/unalias_temporarily.html</id><content type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Utiliser directement une commande, même si un alias a été défini pour elle.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;$&lt;/span&gt; &lt;span class="tok-nb"&gt;alias&lt;/span&gt; &lt;span class="tok-nv"&gt;cp&lt;/span&gt;&lt;span class="tok-o"&gt;=&lt;/span&gt;&lt;span class="tok-s1"&gt;&amp;#39;cp -i&amp;#39;&lt;/span&gt;
&lt;span class="tok-gp"&gt;$&lt;/span&gt; &lt;span class="tok-se"&gt;\c&lt;/span&gt;p &lt;span class="tok-nv"&gt;$src&lt;/span&gt; &lt;span class="tok-nv"&gt;$dest&lt;/span&gt;
&lt;span class="tok-gp"&gt;$&lt;/span&gt;  &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt; &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;No confirmation prompt, because the alias is not used if the command is prefixed by an anti-slash &lt;code&gt;\&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Works at least for &lt;code&gt;bash&lt;/code&gt; and &lt;code&gt;zsh&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;</content><category term="Commandes"/><category term="shell"/><category term="adminsys"/></entry><entry><title>rsync to upload a static site</title><link href="https://grimoire.d12s.fr/2020/rsync_lftp_pelican.html" rel="alternate"/><published>2020-06-16T00:00:00+02:00</published><updated>2020-06-16T00:00:00+02:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2020-06-16:/2020/rsync_lftp_pelican.html</id><summary type="html">&lt;div id="toc" class="toc"&gt;
&lt;div id="toctitle"&gt;Index&lt;/div&gt;
&lt;ul class="sectlevel1"&gt;
&lt;li&gt;&lt;a href="#_version_en"&gt;1. version : en&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_version_fr"&gt;2. version : fr&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id="preamble"&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Téléverser son site web statique via &lt;code&gt;rsync&lt;/code&gt; au lieu de &lt;code&gt;lftp&lt;/code&gt; pour passer de 3min à 3s.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_version_en"&gt;1. version : en&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Pelican static websites are fitted with a &lt;code&gt;Makefile&lt;/code&gt; that allows several methods
to upload your web site its hosting.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I tested &lt;code&gt;lftp&lt;/code&gt; which …&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</summary><content type="html">&lt;div id="toc" class="toc"&gt;
&lt;div id="toctitle"&gt;Index&lt;/div&gt;
&lt;ul class="sectlevel1"&gt;
&lt;li&gt;&lt;a href="#_version_en"&gt;1. version : en&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_version_fr"&gt;2. version : fr&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id="preamble"&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Téléverser son site web statique via &lt;code&gt;rsync&lt;/code&gt; au lieu de &lt;code&gt;lftp&lt;/code&gt; pour passer de 3min à 3s.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_version_en"&gt;1. version : en&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Pelican static websites are fitted with a &lt;code&gt;Makefile&lt;/code&gt; that allows several methods
to upload your web site its hosting.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I tested &lt;code&gt;lftp&lt;/code&gt; which is a full-featured FTP client capable of uploading only the locally changed files, to save some time and bandwidth. Unfortunately, to do so &lt;code&gt;lftp&lt;/code&gt; compares local and distant files one by one, accumulating the network latency overheads at each file.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;code&gt;rsync&lt;/code&gt; (which is another file-transfer tool) can also avoid to transfer unmodified files, but it locally compiles the required informations to check that (date of modification, size of file, even checksums if there is still an ambiguity), and then sends this bundle all at once to the hosting machine (via an &lt;code&gt;ssh&lt;/code&gt; ciphered channel). This other machine needs to have also &lt;code&gt;rsync&lt;/code&gt; on its side to handle the bundle, and will answer which files are to be uploaded. At its turn, the 1st machine will send all the needed files in one transfer.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;If the static website counts 180 files of a few kilo-bytes each, the difference in total processing time, when using a 4G internet access (best ping of 50ms), is quite outstanding :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;lftp&lt;/code&gt; : 180s (no encryption)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;rysnc&lt;/code&gt; : 3s (secure transfer)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Each times, the static website compilation is included, for 2s.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Alas, I took many years to actually do the comparison (and to setup the hosting to support &lt;code&gt;rsync&lt;/code&gt;).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;PS: When using a "tag cloud" included in the pages of the web site, each new content is susceptible to modify the "tag cloud" in all the existing pages. Using a regular FTP client to upload the on-growing 8.6MB of the website each time entirely would not have been a bad idea and it would have use only 25s on the same connection (350 kilo-bytes by seconds upload rate).&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_version_fr"&gt;2. version : fr&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Le générateur de sites statiques Pelican est fourni avec un &lt;code&gt;Makefile&lt;/code&gt; qui propose plusieurs méthodes de téléversement du site vers son hébergement.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;J&amp;#8217;ai testé la méthode basée sur &lt;code&gt;lftp&lt;/code&gt;, un client FTP très complet, notamment capable de n&amp;#8217;uploader que les fichiers qui ont été changés localement pour d&amp;#8217;économiser du temps et de la bande passante. Malheureusement, pour en arriver là, &lt;code&gt;lftp&lt;/code&gt; compare les fichiers locaux et distants un par un, accumulant ainsi les délais de latence du réseau, pour chaque fichier.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;code&gt;rsync&lt;/code&gt; (qui est un autre outil de transfert de fichier) permet également de s&amp;#8217;éviter l&amp;#8217;envoi des fichiers non modifiés, mais il fait ça en compilant localement les informations nécessaires à la comparaison (date de modification, taille du fichier voire somme de contrôle s&amp;#8217;il persiste une ambiguité) et les envoi toutes d&amp;#8217;un coup sur la machine de destination (par un canal chiffré &lt;code&gt;ssh&lt;/code&gt;). Cette deuxième machine doit elle aussi avoir &lt;code&gt;rsync&lt;/code&gt; de son côté pour analyser (automatiquement) les informations transmises et répondre par la liste des fichiers qu&amp;#8217;il faut mettre à jour. La première machine enverra alors tous ces fichiers d&amp;#8217;un coup.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;S&amp;#8217;il s&amp;#8217;agit d&amp;#8217;un site statique comptant 180 fichiers de quelques kilo-octets chacun, la différence de temps de traitement pour la mise à jour du site, sur une connexion internet 4G (avec 50ms de ping au mieux), est assez remarquable :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;lftp&lt;/code&gt; : 180s (sans chiffrement)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;rsync&lt;/code&gt; : 3s (avec chiffrement)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Et chaque fois, le temps de compilation du site lui-même est compris, pour environ 2s.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Malheureusement, il m&amp;#8217;a fallu plusieurs années pour comparer les deux méthodes (et donc configurer l&amp;#8217;hébergement pour pouvoir faire le transfert via &lt;code&gt;rsync&lt;/code&gt;).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;PS: Lorsqu&amp;#8217;on utilise un "nuage d&amp;#8217;étiquettes" sur les pages du site, chaque nouveau contenu est susceptible de modifier cette partie des pages existantes. On peut donc noter que transférer les 8,6 Mo du site à chaque fois n&amp;#8217;aurait pas été une mauvaise idée et n&amp;#8217;aurait d&amp;#8217;ailleurs pris que 25s sur la même connexion (350ko/s d&amp;#8217;upload).&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</content><category term="Articles"/><category term="adminsys"/><category term="benchmark"/><category term="network"/></entry><entry><title>inxi to check battery lifetime and much more</title><link href="https://grimoire.d12s.fr/2020/inxi_to_check_battery_lifetime_and_much_more.html" rel="alternate"/><published>2020-06-08T00:00:00+02:00</published><updated>2020-06-08T00:00:00+02:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2020-06-08:/2020/inxi_to_check_battery_lifetime_and_much_more.html</id><summary type="html">&lt;div id="preamble"&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Condensé d&amp;#8217;information sur le system, y compris l&amp;#8217;usure de la batterie d&amp;#8217;un ordinateur portable.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_inxi_commands"&gt;1. inxi commands&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;$&lt;/span&gt; inxi &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
&lt;span class="tok-gp"&gt;$&lt;/span&gt; inxi --basic &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;
&lt;span class="tok-gp"&gt;$&lt;/span&gt; inxi --battery &lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;(3)&lt;/b&gt;
&lt;span class="tok-gp"&gt;#&lt;/span&gt; inxi -xxAv6 &lt;i class="conum" data-value="4"&gt;&lt;/i&gt;&lt;b&gt;(4)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Concise 2 lines default&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Basic set of information&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Only the battery line&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="4"&gt;&lt;/i&gt;&lt;b&gt;4&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;As root, all …&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</summary><content type="html">&lt;div id="preamble"&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Condensé d&amp;#8217;information sur le system, y compris l&amp;#8217;usure de la batterie d&amp;#8217;un ordinateur portable.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_inxi_commands"&gt;1. inxi commands&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;$&lt;/span&gt; inxi &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
&lt;span class="tok-gp"&gt;$&lt;/span&gt; inxi --basic &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;
&lt;span class="tok-gp"&gt;$&lt;/span&gt; inxi --battery &lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;(3)&lt;/b&gt;
&lt;span class="tok-gp"&gt;#&lt;/span&gt; inxi -xxAv6 &lt;i class="conum" data-value="4"&gt;&lt;/i&gt;&lt;b&gt;(4)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Concise 2 lines default&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Basic set of information&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Only the battery line&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="4"&gt;&lt;/i&gt;&lt;b&gt;4&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;As root, all known info&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;code&gt;inxi&lt;/code&gt; can generally be installed from the eponymous package.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_outstanding_results"&gt;2. Outstanding results&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_battery_condition"&gt;2.1. Battery condition&lt;/h3&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="text"&gt;&lt;span&gt;&lt;/span&gt;&lt;strong&gt;Battery:&lt;/strong&gt;   &lt;strong&gt;ID-1:&lt;/strong&gt; BAT0 &lt;strong&gt;charge:&lt;/strong&gt; 30.1 Wh &lt;strong&gt;condition:&lt;/strong&gt; 30.8/45.0 Wh (68%)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Here the battery reached 68% percents of its nominal capacity the last time it
got fully recharged.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_creation_date_of_the_machine"&gt;2.2. Creation date of the machine&lt;/h3&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="text"&gt;&lt;span&gt;&lt;/span&gt;&lt;strong&gt;Machine:&lt;/strong&gt;
 […]
 […] &lt;strong&gt;date:&lt;/strong&gt; 09/11/2015&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</content><category term="Commandes"/><category term="hardware"/><category term="adminsys"/></entry><entry><title>smartctl to check SSD lifetime and much more</title><link href="https://grimoire.d12s.fr/2020/smartctl_to_check_ssd_lifetime_and_much_more.html" rel="alternate"/><published>2020-06-02T00:00:00+02:00</published><updated>2020-06-02T00:00:00+02:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2020-06-02:/2020/smartctl_to_check_ssd_lifetime_and_much_more.html</id><summary type="html">&lt;div id="preamble"&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Contrôle et surveille l&amp;#8217;état d&amp;#8217;un disque SMART (température, heures de fonctionnement, journaux d&amp;#8217;erreurs…)&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_smartctl_commands"&gt;1. smartctl commands&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;The command generaly comes with the &lt;code&gt;smartmontools&lt;/code&gt; package of your GNU+Linux distribution.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;$&lt;/span&gt; sudo smartctl -H /dev/&lt;span class="tok-nv"&gt;$device&lt;/span&gt; &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
&lt;span class="tok-gp"&gt;$&lt;/span&gt; sudo smartctl -l error /dev/&lt;span class="tok-nv"&gt;$device&lt;/span&gt; &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;
&lt;span class="tok-gp"&gt;$&lt;/span&gt; sudo smartctl -a /dev/&lt;span class="tok-nv"&gt;$device …&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</summary><content type="html">&lt;div id="preamble"&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Contrôle et surveille l&amp;#8217;état d&amp;#8217;un disque SMART (température, heures de fonctionnement, journaux d&amp;#8217;erreurs…)&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_smartctl_commands"&gt;1. smartctl commands&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;The command generaly comes with the &lt;code&gt;smartmontools&lt;/code&gt; package of your GNU+Linux distribution.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;$&lt;/span&gt; sudo smartctl -H /dev/&lt;span class="tok-nv"&gt;$device&lt;/span&gt; &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
&lt;span class="tok-gp"&gt;$&lt;/span&gt; sudo smartctl -l error /dev/&lt;span class="tok-nv"&gt;$device&lt;/span&gt; &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;
&lt;span class="tok-gp"&gt;$&lt;/span&gt; sudo smartctl -a /dev/&lt;span class="tok-nv"&gt;$device&lt;/span&gt; &lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;(3)&lt;/b&gt;
&lt;span class="tok-gp"&gt;$&lt;/span&gt; sudo smartctl -t short /dev/&lt;span class="tok-nv"&gt;$device&lt;/span&gt; &lt;i class="conum" data-value="4"&gt;&lt;/i&gt;&lt;b&gt;(4)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Display health status ; you may have to add &lt;code&gt;-d 'scsi'&lt;/code&gt; for such drives, or some USB ones…&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Recent errors&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;All info&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="4"&gt;&lt;/i&gt;&lt;b&gt;4&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Start short SMART tests (hint: a long one exists also)&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_outstanding_smartctl_a_devdevice_results"&gt;2. Outstanding &lt;code&gt;smartctl -a /dev/$device&lt;/code&gt; results&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;The number of hours the device was "on" :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;[…]
 9 Power_On_Hours 0x0032  100  100  000 Old_age Always - 8612
[…]&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;The number of working hours (for disks) :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;[…]
 3 Spin_Up_Time 0x0007 222 222 033 Pre-fail Always - 2246
[…]&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;The remaining lifetime of SSD in term of rewriting capacities :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;[…]
 202 Percent_Lifetime_Remain 0x0031 096 096 000 Pre-fail Offline - 4
[…]&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Here the SSD consumed 4% of its manufacturer guaranteed lifetime (during 3
years and 9 000 power-on hours).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;An SSD can survive 3x (to 10x) its official TBW (TeraByte Written) value, but
its warranty wont…&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</content><category term="Commandes"/><category term="hardware"/><category term="storage"/><category term="adminsys"/></entry><entry><title>vim : airline</title><link href="https://grimoire.d12s.fr/2020/vim_airline.html" rel="alternate"/><published>2020-05-26T00:00:00+02:00</published><updated>2020-05-26T00:00:00+02:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2020-05-26:/2020/vim_airline.html</id><summary type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;airline &lt;em&gt;est un module de vim qui ajoute une, voire deux, barre(s) à l&amp;#8217;interface de l&amp;#8217;éditeur. La barre principale (en bas) détaille l&amp;#8217;état du fichier courant et la 2e liste les&lt;/em&gt; buffers &lt;em&gt;ouverts.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;#&lt;/span&gt; apt install vim vim-airline fonts-powerline &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
&lt;span class="tok-gp"&gt;$&lt;/span&gt; vi ~/.vimrc&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Or install from the …&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;</summary><content type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;airline &lt;em&gt;est un module de vim qui ajoute une, voire deux, barre(s) à l&amp;#8217;interface de l&amp;#8217;éditeur. La barre principale (en bas) détaille l&amp;#8217;état du fichier courant et la 2e liste les&lt;/em&gt; buffers &lt;em&gt;ouverts.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;#&lt;/span&gt; apt install vim vim-airline fonts-powerline &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
&lt;span class="tok-gp"&gt;$&lt;/span&gt; vi ~/.vimrc&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Or install from the &lt;a href="https://github.com/vim-airline/vim-airline"&gt;sources&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="vim"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-k"&gt;set&lt;/span&gt; &lt;span class="tok-nb"&gt;laststatus&lt;/span&gt;&lt;span class="tok-p"&gt;=&lt;/span&gt;&lt;span class="tok-m"&gt;2&lt;/span&gt;  &lt;span class="tok-c"&gt;&amp;quot; always display statusline&lt;/span&gt;
&lt;span class="tok-k"&gt;let&lt;/span&gt; &lt;span class="tok-k"&gt;g&lt;/span&gt;:airline_powerline_fonts &lt;span class="tok-p"&gt;=&lt;/span&gt; &lt;span class="tok-m"&gt;1&lt;/span&gt;  &lt;span class="tok-c"&gt;&amp;quot; use dedicated fonts for symbols&lt;/span&gt;
&lt;span class="tok-k"&gt;let&lt;/span&gt; &lt;span class="tok-k"&gt;g&lt;/span&gt;:airline#extensions#&lt;span class="tok-nb"&gt;tabline&lt;/span&gt;#enabled &lt;span class="tok-p"&gt;=&lt;/span&gt; &lt;span class="tok-m"&gt;1&lt;/span&gt;  &lt;span class="tok-c"&gt;&amp;quot; display the buffer list at the top&lt;/span&gt;
map &lt;span class="tok-p"&gt;&amp;lt;&lt;/span&gt;A&lt;span class="tok-p"&gt;-&lt;/span&gt;Left&lt;span class="tok-p"&gt;&amp;gt;&lt;/span&gt; :&lt;span class="tok-k"&gt;bp&lt;/span&gt;&lt;span class="tok-p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tok-k"&gt;cr&lt;/span&gt;&lt;span class="tok-p"&gt;&amp;gt;&lt;/span&gt;  &lt;span class="tok-c"&gt;&amp;quot; Alt + Left arrow goes to the previous buffer&lt;/span&gt;
map &lt;span class="tok-p"&gt;&amp;lt;&lt;/span&gt;A&lt;span class="tok-p"&gt;-&lt;/span&gt;Right&lt;span class="tok-p"&gt;&amp;gt;&lt;/span&gt; :&lt;span class="tok-k"&gt;bn&lt;/span&gt;&lt;span class="tok-p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tok-k"&gt;cr&lt;/span&gt;&lt;span class="tok-p"&gt;&amp;gt;&lt;/span&gt;  &lt;span class="tok-c"&gt;&amp;quot; Alt + Right arrow goes to the next buffer&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;$&lt;/span&gt; vi *.py&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="vim"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-p"&gt;:&lt;/span&gt;&lt;span class="tok-k"&gt;b&lt;/span&gt; &lt;span class="tok-k"&gt;vie&lt;/span&gt;  &lt;span class="tok-c"&gt;&amp;quot; show buffer `view.py` if opened and not conflicting with other file name&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;</content><category term="Commandes"/><category term="Vim"/><category term="comfort"/></entry><entry><title>checkinstall, installation tracker</title><link href="https://grimoire.d12s.fr/2020/checkinstall.html" rel="alternate"/><published>2020-05-19T00:00:00+02:00</published><updated>2020-05-19T00:00:00+02:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2020-05-19:/2020/checkinstall.html</id><summary type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Installer un programme à partir de ses sources, compilées localement, en étant sûr de pouvoir le désinstaller proprement ensuite.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;$&lt;/span&gt; &lt;span class="tok-nb"&gt;cd&lt;/span&gt; &lt;span class="tok-nv"&gt;$project_to_compile&lt;/span&gt;
&lt;span class="tok-gp"&gt;$&lt;/span&gt; ./configure
&lt;span class="tok-gp"&gt;$&lt;/span&gt; make
&lt;span class="tok-gp"&gt;$&lt;/span&gt; sudo checkinstall &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
&lt;span class="tok-gp"&gt;$&lt;/span&gt; sudo dpkg -r &lt;span class="tok-nv"&gt;$compiled_project_package_name&lt;/span&gt; &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Type &lt;code&gt;checkinstall&lt;/code&gt; instead of &lt;code&gt;make install&lt;/code&gt; to install your locally compiled program. It will create a &lt;code&gt;.deb&lt;/code&gt; file …&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;</summary><content type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Installer un programme à partir de ses sources, compilées localement, en étant sûr de pouvoir le désinstaller proprement ensuite.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;$&lt;/span&gt; &lt;span class="tok-nb"&gt;cd&lt;/span&gt; &lt;span class="tok-nv"&gt;$project_to_compile&lt;/span&gt;
&lt;span class="tok-gp"&gt;$&lt;/span&gt; ./configure
&lt;span class="tok-gp"&gt;$&lt;/span&gt; make
&lt;span class="tok-gp"&gt;$&lt;/span&gt; sudo checkinstall &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
&lt;span class="tok-gp"&gt;$&lt;/span&gt; sudo dpkg -r &lt;span class="tok-nv"&gt;$compiled_project_package_name&lt;/span&gt; &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Type &lt;code&gt;checkinstall&lt;/code&gt; instead of &lt;code&gt;make install&lt;/code&gt; to install your locally compiled program. It will create a &lt;code&gt;.deb&lt;/code&gt; file and install it. The &lt;code&gt;checkinstall&lt;/code&gt; command comes from its eponymous package.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Remove the installed program as usual under Debian based GNU+Linux distributions.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;</content><category term="Commandes"/><category term="Debian"/><category term="shell"/><category term="adminsys"/></entry><entry><title>Normal Firefox console clipboard with other applications</title><link href="https://grimoire.d12s.fr/2020/firefox_clipboard.html" rel="alternate"/><published>2020-05-11T00:00:00+02:00</published><updated>2020-05-11T00:00:00+02:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2020-05-11:/2020/firefox_clipboard.html</id><summary type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Configurer Firefox pour pouvoir faire des copier / coller normaux entre Firefox et le JavaScript du navigateur, y compris la console développeur.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;In Firefox :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code&gt;&lt;span&gt;&lt;/span&gt;CTRL+T
about:config
dom.event.clipboardevents.enable &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Search for this key in the &lt;code&gt;about:config&lt;/code&gt; panel, and set it to &lt;strong&gt;true&lt;/strong&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Documentation : &lt;a href="https://developer.mozilla.org/en-US/docs/Mozilla/Preferences/Preference_reference/dom.event.clipboardevents.enabled" class="bare"&gt;https://developer …&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;</summary><content type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Configurer Firefox pour pouvoir faire des copier / coller normaux entre Firefox et le JavaScript du navigateur, y compris la console développeur.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;In Firefox :&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code&gt;&lt;span&gt;&lt;/span&gt;CTRL+T
about:config
dom.event.clipboardevents.enable &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Search for this key in the &lt;code&gt;about:config&lt;/code&gt; panel, and set it to &lt;strong&gt;true&lt;/strong&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Documentation : &lt;a href="https://developer.mozilla.org/en-US/docs/Mozilla/Preferences/Preference_reference/dom.event.clipboardevents.enabled" class="bare"&gt;https://developer.mozilla.org/en-US/docs/Mozilla/Preferences/Preference_reference/dom.event.clipboardevents.enabled&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Quand je pense que j&amp;#8217;ai créé 150 sources pour &lt;a href="https://www.meta-press.es"&gt;Meta-Press.es&lt;/a&gt; avant de prendre le temps de trouver ce paramètre de configuration…&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;</content><category term="Commandes"/><category term="Firefox"/></entry><entry><title>Find duplicate files (to remove them and save space)</title><link href="https://grimoire.d12s.fr/2020/find_duplicate_files.html" rel="alternate"/><published>2020-05-06T00:00:00+02:00</published><updated>2020-05-06T00:00:00+02:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2020-05-06:/2020/find_duplicate_files.html</id><summary type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Trouver des fichiers dupliqués pour les supprimer et libérer du stockage.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Modern Rust solution : &lt;a href="https://github.com/pkolaczk/fclones"&gt;fclones&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;$ fclones group --cache /tmp &amp;gt; /tmp/dupes.txt &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
$ fclones link &amp;lt; /tmp/dupes.txt &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Creates the list of duplicated files&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Replaces clones by links, other operations are : move, remove, dedupe (via native filesystem …&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;</summary><content type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Trouver des fichiers dupliqués pour les supprimer et libérer du stockage.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Modern Rust solution : &lt;a href="https://github.com/pkolaczk/fclones"&gt;fclones&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;$ fclones group --cache /tmp &amp;gt; /tmp/dupes.txt &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
$ fclones link &amp;lt; /tmp/dupes.txt &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Creates the list of duplicated files&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Replaces clones by links, other operations are : move, remove, dedupe (via native filesystem deduplication capabilities)&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;A lot of include, exclude and filtering options exists to focus only on some files.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Traditional C solution : &lt;a href="https://github.com/jbruchon/jdupesjdupes"&gt;jdupes&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;$ jdupes --delete --immediate --recurse /mnt/backup &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
$ jdupes /srv/content --recurse: /mnt/backup &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;jdupes can show a lost-space summary or automatically delete dup files. Files are found by sizes, then MD5 signatures (of a heading file portion, or full file), followed by a byte-by-byte comparison (which is very slow but gives exact results)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;will follow subdirectories under &lt;code&gt;/mnt/backup&lt;/code&gt;, but not those under &lt;code&gt;/srv/content&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;</content><category term="Commandes"/><category term="storage"/><category term="metadata"/><category term="optimization"/><category term="adminsys"/></entry><entry><title>Copy files, creating destination directories</title><link href="https://grimoire.d12s.fr/2020/copy_file_creating_destination_directory.html" rel="alternate"/><published>2020-04-29T00:00:00+02:00</published><updated>2020-04-29T00:00:00+02:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2020-04-29:/2020/copy_file_creating_destination_directory.html</id><content type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Copier des fichiers en créant les dossiers de destination.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;$&lt;/span&gt; install -D /path/to/source-file /path/with/&amp;lt;unexistant-elements&amp;gt; &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Will copy the &lt;code&gt;source-file&lt;/code&gt; creating the unexistant directories of the destination&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;code&gt;install&lt;/code&gt; is part of the GNU coreutils.&lt;/p&gt;
&lt;/div&gt;</content><category term="Commandes"/><category term="shell"/><category term="adminsys"/></entry><entry><title>Check DNS via host or dig</title><link href="https://grimoire.d12s.fr/2020/check_dns_via_host_or_dig.html" rel="alternate"/><published>2020-04-22T00:00:00+02:00</published><updated>2020-04-22T00:00:00+02:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2020-04-22:/2020/check_dns_via_host_or_dig.html</id><summary type="html">&lt;div id="preamble"&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Vérfier la configuration DNS d&amp;#8217;un domaine à l&amp;#8217;aide des commandes &lt;code&gt;host&lt;/code&gt; ou &lt;code&gt;dig&lt;/code&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_host"&gt;1. &lt;code&gt;host&lt;/code&gt;&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code&gt;&lt;span&gt;&lt;/span&gt;$ host domain.tld &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
$ host domain.tld resolver.tld &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;
$ host -a domain.tld resolver.tld &lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;(3)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Basic info&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Force querying a specific resolver&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Show all information available&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_dig"&gt;2. &lt;code&gt;dig …&lt;/code&gt;&lt;/h2&gt;&lt;/div&gt;</summary><content type="html">&lt;div id="preamble"&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Vérfier la configuration DNS d&amp;#8217;un domaine à l&amp;#8217;aide des commandes &lt;code&gt;host&lt;/code&gt; ou &lt;code&gt;dig&lt;/code&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_host"&gt;1. &lt;code&gt;host&lt;/code&gt;&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code&gt;&lt;span&gt;&lt;/span&gt;$ host domain.tld &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
$ host domain.tld resolver.tld &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;
$ host -a domain.tld resolver.tld &lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;(3)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Basic info&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Force querying a specific resolver&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Show all information available&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_dig"&gt;2. &lt;code&gt;dig&lt;/code&gt;&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code&gt;&lt;span&gt;&lt;/span&gt;$ dig domain.tld &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
$ dig @resolver.tld domain.tld &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;
$ dig @resolver.tld domain.tld any &lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;(3)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Basic info&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Force querying a specific resolver&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Show all information available&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</content><category term="Commandes"/><category term="network"/><category term="adminsys"/></entry><entry><title>irssi : redirect joins quits parts to a dedicated window</title><link href="https://grimoire.d12s.fr/2020/irssi_redirect_joins-quits-parts.html" rel="alternate"/><published>2020-04-13T00:00:00+02:00</published><updated>2020-04-13T00:00:00+02:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2020-04-13:/2020/irssi_redirect_joins-quits-parts.html</id><summary type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Rediriger les annonces d&amp;#8217;arrivées et de départs des salons IRC dans irssi.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="admonitionblock warning"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class="icon"&gt;
&lt;i class="fa icon-warning" title="Warning"&gt;&lt;/i&gt;
&lt;/td&gt;
&lt;td class="content"&gt;
Not compatible with &lt;code&gt;irssi-xmpp&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="admonitionblock warning"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class="icon"&gt;
&lt;i class="fa icon-warning" title="Warning"&gt;&lt;/i&gt;
&lt;/td&gt;
&lt;td class="content"&gt;
Not compatible with private queries… :-/
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code&gt;&lt;span&gt;&lt;/span&gt;/foreach window /window level ALL -JOINS -PARTS -QUITS &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
/set window_default_hidelevel ALL -JOINS -PARTS -QUITS &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;
/window new HIDDEN &lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;(3)&lt;/b&gt;
/window name groom &lt;i class="conum" data-value="4"&gt;&lt;/i&gt;&lt;b&gt;(4)&lt;/b&gt;
/window level -ALL JOINS …&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;</summary><content type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Rediriger les annonces d&amp;#8217;arrivées et de départs des salons IRC dans irssi.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="admonitionblock warning"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class="icon"&gt;
&lt;i class="fa icon-warning" title="Warning"&gt;&lt;/i&gt;
&lt;/td&gt;
&lt;td class="content"&gt;
Not compatible with &lt;code&gt;irssi-xmpp&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="admonitionblock warning"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class="icon"&gt;
&lt;i class="fa icon-warning" title="Warning"&gt;&lt;/i&gt;
&lt;/td&gt;
&lt;td class="content"&gt;
Not compatible with private queries… :-/
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code&gt;&lt;span&gt;&lt;/span&gt;/foreach window /window level ALL -JOINS -PARTS -QUITS &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
/set window_default_hidelevel ALL -JOINS -PARTS -QUITS &lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;
/window new HIDDEN &lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;(3)&lt;/b&gt;
/window name groom &lt;i class="conum" data-value="4"&gt;&lt;/i&gt;&lt;b&gt;(4)&lt;/b&gt;
/window level -ALL JOINS PARTS QUITS &lt;i class="conum" data-value="5"&gt;&lt;/i&gt;&lt;b&gt;(5)&lt;/b&gt;
/set window_check_level_first ON &lt;i class="conum" data-value="6"&gt;&lt;/i&gt;&lt;b&gt;(6)&lt;/b&gt;
/save &lt;i class="conum" data-value="7"&gt;&lt;/i&gt;&lt;b&gt;(7)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Hide those messages in all current windows&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="2"&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Hide those messages for future windows&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="3"&gt;&lt;/i&gt;&lt;b&gt;3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Create a new HIDDEN window&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="4"&gt;&lt;/i&gt;&lt;b&gt;4&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Name it "groom"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="5"&gt;&lt;/i&gt;&lt;b&gt;5&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Accept joins, parts and quits in this groom window&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="6"&gt;&lt;/i&gt;&lt;b&gt;6&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Tell &lt;code&gt;irssi&lt;/code&gt; to look for each individual window level setting&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="7"&gt;&lt;/i&gt;&lt;b&gt;7&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Save your changes, overwriting your current config file&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Tested from : &lt;a href="https://pthree.org/2010/03/12/irssi-handling-joinspartsquits/" class="bare"&gt;https://pthree.org/2010/03/12/irssi-handling-joinspartsquits/&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;</content><category term="Commandes"/><category term="metadata"/></entry><entry><title>reptyr : attach a program to a new terminal</title><link href="https://grimoire.d12s.fr/2020/reptyr_attach_program_to_new_terminal.html" rel="alternate"/><published>2020-04-06T00:00:00+02:00</published><updated>2020-04-06T00:00:00+02:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2020-04-06:/2020/reptyr_attach_program_to_new_terminal.html</id><summary type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Attacher un programme à un nouveau terminal. Pratique pour garder un processus vivant, lancé hors d&amp;#8217;un &lt;code&gt;screen&lt;/code&gt;, au moment de se déconnecter du serveur distant.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;$&lt;/span&gt; yes &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
&lt;span class="tok-go"&gt;y&lt;/span&gt;
&lt;span class="tok-go"&gt;y&lt;/span&gt;
&lt;span class="tok-go"&gt;y&lt;/span&gt;
&lt;span class="tok-go"&gt;[…]&lt;/span&gt;
&lt;span class="tok-go"&gt;CTRL+Z&lt;/span&gt;
&lt;span class="tok-gp"&gt;$&lt;/span&gt; screen
&lt;span class="tok-gp"&gt;$&lt;/span&gt; &lt;span class="tok-nb"&gt;fg&lt;/span&gt;
&lt;span class="tok-go"&gt;fg: no current job&lt;/span&gt;
&lt;span class="tok-gp"&gt;$&lt;/span&gt; ps ax &lt;span class="tok-p"&gt;|&lt;/span&gt; rg yes
&lt;span class="tok-go"&gt;[…]&lt;/span&gt;
&lt;span class="tok-go"&gt; 238449 pts/18   R+     0:01 yes …&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;</summary><content type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Attacher un programme à un nouveau terminal. Pratique pour garder un processus vivant, lancé hors d&amp;#8217;un &lt;code&gt;screen&lt;/code&gt;, au moment de se déconnecter du serveur distant.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;$&lt;/span&gt; yes &lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
&lt;span class="tok-go"&gt;y&lt;/span&gt;
&lt;span class="tok-go"&gt;y&lt;/span&gt;
&lt;span class="tok-go"&gt;y&lt;/span&gt;
&lt;span class="tok-go"&gt;[…]&lt;/span&gt;
&lt;span class="tok-go"&gt;CTRL+Z&lt;/span&gt;
&lt;span class="tok-gp"&gt;$&lt;/span&gt; screen
&lt;span class="tok-gp"&gt;$&lt;/span&gt; &lt;span class="tok-nb"&gt;fg&lt;/span&gt;
&lt;span class="tok-go"&gt;fg: no current job&lt;/span&gt;
&lt;span class="tok-gp"&gt;$&lt;/span&gt; ps ax &lt;span class="tok-p"&gt;|&lt;/span&gt; rg yes
&lt;span class="tok-go"&gt;[…]&lt;/span&gt;
&lt;span class="tok-go"&gt; 238449 pts/18   R+     0:01 yes&lt;/span&gt;
&lt;span class="tok-go"&gt;[…]&lt;/span&gt;
&lt;span class="tok-gp"&gt;$&lt;/span&gt; reptyr &lt;span class="tok-m"&gt;238449&lt;/span&gt;
&lt;span class="tok-go"&gt;y&lt;/span&gt;
&lt;span class="tok-go"&gt;y&lt;/span&gt;
&lt;span class="tok-go"&gt;y&lt;/span&gt;
&lt;span class="tok-go"&gt;[…]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="colist arabic"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class="conum" data-value="1"&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;For the demonstration, I use &lt;code&gt;yes&lt;/code&gt; just because it lasts until killed&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;</content><category term="Commandes"/><category term="shell"/></entry><entry><title>Scan open ports 22 (SSH) in local network</title><link href="https://grimoire.d12s.fr/2020/ssh_scan_port_22_in_local_network.html" rel="alternate"/><published>2020-03-30T00:00:00+02:00</published><updated>2020-03-30T00:00:00+02:00</updated><author><name>Simon Descarpentries</name></author><id>tag:grimoire.d12s.fr,2020-03-30:/2020/ssh_scan_port_22_in_local_network.html</id><content type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;em&gt;Scanner / lister les ports 22 ouverts sur un réseau local.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="pygments highlight"&gt;&lt;code data-lang="console"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="tok-gp"&gt;#&lt;/span&gt; sudo nmap -sS -p &lt;span class="tok-m"&gt;22&lt;/span&gt; &lt;span class="tok-m"&gt;192&lt;/span&gt;.168.1.0/24 -oG - &lt;span class="tok-p"&gt;|&lt;/span&gt; fgrep &lt;span class="tok-m"&gt;22&lt;/span&gt;/open&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;This will list all the IP that present an open port 22 in the given set to
scan.&lt;/p&gt;
&lt;/div&gt;</content><category term="Commandes"/><category term="SSH"/><category term="network"/><category term="security"/></entry></feed>