Before you press the volume or brightness controls, hold down the Option and Shift keys together on your keyboard. Now go ahead and make your adjustments, and you should see the onscreen indicator move forwards and backwards in smaller increments (four over each segment).
Macrumors
Catégorie : Geek
-
Réglage fin du volume sur Macos
-
Sauvegarder Pocket
Je suis toujours dans mes sauvegardes. Je veux avoir une copie de tout dans mes sauvegarde, données des services en ligne incluses.
Je pensais faire ça facilement avec Pocket. Ils ont une API, assez simple.
En pratique je me retrouve à faire essentiellement de l’ingénierie inverse. La documentation indique des choses qui n’existent pas ou ne fonctionnent pas, et ne donne aucune information sur des éléments essentiels qu’on reçoit (genre la gestion des erreurs).
Authentification
Contrairement aux mécanismes OAuth habituels, leur authorize ne renvoie pas de code temporaire à échanger. Pour récupérer l’access_token, il faut le demander avec le request_token obtenu lors de l’échange serveur à serveur initial.
Ce request_token semble ne pas avoir de durée de vie. Il n’a en tout cas pas de refresh_token associé.
Mécanisme de régulation
L’API indique des limitations à 320 appels par heure. C’est d’autant plus important que pour télécharger mes plus de 29 0001 items par pages de 30 maximum, je vais forcément dépasser le nombre de requêtes que je peux faire en une heure.
Il y a un mécanisme automatique prévu pour la régulation mais le serveur n’envoie pas les entêtes prévues pour ça. Je sais juste qu’au bout d’un moment j’obtiens des erreurs 403 et que ça semble venir de là.
Je vais devoir gérer ça à la main. Pour l’instant je note l’heure de chaque requête dans un tableau. Quand mon tableau fait 320 éléments, je retire le premier élément et attend l’heure de cet élément + 1 heure avant de continuer.
Pagination
Le mécanisme pour la pagination est assez famélique : 30 items maximum par requête, plus un offset pour passer à la page suivante. C’est une mauvaise méthode pour itérer à travers des milliers d’items et ça ne trompe pas : Les requêtes sont effectivement de plus en plus lentes au fur et à mesure des pages. C’est visible et c’est pénible.
Le serveur prévoit de renvoyer un champ total qui permet de savoir s’il reste encore des éléments. Les réponses du serveur ne me renvoient malheureusement pas ce champ alors je vais juste itérer jusqu’à obtenir une réponse vide sans erreur.
Il y a aussi un champ since qui permet de limiter la recherche aux éléments plus récents qu’une certaine date. J’imaginais pouvoir me baser là dessus pour la pagination : Parcourir du plus vieux au plus récent, identifier la date du plus récent et repartir de là à la prochaine itération. C’est d’ailleurs la procédure recommandée pour beaucoup de services qui veulent éviter les problèmes que pose le parcours par offset. Malheureusement ça n’est pas utilisable pour la pagination : les items retournés ne sont correctement ordonnés ni par date d’ajout ni par date de modification.
Étrangement, il semble que la limite de 30 items par page ne soit pas forcée. Il semble que ça fonctionne avec beaucoup plus, mais que ça génère aussi plus d’erreurs. Le meilleur compromis semble effectivement dans les 25 à 30 items par page.
Dernière spécificité, j’ai l’impression de temps de réponse plus longs et d’erreurs plus fréquentes quand je vais du plus vieux au plus récent. Je n’ai pas vérifié cette impression avec des chiffres mais autant rester sur l’ordre par défaut : du plus récent au plus vieux.
Documentation incomplète
J’ai dit qu’il me manquait les entêtes de régulation et le champ total à la racine de la réponse. À l’opposé, j’ai quelques champs qui ne sont pas dans la documentation.
Le status semble être un entier avec, 0 pour une erreur, 1 pour OK, 2 quand il n’y a rien à afficher depuis une mise à jour. Quand status est à 0, le champ error contient le message d’erreur.
Il y a aussi un maxActions, dont je ne connais pas le sens.
Données irrécupérables sur le serveur
Pour une raison ou une autre, certaines de mes données semblent corrompues ou irrécupérables sur leur serveur (comme quoi la sauvegarde est utile ;-)..
J’ai 20 items qui provoquent systématiquement une erreur 504. Je peux récupérer ceux avant, ceux après, mais pas ceux là2. C’est vrai peu importe le sens de parcours (mais les offset ne sont logiquement pas les mêmes dans les deux sens).
Je n’ai pas plus d’explication. Je ne peux même pas connaitre les identifiants concernés pour demander leur suppression.
Potentiellement ce sont des données qui ne peuvent plus être réhydratées sur leurs serveurs, soient qu’il manque des informations essentielles, soit que leurs composants ne savent pas compléter ce qui manque (le serveur du lien sauvegardé qui répond bizarrement ?).
Erreurs aléatoires
Même avec une pagination basique, dans l’ordre par défaut, j’ai des erreurs fréquentes, aléatoires.
La plupart des 403 semblent liées à la limitation du nombre de requêtes, mais pas forcément toutes.
La plupart des 504 semblent liées à mes données irrécupérables mais il est arrivé que ça finisse pas passer quand même.
Les 502, en général il suffit de relancer la même requête, mais parfois l’erreur semble persister un moment.
Automatisation
Je parcours finalement tout par page de 30 et je mets à jour à chaque page le fichier de sauvegarde (pour les données récupérées) et le fichier de configuration (pour le nouvel offset de la prochaine requête). Si j’ai des erreurs inattendues, je pourrai relancer de là où j’en étais.
Si j’ai une page en erreur, je reprends tous les items de la page mais en allant les chercher mais 1 par 1 à partir de leur offset respectif. Parfois je ne retrouve pas l’erreur et ça permet de récupérer tout. Parfois l’erreur persiste sur un des éléments. Dans ce dernier cas l’idée c’est de pouvoir récupérer tous les bons items de la page et d’ignorer l’unique qui est en erreur.
Ça n’est pas parfait — si j’ai une erreur répétée mais temporaire sur un item, il sera ignoré silencieusement dans la sauvegarde — mais je n’ai pas mieux.
Une fois le parcours totalement fait une fois, je peux utiliser le since pour faire du différentiel.
Le code est sur https://github.com/edas/pocket-backup
RGPD à la rescousse
J’ai quand même prévu de faire une requête RGPD pour demander un export de mes données. On verra s’ils arrivent à me récupérer les 20 items qui sont en erreur permanente.
Si oui, je tenterai de les effacer pour reprendre un fonctionnement sans erreur. Sinon, je tenterai peut-être de réinitialiser le compte ou migrer ailleurs.
- Oui, tout ça. J’en suis moi-même étonné. J’ai tracé des usages depuis au moins fin 2010 mais je me demande si je ne l’utilisais pas au début de mon passage à Yahoo! en 2007–2008 du temps où ça s’appelait Read It Later. Ça fait une moyenne de 4 à 6 items par jour suivant la date retenue. ↩︎
- Je me les note pour moi-même : aujourd’hui ce sont les offset 14053, 14481, 17689, 18291, 18629, 19389, 20363, 20815, 20996, 20999, 21512, 21923, 22275, 22283, 22346, 23386, 23841, 24189, 24414, 27441. ↩︎
-
Tout sauvegarder – mars 2025
Nettoyer les écuries d’Augias c’est de la nioniotte à côté du projet de rapatrier toutes mes données en local pour les sauvegarder.
Ce que j’ai déjà
- Où sauvegarder en local
- Sauvegarder Gmail et Améliorer ma sauvegarde Gmail.
- Sauvegarder les SMS et les historiques d’appel
- Sauvegarder Google Drive et Google Photos
- Sauvegarder Github
- Sauvegarder mes sites web
- Sauvegarder Standard Notes
- Sauvegarder les calendriers Google
- Sauvegarder les contacts Google
- Sauvegarder Bitwarden
- Sauvegarder Pocket
Ce qui manque encore
Je vais étendre la liste au fur et à mesure. Il me manque encore pas mal de choses, et pas le plus simple. Au moins :
- Les favoris Firefox Sync
- Les abonnements RSS Inoreader
- Les abonnements, listes et peut-être messages Mastodon
- Les abonnements, listes et peut-être messages Bluesky
- Abonnements et messages Instagram
- Les messages Telegram
- Les messages Whatsapp
- Les messages Signal
- Mes abonnements Newpipe (local Android)
- Mon historique et documents Doctolib
- Mes contacts Linkedin, peut-être les messages aussi
- Mes historiques Spotify, Netflix, etc.
- Les discussions privées Slack
- Les factures et historiques d’un peu partout (boutiques en ligne, abonnements divers, edf, sncf, hôtel, internet, téléphone, etc.)
- Les relevés sécu et mutuelle
- Les relevés banque
Je regrette qu’on n’ait pas un vrai gros projet Open Source dont l’objectif est d’avoir des connecteurs pour tous les services en ligne de façon à rapatrier toutes nos données en local.
Cozy Cloud aurait pu faire ça mais la direction prise ne se centrait pas sur les connecteurs et le projet commercial n’a pas pu trouver sa place.
Automatisation en trois niveaux
Probablement qu’il me faudra faire évoluer mes outils. Je ne peux pas laisser les mots de passe de tout et n’importe quoi en clair.
J’imagine trois niveaux :
- Les sauvegardes automatiques. J’ai des token Oauth voire des mots de passe en clair dans les fichiers de configuration. C’est valable quand les données ne sont pas sensibles et que je tiens à ce que ça sauvegarde « sans moi »
- Les sauvegardes que je lancerai à la main, quand les données ou les mots de passe sont sensibles. Je pense faire des programmes qui s’interfacent directement avec le coffre Bitwarden, que je déverrouillerai dans la session pour l’occasion.
- Ce qui va être une énorme galère à coder : les service en ligne sans API ouverte avec de l’offuscation sur l’authentification, ainsi que les services en ligne derrière un 2FA non automatisable ou un captcha complexe à mimer. Là j’imagine une extension navigateur qui sauvegarde ce dont j’ai besoin quand je passe sur le site.
Copie en ligne
Bon, chaque chose en son temps.
Avant tout ça il faudra déjà que je branche BorgBase ou BackBlaze pour avoir une copie chiffrée en ligne, parce que pour l’instant ça ne fait que recopier en local.
Avec dans les 3 To, ça me prendra bien un bon mois pour faire la première synchronisation. Je sais envoyer plus vite mais je doute qu’on me libère des Gb/s pour moi tout seul.
-
Sauvegarder Bitwarden
Je continue mes sauvegardes.
Le coffre avec tous mes mots de passe est particulier. J’ai fait le choix de le stocker en ligne pour synchroniser tous mes appareils mais perdre tous mes mots de passe n’est pas une option.
Bitwarden a effectivement une copie locale sur tous les appareils mais ça ne me couvre pas si quelque chose est supprimé sur le serveur et que la suppression se réplique alors sur tous mes appareils.
J’ai besoin d’une vraie copie locale, à moi.
Je n’ai cependant pas besoin que la copie soit en clair. Plus exactement, les données sont trop sensibles et je préfère n’avoir que la copie chiffrée. Je sais que je trouverais comment la déchiffrer à la main en cas de besoin (je l’ai déjà fait par le passé).
Je pourrais utiliser la ligne de commande officielle et synchroniser le coffre avec une clé d’API. Il n’y a pas besoin du mot de passe maitre pour ça. Je ne maitrise cependant pas où il stocke le coffre et j’avais moyennement envie de ça sur des tâches de sauvegarde.
J’ai réimplémenté ça à la main avec un programme généré par IA. Il télécharge les paramètres de login, le profil utilisateur et le coffre (chiffré).
C’est du Rust parce que j’espérais utiliser le SDK officiel. Malheureusement ils n’exportent pas les appels bas niveau que je souhaite. J’ai perdu bien trop longtemps à le comprendre et à batailler. J’ai fini par faire mon implémentation à la main.
Si j’avais su que je finirais avec juste quelques appels HTTP, ça ne serait pas en Rust. Tant pis.
-
Sauvegarder les contacts Google
Je continue mes sauvegardes mais je n’ai pas trouvé d’outil adapté pour aller télécharger les contacts google. J’en suis même étonné.
Je suis passé quelques minutes par IA et j’ai pu récupérer ce qui m’intéressait avec https://github.com/edas/google-contacts-backup
Le programme récupère le format brut en provenance de Google, avec juste une sauvegarde en base64 des images en lien.
J’aurais préféré un outil plus abouti qui sache ne retélécharge que ce qui a changé. On verra une prochaine fois.
Si toutefois vous connaissez un outil un peu smart, glissez-moi le nom en commentaire.
-
Sauvegarder les calendriers Google
Je continue mes sauvegardes.
Les calendriers Google c’est finalement plus simple que le reste. Dans les paramètres de chaque calendrier, tout à la fin, il y a une adresse ics privée.
Je peux me contenter de faire un appel régulièrement et sauvegarder ça.
/opt/homebrew/bin/wget -nv -O /path/to/target.ics https://calendar.google.com/calendar/ical/xxxxx/private-xxxxx/basic.ics
Le plus gros calendrier fait tout juste 2 Mo. Il change tous les jours mais ça reste encore un poids acceptable.
Il faut juste bien penser à le faire pour chaque calendrier, y compris ceux que je créerai dans le futur. Ça doit pouvoir s’automatiser via les API Google Calendar mais je ne suis pas certain que ça vaille le coup pour l’instant.
-
Sauvegarder Standard Notes
Je continue mes sauvegardes.
Standard Notes j’ai beaucoup de choses dessus, surtout que j’y ai rapatrier mes anciennes notes de nvalt puis de Simple Note.
Il y a un mécanisme spécifique de backup dans Standard Notes, donc un qui permet d’envoyer une archive par email toutes les semaines. Chez moi ça envoyait en plusieurs exemplaires, et sans retirer le chiffrement.
Il y en a un autre qui permet de garder une trace locale. Je pourrais l’activer sur mon poste quotidien et faire en sorte que cette trace locale soit ensuite récupérée par Google Drive ou Tresorit. En pratique j’ai toujours eu des ennuis dès que je chaîne les outils de synchronisation. Je préfère éviter.
J’ai trouvé sn-cli, qui fait ce que j’espérais.
#!/bin/sh APP=$1 OUT=$2 EMAIL=xxxx PASS='xxxx' SN_EMAIL=$EMAIL SN_PASSWORD=$PASS $APP get items > $OUT/standardnotes.items.json SN_EMAIL=$EMAIL SN_PASSWORD=$PASS $APP get notes > $OUT/standardnotes.notes.json SN_EMAIL=$EMAIL SN_PASSWORD=$PASS $APP get tags > $OUT/standardnotes.tags.json
Ça me demande de laisser mon mot de passe en clair sur le disque de sauvegarde (qui lui est chiffré). Pas idéal mais ce n’est pas un jeu de données très sensible alors ça peut passer.
Plus tard je segmenterai probablement deux types de sauvegardes, une automatique et une que je lancerai à la main qui utilisera la CLI bitwarden avec une session uniquement le temps de la sauvegarde. Ce jour là ça basculera peut-être dans mes sauvegardes à la main. Ça reste acceptable entre temps.
-
Sauvegarder mes sites web
Toujours dans mes sauvegardes.
J’en ai profité pour passer quelques sites statiques basiques directement sur Github. Ils seront sauvegardés avec Github.
C’est moins évident pour les wordpress et ce qui a une base de données. Là j’ai fait un sous-répertoire « data » pour chaque projet avec un script cron qui y fait un dump quotidien.
J’ai ensuite un rsync qui va chercher régulièrement les données qui sont censées bouger (fichiers téléchargés, dump de base de données).
J’ai enfin un script cron qui sauvegarde la configuration du serveur web (nginx, php) sur le serveur lui-même, et là aussi un rsync pour la rapatrier en local.
C’est fait à la main mais c’est probablement suffisant;
-
Sauvegarder Github
Bon, pas tout Github, juste les projets auxquels je participe.
Il y a moyen de faire ça manuellement avec
git clone --mirror
. Je voulais quelque chose qui aille au moins lister mes projets pour les synchroniser automatiquement sans que j’ai besoin de les ajouter manuellement à mes scripts de sauvegarde.J’ai trouvé git-sync (attention, il y a beaucoup d’outils du même nom) qui fait exactement ce que je veux.
La configuration
# Repository settings include_forks: true # Include forked repositories include_wiki: true # Include wiki's include_repos: [] # Include specific repositories exclude_repos: [] # Exclude specific repositories include_orgs: [] # Include repositories from specific organizations exclude_orgs: [] # Exclude repositories from specific organizations raw_git_urls: [] # Raw valid git URLs # Authentication username: username tokens: [xxxxxx] # Server settings backup_dir: /path/to/backup-dir clone_type: mirror # Default: bare concurrency: 5 retry: count: 3 delay: 10 # in seconds platform: github server: domain: github.com protocol: https notification: enabled: false
Et pour lancer
git-sync --config /path/to/config.yaml
Au premier essai ça a synchronisé énormément de choses. Ça liste tous les dépôts où vous êtes membres, donc aussi tous les dépôts privés qui vous ont été partagés. Je me suis rendu compte qu’il y en avait un paquet pour moi, et j’ai pu faire un peu de ménage. Ça m’a aussi permis de marquer comme archives un paquet de vieux dépôts inutilisés, et de supprimer des trucs vides ou à peine commencés.
Je n’ai pas besoin de sauvegarder tout ça très fréquemment. Une fois par semaine devrait suffire. Maintenant, comme ça ne télécharge que ce qui change, j’exécuterai peut-être en quotidien.
-
Sauvegarder Google Drive et Google Photos
Je continue toujours sur mes sauvegardes.
Pour Google Drive j’aurais pu utiliser le client officiel mais j’ai besoin qu’il synchronise même quand je n’ai pas de session ouverte. J’aimerais aussi pouvoir gérer plusieurs utilisateurs facilement.
J’ai fouillé et trouvé rclone qui fait ça pour moi.
La procédure pour créer ses propres clés d’API est un peu pénible mais le reste fonctionne assez facilement. J’ai créé une clé d’API pour chaque compte. Rétrospectivement je ne suis pas certain que ça valait le coup.
L’outil est disponible sous homebrew
brew install rclone
Ma config
[gdrive-x] type = drive client_id = xxx.apps.googleusercontent.com client_secret = xxx scope = drive token = {"access_token":"xxxx","token_type":"Bearer","refresh_token":"xxx","expiry":"xxx"} team_drive = [gphotos-x] type = gphotos client_id = xxxx.apps.googleusercontent.com client_secret = xxxx include_archived = true read_only = true start_year = 1970 token = {"access_token":"xxxx","token_type":"Bearer","refresh_token":"xxx","expiry":"xxx"}
Et mon script de lancement
/opt/homebrew/bin/rclone --config=/path/to/rclone.conf --log-level NOTICE --fast-list --drive-skip-shortcuts sync gdrive-x: /path/to/gdrive-x/ /opt/homebrew/bin/rclone --config=/path/to/rclone.conf --retries-sleep 10s --log-level NOTICE --fast-list --exclude /media/all/** --exclude /media/by-year/** --exclude /media/by-day/** --exclude /upload/** sync gphotos-survol: /path/to/gphotos-x/
Le fonctionnement par défaut sur Google Photos implique beaucoup de doublons. La même image est sauvegardée dans les albums où elle est, plus dans /media/all, dans l’année concernée de /media/by-year, dans le mois concerné de /media/by-month et dans le jour concerné dans /media/by-day.
On peut facilement exclure une partie de ces répertoires (j’ai gardé la répartition par mois, ils déconseillent de garder celle par jour qui impose trop d’appels à Google Photos). Toutes les images ne sont pas toutefois dans des albums donc soit on a des doublons, soit on perd la notion d’albums.
Il faut penser à exclure /upload aussi pour ne pas avoir d’erreur inutiles. Ce répertoire ne sert que pour envoyer des images à Google.
La partie Photo est longue. Il est facile d’outrepasser les quotas qui sont assez réduit sur ce produit, même avec sa propre clé d’API. En cas de difficultés on peut faire une première passe avec les options suivantes :
--tpslimit 0.3 --tpslimit-burst 10 --low-level-retries 1 --retries 1 --transfers 1 --checkers 1
. Attention, dans ce cas ça va réellement durer des plombes.
Je vais faire lancer ça entre une fois par jour et une fois par semaine, ça suffira très bien pour juste un filet de sécurité.