Catégorie : Geek

  • Un petit programme par l’IA

    J’avance sur mes outils de sauve­garde mais aussi sur mes explo­ra­tions IA.

    J’ai eu besoin d’un second programme qui va lire tous les emails d’une boite au format mail­dir, regar­der l’an­née du mail, et le dépla­cer dans une boite mail­dir spéci­fique à cette année là.

    J’au­rais pu le faire en Javas­cript ou en Ruby mais vu ce que m’a fait l’IA en quelques minutes précé­dem­ment, je me suis dit que j’al­lais conti­nuer et refaire un script Go (je n’ai jamais codé une seule ligne de Go).

    Voici le résul­tat : github.com/edas/split-mail­dir-by-year.

    Les 300 lignes de Go ont analysé l’in­té­gra­lité de mon archive Gmail (537 000 emails quand même).

    • Je ne crois pas avoir touché le code source à la main
    • Le code a toujours compilé du premier coup
    • Le code a toujours fait ce que je souhai­tais, sans erreur

    Le code est correc­te­ment struc­turé, des fonc­tions ont été créées au fur et à mesure des besoins quand le code a évolué. Quand une fonc­tion est un peu longue, il sépare en blocs et ajoute une ligne de commen­taire pour dire ce que fait le bloc, ce qui me permet de ne pas avoir à déco­der un code dans un langage que je ne connais pas.

    10 demandes courtes pour avoir le programme et le faire évoluer vers mes besoins, ques­tions de relec­ture incluses. 17 ajouts par la suite pour trai­ter des cas spéci­fiques rencon­trés.

    Je n’au­rais pas fait plus vite moi-même, ni en Go ni dans un langage que je connais très bien. Peut-être que ça aurait été un peu plus diffi­cile pour un non-déve­lop­peur, mais je vois mal ce que j’au­rais eu à y gagner à le coder à la main.

    À chaque modi­fi­ca­tion j’ai le diff à vali­der mais aussi une bonne expli­ca­tion de l’IA sur ce qui a été modi­fié, comment et pourquoi. Ma relec­ture s’est souvent faite en diago­nale sur la base des commen­taires de code. L’IA a su répondre à mes ques­tions quand j’ai rencon­tré des éléments moins évide

    Plutôt que lister les étapes, je copie direc­te­ment mes prompts.


    I have hundreds thousands of files in the "maildir/new" directory. Each file contains a raw email with headers.

    I want a program which reads all emails one by one, look for the "Date" header, return an error in the header doesn't exists or is unreadable, and otherwise move the email file in the directory "by-year/{year}/new" where {year} is the year in the Date header.

    Je relis parce que ça va toucher des données réelles et que j’ai la flemme de faire des données de tests.

    Je vois qu’il retourne toujours une date même quand il y a une erreur. Inha­bi­tué de Go, j’ai peur de certaines erreurs de débu­tants en PHP ou en JS, où on utilise une date du jour plutôt que gérer l’er­reur. Je pose ma ques­tion et je suis rassuré par sa réponse (que je trouve logique après coup vu le fonc­tion­ne­ment des erreurs en Go)

    can the parseEmailDate return nil when it doesn't find a Date header ?

    Je vois aussi un mkdir sans test d’exis­tence préa­lable. Dans d’autres langages ça jette une erreur si le réper­toire existe. Je pose la ques­tion et là aussi je suis rassuré par sa réponse.

    what if the directory already exists line 63 ?

    Je demande une adap­ta­tion, non stric­te­ment néces­saire, pour que chaque réper­toire soit bien une boite mail­dir avec les 3 réper­toires obli­ga­toires. Ce n’est pas néces­saire à ma sauve­garde mais je préfère, au cas où ça m’évite des erreurs un jour.

    Oui, j’ai parfois basculé en français. Je ne sais ni pourquoi j’ai du français ici, ni pourquoi j’ai mis de l’an­glais avant. L’IA est confi­gu­rée pour toujours me répondre en français. Le code est toujours commenté en anglais. Je pense que propres entrées dépendent ce sur quoi mon atten­tion était à ce moment là (code, page web, etc.)

    Si le répertoire "by-year/{year}" n'existe pas, il faut aussi créer "by-year/{year}/cur" et "by-year/{year}/tmp", même si nous ne nous en servons pas

    Seconde adap­ta­tion : L’IA m’a dit plus haut qu’elle avait un code de gestion de conflit. Je vois le commen­taire dans le code qui dit qu’en cas de conflit le code ajoute un suffixe avec le times­tamp du moment pour éviter d’écra­ser un fichier exis­tant. Norma­le­ment ça ne devrait jamais arri­ver mais un suffixe risque­rait de casser le format de nommage des fichiers mail­dir donc je préfère qu’on s’ar­rête avec une erreur et que j’avise.

    if there is a conflict, to not append a timestamp to make it unique. Return an error.

    Troi­sième adap­ta­tion. Je traite un demi-million de fichiers. Je préfère que ça traite les fichiers au fil de l’eau plutôt qu’a­voir la liste d’un demi-million de fichiers en mémoire.

    Au départ c’est d’abord une ques­tion. Je ne sais pas si Go retourne un tableau ou un itéra­teur (oui, j’ai été flem­mard jusqu’à ne même pas faire atten­tion au typage). Je m’at­ten­dais à deman­der la correc­tion dans le premier cas. Au final il modi­fie de lui-même le code à partir de la seconde ques­tion pour faire des itéra­tions par lots 100 fichiers, sans que je ne le demande expli­ci­te­ment.

    En réalité c’est du script maison, qui sera lancé juste une poignée de fois. L’op­ti­mi­sa­tion est tota­le­ment inutile mais je n’ai pas encore appris à tota­le­ment lâcher prise vis-a-vis de ce que j’au­rais codé moi-même.

    What does return ReadDir in line 88 ?
    Si le répertoire contient des millions de fichiers, est-ce que la variable files ligne 88 va tout avoir en mémoire ?

    Je vais jouer avec de vraies données. Je veux voir les erreurs et m’ar­rê­ter pour corri­ger, pas que ça conti­nue et que j’ai à remon­ter voir s’il y a eu des erreurs.

    The programm should stop at the first error, not continue with the next file

    Et, parce que je n’y avais pas pensé avant :

    Le programme doit aussi prendre un chemin en argument. C'est là que se trouveront les différents répertoires prévus.

    La première phase est faite. Je passe au test en condi­tions réelles, sur le demi-million d’email de mon archive. Chaque fois que j’ai une erreur, je lui indique et j’avance.

    C’est là que je vois que chaque client email fait bien ce qu’il veut avec les entêtes. J’ai croisé un nombre inat­tendu de formats diffé­rents et d’er­reurs dans les entêtes. Chaque fois le programme m’af­fiche l’er­reur, je copie-colle la date problé­ma­tique, l’IA corrige, et je relance jusqu’à l’er­reur suivante.

    We should also parse the format for "Mon, 21 Aug 2006 16:47:08 +0200 (CEST)"
    We should also parse the date "Mon, 1 Dec 2008 10:57:10 UT"

    Sur une erreur étrange, j’ouvre l’email et je me rends compte qu’il prend en compte la conti­nua­tion d’une entête Recei­ved comme si c’était une date, parce qu’il ne prend pas en compte les espaces avant le mot clé Date.

    TrimSpave at line 30 should only trim right space, not left space

    Parti­cu­la­rité Gmail, quand il récu­père un email d’une boite tierce (via POP3 ou IMAP), il crée des entêtes à lui, saute une ligne et après pose le vrai email. Rétros­pec­ti­ve­ment je pense que j’au­rais dû reti­rer la section ajou­tée par Gmail pour retrou­ver un email normal. Je le ferais peut-être plus tard. Là je me suis contenté de lui faire contour­ner le problème.

    When we find the header "X-Gmail-fetch-Info", we should ignore the blank line following if it exists

    Encore des ques­tions de dates…

    We should be able to parse the Date "Tuesday 29 May 2007, 16:03"
    We should also parse "Wed, 03 Mar 2010 22:36:13 +0100 CET"
    We should also parse "Thu, 22 Jul 2010 23:02:50"
    We should also parse "Mon, 30 Mar 2009 20:11:22 +0100"

    Ce coup-ci ça ne corrige pas mon problème. Rétros­pec­ti­ve­ment j’au­rais pu le comprendre parce que le message d’er­reur n’était pas exac­te­ment le même, mais je le laisse trou­ver seul. Le mot clé DATE était en majus­cules, c’était la première fois.

    pourtant le script fait une erreur sur la ligne "DATE: Mon, 30 Mar 2009 20:11:22 +0100". Pourquoi ?

    Le code qu’il me génère imbrique quatre fonc­tions de mani­pu­la­tion de texte sur une seule ligne. Je ne trouve pas ça lisible. Je pose la ques­tion.

    que fait la ligne 49 ?

    Ça semble redon­dant avec la ligne suivante, pré-exis­tante. Effec­ti­ve­ment, quand je pose la ques­tion il iden­ti­fie le doublon et le supprime.

    Il faut penser à relire (même si l’er­reur aurait juste était du code inutile). Cursor me fait vali­der chaque chan­ge­ment sous forme de diff donc c’est assez rapide et facile à faire.

    que fait la ligne 50 ?

    Encore des formats de date…

    Encore un format : "mon, 10 jul 2006 01:02:08 gmt"
    encore un : "wed, 23 jun 2004 01:19:32 cest"
    encore un "mon, 22 mar 2010 14:20:15 +0100 +0100". C'est probablement une erreur d'écriture mais il faut la prendre en compte
    "wen, 16 jul 2008 22:09:05 +0200"

    Les deux derniers cas sont forcé­ment des erreurs de la part de clients emails. Pour la première erreur il choi­sit d’igno­rer toutes les répé­ti­tions du déca­lage horaire.

    La seconde erreur est inté­res­sante parce que « wen » est proba­ble­ment là pour « wed » (wednes­day). Il iden­ti­fie l’er­reur et ajoute un code qui remplace toute une liste d’er­reurs de frappes habi­tuelles pour les code courts de jour de la semaine. Parfait.

    "wed, 19 apr 2006 12:15 -0800"

    J’ai mon premier cas d’email sans entête « Date ». Je ne sais pas si c’est auto­risé ou non mais peu importe. Je lui dis de fouiller les entêtes « Recei­ved » à la place. Je sais que ces entêtes peuvent être sur plusieurs lignes.

    L’IA va plus loin que moi, sait que la date est en seconde posi­tion dans ces entêtes, et regarde unique­ment après le premier point virgule. Elle sais aussi comment s’ap­pellent ses entêtes sur plusieurs lignes (lignes de conti­nua­tion). Mieux que ce que j’au­rais fait.

    Je note que je tape vite, avec des erreurs de frappe, un guille­met en trop, etc. Peu importe, c’est destiné à l’IA. Me relire est super­flu : je peux reve­nir en arrière si c’est mal compris.

    If you don't find any Date header, try again to look if you can find a date somewhere in a "Received" header (theere may be multiple "Received" headers") or in the lines begining with a space and following a "Received" header
  • Disque de sauve­garde

    J’ai un SSD de 8 To dédié à ça. L’idée c’est de me donner un peu de mou sachant que j’en utilise au moins 3 To.

    Je l’ai bran­ché sur un Mac mini, qui est la seule machine fixe chez moi et je n’ai pas envie d’al­ler ache­ter un NAS en plus.

    Le tout sera aussi sauve­gardé en ligne au cas où le disque fait défaillance (mauvaise mani­pu­la­tion, panne, vol, incen­die, dégât des eaux) mais j’ai besoin que ce soit d’abord en local et pas unique­ment dépen­dant d’un service en ligne.

    Outre la défiance vis-a-vis des services en ligne, ça me permet­tra de tout remon­ter sans attendre des jours à tout télé­char­ger.

    Montage du disque

    C’est une machine parta­gée, donc il faut des droits d’ac­cès. Macos monte par défaut tous les disques USB avec un para­mètre noow­ners qui fait que tout le monde a les mêmes droits sur tous les fichiers.

    Pour corri­ger ça il faut l’em­pê­cher de monter le disque auto­ma­tique­ment et le faire à la main avec l’op­tion owners. Je ne sais pas si c’est redon­dant mais j’ai eu des succès en ajou­tant la commande diskutil enableOwnership avec l’iden­ti­fiant du disque;

    C’est un disque de sauve­garde, je fais déjà écrire beau­coup dessus en perma­nence, il faut bien penser à ajou­ter le noatime pour éviter de géné­rer des écri­tures inutiles.

    Au final :

    # GUID du disque, les /dev/disk* ne sont pas stables
    GUID="xxxxx"
    # Point de montage
    DIR="/Volumes/data"
    mkdir -m 0750 $DIR 2> /dev/null
    diskutil mount -mountOptions noauto,nosuid,nodev,noatime,nobrowse,owners -mountPoint $DIR $GUID && diskutil enableOwnership $GUID

    On chiffre

    Le disque est chif­fré. Pour moi c’est indis­pen­sable en cas de vol. C’est aussi néces­saire si le disque semble avoir des défaillance, que je ne peux l’ef­fa­cer mais que quelqu’un risque de réus­sir à relire quand même. Je ne veux ni ne peux me permettre que tout se balade n’im­porte où.

    Je pour­rais enre­gis­trer la clé de chif­fre­ment dans le gestion­naire natif de Macos comme il m’in­vite à le faire mais je vais avoir besoin plus tard que le montage se fasse au démar­rage du disque, hors de toute session utili­sa­teur.

    Je me permets donc de mettre en clair le mot de passe du disque. Tant que le script en ques­tion n’est acces­sible que par root, ça me va.

    # GUID du disque, les /dev/disk* ne sont pas stables
    GUID="xxxxx"
    # Point de montage
    DIR="/Volumes/data"
    # Mot de passe du système de fichier
    PASS="xxxxxx"
    diskutil apfs unlockVolume $GUID -passphrase $PASS -nomount
    mkdir -m 0750 $DIR 2> /dev/null
    diskutil mount -mountOptions noauto,nosuid,nodev,noatime,nobrowse,owners -mountPoint $DIR $GUID && diskutil enableOwnership $GUID
    RES=$?
    sudo chgrp Famille $DIR
    sudo chmod 750 $DIR

    On garde actif

    Par défaut Macos démonte tous les disques USB quand on ferme la session utili­sa­teur. C’est aussi vrai pour les parti­tions chif­frées, y compris celles qu’on aurait montées à la main.

    Bref, il suffit que n’im­porte qui utilise le poste et se décon­necte pour que mon disque de sauve­garde soit aux abon­nés absents, impos­sible à remon­ter vu que seul root peut accé­der au mot de passe du disque.

    J’ai ajouté en fin de script une petite boucle qui « occupe » le disque et empêche qu’il soit démonté. Ça a l’air de fonc­tion­ner.

    cd $DIR
    while true; do
       sleep 10;
    done

    Il faut quand même pouvoir arrê­ter le système, donc le script doit savoir réagir à un signal d’in­ter­rup­tion.

    trap 'bye' SIGINT SIGTERM SIGKILL
    function bye() {
     cd /Volumes
     exit 1;
    }

    Lance­ment au démar­rage

    Je n’ai pas trouvé d’autres méthodes qu’un fichier plist dans /Library/LaunchDaemons.

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
    <dict>
      <key>Label</key>
      <string>xxxx.backup-disk</string>
      <key>OnDemand</key>
      <false/>
      <key>UserName</key>
      <string>root</string>
      <key>GroupName</key>
      <string>wheel</string>
      <key>ProgramArguments</key>
      <array>
        <string>/usr/local/sbin/mount-data.sh</string>
      </array>
      <key>RunAtLoad</key>
      <true />
      <key>KeepAlive</key>
      <false/>
      <key>LaunchOnlyOnce</key>
      <true/>
    </dict>
    </plist>

    Le script de montage complet est dans /usr/local/sbin, en lecture unique­ment pour root.

    #!/bin/sh
    # GUID du disque, les /dev/disk* ne sont pas stables
    GUID="xxxxx"
    # Point de montage
    DIR="/Volumes/data"
    # Mot de passe du système de fichier
    PASS="xxxxxx"
    trap 'bye' SIGINT SIGTERM SIGKILL
    function bye() {
     cd /Volumes
     exit 1;
    }
    diskutil apfs unlockVolume $GUID -passphrase $PASS -nomount
    mkdir -m 0750 $DIR 2> /dev/null
    diskutil mount -mountOptions noauto,nosuid,nodev,noatime,nobrowse,owners -mountPoint $DIR $GUID && diskutil enableOwnership $GUID
    RES=$?
    sudo chgrp Famille $DIR
    sudo chmod 750 $DIR
    cd $DIR
    while true; do
       sleep 10;
    done

  • Sauve­gar­der Gmail

    J’ai un histo­rique de 25 ans d’emails et j’y tiens. Il m’ar­rive encore régu­liè­re­ment d’al­ler fouiller pour retrou­ver trace de contacts ou d’échanges d’il y a 10 ans. Je l’ai fait encore ce matin.

    Je tiens donc à assu­rer la péren­nité de tout ça. J’ai confiance en Google1 mais j’ai déjà lu les récits de personnes qui se sont vus clôtu­rer leur compte sans préavis ni possi­bi­lité de récu­pé­ra­tion. Je ne suis pas non plus à l’abri de faire moi-même des bêtises dans mon compte.

    J’ai déjà utilisé Getmail par le passé pour télé­char­ger un à un tous mes emails en prove­nance de Google. Il n’a cepen­dant pas été mis à jour pour Python3. Getmail6 semble avoir pris le relai et il a la bonne idée d’être dispo­nible sous macos via home­brew.

    POP3

    Mon compte dépasse le demi-million d’emails archi­vés. La synchro­ni­sa­tion IMAP semble prendre des années à balayer tous les emails pour savoir lesquels sont nouveaux depuis la dernière fois. C’est jouable si vous avez juste quelques dizaines de milliers d’emails. Au-delà il faut utili­ser le bon vieux POP3.

    1. Acti­ver POP3 dans les options de Gmail
    2. S’as­su­rer de le confi­gu­rer pour récu­pé­rer tous les emails et pas unique­ment ceux qui arrivent à partir d’aujourd’­hui.

    Si vous aviez déjà utili­ser POP3 par le passé, il faut lui deman­der de réac­ti­ver le télé­char­ge­ment de tous les emails, y compris ceux qui ont déjà été télé­char­gés.

    Si vous avez déjà un client email qui se connecte en POP3, passez-le en IMAP. Ils se feraient concur­rence. Vous auriez une partie des emails d’un côté et une partie de l’autre.

    Confi­gu­ra­tion

    Ma confi­gu­ra­tion getmailrc ressemble à ça :

    L’uti­li­sa­teur est l’adresse email complète. N’uti­li­sez pas votre mot de passe Google et créez un mot de passe d’ap­pli­ca­tion dédié, ça vous permet­tra de le révoquer un jour. Pensez à proté­ger ce fichier de confi­gu­ra­tion parce que celui qui y aura accès aura aussi accès à votre compte Google.

    Le para­mètre recei­ved assure que Getmail récu­père le message tel quel, sans ajou­ter d’en­tête.

    Erreurs de synchro­ni­sa­tion

    Google envoie tous les emails par groupes de 200 à 1000 non télé­char­gés à chaque appel POP3. Si le para­mètre read_all est à false, Getmail ne télé­charge pas les emails qu’il a déjà vu.

    Pour une raison ou une autre, ça peut partir en boucle si Getmail pense avoir déjà vu un email que Google pense pour­tant ne pas être déjà télé­chargé : L’email va être repro­posé à chaque fois. Si ça fait ça sur plusieurs centaines d’emails, vous prenez le risque que vous restiez bloqué sur le même groupe d’emails indé­fi­ni­ment à chaque appel.

    Véri­fiez bien que le read_all est à true. Si le problème persiste, une solu­tion est de passer par le type BrokenUIDLPOP3SSLRe­trie­ver plutôt que SimplePOP3SSLRe­trie­ver. Getmail télé­charge alors systé­ma­tique­ment les messages sans se préoc­cu­per de ce qu’il a déjà lu ou non.

    Quota

    Gmail a des quota sur ses APIs. Pour initia­li­ser mon demi-million d’emails j’ai lancé Getmail en boucle et je suis tombé sur des erreurs 403. Si vous devez comme moi initia­li­ser plusieurs dizaines de Go, ça demande un peu de surveillance.

    Le quota semble toute­fois très très large. En rythme de croi­sière je compte proba­ble­ment synchro­ni­ser 1 à 2 fois par jours mais on peut sans problèmes faire plusieurs synchro­ni­sa­tion par heures si ça vous semble indis­pen­sable.

    Mail­dir

    Il y a deux formats, mbox et mail­dir. Mbox c’est un unique gros fichier, un peu comme une archive tar. Mail­dir c’est un réper­toire avec un fichier par email, ce qui me semble plus adapté pour des sauve­gardes avec de nouveaux emails tous les jours.

    Initia­li­ser un mail­dir c’est juste un réper­toire qui contient un sous-réper­toire tmp, un new, et un cur. Tous les emails envoyés par Getmail iront dans new.

    Il reste que pour mon demi-million d’emails ça commence à faire beau­coup de fichiers dans un seul réper­toire. J’ai fait un petit script qui parcourt l’in­té­gra­lité des emails, lit la date2, et les répar­tit dans des mail­dir spéci­fiques par année. Ça faci­li­tera aussi la sauve­garde et me permet­tra éven­tuel­le­ment de faire un zip pour les vieilles années.

    Emails envoyés

    Le problème du POP3 c’est que ça ne télé­charge que les emails reçus, pas les emails envoyés. J’ai donc dû ajou­ter une seconde synchro­ni­sa­tion IMAP sur le dossier des emails envoyés. Là j’ai dans les 30 000 emails. C’est long à parcou­rir mais encore jouable tant que je ne lance pas la récu­pé­ra­tion toutes les deux minutes.

    J’ai donc deux fichiers getmailrc, un pop.getmailrc (emails reçus) et un imap.getmailrc (emails envoyés). Je dois donc manuel­le­ment spéci­fier les para­mètres –rcfile= quand j’ap­pelle Getmail. On peut spéci­fier plusieurs fois le para­mètre, les synchro­ni­sa­tions sont alors lancées l’une après l’autre.

    J’en­vois ça vers le même dossier mail­dir, puis fais la même répar­ti­tion par année.

    Enre­gis­trer en tâche plani­fiée

    Sous Linux il suffit proba­ble­ment de faire une entrée dans le cron.

    Sous Macos, si je veux que la synchro­ni­sa­tion s’exé­cute même quand je ne suis pas connecté, il faut enre­gis­trer le script dans /Library/Laun­chDae­mons.

    Comme le réper­toire desti­na­tion de mes sauve­garde est hors de mon disque prin­ci­pal, Macos impose aussi que le programme lancé ait la permis­sion spéciale « full disk access ». Getmail n’est qu’un script Python et je n’ai pas voulu donner des droits larges à tout Python. J’ai dû faire un programme natif qui lance mon script Getmail et donner les droits sur le disque à ce script là.

    Je ferai proba­ble­ment un billet dédié à tout ça.

    Entre temps j’ai presque 40 Go d’his­to­rique email à synchro­ni­ser depuis Google par batch de 200 à 1000 mails. Ça va me prendre un peu de temps.


    1. Oui, j’uti­lise Google. J’ai soupesé plein de fois les alter­na­tives mais toutes auraient demandé un compro­mis signi­fi­ca­tif et je ne suis pas encore passé à l’ac­tion. Ça vien­dra. J’ai besoin de trou­ver le bon équi­libre et de ne pas perdre la recherche dans le passé. ↩︎
    2. Je ferais un billet spéci­fique, ça s’est révélé bien moins évident que je ne l’ima­gi­nais naïve­ment. ↩︎
  • Orga­ni­sa­tion des sauve­gardes

    Je me suis remis à mes sauve­gardes. Le dernier épisode était en septembre et ça commence à faire presque deux ans que rien n’est fina­lisé.

    Je reste sur mon plan précé­dent. J’ai juste aban­donné l’idée d’uti­li­ser Crash­plan. Ça part de messages sur des forums où ils disent expli­ci­te­ment qu’ils ne pouvaient pas garan­tir le bon fonc­tion­ne­ment quand on dépasse quelques To de sauve­garde. Derrière j’ai exploré plus et les débits famé­liques rendent de toutes façons illu­soire une restau­ra­tion complète sur des volumes de cet ordre de gran­deur en cas de défaillance disque.

    J’irai chez BorgBase ou Hetz­ner, proba­ble­ment Hetz­ner parce que même en coupant l’inu­tile j’ai quand même au moins 3 To aujourd’­hui et que va commen­cer à faire cher chez BorgBase avec l’aug­men­ta­tion natu­relle.

    Disque externe – Disque interne

    Le vrai sujet de ce week-end, c’est comment monter une parti­tion chif­frée depuis un disque externe. C’était déjà mon problème en septembre.

    Macos consi­dère que les disques externes sont comme des clés usb, lisibles par tous les utili­sa­teurs, sans droits d’ac­cès, et démon­tées dès qu’on se décon­necte de sa session.

    Passer à un système chif­fré empêche qu’il soit montable par tout le monde tant qu’on n’ajoute pas la clé de chif­fre­ment dans le trous­seau.

    Si c’est monté manuel­le­ment, on peut ajou­ter le para­mètre owners pour faire en sorte que le système respecte les permis­sions sur les fichiers et n’ouvre pas tout à tout le monde.

    J’ai pu faire monter le disque au démar­rage en ajou­tant un plist dans /Library/Laun­chDea­mons et en le char­geant avec un laun­chctl load. Le plist exécute un script au démar­rage qui déver­rouille le disque et le monte avec les bonnes options. Ça veut dire que la clé de chif­fre­ment est en clair dans un fichier du disque interne. Le disque interne est chif­fré lui aussi, le fichier n’est lisible que par root. Ce n’est pas parfait mais suffi­sant pour mon usage.

    Ça reste visible comme un disque externe, donc tout le monde peut deman­der à l’éjec­ter. J’ai palier au problème ajou­tant un petit code dans le script de démar­rage qui entre dans le disque et attend indé­fi­ni­ment. Le disque étant occupé, personne ne peut l’éjec­ter.

    J’ai l’im­pres­sion de batailler à faire du brico­lage sur ce qui m’au­rait pris quelques minutes sous Linux mais ça fonc­tionne.

    L’étape suivante ça va être de s’as­su­rer que tous les fichiers se retrouvent sur le disque prévu pour, en synchro­ni­sant tous les comptes Google Drive et Treso­rit. Ensuite je vais instal­ler un getmail pour archi­ver en temps réel les boites email, proba­ble­ment un script pour archi­ver le Github. La dernière étape sera de bran­cher Borg pour envoyer le backup en ligne et d’at­tendre un bon mois qu’il finisse la synchro­ni­sa­tion initiale.

  • Objets décon­nec­tés

    Un péché d’or­gueil d’avoir fait fabriquer en France

    Libé­ra­tion

    J’en ai marre d’être pris pour un jambon. Le problème, très bien noté dans l’ar­ticle, c’est qu’il y a eu un défaut sur des milliers de cadres, qu’il a fallu un rappel, et qu’ils n’ont pas su le finan­cer.

    La fabri­ca­tion en France elle a bon dos.

    France ou Chine, le problème est surtout qu’ils ont préféré ne pas s’as­su­rer contre ce risque, ou mal.

    Je note aussi qu’on se retrouve dans le même cas que VanMoof, c’est à dire que l’en­tre­prise n’a pas pris la peine de penser à la péren­nité des vélos vendus en cas de cessa­tion d’ac­ti­vité. Sachant qu’il y a eu un précé­dent avec VanMoof, cette impasse est un choix de leur part.

    Bref, on a juste une clas­sique enter­prise qui a rogné des choses qu’elle n’au­rait pas dû et qui tente de repor­ter la faute ensuite.


    Il est peut-être temps d’avoir une légis­la­tion adap­tée aux objets connec­tés, avec une obli­ga­tion de péren­nité sur une durée de vie cible, dont au mini­mum la divul­ga­tion des proto­coles, api et signa­tures en cas de cessa­tion d’ac­ti­vité.

  • SMS Backup+

    Je ne comprends toujours pas qu’An­droid n’ait rien prévu pour migrer la récep­tion des SMS dans le cloud.

    J’uti­lise SMS Backup+. Il y a peut-être des alter­na­tives, d’au­tant plus main­te­nant qu’il n’est plus main­tenu dans les stores, mais c’est mon histo­rique depuis faci­le­ment une décen­nie.

    Ce petit outil récu­père chaque SMS reçu pour l’ajou­ter dans les archives de mon compte email. Ça me permet de résis­ter à la perte de mon télé­phone mais aussi de fouiller dans les archives.

    Bonus, il fait de même avec les appels (mais sans le contenu audio). Pour les appels je peux même les poser dans le calen­drier pour retrou­ver faci­le­ment qui m’a appelé quand avec quel numéro.


    Mise à jour : Il semble que ça ne sauve­garde pas les messages RCS chif­frés qui sont envoyés entre personnes qui utilisent Google Message. Il va falloir cher­cher un peu plus loin.

  • Répa­rer son smart­phone

    Je suis assez fier, j’ai donné 18 mois de vie en plus à mon smart­phone.

    Je me suis résolu à tenter d’ou­vrir moi-même la bête pour chan­ger le connec­teur de charge. Retour d’ex­pé­rience.

    Le maté­riel

    Les pièces déta­chées se trouvent assez faci­le­ment sur Amazon, même pour un vieux modèle peu répandu. Les prix n’ont rien à voir avec ceux des ateliers de répa­ra­tion. Le connec­teur de charge je l’ai trouvé à moins de 10 €, avec un mini tour­ne­vis cruci­forme et quelques outils en plas­tique desti­nés à ouvrir le capot.

    J’ai ajouté un gros tube de colle smart­phone à 10 € dont la conte­nance me servira pendant des années.

    Le seul vrai pré-requis c’est le pisto­let à chaleur. Ma femme avait ça pour ses loisirs créa­tifs mais sinon ça coûte une ving­taine d’eu­ros en boutique. Il parait que ça peut se faire au sèche cheveux mais je ne sais pas si j’ai envie de tenter (moins de puis­sance et moins de direc­ti­vité).

    La procé­dure

    J’ai suivi deux vidéos, une pour ouvrir le panneau arrière et une pour le rempla­ce­ment de la pièce elle-même. Une recherche sur Youtube avec le modèle de télé­phone et la répa­ra­tion souhai­tée donne plusieurs vidéos même sur des modèles confi­den­tiels.

    Le panneau arrière ça semble être assez simi­laire partout : On chauffe pour décol­ler et on ouvre sans forcer pour ne rien casser. La première fois c’est déli­cat. La seconde fois on fait ça vite et sans diffi­cul­tés.

    Le rempla­ce­ment de pièce se résume presque à reti­rer des vis et débran­cher des nappes puis tout remettre en place. Le plus diffi­cile c’est réus­sir à rebran­cher les nappes avec mes gros doigts.

    Astuce : On m’a conseillé de prendre une photo à chaque étape pour bien m’as­su­rer que je remets tout exac­te­ment au même endroit sans rien oublier. C’est assez rassu­rant. J’ai imprimé la première photo sur un A4 et à ça m’a permis de scot­cher les vis sur le papier une à une, pour ne rien oublier et remettre la bonne vis au bon endroit.

    Le recol­lage du panneau arrière n’était pas plus compliqué mais éton­nam­ment je n’ai pas trouvé de vidéo, et du coup j’avais oublié d’ache­ter de la colle pour ça (prenez de la colle adap­tée, qui permet­tra de réou­vrir le panneau la prochaine fois).

    Note : Si le smart­phone est étanche avant l’opé­ra­tion, il ne l’est plus après, que ce soit par vous ou par le répa­ra­teur de quar­tier. Si le votre est sous garan­tie, faites le passer en garan­tie auprès du construc­teur et ne l’ou­vrez pas. Eux ont les outils pour retrou­ver l’étan­chéité.

    Les aléas

    Les erreurs, ça arrive, surtout les premières fois.

    La première fois j’ai oublié de reti­rer le tiroir de la carte SIM. La vidéo commençait smart­phone déjà ouvert donc ça devait sembler évident. J’ai donc bête­ment plié le tiroir en voulant chan­ger le connec­teur de charge, et j’ai dû le chan­ger aussi.

    La réalité c’est que ce n’est guère mieux dans les ateliers. Ils ont plus d’ex­pé­rience donc font moins d’er­reur mais j’ai déjà eu une fois un retour atelier avec plus de problèmes qu’au départ, une autre fois où ils m’ont grillé le capteur d’em­preinte en chan­geant le connec­teur de charge. Les deux fois je n’ai pas réussi à obte­nir gain de cause sur le « ça fonc­tion­nait quand je vous l’ai donné ». En fait j’ai même vu qu’il me manquait une vis à l’in­té­rieur quand j’ai ouvert le télé­phone la première fois, donc un atelier m’avait même perdu une vis sans rien me dire.

    Il y a un risque à toute répa­ra­tion. C’est prin­ci­pa­le­ment de l’inat­ten­tion et un geste qui dérape. Même si les gestes du profes­sion­nel seront plus assu­rés par l’ha­bi­tude, ça arrive à tout le monde.

    Pourquoi 18 mois seule­ment

    Si je conjugue tout au passé c’est que j’ai de nouveau cassé mon connec­teur de charge la semaine dernière en me prenant les pieds dans le câble bran­ché. Je l’ai changé mais j’ai oublié de reti­rer un cache sur le micro donc j’ai voulu réou­vrir ça le soir à 23h, crevé par l’heure et la jour­née, agacé contre moi-même, et après m’être fâché avec fiston à propos des devoirs.

    Bref, je n’au­rais jamais dû faire un travail de préci­sion dans ces condi­tions : J’ai fait une bêtise et cassé un connec­teur sur la carte mère. Il était temps de lui dire adieu mais je ne regrette aucu­ne­ment parce que j’ai gagné 18 mois de plus en osant ouvrir moi-même.

    Pourquoi pas un atelier local ?

    Vu la diffé­rence de prix entre une répa­ra­tion maison et un atelier, je suis étonné qu’il n’y ai pas plus de répa­ra­tions maison. Un chan­ge­ment d’écran ou de connec­teur chez soi épargne faci­le­ment 30 €. Sur un vieux télé­phone ou un premier prix, le risque se justi­fie tout à fait.

    De mon côté je n’avais pas le choix. Les four­nis­seurs offi­ciels des ateliers ne propo­saient plus la pièce alors que j’en trou­vais plein en ligne. C’était ça ou mettre le télé­phone à la benne.

    Très person­nel et non géné­ra­li­sable : Ça m’a donné aussi l’oc­ca­sion de mettre en œuvre une solu­tion arti­sa­nale qui a arrêté un cycle de rempla­ce­ment de connec­teur de charge trop fréquent. Mon modèle est visi­ble­ment connu pour avoir une nappe qui finissent par mal tenir. Des vidéos proposent de mettre un peu de pres­sion à l’aide de scotch d’élec­tri­cien, ce que les ateliers se refu­saient à faire. J’ai tenté et ça a eu l’ef­fet recher­ché.

  • Dalle mate pour les MacBooks

    Je suis sur le point de m’ache­ter mon premier macbook pro person­nel. C’est cher, je fais atten­tion.

    J’ai fini par avoir un avis clair sur mes besoins sur tout sauf sur cette option pour dalle mate nommée pompeu­se­ment nano-texture.

    Est-ce un besoin ?

    Premier réflexe : Ça fait entre 15 et 20 ans que je travaille sur MacBook et je n’ai jamais râlé sur la mauvaise qualité de la dalle.

    En lisant un commen­taire je me suis rappelé que pendant 3 ans les équipes, moi inclus, faisaient atten­tion à bais­ser les stores de l’opens­pace, quitte à le rendre sombre. Je fais pareil chez moi où les stores du bureau sont bais­sés en perma­nence quand bien même je suis dans la dispo­si­tion qui génère le moins de reflets possible. Même topo quand je suis sur le canapé où je tire systé­ma­tique­ment les rideaux, et sur la table de la salle à manger où je me mets à une place diffé­rente, dos au mur, quand je suis avec mon poste de travail.

    Bref, j’ai proba­ble­ment bana­lisé une gêne réelle et perma­nente au point de ne même plus en avoir conscience. Une fois sauté le pas, peut-être que je le deman­de­rai comment j’ai bien pu faire avant.

    Je peux faire sans, j’ai toujours fait sans, mais si je prends un MacBook et pas un Mac mini, c’est bien pour pouvoir bouger avec. Autant maxi­mi­ser cette possi­bi­lité.

    Quelle qualité ?

    Je suis allé voir avec mes propres yeux à quoi ça ressem­blait, direc­te­ment à l’Apple Store, compa­rant côte à côte un Macbook avec et un sans.

    Du code, du web

    Le résul­tat est bon, impres­sion­nant même. Pour un usage prin­ci­pa­le­ment code et web, avec pour ambi­tion de ne pas lais­ser le MacBook scot­ché dans un bureau sombre rideaux tirés, il ne fait aucun doute que je veux cette option.

    Je ne sais pas si j’au­rais été gêné par les reflets avant. Proba­ble­ment pas vu que je ne me suis jamais fait la réflexion en allant à l’Apple store jusqu’à présent. Pour autant, sans reflets latents en fond, la lisi­bi­lité était signi­fi­ca­ti­ve­ment meilleure. Je n’ai pas eu l’im­pres­sion de perdre en préci­sion ou en couleurs.

    Le test vaut ce qu’il vaut. L’en­vi­ron­ne­ment des maga­sins est très lumi­neux mais je me dis qu’ils ont quand même dû le penser pour éviter de prendre en défaut leurs dalles brillantes jusqu’à présent s’ils voulaient les vendre. En reve­nant à la maison, je me dis que ce n’était pas si éloi­gné de la réalité.

    De la vidéo

    Sur les vidéos c’est diffé­rent. Les noirs sont plus profonds et dalle est quand même plus flat­teuse en brillant sur des scènes sombres, malgré les reflets.

    Je ne sais pas si la diffé­rence dans les noirs se voit toujours en envi­ron­ne­ment peu lumi­neux. Ce que je lis sur le web me laisse croire que non, mais je pense que j’op­te­rais quand même pour une dalle brillante si le trai­te­ment vidéo était mon acti­vité première, quitte à ce faire le noir autour de moi.

    En réalité la vidéo je l’ai essen­tiel­le­ment en lecture, quand je suis hors du bureau (donc lumi­no­sité non contrô­lée). Là je préfè­re­rai peut-être perdre sur la qualité et les noirs que de subir des reflets.

    De la photo

    Pour le trai­te­ment photo j’hé­site. Une dalle brillante avec une pièce à lumi­no­sité maîtri­sée est proba­ble­ment ce qu’il y a de mieux, comme pour la vidéo, mais j’ai moins ressenti le besoin à l’af­fi­chage d’une photo sombre qu’a­vec une vidéo de même tona­lité.

    Et donc ?

    Chez moi, à majo­rité code et web, 30% photo, un peu de lecture vidéo en mobi­lité, je me dis que la dalle mate est proba­ble­ment plus perti­nente.

    Reste le prix, mais ne nous mentons pas : Si on vise un MacBook Pro c’est que le prix n’est pas le premier critère de choix. C’est outra­geu­se­ment cher mais ça vaut proba­ble­ment quand même le coup si vos usages ne sont pas majo­ri­tai­re­ment orien­tés vidéo.

  • Prochain ordi­na­teur portable

    Je n’ai plus d’or­di­na­teur person­nel depuis presque 20 ans. J’en ai toujours eu un profes­sion­nel, avec assez de lati­tude donnée par l’en­tre­prise pour qu’il serve aussi à mes usages person­nels.

    Ce n’est plus le cas aujourd’­hui. C’est pour entre quelques mois et plusieurs années. Bref, je ressens le besoin d’en ache­ter un.

    Apple a mis à jour sa gamme de macbook, c’est ce que j’at­ten­dais pour passer à l’achat. Il reste que j’hé­site :

    Pile, je reste raison­nable dans mon achat, ce qui est un point que je valo­rise peu importe le montant lui-même. Proba­ble­ment est-ce suffi­sant pour mes usages actuels. Mes frus­tra­tions ne seront pas si diffé­rentes de celles dont je m’ac­com­mo­dais jusque là. Je m’em­pêche juste d’y amener des jeux deman­deurs. Si mes besoins quoti­diens augmentent avec le temps, il sera toujours temps de le revendre et en ache­ter un nouveau.

    La première option, côté pile, c’est le macbook air.

    Ils ont désor­mais 16 Go de RAM par défaut et il me suffi­rait d’aug­men­ter le disque pour me retrou­ver avec quelque chose de très simi­laire à ce que j’avais ces trois dernières années (macbook pro M1 avec 16 Go de RAM).

    Le macbook air n’a pas de refroi­dis­se­ment actif. Il limite son proces­seur quand on lui demande beau­coup en continu. Ça peinera proba­ble­ment un peu dans les trai­te­ments photos soute­nus mais j’ima­gine que ça ne posera pas de gros problèmes.

    Pour les jeux ça sera autre chose. Le macbook pro M1 souf­flait déjà pas mal avec les détails au mini­mum. Ça ne passera clai­re­ment pas correc­te­ment sur le macbook air.

    Je ne me suis remis à jouer que tout récem­ment. Je ne sais même pas si ça ne va pas me passer rapi­de­ment donc peut-être que je pour­rais être raison­nable et tracer une croix dessus.

    Je vais aussi devoir me trim­bal­ler avec des adap­ta­teurs pour le HDMI et les cartes mémoire du HDMI, du lecteur de cartes. Rien de grave, je le faisais déjà, mais c’est mieux si je peux éviter. Ça me coupe aussi la possi­bi­lité d’un agen­ce­ment à trois écrans comme j’en ai eu par le passé.

    Mon vrai sujet c’est la péren­nité. J’ai des exigences très fortes, voire des habi­tudes luxueuses, en termes de puis­sance et réac­ti­vité. J’achète pour des années. J’ai­me­rais ne pas me retrou­ver frus­tré dans le futur quand les logi­ciels et les usages seront plus exigeants eux aussi.

    Face, je paye plus bien plus cher, même si au final la diffé­rence se limite à mon tarif pour une jour­née de travail donc est-ce si impor­tant que ça ? Pour ce prix j’ai du sur-gonflé qui va tenir mes usages très long­temps. J’au­rai surtout zéro conces­sions et un confort inégalé, ce qui compte vrai­ment au quoti­dien. Seule ombre au tableau, le maté­riel sera un peu plus lourd, même si ça reste léger au final.

    La seconde option, côté face, c’est le macbook pro

    Je prends le macbook pro du moment, proces­seur M4 pro de base. Je double la RAM et le disque pour assu­rer de la péren­nité et du confort.

    Oui c’est surgon­flé mais si j’achète un poste c’est pour qu’il tienne long­temps, idéa­le­ment très long­temps. Je préfère prévoir d’of­fice nette­ment plus que néces­saire pour ne pas être frus­tré par ce que me deman­de­ront les logi­ciels et usages futurs.

    C’est outra­geu­se­ment cher mais la diffé­rence avec l’op­tion du macbook air plus haut c’est de l’ordre de 1 100 € HT, donc moins que la factu­ra­tion d’une jour­née de travail. Si je devais récu­pé­rer cette somme en divi­dendes, ça me ferait 550 € sur mon compte en banque après la fisca­lité. Ce n’est pas rien mais je suis peut-être prêt à l’in­ves­tir pour un confort quoti­dien sur plusieurs années.

    La petite frus­tra­tion qui tourne toute­fois en tête, c’est que le macbook pro est légè­re­ment plus lourd : 1,6 kg vs 1,25 kg. 350 grammes à porter.


    Bref, j’hé­site.

    Je suis preneur de ce que ça vous évoque, sachant que ce choix est à priori limi­ta­tif. J’ai besoin d’un portable donc le mac mini n’est pas une option. Je ne souhaite pas passer sous Linux ou Windows.

    L’oc­ca­sion est une option unique­ment dans la mesure où j’ai accès à une facture avec TVA, où la batte­rie est remise à neuf et où le prix hors taxes résul­tant fait une diffé­rence vrai­ment impor­tante par rapport au neuf.

  • Grand écran haute défi­ni­tion

    Je remets à jour mon envi­ron­ne­ment de travail. Ça fait 4 ans que je cherche à rempla­cer mon écran.

    Idéa­le­ment je cherche un 34 à 40″ en 21:9ème. C’est à dire l’équi­valent d’un 27 à 32″ qu’on a étendu sur le côté. Ça me permet­trait de mettre 2 fenêtres côte à côte et d’avoir un meilleur espace pour le trai­te­ment photo.

    J’ai vu la diffé­rence de qualité d’un écran haute défi­ni­tion. J’ado­re­rais avoir la même défi­ni­tion que l’écran retina du mac, donc du 220dpi.

    Sur un 40″ 21:9ème ça veut dire quelque chose entre le 7650 x 3280 et le 8192 x 3510. Sur un 34″ ça veut dire dans les 6720 x 2880.

    Je fais aussi du trai­te­ment photo donc là dessus je veux un bon contraste, une bonne lumi­no­sité, un bon respect des couleurs, et une homo­gé­néité sur toute la dalle. Je ne fais pas de jeu haute perfor­mance mais la réac­ti­vité doit rester correcte.


    Pour l’ins­tant ce qui s’en rapproche le plus c’est le Dell U4025QW. C’est le bon format mais on est sur du 140dpi et j’ai un peu peur des défi­ni­tions inter­mé­diaires entre 110 et 220dpi sur mac. La lumi­no­sité est correcte mais sans plus. La réac­ti­vité est passable.

    Si quelqu’un a ce 40″, celui là ou la géné­ra­tion précé­dente, je suis très inté­ressé pour tester.

    Un 34″ 21:9ème en 220dpi pour­rait être un bon compro­mis mais je n’en ai pas trouvé avec une défi­ni­tion supé­rieure aux 110dpi de base..

    Si je tiens aux 220dpi, je l’ai en 32″ au format 16:9ème avec le Dell U3224KB mais en réalité je tiens plus au format qu’à la grande taille.

    Il reste l’op­tion d’avoir deux 27″ plutôt qu’un grand écran unique mais, là aussi, les écrans en 220dpi ne courent pas les rues. Je perds aussi de la surface pour le trai­te­ment photo.

    Des idées ? des recom­man­da­tions ?