From 890c95a4503cf4453baba8a83a250365880ce496 Mon Sep 17 00:00:00 2001 From: Richard Dern Date: Sat, 1 Nov 2025 15:40:40 +0100 Subject: [PATCH] Correction semi-automatique des liens morts --- .../critiques/films/jurassic-park/index.md | 2 +- .../jeux-video/ark-survival-evolved/index.md | 2 +- .../jurassic-world-evolution-2/index.md | 14 +- .../critiques/jeux-video/timberborn/index.md | 30 +-- .../02/14/la-station-meteo-parfaite/index.md | 2 +- .../01/07/la-station-meteo-parfaite/index.md | 2 +- .../index.md | 14 +- .../2021/02/28/rant-raspberry-pi-4/index.md | 2 +- .../2021/03/09/mon-reseau/index.md | 2 - .../2021/08/28/de-retour/index.md | 2 +- .../index.md | 2 +- .../03/22/mon-pc-de-jeu-est-mort/index.md | 2 +- .../index.md | 4 +- .../index.md | 2 +- .../index.md | 16 +- .../2022/12/23/bonne-annee-2023/index.md | 4 +- .../index.md | 2 +- .../index.md | 2 +- .../30/ma-moisson-des-soldes-steam/index.md | 2 +- .../14/internet-c-etait-mieux-avant/index.md | 2 +- .../08/16/reflexion-ia-et-licences/index.md | 2 +- .../2023/09/03/nouveau-site-en-ligne/index.md | 4 +- .../01/15/2024-l-annee-du-changement/index.md | 40 +-- .../02/19/j-ai-discute-avec-chatgpt/index.md | 2 +- .../index.md | 2 +- .../03/03/reflexions-leonardo-ai/index.md | 2 +- .../index.md | 4 +- .../index.md | 2 +- .../index.md | 2 +- .../index.md | 2 +- .../index.md | 2 +- tools/check_external_links.js | 45 +++- tools/config.json | 6 +- tools/lib/markdown_links.js | 24 +- tools/tests/markdown_links.test.js | 7 +- tools/update_external_links.js | 254 ++++++++++++++++++ 36 files changed, 405 insertions(+), 105 deletions(-) create mode 100644 tools/update_external_links.js diff --git a/content/critiques/films/jurassic-park/index.md b/content/critiques/films/jurassic-park/index.md index 52ffa572..639bcd8b 100644 --- a/content/critiques/films/jurassic-park/index.md +++ b/content/critiques/films/jurassic-park/index.md @@ -40,7 +40,7 @@ Perdu_, et dans une moindre mesure, dans la saga _Jurassic World_, c’est Jeff Goldblum, qui incarne le Professeur Ian Malcom, chaoticien de son temps. Ce qui est surprenant d’ailleurs, puisque -[je suis moi-même détracteur de la théorie du chaos](https://git.dern.ovh/Livres/reflexions/src/branch/main/03%20-%20Hasard%2C%20chaos/01-introduction.md) +[je suis moi-même détracteur de la théorie du chaos](https://git.dern.ovh/livres/reflexions/src/branch/main/03%20-%20Hasard%2C%20chaos/01-introduction.md) depuis longtemps ! Pourtant, Ian Malcom dégage une assurance charismatique, et s’exprime d’une voix telle que seul Jeff Goldblum est capable de produire. Et, en plus de son intelligence, il est doté d’un humour varié, allant de la diff --git a/content/critiques/jeux-video/ark-survival-evolved/index.md b/content/critiques/jeux-video/ark-survival-evolved/index.md index d678a1b5..bdfbc91d 100644 --- a/content/critiques/jeux-video/ark-survival-evolved/index.md +++ b/content/critiques/jeux-video/ark-survival-evolved/index.md @@ -11,7 +11,7 @@ title: "Ark: Survival Evolved" ## Configuration -J'utilise [ma nouvelle machine de jeu](/interets/informatique/2022/04/15/mon-nouveau-pc-de-jeu-est-arrive/), basée sur un Ryzen 9 5900X, 32G de mémoire, une RTX 3080 10G et un SSD de 1To. Mon moniteur est un [Huawei Mateview GT](https://consumer.huawei.com/fr/monitors/mateview-gt/), un 34 pouces WQHD (3440x1440). +J'utilise [ma nouvelle machine de jeu](/interets/informatique/2022/04/15/mon-nouveau-pc-de-jeu-est-arrive/), basée sur un Ryzen 9 5900X, 32G de mémoire, une RTX 3080 10G et un SSD de 1To. Mon moniteur est un [Huawei Mateview GT](https://consumer.huawei.com/fr/support/monitor/mateview-gt/), un 34 pouces WQHD (3440x1440). Je me fais plaisir : tous les curseurs à fond et toutes les options activées (à l'exception du _motion blur_ que je ne supporte dans aucun jeu). Et ça tourne très bien ! Pour être honnête, les FPS peuvent descendre jusqu'à 40 dans certaines circonstances (sur la première map du jeu quand on fait face à la forêt). Mais la plupart du temps je suis plutôt au-dessus de 90. Il faut dire que le jeu date tout de même de 2017 (2015 en comptant l'accès anticipé). diff --git a/content/critiques/jeux-video/jurassic-world-evolution-2/index.md b/content/critiques/jeux-video/jurassic-world-evolution-2/index.md index 2cb1d91b..6e14bc9c 100644 --- a/content/critiques/jeux-video/jurassic-world-evolution-2/index.md +++ b/content/critiques/jeux-video/jurassic-world-evolution-2/index.md @@ -1,6 +1,6 @@ --- cover: images/frO1rX.jpeg -date: '2021-11-10' +date: "2021-11-10" title: Jurassic World Evolution 2 --- @@ -22,16 +22,16 @@ en 1920x1080 à environ 60fps depuis la version 1.1.6. Quelques observations : - Sur ma config, le _FAA_ provoque un motion-blur assez désagréable en -plus d'être très moche et de flinguer les performances. Le _TAA_ en revanche est -très propre et économe en ressources (ou mieux optimisé), à condition de ne pas -utiliser l'upscaling. + plus d'être très moche et de flinguer les performances. Le _TAA_ en revanche est + très propre et économe en ressources (ou mieux optimisé), à condition de ne pas + utiliser l'upscaling. - Je trouve préférable d'avoir des ombres moins détaillées (réglage moyen) que -d'avoir des ombres qui disparaissent d'une partie de l'écran lorsque la caméra -prend de l'altitude. + d'avoir des ombres qui disparaissent d'une partie de l'écran lorsque la caméra + prend de l'altitude.
Mise à jour du 11 mars 2022 -J'utilise depuis quelques mois maintenant un moniteur [Huawei Mateview GT](https://consumer.huawei.com/fr/monitors/mateview-gt/), un 34 pouces WQHD (3440x1440), ce qui a tendance à pousser ma GTX1070 dans ses retranchements. Il devient difficile de conserver les réglages les plus élevés avec une telle résolution. +J'utilise depuis quelques mois maintenant un moniteur [Huawei Mateview GT](https://consumer.huawei.com/fr/support/monitor/mateview-gt/), un 34 pouces WQHD (3440x1440), ce qui a tendance à pousser ma GTX1070 dans ses retranchements. Il devient difficile de conserver les réglages les plus élevés avec une telle résolution.
diff --git a/content/critiques/jeux-video/timberborn/index.md b/content/critiques/jeux-video/timberborn/index.md index a2ba16cd..c9924568 100644 --- a/content/critiques/jeux-video/timberborn/index.md +++ b/content/critiques/jeux-video/timberborn/index.md @@ -1,6 +1,6 @@ --- cover: images/dOF7rd.jpg -date: '2023-07-06' +date: "2023-07-06" title: Timberborn --- @@ -10,14 +10,14 @@ Sympa, mignon, "rafraîchissant"... ## Configuration -J'utilise [ma machine de jeu](/interets/informatique/2022/04/15/mon-nouveau-pc-de-jeu-est-arrive/), basée sur un Ryzen 9 5900X, 32G de mémoire, une RTX 3080 10G et un SSD de 1To. Mon moniteur est un [Huawei Mateview GT](https://consumer.huawei.com/fr/monitors/mateview-gt/), un 34 pouces WQHD (3440x1440). +J'utilise [ma machine de jeu](/interets/informatique/2022/04/15/mon-nouveau-pc-de-jeu-est-arrive/), basée sur un Ryzen 9 5900X, 32G de mémoire, une RTX 3080 10G et un SSD de 1To. Mon moniteur est un [Huawei Mateview GT](https://consumer.huawei.com/fr/support/monitor/mateview-gt/), un 34 pouces WQHD (3440x1440). Le jeu tourne parfaitement bien sous NixOS. Peu gourmand et bien optimisé, il se lance très rapidement et reste parfaitement fluide en toute circonstance. ## Présentation -*Timberborn* est un jeu de "création de base", de gestion de colonie. +_Timberborn_ est un jeu de "création de base", de gestion de colonie. Il se distingue par plusieurs points que je détaillerai plus tard, mais en particulier par son accroche : nous sommes dans une situation post-apocalyptique vue à travers les yeux de castors ! Les "Rustiqueues" sont la première faction jouable. @@ -36,7 +36,7 @@ Il n'est question que de monter une colonie prospère et auto-suffisante, dans u ## Premières heures de jeu -*Timberborn* offre un didacticiel complètement intégré à la première partie lancée. +_Timberborn_ offre un didacticiel complètement intégré à la première partie lancée. Si, habituellement, une fois qu'on a complété le tutoriel de ce genre de jeux, on est pressé de lancer une nouvelle partie pour mettre à l'oeuvre ce que l'on vient d'apprendre, on n'a pas vraiment envie d'abandonner ses premiers castors... ![0b2UFE](images/0b2UFE.jpg) @@ -44,8 +44,8 @@ Si, habituellement, une fois qu'on a complété le tutoriel de ce genre de jeux, D'autant que la première carte proposée est intéressante : assez facile pour démarrer le jeu en douceur, mais assez grande pour explorer toutes ses possibilités. En fait, on découvrira que la difficulté est bien gérée sur toutes les cartes disponibles. Et si aucune ne convient, on appréciera l'existence d'un créateur de cartes intégré (très facile à utiliser), qui permet même la modification des cartes officielles. -On regrettera en revanche que le *workshop* Steam ne soit pas - encore - intégré, ce qui aurait permis de faciliter l'installation de nouvelles cartes. -Qu'à cela ne tienne : les plus aventureux feront comme on faisait "de mon temps" : on téléchargera de nouvelles *maps* à la main et on les mettra dans le dossier qui va bien. +On regrettera en revanche que le _workshop_ Steam ne soit pas - encore - intégré, ce qui aurait permis de faciliter l'installation de nouvelles cartes. +Qu'à cela ne tienne : les plus aventureux feront comme on faisait "de mon temps" : on téléchargera de nouvelles _maps_ à la main et on les mettra dans le dossier qui va bien. Ceci dit, j'ai trouvé les cartes officielles particulièrement intéressantes. Leur variété est exemplaire : que l'on s'étonne de trouver une carte nommée "Diorama", la plus petite, et pourtant dotée de tout le nécessaire pour établir une colonie ! @@ -55,8 +55,8 @@ Explorer rapidement ces différentes cartes avec l'éditeur intégré est très ## Mécaniques de jeu -*Timberborn* n'est pas un jeu compliqué. -Le *micro-management* est très abordable et, si l'on prend son temps, ne représente pas une grande difficulté. +_Timberborn_ n'est pas un jeu compliqué. +Le _micro-management_ est très abordable et, si l'on prend son temps, ne représente pas une grande difficulté. On fera simplement attention de ne pas produire trop d'habitations si l'on manque de nourriture par exemple... Globalement, c'est un jeu de gestion de colonie comme un autre : on récolte des ressources, on les entasse, on les transforme pour produire des ingrédients intermédiaires pour des constructions plus élaborées, tout en amassant de la science qui servira à débloquer de nouvelles productions. @@ -64,7 +64,7 @@ En outre, on s'assurera de la croissance - mesurée - de sa colonie, et on assur ![FFoFiM](images/FFoFiM.jpg) -*Timberborn* se distingue toutefois sur quelques caractéristiques fondamentales, et notamment la gestion de l'eau. +_Timberborn_ se distingue toutefois sur quelques caractéristiques fondamentales, et notamment la gestion de l'eau. Après un certain nombre de cycles jour/nuit, une sécheresse finira par survenir, tôt ou tard, et pour une durée plus ou moins longue. Si l'eau peut être stockée dans des réservoirs pour la consommation individuelle des castors, ces réserves ne pourront pas être utilisées pour l'approvisionnement en énergie des différentes machines à construire. @@ -77,7 +77,7 @@ Bien qu'impitoyable face aux machines mécaniques (et à l'agriculture), les sé ![Jsztzi](images/Jsztzi.jpg) Évidemment, la solution éolienne ne supplée pas totalement à l'énergie hydraulique, y compris en période de sécheresse : le vent aussi va et vient comme bon lui semble, et tout ce que l'on peut faire, c'est minimiser les pertes de travail que cela occasionne. -Cependant, cet équilibre est moins pénible à maintenir qu'il n'y parait : rien, dans *Timberborn*, ne donne l'impression d'être contraignant ; on n'a pas l'impression de s'infliger des tâches rébarbatives alors qu'on est dans un jeu, tout simplement parce que les conséquences de défauts de gestion ne sont pas punitives. +Cependant, cet équilibre est moins pénible à maintenir qu'il n'y parait : rien, dans _Timberborn_, ne donne l'impression d'être contraignant ; on n'a pas l'impression de s'infliger des tâches rébarbatives alors qu'on est dans un jeu, tout simplement parce que les conséquences de défauts de gestion ne sont pas punitives. J'ignore à l'heure actuelle si c'est parce que je joue "correctement", mais je n'ai jamais vu un de mes castors mourir pour une autre raison que la vieillesse ; pourtant, au cours de la même partie, ils ont vécu la famine, la fatigue, les blessures, l'isolement[^isolement] et la déshydratation... [^isolement]: J'ai, sans le vouloir évidemment, isolé un castor entre trois habitations en oubliant de construire un chemin au milieu. @@ -95,7 +95,7 @@ Cultiver le bois et développer son agriculture nécessite évidemment de bien g Il est important de noter que les régions peu propices à l'agriculture (c'est-à-dire, ce qui n'est pas à proximité d'une rivière) peuvent être approvisionnées en eau, et que l'inverse est aussi vrai : des régions apparemment fertiles (couvertes d'herbe) peuvent se transformer en désert sous l'effet de la sécheresse. On pourra utiliser des tours d'irrigation en début de partie, mais on est fortement encouragés à transformer l'environnement en creusant des canaux et des bacs de rétention à grand renfort de dynamite... -Autre caractéristique intéressante de *Timberborn*, la gestion des districts : un district peut s'étendre sur des dimensions "restreintes", "limitées" par la longueur des chemins créés. +Autre caractéristique intéressante de _Timberborn_, la gestion des districts : un district peut s'étendre sur des dimensions "restreintes", "limitées" par la longueur des chemins créés. J'emploie les guillemets parce qu'il n'y a pas de limite "dure" : c'est juste que plus les chemins sont longs, plus longtemps les castors vont mettre pour rejoindre deux points. Par soucis d'optimisation, on créera donc un nouveau district. @@ -107,14 +107,14 @@ C'est un point inhabituel (à ma connaissance), qui rend le milieu de partie par En vérité, ces districts ne sont totalement indépendants que jusqu'à ce que vous les reliiez par un passage interdistrict, sorte de poste frontière qui permet l'échange de marchandises entre districts, ce qui peut s'avérer salvateur pour les districts qui se concentrent sur la récolte d'une ressource spécifique (typiquement le métal). En fin de partie, on cherchera à récolter du métal, d'abord en démontant d'anciennes ruines laissées sur place par les humains, puis en exploitant des mines souterraines : les ruines offrent du métal en quantité limitée, au contraire des mines. -Ce métal servira notamment à produire des *bots*, des castors mécanisés qui aideront les castors "naturels" dans leurs tâches quotidiennes. +Ce métal servira notamment à produire des _bots_, des castors mécanisés qui aideront les castors "naturels" dans leurs tâches quotidiennes. ![3koNvC](images/3koNvC.jpg) ## Conclusion -Il ne faut pas chercher de la grande stratégie ou de la gestion poussée dans *Timberborn*. -Ce qui est proposé est plus calme, moins prise de tête ; on cherche ici la valorisation, la satisfaction, le plaisir de jouer *pour jouer*, avec des règles relativement simples et pas punitives. +Il ne faut pas chercher de la grande stratégie ou de la gestion poussée dans _Timberborn_. +Ce qui est proposé est plus calme, moins prise de tête ; on cherche ici la valorisation, la satisfaction, le plaisir de jouer _pour jouer_, avec des règles relativement simples et pas punitives. Alors que l'on doit se développer progressivement, petit à petit, les journées sont très courtes et s'enchaînent très vite. C'est là le plus gros défaut du jeu : ce rythme est à l'origine de temps d'attente, parfois très long, jusqu'à la complétion d'une tâche, puisqu'elle est entrecoupée de pauses pour le repos nocturne des castors. @@ -130,5 +130,5 @@ Après 37 heures de jeu, j'ai débloqué la deuxième faction du jeu, et je n'ai Il me reste donc encore pas mal de choses à explorer, et c'est un jeu auquel je reviendrai volontiers. J'anticipais une durée de vie [d'une cinquantaine d'heures](/interets/informatique/2023/06/30/ma-moisson-des-soldes-steam/#timberborn) et pour l'instant, cette trajectoire est suivie. -Je ne recommande pas *Timberborn* aux joueurs *hardcore* qui vont rapidement tourner en rond. +Je ne recommande pas _Timberborn_ aux joueurs _hardcore_ qui vont rapidement tourner en rond. Je le recommande chaudement par contre à ceux qui recherchent une expérience de jeu moins exigeante que les ténors du genre. diff --git a/content/interets/electronique/2022/02/14/la-station-meteo-parfaite/index.md b/content/interets/electronique/2022/02/14/la-station-meteo-parfaite/index.md index dc353120..f8dcef04 100644 --- a/content/interets/electronique/2022/02/14/la-station-meteo-parfaite/index.md +++ b/content/interets/electronique/2022/02/14/la-station-meteo-parfaite/index.md @@ -103,7 +103,7 @@ J'aimerais ajouter de nouveaux capteurs, et voici mes premières idées : - caméra infrarouge (pour voir la faune locale la nuit !) - un capteur de couleur (je ne sais pas si je vais quelque part avec ça mais je veux faire mes tests !) - un capteur d'UV -- un [compteur Geiger](https://fr.wikipedia.org/wiki/Compteur_Geiger), qui risque d'être le plus intéressant de mes capteurs, surtout si je peux [le monter moi-même](https://mightyohm.com/interets/informatique/products/geiger-counter/), rien que pour le fun que ça me procurera ! +- un [compteur Geiger](https://fr.wikipedia.org/wiki/Compteur_Geiger), qui risque d'être le plus intéressant de mes capteurs, surtout si je peux [le monter moi-même](https://mightyohm.com/blog/products/geiger-counter/), rien que pour le fun que ça me procurera ! - un GPS, évidemment pour obtenir des coordonnées précises et - surtout - mon altitude (même si je pourrais la calculer à partir de la pression atmosphérique, mais j'ai de toute façon l'intention de faire les deux), mais aussi pour obtenir un indicateur temporel dont je pourrais me servir sur l'ensemble de mon réseau local via [NTP](http://www.ntp.org) - un ou plusieurs capteurs de qualité de l'air, ce qui peut inclure la détection de gaz, de poussières, de pollens, de particules fines, etc. à voir si c'est faisable en terme de consommation d'énergie - un capteur de choc/vibration, qui serait d'un intérêt extrême pour la mesure d'une activité sismique, mais qui va nécessiter un peu de réflexion pour produire des résultats plus ou moins fiables diff --git a/content/interets/electronique/2023/01/07/la-station-meteo-parfaite/index.md b/content/interets/electronique/2023/01/07/la-station-meteo-parfaite/index.md index b40e195d..f102ca84 100644 --- a/content/interets/electronique/2023/01/07/la-station-meteo-parfaite/index.md +++ b/content/interets/electronique/2023/01/07/la-station-meteo-parfaite/index.md @@ -103,7 +103,7 @@ J'aime bien l'idée d'avoir une information immédiate et binaire, en plus de la ## Compteur Geiger -[Ce compteur Geiger](https://mightyohm.com/interets/informatique/products/geiger-counter/) est mon petit plaisir, juste parce que je peux (et je vais) l'assembler moi-même, mais aussi parce qu'il est bien conçu : il peut fonctionner de façon autonome, mais aussi avec un micro-contrôleur. +[Ce compteur Geiger](https://mightyohm.com/blog/products/geiger-counter/) est mon petit plaisir, juste parce que je peux (et je vais) l'assembler moi-même, mais aussi parce qu'il est bien conçu : il peut fonctionner de façon autonome, mais aussi avec un micro-contrôleur. Vu son prix, qui représente tout mon budget initial (une centaine d'euros), il ne sera pas intégré tout de suite au projet. diff --git a/content/interets/informatique/2016/07/27/alphabet-une-entreprise-pas-comme-les-autres/index.md b/content/interets/informatique/2016/07/27/alphabet-une-entreprise-pas-comme-les-autres/index.md index dc33c18e..70697e32 100644 --- a/content/interets/informatique/2016/07/27/alphabet-une-entreprise-pas-comme-les-autres/index.md +++ b/content/interets/informatique/2016/07/27/alphabet-une-entreprise-pas-comme-les-autres/index.md @@ -1,6 +1,6 @@ --- cover: images/OfLvCd.webp -date: '2016-07-27' +date: "2016-07-27" title: Alphabet, une entreprise pas comme les autres --- @@ -58,7 +58,7 @@ Mais, c’est Google, alors c’est forcément bien. Ces deux entreprises veulent notamment, respectivement, “tuer la mort” et soigner le diabète. Des projets pour le bien de l’humanité ? -Oh, vous ne pouvez pas être naïfs à ce point… +Oh, vous ne pouvez pas être naïfs à ce point… Tout le monde le sait, le marché de la santé est on ne peut plus lucratif. Surtout dans un pays dont l’obésité morbide est aussi prépondérante. @@ -80,10 +80,10 @@ Mais, on va m’accuser de conspirationnisme. Quand on phagocyte les données de millions (milliards ?) d’internautes, la bande passante revient cher. La solution ? Fournir Internet à une partie des utilisateurs. -C’est aussi [ce que fait facebook d’ailleurs](https://www.facebook.com/connectivity/). +C’est aussi [ce qu'a fait facebook d’ailleurs](https://www.theverge.com/2022/12/12/23505353/meta-connectivity-shutdown-facebook-internet). Du coup, il n’aurait jamais été aussi rentable d’aspirer la vie privée des gens. -Et de leur envoyer des pubs soigneusement ciblées, grâce à… +Et de leur envoyer des pubs soigneusement ciblées, grâce à… ### … X @@ -120,7 +120,7 @@ Enfin, Jigsaw est officiellement un incubateur technologique, mais… je vous in Il traite notamment de Jared Cohen, de son étonnante carrière, et de son rôle dans Jigsaw. Personne ne le connaît. -Il est pourtant dans le top 100 des personnes les plus influentes du monde selon le *Time Magazine*. +Il est pourtant dans le top 100 des personnes les plus influentes du monde selon le _Time Magazine_. Bien qu’officiellement il travaille à l’anti-radicalisation, un certain mystère l’entoure, notamment au sujet de ses activités en Afghanistan en 2009, en plein [Cablegate](https://fr.wikipedia.org/wiki/Révélations_de_télégrammes_de_la_diplomatie_américaine_par_WikiLeaks). @@ -166,10 +166,10 @@ Si Microsoft était détesté dans les années 90 (et l’est toujours), Google/ Il aura fallu une dizaine d’années à Microsoft pour se faire détester pour ses manquements à la vie privée. Google la piétine constamment et est toujours acclamé pour ça, presque vingt ans après sa création. Une véritable prouesse ! -Même [Apple a tenu tête au FBI](https://web.archive.org/web/20160417095930mp_/http://www.france24.com/fr/20160218-apple-fbi-chine-iphone-securite-san-bernardino-censure-pekin-cook-posture), alors que l’on ne les a jamais vraiment encensés pour protéger la vie privée de leurs utilisateurs… +Même [Apple a tenu tête au FBI](https://web.archive.org/web/20160417095930mp_/http://www.france24.com/fr/20160218-apple-fbi-chine-iphone-securite-san-bernardino-censure-pekin-cook-posture), alors que l’on ne les a jamais vraiment encensés pour protéger la vie privée de leurs utilisateurs… Les concurrents de Alphabet sont peu nombreux sur certains marchés clés, comme la téléphonie mobile où la perte de Microsoft n’est pas catastrophique, mais où celle d’Apple le serait, ou les navigateurs Web, où Mozilla peine à maintenir Firefox. Il est capital que ces alternatives existent, et que d’autres voient le jour, faute de quoi Internet ne sera plus réduit qu’à pas grand-chose : beaucoup de publicités, et au milieu, ce que Google veut bien vous laisser voir en fonction de qui vous êtes. Il n’y aura plus la place pour la découverte et la nouveauté. Juste une zone de texte pour votre empreinte de carte bancaire et un bouton vert “Acheter”. -C’est vraiment ça que vous voulez ? \ No newline at end of file +C’est vraiment ça que vous voulez ? diff --git a/content/interets/informatique/2021/02/28/rant-raspberry-pi-4/index.md b/content/interets/informatique/2021/02/28/rant-raspberry-pi-4/index.md index 6ac9a719..e52fb7e9 100644 --- a/content/interets/informatique/2021/02/28/rant-raspberry-pi-4/index.md +++ b/content/interets/informatique/2021/02/28/rant-raspberry-pi-4/index.md @@ -46,7 +46,7 @@ Le support de stockage de prédilection du Raspberry Pi est la carte micro-SD, q Bien que j'apprécie la possibilité de démarrer depuis le réseau, je trouve que c'est très complexe à mettre en oeuvre, et peu pratique à l'usage. C'est un plus indéniable dans une utilisation "industrielle" du Pi, mais dans un cadre privé, c'est trop incommode. Notez que cette remarque n'est pas spécifique au Raspberry Pi mais au _network boot_ en général. -Enfin, il est possible de démarrer depuis un périphérique USB. Par contre, c'est une fonctionnalité que j'estime avoir attendu trop longtemps (elle était disponible sur les versions précédentes du Pi, mais les changements matériels apportés au Pi 4 ont imposé des changements au niveau logiciel de la procédure de démarrage), et n'est toujours pas universelle, en particulier en ce qui concerne les SSD externes. Certains boitiers sont reconnus et permettent le boot par USB, d'autres non, et cela dépend parfois du système d'exploitation : Raspberry Pi OS peut démarrer depuis un boitier spécifique, mais FreeBSD ou même [Home Assistant OS](https://www.home-assistant.io/installation/raspberrypi) ne le peut pas. Et je ne parle pas du support de [TRIM](https://en.wikipedia.org/wiki/Trim_(computing)) qui nécessite parfois [une configuration spécifique](https://lemariva.com/interets/informatique/2020/08/raspberry-pi-4-ssd-booting-enabled-trim). +Enfin, il est possible de démarrer depuis un périphérique USB. Par contre, c'est une fonctionnalité que j'estime avoir attendu trop longtemps (elle était disponible sur les versions précédentes du Pi, mais les changements matériels apportés au Pi 4 ont imposé des changements au niveau logiciel de la procédure de démarrage), et n'est toujours pas universelle, en particulier en ce qui concerne les SSD externes. Certains boitiers sont reconnus et permettent le boot par USB, d'autres non, et cela dépend parfois du système d'exploitation : Raspberry Pi OS peut démarrer depuis un boitier spécifique, mais FreeBSD ou même [Home Assistant OS](https://www.home-assistant.io/installation/raspberrypi) ne le peut pas. Et je ne parle pas du support de [TRIM](https://en.wikipedia.org/wiki/Trim_(computing)) qui nécessite parfois [une configuration spécifique](https://lemariva.com/blog/2020/08/raspberry-pi-4-ssd-booting-enabled-trim). - Wifi diff --git a/content/interets/informatique/2021/03/09/mon-reseau/index.md b/content/interets/informatique/2021/03/09/mon-reseau/index.md index 5e7742f7..14b47911 100644 --- a/content/interets/informatique/2021/03/09/mon-reseau/index.md +++ b/content/interets/informatique/2021/03/09/mon-reseau/index.md @@ -7,8 +7,6 @@ J’avais envie d’honorer une vieille tradition geek : présenter mon réseau, -- L’historique de cet article est consultable depuis [ma forge logicielle](https://git.dern.ovh/Blog/contenu/src/branch/main/interets/informatique/2021/03/09/mon-reseau/index.md) - ## Généralités Je suis client [free](https://portail.free.fr) depuis 2004, et j’ai la fibre depuis mars 2023. diff --git a/content/interets/informatique/2021/08/28/de-retour/index.md b/content/interets/informatique/2021/08/28/de-retour/index.md index 1601b320..3554bf11 100644 --- a/content/interets/informatique/2021/08/28/de-retour/index.md +++ b/content/interets/informatique/2021/08/28/de-retour/index.md @@ -115,7 +115,7 @@ J'aimerais reprendre un peu l'écriture. Peut-être pas dans le but de produire livre, mais en tout cas consigner mes pensées, mes réflexions, en plus de celles que j'écris manuellement dans des carnets de cuir. Le ton n'y est pas le même, le contexte non plus. Mes futurs écrits qui seront publiés -[dans ma forge](https://git.dern.ovh/Livres) auront une valeur +[dans ma forge](https://git.dern.ovh/livres) auront une valeur philosophique, tandis que mes écris de plume et d'encre ont plus une valeur historique, tel un journal de ma vie dans ce monde. diff --git a/content/interets/informatique/2022/03/11/a-la-recherche-du-clavier-parfait-personnalisation-terminee/index.md b/content/interets/informatique/2022/03/11/a-la-recherche-du-clavier-parfait-personnalisation-terminee/index.md index 9eceb416..ae65c1e5 100644 --- a/content/interets/informatique/2022/03/11/a-la-recherche-du-clavier-parfait-personnalisation-terminee/index.md +++ b/content/interets/informatique/2022/03/11/a-la-recherche-du-clavier-parfait-personnalisation-terminee/index.md @@ -11,7 +11,7 @@ Paré des keycaps [Akko Macaw](https://en.akkogear.com/product/macaw-keycap-set- Le clavier repose sur un tapis de bureau de la même marque de dimensions généreuses : 90cm par 40cm et surtout, 5mm d'épaisseur là où la plupart des tapis de même dimensions et de qualité inférieure ne sont épais que de 2 à 4cm. Aux motifs "océaniques", ce tapis se marie à la perfection avec le clavier, en plus d'être très confortable, et aux finitions irréprochables. Étonnant pour un tapis à moins de 30 euros ! Akko est définitivement un constructeur plein de surprises... -Loin de dénaturer l'ensemble, le repose-poignets en marbre est comme une généreuse écume, survolant la mer et reflétant la lumière de mille façons différentes. L'ensemble est poétique, reposant, un délice pour les yeux et pour les mains. Non, le marbre n'est pas froid, il est de la même température que mes poignets, en plus d'être délicat et soyeux. Il est vrai, en revanche, que le tapis de souris SteelSeries dénote, de même que la souris [SteelSeries Rival 3 Wireless](https://steelseries.com/gaming-mice/rival-3-wireless) (que j'ai [testé et adopté](/interets/informatique/2021/11/08/test-steelseries-rival-3-wireless/)). Mais je ne suis pas prêt à abandonné les tapis rigides, pas plus que les [patins en céramique](https://www.lexip.co/fr/produits/Mo42) (ni même la Rival, d'ailleurs). +Loin de dénaturer l'ensemble, le repose-poignets en marbre est comme une généreuse écume, survolant la mer et reflétant la lumière de mille façons différentes. L'ensemble est poétique, reposant, un délice pour les yeux et pour les mains. Non, le marbre n'est pas froid, il est de la même température que mes poignets, en plus d'être délicat et soyeux. Il est vrai, en revanche, que le tapis de souris SteelSeries dénote, de même que la souris [SteelSeries Rival 3 Wireless](https://steelseries.com/gaming-mice/rival-3-wireless) (que j'ai [testé et adopté](/interets/informatique/2021/11/08/test-steelseries-rival-3-wireless/)). Mais je ne suis pas prêt à abandonné les tapis rigides, pas plus que les [patins en céramique](https://www.lexip.co/products/mo42-6-patins-ceramique-souris) (ni même la Rival, d'ailleurs). ![n0qAcb](images/n0qAcb.jpg) diff --git a/content/interets/informatique/2022/03/22/mon-pc-de-jeu-est-mort/index.md b/content/interets/informatique/2022/03/22/mon-pc-de-jeu-est-mort/index.md index 67fed695..bd3f217e 100644 --- a/content/interets/informatique/2022/03/22/mon-pc-de-jeu-est-mort/index.md +++ b/content/interets/informatique/2022/03/22/mon-pc-de-jeu-est-mort/index.md @@ -13,7 +13,7 @@ Malheureusement, c'est à l'agonie qu'il a fini ses jours. Probablement à cause Or, changer une carte mère aussi vieille n'a pas de sens. Principalement parce qu'elle n'est plus vendue, et puis, parce que ses remplaçantes veulent de nouveaux compagnons, eux aussi plus évolués. Fondamentalement, je ne peux récupérer de mon ancien PC de jeu que le boîtier (un vieillissant et immense Cooler Master HAF-X), les 2x 8Go de DDR4, et mes deux SSDs. J'ignore si je peux faire quelque chose du Core i7 7700k, je ne me sens pas de le revendre. -En conséquence, j'ai choisi le matériel qui en prendra la relève. Mon choix s'est porté sur un processeur [Intel Core i7 12700k](https://www.intel.fr/content/www/fr/fr/products/sku/134594/intel-core-i712700k-processor-25m-cache-up-to-5-00-ghz/specifications.html), un système de refroidissement en watercooling (mon premier) de chez [MSI](https://fr.msi.com/Liquid-Cooling/MAG-CORELIQUID-C240), et une carte mère [Asrock B660M Steel Legend](https://www.asrock.com/mb/Intel/B660M_Steel_Legend/index.asp). Le tout pour 891€, payé en 4x sans frais grâce à Paypal. Quand ce crédit-là sera remboursé, je lancerai la dernière étape de mon grand remplacement avec l'acquisition d'une RTX 3080 (ti) selon les disponibilités et les tarifs, ou tout modèle qui suivra, et qui sera au sommet de la hiérarchie, hors modèles d'oligarques (genre les RTX 3090). +En conséquence, j'ai choisi le matériel qui en prendra la relève. Mon choix s'est porté sur un processeur [Intel Core i7 12700k](https://www.intel.fr/content/www/fr/fr/products/sku/134594/intel-core-i712700k-processor-25m-cache-up-to-5-00-ghz/specifications.html), un système de refroidissement en watercooling (mon premier) de chez [MSI](https://fr.msi.com/Liquid-Cooling/MAG-CORELIQUID-C240), et une carte mère [Asrock B660M Steel Legend](https://www.asrock.com/mb/Intel/B660M%20Steel%20Legend/index.fr.asp). Le tout pour 891€, payé en 4x sans frais grâce à Paypal. Quand ce crédit-là sera remboursé, je lancerai la dernière étape de mon grand remplacement avec l'acquisition d'une RTX 3080 (ti) selon les disponibilités et les tarifs, ou tout modèle qui suivra, et qui sera au sommet de la hiérarchie, hors modèles d'oligarques (genre les RTX 3090). La commande pour le CPU et la carte mère est faite, j'attends là son expédition. Puis son montage. Couplés à mes 2x 8G de DDR4, à mes SSDs, mon HAF-X, ma Seasonic X850, et ma MSI GTX1070. diff --git a/content/interets/informatique/2022/03/27/toujours-pas-de-remplacant-pour-mon-pc-de-jeu/index.md b/content/interets/informatique/2022/03/27/toujours-pas-de-remplacant-pour-mon-pc-de-jeu/index.md index 34567f7f..464bf066 100644 --- a/content/interets/informatique/2022/03/27/toujours-pas-de-remplacant-pour-mon-pc-de-jeu/index.md +++ b/content/interets/informatique/2022/03/27/toujours-pas-de-remplacant-pour-mon-pc-de-jeu/index.md @@ -5,11 +5,11 @@ title: Toujours pas de remplaçant pour mon PC de jeu ## Choix du matériel -Il y a quelques jours, je déplorais [la mort de mon PC de jeu](/interets/informatique/2022/03/22/mon-pc-de-jeu-est-mort/), alors basé sur un [Intel Core i7 7700K](https://www.intel.com/content/www/us/en/products/sku/97129/intel-core-i77700k-processor-8m-cache-up-to-4-50-ghz/specifications.html) et une carte mère [Asus ROG Strix Z270F](https://rog.asus.com/motherboards/rog-strix/rog-strix-z270f-gaming-model/). J'ai choisi un [Intel Core i7 12700k](https://www.intel.fr/content/www/fr/fr/products/sku/134594/intel-core-i712700k-processor-25m-cache-up-to-5-00-ghz/specifications.html) et une [Asrock B660M Steel Legend](https://www.asrock.com/mb/Intel/B660M_Steel_Legend/index.asp). +Il y a quelques jours, je déplorais [la mort de mon PC de jeu](/interets/informatique/2022/03/22/mon-pc-de-jeu-est-mort/), alors basé sur un [Intel Core i7 7700K](https://www.intel.com/content/www/us/en/products/sku/97129/intel-core-i77700k-processor-8m-cache-up-to-4-50-ghz/specifications.html) et une carte mère [Asus ROG Strix Z270F](https://rog.asus.com/motherboards/rog-strix/rog-strix-z270f-gaming-model/). J'ai choisi un [Intel Core i7 12700k](https://www.intel.fr/content/www/fr/fr/products/sku/134594/intel-core-i712700k-processor-25m-cache-up-to-5-00-ghz/specifications.html) et une [Asrock B660M Steel Legend](https://www.asrock.com/mb/Intel/B660M%20Steel%20Legend/index.fr.asp). Pour la carte mère, j'aime bien ASRock : moins *mainstream* qu'Asus, et, de mon expérience, beaucoup plus robuste et durable. Rares sont mes cartes Asus qui ont tenu aussi longtemps que mes cartes ASRock, même d'entrée de gamme, et même avec CPU intégré (comme la [E350M1](https://www.asrock.com/mb/AMD/E350M1/) qui me rend encore service). -Le Core i7 12700k est un choix évident pour moi. C'est ce qu'il se fait de mieux pour toutes les tâches, et surtout le jeu. J'aurais pu aussi choisir une plateforme AMD. Pour un tarif équivalent, j'aurais pu me baser sur un [AMD Ryzen 9 5950X](https://www.amd.com/fr/products/processors/desktops/ryzen/5000-series/amd-ryzen-9-5950x.html) et une [ASRock B550M Pro4](https://www.asrock.com/mb/AMD/B550M_Pro4/index.asp). +Le Core i7 12700k est un choix évident pour moi. C'est ce qu'il se fait de mieux pour toutes les tâches, et surtout le jeu. J'aurais pu aussi choisir une plateforme AMD. Pour un tarif équivalent, j'aurais pu me baser sur un [AMD Ryzen 9 5950X](https://www.amd.com/fr/products/processors/desktops/ryzen/5000-series/amd-ryzen-9-5950x.html) et une [ASRock B550M Pro4](https://www.asrock.com/mb/AMD/B550M%20Pro4/index.fr.asp). Dans tous les cas, je ne peux pas récupérer mon ancien [Cooler Master Hyper 412S](https://www.coolermaster.com/catalog/legacy-products/cooling/hyper-412s/), probablement insuffisant pour dissiper la chaleur générée par ces processeurs. L'occasion pour moi de passer au watercooling avec un [MSI MAG CORELIQUID C240](https://fr.msi.com/Liquid-Cooling/MAG-CORELIQUID-C240). diff --git a/content/interets/informatique/2022/06/30/test-steelseries-aerox-3-wireless/index.md b/content/interets/informatique/2022/06/30/test-steelseries-aerox-3-wireless/index.md index a4b9895c..317f98aa 100644 --- a/content/interets/informatique/2022/06/30/test-steelseries-aerox-3-wireless/index.md +++ b/content/interets/informatique/2022/06/30/test-steelseries-aerox-3-wireless/index.md @@ -74,7 +74,7 @@ Je n'ai donc aucun soucis à me passer d'un taux de *polling* élevé sur ma mac Un paramétrage manque à l'appel dans tous les cas de figure : c'est la hauteur de décrochage. Ce réglage ne me manque pas personnellement, on verra plus bas pourquoi, mais je peux comprendre que son absence soit remarquée, surtout pour une souris plutôt haut de gamme. -Si je dis que la hauteur de décrochage me convient, c'est parce que j'ai remplacé les patins de la souris par des [patins en céramique](https://www.lexip.co/fr/produits/Mo42). +Si je dis que la hauteur de décrochage me convient, c'est parce que j'ai remplacé les patins de la souris par des [patins en céramique](https://www.lexip.co/products/mo42-6-patins-ceramique-souris). Ils sont un tout petit peu plus épais que les patins en PTFE de base, et par conséquent, la hauteur de décrochage par défaut est juste parfaite. C'est un petit *mod* tout simple, néanmoins pas donné (compter une dizaine d'euros pour un jeu de patins), mais que je fais sur toutes mes souris, et je ne peux plus utiliser une souris avec des patins classiques. C'est un investissement sur le long terme : ces patins sont increvables, livrés par six mais généralement je n'en ai besoin que de quatre sur les souris Steelseries, et fournis avec des pastilles autocollantes en nombre suffisant pour pouvoir réutiliser les patins sur deux souris différentes. diff --git a/content/interets/informatique/2022/12/05/retour-d-experience-un-an-sous-nixos/index.md b/content/interets/informatique/2022/12/05/retour-d-experience-un-an-sous-nixos/index.md index d5e87bef..4466aa12 100644 --- a/content/interets/informatique/2022/12/05/retour-d-experience-un-an-sous-nixos/index.md +++ b/content/interets/informatique/2022/12/05/retour-d-experience-un-an-sous-nixos/index.md @@ -1,6 +1,6 @@ --- -date: '2022-12-05' -title: 'Retour d''expérience : un an sous NixOS' +date: "2022-12-05" +title: "Retour d'expérience : un an sous NixOS" --- Voilà déjà un an que je me suis mis à [NixOS](https://nixos.org/manual/nixos/stable). @@ -20,13 +20,13 @@ Tout fonctionne à merveille. Aucune surprise d'un boot à l'autre. Sous Windows, de tout temps, à chaque démarrage de mes machines, je me demandais quelle tuile allait encore me tomber dessus. Une mise à jour qui se serait mal déroulée, un logiciel qui refuse de se lancer pour une obscure raison... -Avec NixOS, ce sentiment *n'existe pas*. +Avec NixOS, ce sentiment _n'existe pas_. Si la machine démarre une fois, elle démarrera à chaque fois, systématiquement de la même façon. Le sentiment de stabilité est exceptionnel. Même debian ne m'a jamais donné pleinement satisfaction à ce niveau, bien que cela constituait déjà une énorme amélioration par rapport à Windows. Côté performances, sachez que je ne joue pas à des jeux particulièrement exigeants. -Néanmoins, je joue sur un [Huawei MateView GT](https://consumer.huawei.com/fr/monitors/mateview-gt/), un moniteur de 34" d'une définition de 3440x1440 (3K) à 165Hz. +Néanmoins, je joue sur un [Huawei MateView GT](https://consumer.huawei.com/fr/support/monitor/mateview-gt/), un moniteur de 34" d'une définition de 3440x1440 (3K) à 165Hz. Je ne vous fournirai pas de benchmarks à la [Tom's Hardware](https://www.tomshardware.com/reviews/nvidia-geforce-rtx-3080-review/4), je ne suis pas là pour ça. Mais je peux vous dire que mes jeux tournent aussi bien - dans certains cas, mieux - que sous Windows. La plupart du temps, les chargements sont plus rapides, même pour des jeux qui ne sont pas nativement prévus pour tourner sous Linux. @@ -108,9 +108,9 @@ Peut-être qu'un jour, quand j'aurai le temps et la motivation, je me pencherai J'ai été fidèle à debian pendant à peu près vingt ans. J'ai bien testé pas mal de distros avec le temps, y compris [LFS](https://www.linuxfromscratch.org/), mais aucune ne m'a jamais donné aussi rapidement la satisfaction ressentie avec NixOS. -Je m'y sens *chez moi*. +Je m'y sens _chez moi_. -Je dis souvent, pour justifier ma conversion à Apple, que pendant un tiers de ma vie de geek, j'ai bidouillé Windows ; pendant le deuxième tiers, j'ai bidouillé Linux ; maintenant, je veux et peux *utiliser* mon informatique (sous-entendu, via l'éco-système Apple). +Je dis souvent, pour justifier ma conversion à Apple, que pendant un tiers de ma vie de geek, j'ai bidouillé Windows ; pendant le deuxième tiers, j'ai bidouillé Linux ; maintenant, je veux et peux _utiliser_ mon informatique (sous-entendu, via l'éco-système Apple). Ne plus devoir bidouiller pour que ça marche. Ne plus chercher des hacks dégueulasses pour faire tourner un logiciel dont j'ai besoin. @@ -127,10 +127,10 @@ C'est tellement codifié que je ne serai pas étonné si, à l'avenir, le systè Je suis libéré du poids psychologique de la maintenance de mes systèmes d'exploitation. Je ne suis plus inquiété que quelque chose tombe en panne, ou qu'une mise à jour se passe mal. -NixOS va me permettre d'*utiliser* mon informatique non-Apple pendant le dernier tiers de ma vie de geek. +NixOS va me permettre d'_utiliser_ mon informatique non-Apple pendant le dernier tiers de ma vie de geek. J'espère vous avoir donné envie de vous y mettre. -*P.S. :* [Je l'ai déjà dit](/interets/informatique/2021/11/07/deux-semaines-sous-nixos-je-divorce-de-debian/#une-courbe-dapprentissage-importante) l'an dernier et je le maintiens, la courbe d'apprentissage est importante, et je ne suis pas encore capable de tirer pleinement profit de NixOS (par exemple, les [flakes](https://nixos.wiki/wiki/Flakes)). +_P.S. :_ [Je l'ai déjà dit](/interets/informatique/2021/11/07/deux-semaines-sous-nixos-je-divorce-de-debian/#une-courbe-dapprentissage-importante) l'an dernier et je le maintiens, la courbe d'apprentissage est importante, et je ne suis pas encore capable de tirer pleinement profit de NixOS (par exemple, les [flakes](https://nixos.wiki/wiki/Flakes)). Il faut prendre son temps, et être patient. On n'a rien sans rien. diff --git a/content/interets/informatique/2022/12/23/bonne-annee-2023/index.md b/content/interets/informatique/2022/12/23/bonne-annee-2023/index.md index 0208db4f..b54d0c4a 100644 --- a/content/interets/informatique/2022/12/23/bonne-annee-2023/index.md +++ b/content/interets/informatique/2022/12/23/bonne-annee-2023/index.md @@ -69,7 +69,7 @@ D'autant que j'ai peut-être exploré 8% de ce que le jeu peut m'offrir. En ce qui concerne la lecture, cette année je me suis consacré à la paléontologie, en particulier [_The Dinosaur Heresies_](https://en.wikipedia.org/wiki/The_Dinosaur_Heresies) de Robert Bakker. Et ça tombe bien puisqu'on fête en 2022 les 200 ans de la discipline. -D'ailleurs, le magazine [Espèces](https://especes.org/) a consacré à cet anniversaire un [numéro spécial](https://especes.org/produit/la-paleontologie-a-200-ans-n-45/) que je suis en train de lire avec beaucoup de plaisir. +D'ailleurs, le magazine [Espèces](https://especes.org/) a consacré à cet anniversaire un [numéro spécial](https://especes.org/numeros/numero-45/) que je suis en train de lire avec beaucoup de plaisir. ### Cours de langues @@ -100,7 +100,7 @@ L'an dernier, je suis passé en 3440x1440. C'est super, que ce soit pour jouer ou travailler, mais la 4K sera peut-être plus confortable encore. En réalité, il y a peu de chances que je change mon écran, je disais ça pour faire la traditionnelle blague de geek. -Je suis très satisfait de mes écrans actuels ([un Hawei MateView GT 34](https://consumer.huawei.com/fr/monitors/mateview-gt/) et un [Alienware 25](https://www.dell.com/fr-fr/shop/écran-de-gaming-alienware-25-aw2521h/apd/210-aycl/moniteurs-et-accessoires-de-moniteur)), et ils ne présentent pas de signes de panne. +Je suis très satisfait de mes écrans actuels ([un Hawei MateView GT 34](https://consumer.huawei.com/fr/support/monitor/mateview-gt/) et un [Alienware 25](https://www.dell.com/fr-fr/shop/écran-de-gaming-alienware-25-aw2521h/apd/210-aycl/moniteurs-et-accessoires-de-moniteur)), et ils ne présentent pas de signes de panne. ### Attentes personnelles diff --git a/content/interets/informatique/2022/12/24/l-ia-pose-la-question-de-l-identite/index.md b/content/interets/informatique/2022/12/24/l-ia-pose-la-question-de-l-identite/index.md index a8ffd26f..926563c8 100644 --- a/content/interets/informatique/2022/12/24/l-ia-pose-la-question-de-l-identite/index.md +++ b/content/interets/informatique/2022/12/24/l-ia-pose-la-question-de-l-identite/index.md @@ -41,7 +41,7 @@ Imaginez quelqu'un qui vous veut du mal, et réalise un _deepfake_ vous montrant C'est techniquement faisable. Vous ne pouvez que vous en défendre a posteriori : il n'existe nul moyen préventif contre ce genre de malveillance. -Évidemment, il existe - encore - des outils pour déterminer la véracité d'une vidéo (par exemple, [_FakeCatcher_](https://www.intel.com/content/www/us/en/newsroom/news/intel-introduces-real-time-deepfake-detector.html) d'Intel), ou plus exactement, pour déterminer les chances qu'une vidéo donnée soit en réalité un _deepfake_. +Évidemment, il existe - encore - des outils pour déterminer la véracité d'une vidéo (par exemple, [_FakeCatcher_](https://newsroom.intel.com/artificial-intelligence/intel-introduces-real-time-deepfake-detector) d'Intel), ou plus exactement, pour déterminer les chances qu'une vidéo donnée soit en réalité un _deepfake_. Mais pour combien de temps encore ? Et que se passera-t'il le jour où même les outils les plus perfectionnés n'en seront plus capables ? diff --git a/content/interets/informatique/2023/06/10/tentative-de-remplacement-de-drone-ci-par-gitea-actions-sous-nixos/index.md b/content/interets/informatique/2023/06/10/tentative-de-remplacement-de-drone-ci-par-gitea-actions-sous-nixos/index.md index d2dc9ca4..0c825940 100644 --- a/content/interets/informatique/2023/06/10/tentative-de-remplacement-de-drone-ci-par-gitea-actions-sous-nixos/index.md +++ b/content/interets/informatique/2023/06/10/tentative-de-remplacement-de-drone-ci-par-gitea-actions-sous-nixos/index.md @@ -299,7 +299,7 @@ Explications. Pour déployer, je passe par `rsync`. J'ai donc besoin de quelques informations de base mais qui doivent rester confidentielles, notamment l'utilisateur SSH et sa clé privée. -Ça tombe bien, Gitea a introduit le stockage de [secrets](https://docs.gitea.com/next/usage/secrets) dans sa version 1.19, justement pour qu'on puisse s'en servir dans les actions. +Ça tombe bien, Gitea a introduit le stockage de [secrets](https://docs.gitea.com/usage/actions/secrets) dans sa version 1.19, justement pour qu'on puisse s'en servir dans les actions. Tout à la fois content de trouver cette fonctionnalité assez attendue parmi les utilisateurs et inquiet qu'un truc tourne mal, je renseigne vite fait les quelques secrets dont j'ai besoin - dont cette fameuse clé privée - et j'ajoute l'action à mon projet : ```yaml diff --git a/content/interets/informatique/2023/06/30/ma-moisson-des-soldes-steam/index.md b/content/interets/informatique/2023/06/30/ma-moisson-des-soldes-steam/index.md index c679502a..7c6b6b8c 100644 --- a/content/interets/informatique/2023/06/30/ma-moisson-des-soldes-steam/index.md +++ b/content/interets/informatique/2023/06/30/ma-moisson-des-soldes-steam/index.md @@ -23,7 +23,7 @@ J'anticipe jouer un peu plus d'une centaine d'heures : au-delà, je commence à ![TYYxDI](images/TYYxDI.jpg) -Ça faisait depuis un moment que mon père me parlait de [*HZD*](https://store.steampowered.com/app/1151640/Horizon_Zero_Dawn_Complete_Edition/), et étant pour le moins friand de [*Ark: Survival Evolved*](https://www.richard-dern.fr/critiques/jeux-video/ark-survival-evolved/), il faut dire que *Horizon Zero Dawn* a des atouts pour me séduire. +Ça faisait depuis un moment que mon père me parlait de [*HZD*](https://store.steampowered.com/app/1151640/Horizon_Zero_Dawn_Complete_Edition/), et étant pour le moins friand de [*Ark: Survival Evolved*](https://richard-dern.fr/critiques/jeux-video/ark-survival-evolved/), il faut dire que *Horizon Zero Dawn* a des atouts pour me séduire. Néanmoins, à son prix de base de 49.99€, je ne voulais pas prendre le risque d'être déçu. Ce n'est pas tout à fait le même jeu qu'*Ark*, et je suis assez pointilleux en ce qui concerne les jeux qui se réclament du style "Survie en monde ouvert". diff --git a/content/interets/informatique/2023/08/14/internet-c-etait-mieux-avant/index.md b/content/interets/informatique/2023/08/14/internet-c-etait-mieux-avant/index.md index 5e7ac512..c8b5f91d 100644 --- a/content/interets/informatique/2023/08/14/internet-c-etait-mieux-avant/index.md +++ b/content/interets/informatique/2023/08/14/internet-c-etait-mieux-avant/index.md @@ -23,7 +23,7 @@ Je fais ça à la bonne franquette : je ne vous les présente pas dans un ordre - [The Unbearable Sameness of the Modern Web](https://blog.rachelbinx.com/2023/02/unbearable-sameness/) : Il semble loin le temps où l'on faisait preuve de créativité sur le web... -- ...une idée que mon ami Thibaut d'[Arsouyes](https://www.arsouyes.org/interets/informatique/2023/2023-08-07_CSS_and_personnality/) semble partager, avec toutefois une perspective un peu différente mais non moins pertinente. +- ...une idée que mon ami Thibaut d'[Arsouyes](https://www.arsouyes.org/articles/2023/2023-08-14/) semble partager, avec toutefois une perspective un peu différente mais non moins pertinente. - [The Rise Of User-Hostile Software | Den](/interets/liens-interessants/2022/12/23/a8d63150/) : la tendance à ce que j'appelle l'informatique hostile était déjà un sujet de préoccupation l'an dernier, mais [Google est venu récemment confirmer](/interets/informatique/2023/07/22/a-propos-de-web-environment-integrity/) que c'était bien là le "grand projet" pour le web moderne, ce qui m'a conduit à écrire une [diatribe](/interets/informatique/2023/07/20/je-n-ai-plus-envie-de-me-battre-pour-vous/) pleine de désespoir. diff --git a/content/interets/informatique/2023/08/16/reflexion-ia-et-licences/index.md b/content/interets/informatique/2023/08/16/reflexion-ia-et-licences/index.md index b63a185f..b18eb7b5 100644 --- a/content/interets/informatique/2023/08/16/reflexion-ia-et-licences/index.md +++ b/content/interets/informatique/2023/08/16/reflexion-ia-et-licences/index.md @@ -38,7 +38,7 @@ Il peut aussi vous faire croire que je transmets une opinion alors que mon but e ### Tromperie La deuxième implication est la tromperie opérée par Google sur l'auteur du contenu d'un site. -Cela rejoint l'idée développée par les [Arsouyes](https://www.arsouyes.org/interets/informatique/2023/2023-08-07_CSS_and_personnality/), dont la portée va décidément bien au-delà de ce que j'ai pu croire en première lecture. +Cela rejoint l'idée développée par les [Arsouyes](https://www.arsouyes.org/articles/2023/2023-08-14/), dont la portée va décidément bien au-delà de ce que j'ai pu croire en première lecture. (Au passage, ça fait du bien de lire du contenu avec une vraie profondeur.) Je m'en fous que Google affiche "clairement" que le résumé est auto-généré ou qu'il soit nécessaire de cliquer sur un bouton : si vous venez sur mon site et que Chrome vous affiche le résumé d'une page, vous croirez que j'en suis l'auteur, parce que l'enrobage autour de ce résumé reste le mien. diff --git a/content/interets/informatique/2023/09/03/nouveau-site-en-ligne/index.md b/content/interets/informatique/2023/09/03/nouveau-site-en-ligne/index.md index 3277deee..3cebeff8 100644 --- a/content/interets/informatique/2023/09/03/nouveau-site-en-ligne/index.md +++ b/content/interets/informatique/2023/09/03/nouveau-site-en-ligne/index.md @@ -43,10 +43,10 @@ De façon plus générale, je peux travailler avec [Blade](https://laravel.com/d J’ai développé mon propre générateur de site statique. Il n’est pas fait pour être redistribué : n’espérez pas télécharger les sources et lancer votre propre blog. -Déjà parce que les sources de mes propre articles sont incluses[^sources_incluses], et puis parce que je l’ai développé pour répondre à mes besoins et envies spécifiques. +Déjà parce que les sources de mes propres articles sont incluses[^sources_incluses], et puis parce que je l’ai développé pour répondre à mes besoins et envies spécifiques. Par contre, j’encourage la lecture du code : vous y trouverez peut-être une bonne idée ou deux. -[^sources_incluses]: Ce n’est plus le cas depuis le 6 septembre : [sources des articles](https://git.dern.ovh/Blog/contenu) +[^sources_incluses]: Ce n’est plus le cas depuis le 6 septembre : [~~sources des articles~~](https://git.dern.ovh/Blog/contenu) Le moteur repose sur [Laravel](https://laravel.com/) dans sa dernière version. La partie UI/UX, c’est moi, vraiment à 100%. diff --git a/content/interets/informatique/2024/01/15/2024-l-annee-du-changement/index.md b/content/interets/informatique/2024/01/15/2024-l-annee-du-changement/index.md index dcf0261b..639f30c7 100644 --- a/content/interets/informatique/2024/01/15/2024-l-annee-du-changement/index.md +++ b/content/interets/informatique/2024/01/15/2024-l-annee-du-changement/index.md @@ -1,5 +1,5 @@ --- -date: '2024-01-15' +date: "2024-01-15" title: 2024, l'année du changement --- @@ -10,7 +10,7 @@ La banque a fait la gueule, moi par contre, ça va mieux, pourvu que ça dure ## Mon premier iPhone de première main Après avoir longtemps hésité avec un iPad, j'ai fini par jeter mon dévolu sur le magnifique [iPhone 15 Pro Titane Bleu](https://www.apple.com/fr/iphone-15-pro/). -Venant d'un iPhone 6S Plus (légué par mon épouse suite à son achat d'un iPhone 12 Pro Max), j'ai sauté 9 générations d'un coup, et ça se sent. +Venant d'un iPhone 6S Plus (légué par mon épouse suite à son achat d'un iPhone 12 Pro Max), j'ai sauté 9 générations d'un coup, et ça se sent. Je craignais qu'il soit trop grand (je n'étais pas fan de la taille du 6S Plus), mais en fin de compte, vu la place qu'occupe la sublime dalle OLED Pro Motion, il reste compact. Il a la taille parfaite pour moi, agréable dans la poche comme dans la main, et le titane le rend plus léger ce qui n'est pas pour me déplaire. @@ -31,14 +31,14 @@ Les fonctionnalités liées à Continuité en particulier ont ma préférence. Plus besoin de webcam ou de micro, c'est l'iPhone qui les remplace, et ce, sans-fil. On verra après que ce point précis (le "sans-fil") est au coeur des changements qui surviennent au niveau de mon matériel. -Bref, je suis *in love* de mon iPhone 15 Pro Titane Bleu. +Bref, je suis _in love_ de mon iPhone 15 Pro Titane Bleu. ## Installation audio/vidéo Jusqu'à maintenant, j'avais une installation audio/vidéo compliquée et pénible à gérer au quotidien. Jugez plutôt. -Je disposais d'un écran [Huawei MateView GT34](https://consumer.huawei.com/fr/monitors/mateview-gt/) (à droite ci-dessous) et d'un [Alienware 25](https://www.dell.com/fr-fr/shop/écran-de-gaming-alienware-25-aw2523hf/apd/210-bfim/moniteurs-et-accessoires-de-moniteur). +Je disposais d'un écran [Huawei MateView GT34](https://consumer.huawei.com/fr/support/monitor/mateview-gt/) (à droite ci-dessous) et d'un [Alienware 25](https://www.dell.com/fr-fr/shop/écran-de-gaming-alienware-25-aw2523hf/apd/210-bfim/moniteurs-et-accessoires-de-moniteur). ![oPIKq8](images/oPIKq8.jpeg) @@ -151,7 +151,7 @@ Mais après avoir connu des déboires assez conséquents avec des câbles de mau J'ai encore un peu de travail à faire pour masquer les quelques câbles qui restent, comme vous le constatez sur la photo, mais mon cahier des charges est rempli : aussi peu de câbles que possible, une image et un son au top. -Reste un problème existentiel : j'ai écrit un article intitulé "*Le son numérique, c'est de la merde*" (lié plus haut), mais force est de constater que, quand on dispose du matériel approprié, mes critiques s'éventent. +Reste un problème existentiel : j'ai écrit un article intitulé "_Le son numérique, c'est de la merde_" (lié plus haut), mais force est de constater que, quand on dispose du matériel approprié, mes critiques s'éventent. Et on va voir que ce n'est pas la seule situation dans laquelle je me suis mis où je dois revoir quelques uns de mes principes de vie. ## Je suis sur instagram @@ -162,12 +162,12 @@ C'est entre les fêtes de fin d'année que j'ai glissé, au cours d'une conversa > En 2024, je vais peut-être me mettre aux réseaux sociaux -Étonnement, voire consternation dans mon entourage : "*Toi, sur les réseaux sociaux ?*". +Étonnement, voire consternation dans mon entourage : "_Toi, sur les réseaux sociaux ?_". Je me souviens encore de l'expression faciale de mon épouse lors de cette annonce : une surprise indescriptible, comme si elle venait de découvrir que je menais une double-vie et dont l'une d'elle est celle d'un agent secret. C'est peut-être d'ailleurs un élément renforçateur de ma décision : j'ai aimé être encore capable de l'étonner et la surprendre à ce point après 18 ans de vie commune ! En tout cas, le cheminement qui m'a fait arriver à cette idée est intéressant. -J'ai joué à [*No Man's Sky*](https://www.nomanssky.com) (dont je devrais écrire le test prochainement), où l'on explore des galaxies, leurs systèmes solaires et leurs planètes. +J'ai joué à [_No Man's Sky_](https://www.nomanssky.com) (dont je devrais écrire le test prochainement), où l'on explore des galaxies, leurs systèmes solaires et leurs planètes. Et on constate que, conformément à ce que l'astrophysique nous enseigne, une vaste majorité de ces planètes est inhabitable, et donc, inintéressante. Je schématise vite fait, le jeu est bien plus intéressant que ça mais ce n'est pas le sujet. @@ -175,18 +175,18 @@ Donc, à la louche, 90% des planètes sont inintéressantes, et par corollaire, Savoir que le jeu génère ces mondes de façon procédurale rend mon hypothèse encore plus acceptable. Cette hypothèse, c'est que ce ratio de 90/10 peut être appliqué à tout et n'importe quoi. En l'occurrence, j'ai pensé que ce ratio pourrait se retrouver dans les réseaux sociaux : 90% de contenu qui ne m'intéresse pas pour 10% de contenu qui m'intéresse. -Et comme dans *NMS*, ça vaut le coup d'explorer des systèmes en apparence pas très intéressants pour découvrir des planètes particulièrement hospitalières, je me suis dit que je devais chercher du contenu intéressant dans ce que je pense n'être qu'un ramassis de conneries. +Et comme dans _NMS_, ça vaut le coup d'explorer des systèmes en apparence pas très intéressants pour découvrir des planètes particulièrement hospitalières, je me suis dit que je devais chercher du contenu intéressant dans ce que je pense n'être qu'un ramassis de conneries. Ce qui me plaît dans ce cheminement n'est pas tant sa logique ou sa conclusion mais son origine : j'ai joué à un jeu vidéo et c'est un jeu vidéo qui a déclenché une épiphanie, dont les retombées potentielles sont très positives, comme on va le voir ensuite. -Alors, attention, parce que je n'ai pas choisi *n'importe quel* réseau social, j'ai choisi instagram parce qu'il ne requiert pas vraiment d'interaction. +Alors, attention, parce que je n'ai pas choisi _n'importe quel_ réseau social, j'ai choisi instagram parce qu'il ne requiert pas vraiment d'interaction. Tu suis des comptes qui te plaisent, tu like les posts qui te plaisent, et c'est tout. Je ne suis pas "obligé" de discuter de la pluie et du beau temps. Je ne suis pas "obligé" de commenter. Et je ne suis pas "obligé" de publier des trucs. Pour rappel, je dis depuis l'existence de facebook que les réseaux sociaux, c'est de la merde. -Des aspirateurs à données personnelles qui sont utilisées pour générer de l'argent. +Des aspirateurs à données personnelles qui sont utilisées pour générer de l'argent. En gros, que c'est une création du Mal. **Tout cela reste vrai.** @@ -208,16 +208,16 @@ On y trouve ce qu'on y cherche. J'imagine déjà le branle-bas-de-combat chez les aficionados des réseaux décentralisés à la lecture de ces quelques lignes. -Si vous lisez ce blog, vous savez déjà que j'ai fait quelques essais (parfois bien antérieurs au présent blog puisque j'ai connu les premiers moments de [diaspora*](https://diasporafoundation.org/), et avant cela, j'étais sur [StatusNet](https://fr.wikipedia.org/wiki/GNU_social)). +Si vous lisez ce blog, vous savez déjà que j'ai fait quelques essais (parfois bien antérieurs au présent blog puisque j'ai connu les premiers moments de [diaspora\*](https://diasporafoundation.org/), et avant cela, j'étais sur [StatusNet](https://fr.wikipedia.org/wiki/GNU_social)). Malheureusement, je n'ai jamais été conquis par ces réseaux, pas plus que les réseaux "centralisés". Trop de militantisme pour tout et n'importe quoi, trop d'interactions, en tout cas plus que ce dont j'ai besoin, trop de maintenance, paradoxe entre créer son instance et créer un compte sur une instance existante, etc. Je connais donc bien les enjeux, et je ne peux que continuer à soutenir toute initiative visant à proposer une alternative. En outre, j'ai un excellent bagage technique. -Je ne suis pas naïf en ce qui concerne les posts qui me sont présentés, ni *la façon* dont ils sont présentés. -Je *sais* que tout est fait pour me faire rester sur la plateforme le plus longtemps possible. -Je *sais* que la vaste majorité des posts sont promotionnels, de façon plus ou moins flagrante. -Je *sais* qu'il y a beaucoup de *fakes* et de *deep-fakes*, et que parfois, même l'oeil averti peut être trompé. +Je ne suis pas naïf en ce qui concerne les posts qui me sont présentés, ni _la façon_ dont ils sont présentés. +Je _sais_ que tout est fait pour me faire rester sur la plateforme le plus longtemps possible. +Je _sais_ que la vaste majorité des posts sont promotionnels, de façon plus ou moins flagrante. +Je _sais_ qu'il y a beaucoup de _fakes_ et de _deep-fakes_, et que parfois, même l'oeil averti peut être trompé. J'arrive à "naviguer" dans ces eaux inconnues et déjouer ses pièges. J'ai réussi à le faire dans les 48 premières heures de présence sur la plateforme. @@ -231,19 +231,19 @@ Je vais me permettre d'en aborder quelques uns, libre à vous de ne pas lire la Pour commencer, je réalise que tout n'est pas merdique sur instagram. Il y a beaucoup de choses qui ne m'intéressent pas, il y en a même qui me révulsent, mais une fois que le tri est fait, je vois qu'il y a aussi des "gens comme moi", c'est-à-dire qui partagent les mêmes centres d'intérêt, et ce qui me plaît c'est que ça ne déborde pas. Tu prends le compte de n'importe quel geek sur ActivityPub, tu auras des posts techniques intéressants mais tu vas aussi avoir droit à des avis politiques très tranchés. -Si je suis un compte instagram consacré à *Jurassic Park*, il y a peu de chance que ça parle de gilets jaunes (si l'esprit peut le concevoir, ça se trouvera, mais tu vois le principe). +Si je suis un compte instagram consacré à _Jurassic Park_, il y a peu de chance que ça parle de gilets jaunes (si l'esprit peut le concevoir, ça se trouvera, mais tu vois le principe). J'ai l'impression que, quelque part, quand tu es "influenceur", tu es obligé de te conformer à ce que tes (futurs) followers recherchent. Alors que sur ActivityPub, c'est l'exact inverse. -Pour reprendre l'exemple de *Jurassic Park*, si je suis un compte sur instagram, c'est *parce qu'il* propose un contenu relatif à *Jurassic Park*, et je ne m'attends pas à ce qu'il publie quelque chose de radicalement différent. -Sur ActivityPub, je *m'attends* à la possibilité qu'un compte ne parle pas *que* de *Jurassic Park*. +Pour reprendre l'exemple de _Jurassic Park_, si je suis un compte sur instagram, c'est _parce qu'il_ propose un contenu relatif à _Jurassic Park_, et je ne m'attends pas à ce qu'il publie quelque chose de radicalement différent. +Sur ActivityPub, je _m'attends_ à la possibilité qu'un compte ne parle pas _que_ de _Jurassic Park_. Ce n'est peut-être pas aussi bien défini que ça, mais en une semaine d'usage, c'est mon ressenti. Ensuite, il y a une simplicité d'usage qui me séduit actuellement. C'est facile d'utiliser instagram : tu scrolle, tu regarde du contenu, parfois tu follow, parfois tu like. C'est tout. -Bien que truffée de *dark-patterns*, l'UI/UX est simple, presque minimaliste. +Bien que truffée de _dark-patterns_, l'UI/UX est simple, presque minimaliste. Mal foutue, bourrée de bugs, mais simple et facile à prendre en main. Dans une période où je me remets de mon burnout, je suis dans la logique de la simplification de ma vie, et à la maximisation de mon bien-être. @@ -268,4 +268,4 @@ Je me félicite de ce que je perçois comme une évolution personnelle, tout en Il ne faut donc pas comprendre que je valide les réseaux sociaux, ni que je vais passer à facebook, que je vais me mettre à évangéliser pour X, ni que je vais devenir un adepte des produits de chez Google. J'ai simplement fait un pas sur instagram et j'y ai trouvé ce que j'y ai cherché à un moment particulier de ma vie. -Je ne vais inciter personne à y aller, et je ne renonce pas à soutenir les alternatives. \ No newline at end of file +Je ne vais inciter personne à y aller, et je ne renonce pas à soutenir les alternatives. diff --git a/content/interets/informatique/2024/02/19/j-ai-discute-avec-chatgpt/index.md b/content/interets/informatique/2024/02/19/j-ai-discute-avec-chatgpt/index.md index 26c4ea3e..81e5e2a3 100644 --- a/content/interets/informatique/2024/02/19/j-ai-discute-avec-chatgpt/index.md +++ b/content/interets/informatique/2024/02/19/j-ai-discute-avec-chatgpt/index.md @@ -10,7 +10,7 @@ Je continue l'exploration du monde moderne, [commencée avec instagram](/interet Je le disais [dans mon article précédent](/interets/informatique/2024/02/14/l-avenir-du-blog/), j'ai l'intention de ne pas rester sur la touche simplement parce que je suis hostile par principe : je dois tester par moi-même et me faire une idée un peu plus précise. J'ai abondamment écrit sur les périls de l'intelligence artificielle, il n'en reste pas moins qu'on ne remettra pas Pandore dans sa boîte. -J'ai donc décidé de créer un compte sur OpenAI afin de tester ChatGPT, vu qu'on n'entend parler que de lui (et que sa concurrence, au moins chez Microsoft, [est à la ramasse](https://www.arsouyes.org/interets/informatique/2024/2024-01-27_Pas_Aide_des_robots/)). +J'ai donc décidé de créer un compte sur OpenAI afin de tester ChatGPT, vu qu'on n'entend parler que de lui (et que sa concurrence, au moins chez Microsoft, [est à la ramasse](https://www.arsouyes.org/articles/2024/2024-01-27_Pas_Aide_des_robots/)). Mon espoir, ou en tout cas, dans mon imaginaire romantique, je pourrais utiliser un outil comme ChatGPT afin de m'aider à être plus productif : l'idée est qu'il me génère un texte de base sur un sujet donné, et que je modifie ensuite ce texte à ma sauce. Un exemple concret : j'ai regardé, au cours de la semaine dernière, l'intégrale de la saga _Alien_, et j'aimerais bien publier une critique de chaque film. diff --git a/content/interets/informatique/2024/02/21/retour-d-experience-deux-mois-sur-instagram/index.md b/content/interets/informatique/2024/02/21/retour-d-experience-deux-mois-sur-instagram/index.md index 8a343404..edb9cf08 100644 --- a/content/interets/informatique/2024/02/21/retour-d-experience-deux-mois-sur-instagram/index.md +++ b/content/interets/informatique/2024/02/21/retour-d-experience-deux-mois-sur-instagram/index.md @@ -156,7 +156,7 @@ Alors finalement, qu'est-ce qui cloche avec instagram ? - On peut filtrer ce qui nous intéresse ou pas, y compris les publicités - instagram ne devient pas propriétaire des contenus publiés[^conditions] (c'était un point d'achoppement lorsque facebook a commencé à devenir populaire) -[^conditions]: Voir . Attention cependant : il est indiqué dans l'en-tête que ces conditions s'appliquent aux utilisateurs professionnels. Si c'est le cas, qu'en est-il des publications de non-professionnels ? +[^conditions]: Voir . Attention cependant : il est indiqué dans l'en-tête que ces conditions s'appliquent aux utilisateurs professionnels. Si c'est le cas, qu'en est-il des publications de non-professionnels ? Oui mais : diff --git a/content/interets/informatique/2024/03/03/reflexions-leonardo-ai/index.md b/content/interets/informatique/2024/03/03/reflexions-leonardo-ai/index.md index 4ac61004..381942ed 100644 --- a/content/interets/informatique/2024/03/03/reflexions-leonardo-ai/index.md +++ b/content/interets/informatique/2024/03/03/reflexions-leonardo-ai/index.md @@ -133,7 +133,7 @@ On peut se lamenter sur les conséquences probable de la généralisation de l'I Mais on peut aussi se dire que c'est l'évolution normale, ou en tout cas habituelle. Il n'est donc pas idiot de penser que nos métiers pourront continuer d'exister et être valorisés, non plus en tant que partie intégrante d'entreprises diverses, mais en tant que métiers de l'artisanat. -De toute façon, autant s'y faire, considérant [le déclin fulgurant](https://qbatch.com/interets/informatique/software-development-crisis/) de la cote des développeurs sur le marché professionnel en l'espace de quelques mois. +De toute façon, autant s'y faire, considérant [le déclin fulgurant](https://qbatch.com/blog/software-development-crisis/) de la cote des développeurs sur le marché professionnel en l'espace de quelques mois. ## Conclusion diff --git a/content/interets/informatique/2024/03/10/j-ai-pris-un-abonnement-a-chatgpt/index.md b/content/interets/informatique/2024/03/10/j-ai-pris-un-abonnement-a-chatgpt/index.md index 4d13987f..d7724f81 100644 --- a/content/interets/informatique/2024/03/10/j-ai-pris-un-abonnement-a-chatgpt/index.md +++ b/content/interets/informatique/2024/03/10/j-ai-pris-un-abonnement-a-chatgpt/index.md @@ -7,9 +7,9 @@ title: J'ai pris un abonnement à ChatGPT Cela faisait [quelques jours](/interets/informatique/2024/02/19/j-ai-discute-avec-chatgpt/) que je m’amusais avec la version gratuite de ChatGPT (la 3.5) et, [enthousiasmé par Leonardo.ai](/interets/informatique/2024/03/03/reflexions-leonardo-ai/), j’ai commencé à réfléchir à la question de payer pour utiliser l’un ou l’autre de ces services. Mon choix s’est finalement porté sur la solution d’[OpenAI](https://openai.com). -J’ai décidé de prendre l’abonnement ”[Plus](https://openai.com/chatgpt/pricing)” proposé par OpenAI pour plusieurs raisons : +J’ai décidé de prendre l’abonnement ”[Plus](https://chatgpt.com/fr-FR/pricing/)” proposé par OpenAI pour plusieurs raisons : -- Leonardo.ai se concentre sur des productions visuelles, alors que ChatGPT me permet de produire du texte, du code, et des images (via [Dall·E](https://openai.com/dall-e-3)) +- Leonardo.ai se concentre sur des productions visuelles, alors que ChatGPT me permet de produire du texte, du code, et des images (via [Dall·E](https://openai.com/fr-FR/index/dall-e-3/)) - Je peux personnaliser ChatGPT : je peux créer des GPT destinés à des usages particuliers, configurés selon certaines préférences personnelles, afin d’obtenir des résultats plus proches de ce que je veux que ceux proposés par défaut. Ce dernier point s’avère tout à fait convaincant et surprenant. diff --git a/content/interets/paleontologie/2025/04/25/curiosites-taxonomiques-du-mesozoique/index.md b/content/interets/paleontologie/2025/04/25/curiosites-taxonomiques-du-mesozoique/index.md index 379ae1d9..b95af13e 100644 --- a/content/interets/paleontologie/2025/04/25/curiosites-taxonomiques-du-mesozoique/index.md +++ b/content/interets/paleontologie/2025/04/25/curiosites-taxonomiques-du-mesozoique/index.md @@ -257,7 +257,7 @@ C’est une manière de rappeler que **la paléontologie dépend aussi de décis [_Dracorex hogwartsia_](https://fr.wikipedia.org/wiki/Dracorex) est un exemple notable de la manière dont la culture populaire peut influencer la nomenclature scientifique. Son crâne orné de pointes et de bosses évoque l'image d'un dragon, ce qui a inspiré son nom en hommage à l'univers de _Harry Potter_. -Cependant, certains paléontologues, comme [Jack Horner](), suggèrent que _Dracorex_ pourrait représenter un stade juvénile de [_Pachycephalosaurus_](https://fr.wikipedia.org/wiki/Pachycephalosaurus), tout comme [_Stygimoloch_ ](https://fr.wikipedia.org/wiki/Stygimoloch)en raison de similitudes morphologiques et de la plasticité ontogénique observée dans cette lignée. +Cependant, certains paléontologues, comme [Jack Horner](), suggèrent que _Dracorex_ pourrait représenter un stade juvénile de [_Pachycephalosaurus_](https://fr.wikipedia.org/wiki/Pachycephalosaurus), tout comme [_Stygimoloch_](https://fr.wikipedia.org/wiki/Stygimoloch) en raison de similitudes morphologiques et de la plasticité ontogénique observée dans cette lignée. Il est d'ailleurs intéressant de noter que Jack Horner a travaillé à la fois sur [_Jurassic Park_](/critiques/films/jurassic-park/) et [_Jurassic World_](/critiques/films/jurassic-world/). Il est non moins intéressant de préciser que le _Stygimoloch_ fait une apparition fracassante dans [_Jurassic World: Fallen Kingdom_](/critiques/films/jurassic-world-fallen-kingdom/), alors même que le débat sur _Dracorex_ persiste depuis une dizaine d'années à la sortie du film. diff --git a/content/interets/philosophie/2023/05/18/lhumain-cette-espece-primitive-introduction/index.md b/content/interets/philosophie/2023/05/18/lhumain-cette-espece-primitive-introduction/index.md index eb130b90..3a7d438d 100644 --- a/content/interets/philosophie/2023/05/18/lhumain-cette-espece-primitive-introduction/index.md +++ b/content/interets/philosophie/2023/05/18/lhumain-cette-espece-primitive-introduction/index.md @@ -14,7 +14,7 @@ J’ai tenté de trouver un juste milieu entre la vulgarisation et la technicit Ce livre est publié sous licence _Creative Commons Attribution - Partage dans les Mêmes Conditions 4.0 International_. - Texte de la licence: -- Obtenir les sources: +- Obtenir les sources: - [Me contacter](/contact/) ## Introduction diff --git a/content/interets/philosophie/2023/06/29/lhumain-cette-espece-primitive-une-bulle-cognitive-limitante/index.md b/content/interets/philosophie/2023/06/29/lhumain-cette-espece-primitive-une-bulle-cognitive-limitante/index.md index 29834923..a2a98fa6 100644 --- a/content/interets/philosophie/2023/06/29/lhumain-cette-espece-primitive-une-bulle-cognitive-limitante/index.md +++ b/content/interets/philosophie/2023/06/29/lhumain-cette-espece-primitive-une-bulle-cognitive-limitante/index.md @@ -68,7 +68,7 @@ théorisé l'apparition de la Vie près de ces cheminées naturelles qu'on appel Günter Wächtershäuser[^wachtershauser_evolution_1990] (né en 1938). [^contributeurs_wikipedia_mont_2020]: Contributeurs Wikipédia. « Mont hydrothermal », Wikipédia, décembre 2020. -[^wachtershauser_evolution_1990]: G. Wachtershauser. « Evolution of the first metabolic cycles. », Proceedings of the National Academy of Sciences 87, nᵒ 1 (janvier 1990) : 200‑204. +[^wachtershauser_evolution_1990]: G. Wachtershauser. « Evolution of the first metabolic cycles. », Proceedings of the National Academy of Sciences 87, nᵒ 1 (janvier 1990) : 200‑204. ![noTpad](images/noTpad.jpg) diff --git a/content/interets/philosophie/2023/07/06/lhumain-cette-espece-primitive-les-limites-de-notre-perception/index.md b/content/interets/philosophie/2023/07/06/lhumain-cette-espece-primitive-les-limites-de-notre-perception/index.md index cf1aaa91..508199bb 100644 --- a/content/interets/philosophie/2023/07/06/lhumain-cette-espece-primitive-les-limites-de-notre-perception/index.md +++ b/content/interets/philosophie/2023/07/06/lhumain-cette-espece-primitive-les-limites-de-notre-perception/index.md @@ -38,7 +38,7 @@ oiseaux, et a prouvé l'étendu des usages qu'ils en faisaient, qui ne se limitaient pas au déplacement mais également à la détection de proies et à la communication. -[^pierce_experimental_1938]: G. W. Pierce et Donald R. Griffin. « Experimental Determination of Supersonic Notes Emitted by Bats », Journal of Mammalogy 19, nᵒ 4 (1938) : 454‑55. +[^pierce_experimental_1938]: G. W. Pierce et Donald R. Griffin. « Experimental Determination of Supersonic Notes Emitted by Bats », Journal of Mammalogy 19, nᵒ 4 (1938) : 454‑55. À l'opposé du spectre sonore, tant que nous ne pouvions pas analyser les très basses fréquences, nous ignorions que les baleines et les éléphants utilisaient diff --git a/tools/check_external_links.js b/tools/check_external_links.js index de97c8d1..f55f6a73 100644 --- a/tools/check_external_links.js +++ b/tools/check_external_links.js @@ -285,7 +285,10 @@ async function checkLink(url) { let info = runResults.get(url); if (!info) { const cachedInfo = cache[url]; - if (!isCacheValid(cachedInfo)) { + if (cachedInfo?.manually_killed === true) { + // Do not re-test manually killed links + info = cachedInfo; + } else if (!isCacheValid(cachedInfo)) { const host = extractHost(url); if (host) { await applyHostDelay(host); @@ -304,12 +307,13 @@ async function checkLink(url) { } info = { + ...(cachedInfo || {}), status: result.status ?? null, errorType: result.errorType || null, method: result.method, checked: new Date().toISOString(), }; - cache[url] = info; + cache[url] = info; // preserves files, manual flags, etc. cacheDirty = true; persistCache(); } else if (cachedInfo) { @@ -540,10 +544,43 @@ function writeReport(entries) { if (cachePruned) { cacheDirty = true; } + // Update file paths, line numbers and ensure manual flags exist + for (const entry of uniqueEntries) { + const files = Array.from( + new Set(entry.occurrences.map((o) => path.relative(SITE_ROOT, o.file))) + ).sort((a, b) => a.localeCompare(b)); + const locations = Array.from( + new Set( + entry.occurrences.map( + (o) => `${path.relative(SITE_ROOT, o.file)}:${o.line}` + ) + ) + ).sort((a, b) => a.localeCompare(b)); + const existing = cache[entry.url] || {}; + cache[entry.url] = { + ...existing, + manually_validated: existing.manually_validated === true, + manually_killed: existing.manually_killed === true, + files, + locations, + }; + cacheDirty = true; + } + if (cacheDirty) { + ensureDirectoryExists(CACHE_PATH); + fs.writeFileSync(CACHE_PATH, yaml.dump(cache)); + cacheDirty = false; + } + + // Exclude manually killed from re-checking and reporting + const entriesToCheck = uniqueEntries.filter( + (e) => !(cache[e.url] && cache[e.url].manually_killed === true) + ); + ensureDirectoryExists(PROGRESS_FILE); fs.writeFileSync(PROGRESS_FILE, `"url","locations","status"\n`, "utf8"); - const total = uniqueEntries.length; + const total = entriesToCheck.length; if (total === 0) { process.stdout.write("No external links found.\n"); ensureDirectoryExists(CACHE_PATH); @@ -552,7 +589,7 @@ function writeReport(entries) { return; } - const hostGroups = groupEntriesByHost(uniqueEntries); + const hostGroups = groupEntriesByHost(entriesToCheck); const concurrency = Math.max(1, Math.min(MAX_CONCURRENT_HOSTS, hostGroups.length || 1)); let processed = 0; await runWithConcurrency( diff --git a/tools/config.json b/tools/config.json index 8524fb3a..8a16a023 100644 --- a/tools/config.json +++ b/tools/config.json @@ -8,12 +8,12 @@ "hostDelayMs": 2000, "retryDelayMs": 5000, "requestTimeoutSeconds": 5, - "cacheTtlSuccessDays": 7, - "cacheTtlClientErrorDays": 0, + "cacheTtlSuccessDays": 30, + "cacheTtlClientErrorDays": 7, "outputFormat": "markdown", "outputFile": "tools/cache/external_links_report.md", "userAgent": null, "enableCookies": true, "cookieJar": "tools/cache/curl_cookies.txt" } -} +} \ No newline at end of file diff --git a/tools/lib/markdown_links.js b/tools/lib/markdown_links.js index afe1dd9c..9eb3bfe9 100644 --- a/tools/lib/markdown_links.js +++ b/tools/lib/markdown_links.js @@ -15,6 +15,14 @@ function trimUnbalancedTrailing(value, openChar, closeChar) { return result; } +function stripTrailingPunctuation(value) { + let result = value; + while (/[.,;:!?'"\u2018\u2019\u201C\u201D]+$/.test(result)) { + result = result.slice(0, -1); + } + return result; +} + function sanitizeUrlCandidate(raw, options = {}) { if (typeof raw !== "string") return null; let candidate = raw.trim(); @@ -24,9 +32,7 @@ function sanitizeUrlCandidate(raw, options = {}) { candidate = candidate.slice(1, -1).trim(); } - while (/[.,;:!?'"\u2018\u2019\u201C\u201D]+$/.test(candidate)) { - candidate = candidate.slice(0, -1); - } + candidate = stripTrailingPunctuation(candidate); if (!options.keepTrailingParens) { candidate = trimUnbalancedTrailing(candidate, "(", ")"); @@ -39,9 +45,15 @@ function sanitizeUrlCandidate(raw, options = {}) { } candidate = trimUnbalancedTrailing(candidate, "[", "]"); candidate = trimUnbalancedTrailing(candidate, "{", "}"); + candidate = stripTrailingPunctuation(candidate); + candidate = candidate.replace(/[)]+$/g, (suffix) => { + const toTrim = !options.keepTrailingParens ? suffix.length : Math.max(0, suffix.length - 1); + return ")".repeat(suffix.length - toTrim); + }); candidate = candidate.replace(/[*_]+$/, ""); candidate = candidate.replace(/\[\^[^\]]*\]$/, ""); + candidate = stripTrailingPunctuation(candidate); if (!options.keepTrailingParens) { candidate = trimUnbalancedTrailing(candidate, "(", ")"); } @@ -201,6 +213,7 @@ async function collectMarkdownLinksFromStream(stream) { lineNumber++; const trimmed = line.trim(); + // Skip YAML front matter entirely; only scan Markdown content if (lineNumber === 1 && trimmed === "---") { inFrontMatter = true; continue; @@ -208,11 +221,8 @@ async function collectMarkdownLinksFromStream(stream) { if (inFrontMatter) { if (trimmed === "---") { inFrontMatter = false; - continue; - } - if (trimmed.startsWith("#")) { - continue; } + continue; } for (const url of extractLinksFromText(line)) { diff --git a/tools/tests/markdown_links.test.js b/tools/tests/markdown_links.test.js index 27897bb1..68913ea8 100644 --- a/tools/tests/markdown_links.test.js +++ b/tools/tests/markdown_links.test.js @@ -24,7 +24,8 @@ test("collectMarkdownLinksFromStream preserves line numbers", async () => { "Markdown [link](https://docs.example.org/page(with more valid content)).", "Le **[baume du Canada](https://fr.wikipedia.org/wiki/Baume_du_Canada)**", "(_Theropoda [incertae sedis](https://fr.wikipedia.org/wiki/Incertae_sedis)_)", - "[CDN](https://fr.wikipedia.org/wiki/Réseau_de_diffusion_de_contenu)[^2]." + "[CDN](https://fr.wikipedia.org/wiki/Réseau_de_diffusion_de_contenu)[^2].", + "(heu... [oui](https://github.com/opencart/opencart/tree/master/upload/system/storage/vendor)...)" ].join("\n"); const stream = Readable.from([content]); const links = await collectMarkdownLinksFromStream(stream); @@ -36,10 +37,11 @@ test("collectMarkdownLinksFromStream preserves line numbers", async () => { { url: "https://fr.wikipedia.org/wiki/Baume_du_Canada", line: 6 }, { url: "https://fr.wikipedia.org/wiki/Incertae_sedis", line: 7 }, { url: "https://fr.wikipedia.org/wiki/Réseau_de_diffusion_de_contenu", line: 8 }, + { url: "https://github.com/opencart/opencart/tree/master/upload/system/storage/vendor", line: 9 }, ]); }); -test("collectMarkdownLinksFromStream ignores URLs in front matter comments", async () => { +test("collectMarkdownLinksFromStream ignores URLs in front matter entirely", async () => { const content = [ "---", "links:", @@ -51,7 +53,6 @@ test("collectMarkdownLinksFromStream ignores URLs in front matter comments", asy const stream = Readable.from([content]); const links = await collectMarkdownLinksFromStream(stream); assert.deepStrictEqual(links, [ - { url: "https://included.example.com", line: 4 }, { url: "https://body.example.com", line: 6 }, ]); }); diff --git a/tools/update_external_links.js b/tools/update_external_links.js new file mode 100644 index 00000000..835a609e --- /dev/null +++ b/tools/update_external_links.js @@ -0,0 +1,254 @@ +const fs = require("fs"); +const path = require("path"); +const util = require("util"); +const yaml = require("js-yaml"); +const readline = require("readline"); +const { execFile } = require("child_process"); + +const execFileAsync = util.promisify(execFile); + +const SITE_ROOT = path.resolve(__dirname, ".."); +const CONFIG_PATH = path.join(__dirname, "config.json"); + +let config = {}; +if (fs.existsSync(CONFIG_PATH)) { + try { + config = JSON.parse(fs.readFileSync(CONFIG_PATH, "utf8")); + } catch (error) { + console.warn( + `Impossible de parser ${path.relative( + SITE_ROOT, + CONFIG_PATH + )}. Valeurs par défaut utilisées. (${error.message})` + ); + } +} + +const externalConfig = { + cacheDir: path.join(__dirname, "cache"), + cacheFile: "external_links.yaml", + ...(config.externalLinks || {}), +}; + +const CACHE_DIR = path.isAbsolute(externalConfig.cacheDir) + ? externalConfig.cacheDir + : path.resolve(SITE_ROOT, externalConfig.cacheDir); +const CACHE_PATH = path.isAbsolute(externalConfig.cacheFile) + ? externalConfig.cacheFile + : path.join(CACHE_DIR, externalConfig.cacheFile); + +function ensureDirectoryExists(targetFile) { + fs.mkdirSync(path.dirname(targetFile), { recursive: true }); +} + +function loadCache() { + if (!fs.existsSync(CACHE_PATH)) return {}; + try { + return yaml.load(fs.readFileSync(CACHE_PATH, "utf8")) || {}; + } catch (e) { + console.error("Erreur de lecture du cache YAML:", e.message); + return {}; + } +} + +function saveCache(cache) { + ensureDirectoryExists(CACHE_PATH); + fs.writeFileSync(CACHE_PATH, yaml.dump(cache), "utf8"); +} + +function promptFactory() { + const rl = readline.createInterface({ input: process.stdin, output: process.stdout }); + const question = (q) => + new Promise((resolve) => rl.question(q, (ans) => resolve(ans.trim()))); + return { + async ask(q) { + return await question(q); + }, + close() { + rl.close(); + }, + }; +} + +async function ensureCheckRanIfNeeded() { + if (fs.existsSync(CACHE_PATH)) return; + console.log( + "Cache introuvable. Exécution préalable de tools/check_external_links.js..." + ); + await execFileAsync("node", [path.join(__dirname, "check_external_links.js")], { + cwd: SITE_ROOT, + env: process.env, + }); +} + +function listBrokenUrls(cache) { + const result = []; + for (const [url, info] of Object.entries(cache)) { + const status = info && typeof info.status === "number" ? info.status : null; + const killed = info && info.manually_killed === true; + const validated = info && info.manually_validated === true; + if (killed) continue; // on ne traite plus ces URL + if (validated) continue; // déjà validé manuellement + if (status !== null && (status >= 400 || status === 0)) { + result.push({ url, info }); + } + } + return result; +} + +function getFilesForUrl(info) { + let files = []; + if (Array.isArray(info?.files) && info.files.length > 0) { + files = info.files; + } else if (Array.isArray(info?.locations) && info.locations.length > 0) { + files = Array.from(new Set(info.locations.map((s) => String(s).split(":")[0]))); + } + return files.map((p) => path.resolve(SITE_ROOT, p)); +} + +function replaceInFile(filePath, from, to) { + if (!fs.existsSync(filePath)) return { changed: false }; + const original = fs.readFileSync(filePath, "utf8"); + if (!original.includes(from)) return { changed: false }; + const updated = original.split(from).join(to); + if (updated !== original) { + fs.writeFileSync(filePath, updated, "utf8"); + return { changed: true }; + } + return { changed: false }; +} + +async function main() { + await ensureCheckRanIfNeeded(); + let cache = loadCache(); + + const broken = listBrokenUrls(cache); + if (broken.length === 0) { + console.log("Aucun lien en erreur (>= 400) à traiter."); + return; + } + + const p = promptFactory(); + try { + for (const { url, info } of broken) { + const statusLabel = typeof info.status === "number" ? String(info.status) : "inconnu"; + const locations = Array.isArray(info.locations) ? info.locations : []; + const files = Array.isArray(info.files) ? info.files : Array.from(new Set(locations.map((s) => String(s).split(":")[0]))); + console.log("\nURL: ", url); + console.log("Statut: ", statusLabel); + if (locations.length > 0) { + console.log("Emplacements:"); + for (const loc of locations) console.log(" - ", loc); + } else if (files.length > 0) { + console.log("Emplacements:"); + for (const f of files) console.log(" - ", `${f}:?`); + } else { + console.log("Fichiers: (aucun chemin enregistré)"); + } + + const choice = ( + await p.ask( + "Action ? [i]gnorer, [c]onfirmer, [r]emplacer, [m]ort, [q]uitter (défaut: i) : " + ) + ).toLowerCase() || "i"; + + if (choice === "q") { + console.log("Arrêt demandé."); + break; + } + + if (choice === "i") { + // Ignorer + continue; + } + + if (choice === "c") { + const nowIso = new Date().toISOString(); + cache[url] = { + ...(cache[url] || {}), + manually_validated: true, + manually_killed: cache[url]?.manually_killed === true, + status: 200, + errorType: null, + method: "MANUAL", + checked: nowIso, + }; + saveCache(cache); + console.log("Marqué comme validé manuellement."); + continue; + } + + if (choice === "m") { + cache[url] = { + ...(cache[url] || {}), + manually_killed: true, + manually_validated: cache[url]?.manually_validated === true, + status: cache[url]?.status ?? null, + errorType: cache[url]?.errorType ?? null, + method: cache[url]?.method ?? null, + }; + saveCache(cache); + console.log("Marqué comme mort (plus jamais retesté)."); + continue; + } + + if (choice === "r") { + if (!(Array.isArray(files) && files.length > 0)) { + console.log( + "Impossible de remplacer: aucun fichier enregistré pour cet URL. Relancez d'abord tools/check_external_links.js." + ); + continue; + } + const newUrl = await p.ask("Nouvel URL: "); + if (!newUrl || !newUrl.includes("://")) { + console.log("URL invalide, opération annulée."); + continue; + } + // Remplacements dans les fichiers listés + let changedFiles = 0; + for (const rel of files) { + const abs = path.resolve(SITE_ROOT, rel); + const { changed } = replaceInFile(abs, url, newUrl); + if (changed) changedFiles++; + } + console.log(`Remplacements effectués dans ${changedFiles} fichier(s).`); + + // Mettre à jour la base: déplacer l'entrée vers la nouvelle clé + const oldEntry = cache[url] || {}; + const newEntryExisting = cache[newUrl] || {}; + cache[newUrl] = { + ...newEntryExisting, + files: Array.isArray(oldEntry.files) ? [...oldEntry.files] : files, + locations: Array.isArray(oldEntry.locations) + ? [...oldEntry.locations] + : Array.isArray(oldEntry.files) + ? oldEntry.files.map((f) => `${f}:?`) + : Array.isArray(locations) + ? [...locations] + : [], + manually_validated: false, + manually_killed: false, + status: null, + errorType: null, + method: newEntryExisting.method || null, + checked: null, + }; + delete cache[url]; + saveCache(cache); + console.log("Base mise à jour pour le nouvel URL."); + continue; + } + + console.log("Choix non reconnu. Ignoré."); + } + } finally { + p.close(); + } + + console.log("\nTerminé. Vous pouvez relancer 'node tools/check_external_links.js' pour mettre à jour les statuts."); +} + +main().catch((err) => { + console.error("Erreur:", err); + process.exitCode = 1; +});