Browse Source

Commit initial

pull/1/head
Richard Dern 3 weeks ago
commit
e048c8d313
  1. 23
      .drone.yml
  2. 4
      .gitignore
  3. 8
      archetypes/default.md
  4. 44
      config/_default/config.toml
  5. 3
      content/_index.md
  6. 184
      content/blog/2021/01/01/introduction.md
  7. 287
      content/blog/2021/01/03/presentation-de-cyca.md
  8. 278
      content/blog/2021/01/04/installer-gitea-sur-nas-synology.md
  9. 47
      content/blog/2021/01/26/un-livre-en-approche.md
  10. 71
      content/blog/2021/02/28/rant-raspberry-pi-4.md
  11. 25
      content/blog/2021/03/05/plaidoyer-en-faveur-de-l-intelligence.md
  12. BIN
      content/blog/2021/03/09/mon-reseau/images/T34.jpg
  13. BIN
      content/blog/2021/03/09/mon-reseau/images/ak34.jpg
  14. BIN
      content/blog/2021/03/09/mon-reseau/images/gn41.jpeg
  15. BIN
      content/blog/2021/03/09/mon-reseau/images/reseau.png
  16. BIN
      content/blog/2021/03/09/mon-reseau/images/shaper-pipe.png
  17. BIN
      content/blog/2021/03/09/mon-reseau/images/shaper-queue.png
  18. BIN
      content/blog/2021/03/09/mon-reseau/images/shaper-rule.png
  19. BIN
      content/blog/2021/03/09/mon-reseau/images/station-meteo.jpg
  20. 310
      content/blog/2021/03/09/mon-reseau/index.md
  21. 85
      content/blog/2021/03/14/ecommerce-et-auto-hebergement.md
  22. 35
      content/blog/2021/03/18/les-gafam.md
  23. 46
      content/blog/2021/04/02/covid-19-vous-avez-tous-tort.md
  24. 3
      content/blog/_index.md
  25. 3
      content/critiques/films/_index.md
  26. 12
      data/mois.yaml
  27. 9
      docker-compose.yml
  28. 1121
      package-lock.json
  29. 17
      package.json
  30. 7
      postcss.config.js
  31. 44
      tailwind.config.js
  32. 20
      themes/202108/LICENSE
  33. 82
      themes/202108/assets/css/highlight.css
  34. 165
      themes/202108/assets/css/main.css
  35. 9
      themes/202108/assets/js/main.js
  36. 16
      themes/202108/layouts/404.html
  37. 13
      themes/202108/layouts/_default/baseof.html
  38. 9
      themes/202108/layouts/_default/section.html
  39. 56
      themes/202108/layouts/_default/single.html
  40. 11
      themes/202108/layouts/_default/taxonomy.html
  41. 9
      themes/202108/layouts/_default/term.html
  42. 8
      themes/202108/layouts/index.html
  43. 39
      themes/202108/layouts/index.xml
  44. 7
      themes/202108/layouts/partials/base-content.html
  45. 17
      themes/202108/layouts/partials/blocs/latest-articles.html
  46. 21
      themes/202108/layouts/partials/blocs/tags-cloud.html
  47. 16
      themes/202108/layouts/partials/breadcrumb.html
  48. 22
      themes/202108/layouts/partials/footer.html
  49. 25
      themes/202108/layouts/partials/head.html
  50. 6
      themes/202108/layouts/partials/header.html
  51. 8
      themes/202108/layouts/partials/item-article.html
  52. 1
      themes/202108/layouts/partials/tag.html
  53. 12
      themes/202108/theme.toml

23
.drone.yml

@ -0,0 +1,23 @@
kind: pipeline
type: docker
name: default
steps:
- name: build
image: klakegg/hugo:ext-ci
commands:
- npm install --save-dev
- hugo --gc --minify --environment production
- name: deploy
image: appleboy/drone-scp
settings:
host: "10.0.2.1"
target: /mnt/volume1/shares/www/richard-dern.fr/www/
source: public/*
username:
from_secret: scp_user
password:
from_secret: rsync_password
when:
branch: master

4
.gitignore

@ -0,0 +1,4 @@
.DS_Store
._.DS_Store
resources
node_modules

8
archetypes/default.md

@ -0,0 +1,8 @@
---
title: "{{ replace .Name "-" " " | title }}"
date: {{ .Date }}
draft: true
toc: true
tags: []
---

44
config/_default/config.toml

@ -0,0 +1,44 @@
baseURL = 'https://www.richard-dern.fr/'
buildDrafts = true
buildExpired = true
buildFuture = true
defaultContentLanguage = 'fr'
enableEmoji = true
enableGitInfo = false
enableRobotsTXT = true
rssLimit = 10
timeZone = 'Europe/Paris'
theme = '202108'
title = 'Richard Dern'
[params]
AuthorName = 'Richard Dern'
description = "Opinions impopulaires d'un robot parmi les humains"
[markup]
[markup.highlight]
anchorLineNos = false
codeFences = true
guessSyntax = true
hl_Lines = ""
lineAnchors = ""
lineNoStart = 1
lineNos = true
lineNumbersInTable = true
noClasses = false
style = "dracula"
tabWidth = 4
[related]
includeNewer = true
threshold = 90
toLower = false
[[related.indices]]
name = 'tags'
weight = 10

3
content/_index.md

@ -0,0 +1,3 @@
---
title: "Accueil"
---

184
content/blog/2021/01/01/introduction.md

@ -0,0 +1,184 @@
---
title: "Introduction"
date: 2021-01-01T21:39:56+01:00
toc: true
---
Nouvelle année, nouveau blog. Ce n'est pas mon premier, et je ne peux pas
garantir que ce sera le dernier. Mais ma résolution pour 2021: le garder au
moins un an...
<!--more-->
Effectivement, au fil des ans, depuis 1998, j'enchaîne la publication de sites
divers et variés, souvent des blogs, et puis, ne cherchant pas particulièrement
à les faire connaitre, je les supprime au gré de mes humeurs. Sans sauvegarde.
Je suis comme ça: quand quelque chose ne m'intéresse plus, je n'y consacre plus
de temps. Je redémarre à zéro.
L'effet pervers de ce système est que du coup, vous trouverez assez peu de
choses sur moi sur Internet, autres que ce qui est mis en lien en haut à droite
de ce site, et ce d'autant que _Richard Dern_ n'est que mon nom de plume.
Je me réjouis de commencer un nouveau site le jour même d'une nouvelle année.
C'est probablement mon côté psycho-rigide, mais j'éprouve une certaine
satisfaction à mettre en ligne quelque chose de nouveau au premier de l'an.
## À propos de moi ##
### Mon handicap ###
Tout d'abord, il me semble important de vous dire quelle est ma caractéristique
principale, ce qui me définit, ce qui fait de moi ce que je suis. Vous verrez
après en quoi c'est important, mais avant, sachez que je le considère comme un
**handicap**, pas comme un don.
Je suis **neuro-atypique**, plus vulgairement (et faussement) appelé
**surdoué**.
C'est cette caractéristique qui vous fera m'apprécier ou me détester, selon
votre point de vue sur la question, parce qu'il est inévitable que vous en ayez
un.
Cela a de multiples conséquences: j'ai un QI élevé (142), et un système de
pensées en arborescence (là où les neuro-typiques ont une pensée linéaire),
constamment actif, très rapide, rarement mis en défaut.
C'est un handicap en particulier sur le plan social. J'ai écris plusieurs fois
à ce sujet (par exemple, sur
[reddit](https://www.reddit.com/r/self/comments/f525iz/being_smarter_than_98_of_people_could_be_a/)),
mais la douance ne semble toujours pas être globalement acceptée, en
tout cas pas en France. Les "surdoués" sont vus comme des personnes imbues
d'elles-mêmes, se vantant de leur intelligence, et rabaissant les autres. Un
ressenti particulièrement important (et injuste) compte tenu de mon
inextinguible soif de connaissances, source de mon intérêt pour toute chose,
cause du fait que j'ai un avis (souvent éclairé et toujours sourcé) sur de
nombreux sujets. Je le ressent comme injuste (et comme un handicap), parce que,
fondamentalement, si j'ai accès à ces connaissances, tout le monde aussi. Il ne
tient qu'aux gens de s'instruire. Me détester pour ça est un **choix**
profondément injuste.
La douance m'empêche de me faire comprendre clairement et succinctement. À cause
de mon système de pensées en arborescence, dans le cadre d'une discussion
simple, je passe mon temps à piocher des idées en relation avec cette
conversation, plus ou moins éloignées de l'idée initiale mais toujours en
rapport. Cela engendre un manque de comprehension chez l'autre, qui n'avance pas
au même rythme que moi et se sent perdu. Ceci constitue l'autre raison pour
laquelle je considère ma douance comme un handicap.
Je vais m'arrêter là pour l'instant en ce qui concerne ma douance, j'aurai le
temps et l'occasion d'y revenir plus tard, au gré de mes articles sur ce nouveau
site.
### Mon parcours ###
#### Personnel ####
J'ai commencé l'informatique à l'âge de cinq ans sur un Amstrad CPC 464, où j'ai
découvert la programmation en BASIC fin des années 1980. J'ai pu ensuite accéder
aux PC, puis à Internet en 1998, d'abord en fréquentant les premiers cyber-cafés
puis avec ma propre connection 512K par câble.
À cette époque, j'étais très actif sur MSN Chat et MSN Communities, ancêtres de
WhatsApp et facebook (en schématisant). J'avais même reçu une certification de
Microsoft pour la qualité de mes communautés d'aide en informatique.
Et puis j'ai commencé à développer en PHP. D'abord des modules pour le forum
libre [phpBB](https://www.phpbb.com/), puis mes propres applications. J'ai
ensuite laissé tomber PHP quelques temps (entre la version 3 et la version 5)
pour travailler sur le framework .Net de Microsoft, en particulier en C#, et
c'est ainsi que, vers 2005, j'ai commencé à travailler sur Cyca en tant que
"laboratoire de développement".
J'ai fait plusieurs tentatives pour m'intégrer à diverses communautés sur
Internet, incluant facebook, twitter, ActivityPub, mais aussi des sites comme
[LinuxFr.org](https://linuxfr.org/). J'ai tenu plusieurs blogs successifs,
traitant toujours d'informatique, mais aussi d'autres sujets qui me sont chers.
J'ai réalisé quelques applications que j'ai voulu publié, mais je n'ai jamais eu
le "succès" que j'attendais. J'ignore toujours si c'est parce que ce que je
faisais n'intéressait personne, si c'est parce que je ne savais pas comment
interagir avec les autres humains, ou si c'est parce que je ne savais pas
comment gérer la haine de certains de mes détracteurs. Quoiqu'il en soit, tout
ou presque est désormais perdu, oublié.
Ce qui me ramène à mon handicap. Malgré ma présence sur Internet depuis ses
débuts en France (je me souviens qu'à cette époque, je notais dans un carnet
toutes les adresses web que je voyais dans les journaux et magazines, en
prévision de les consulter quand j'aurais Internet, mais j'ai vite lâché prise
face à la quantité), je n'ai pas de réseau. Je ne connais personne, et personne
ne me connait, contrairement à d'autres "vieux de la vieille", dont certains
sont apparus après moi sur Internet, mais qui sont toujours présents et
populaires. Et cela a des conséquences aussi sur ma vie professionnelle.
#### Professionnel ####
Je n'ai pas très envie de m'étendre sur le sujet. Je n'ai connu que des
déceptions professionnelles, parfois graves. La dernière en date, celle qui a
causé mon chômage actuel, s'est terminée en burn-out. Ce chômage m'a permi de
travailler sur Cyca, mais je n'ai pas eu le temps d'en faire un projet
financièrement viable. Par manque de réseau, de compétences sociales, et peut
être aussi parce que personne n'en a l'intérêt, finalement.
En bref, mon parcours professionnel est un désastre, mais je garde espoir de
trouver un employeur qui saura utiliser mes compétences (et mon handicap) à bon
escient.
## Ce que j'attends de ce site ##
J'ai beaucoup de choses à dire, sur beaucoup de sujets différents. J'ai besoin
de les extérioriser. Mais jusqu'à présent, je n'avais peut-être pas la bonne
approche.
Ce blog est sous-titré:
> Opinions impopulaires d'un robot parmi les humains
J'essaye de convoyer plusieurs choses dans ce sous-titre, lisible sur toutes les
pages du site:
- Je m'exprime, en mon nom, sur mon site, mon propre point de vue, sur les
sujets de mon choix. Cela fait beaucoup de possessifs, mais il me semble
important de mettre en exergue que mes pensées m'appartiennent, et que je suis
libre de les diffuser comme je l'entends, sans crainte de la censure
- Ces idées sont impopulaires: mon point de vue est généralement différent des
autres, sauf sur des sujets bien spécifiques où un élément extérieur vient
corroborer une idée parfaitement inébranlable. De plus, elles concernent parfois
des sujets disruptifs, clivants, quand je crois en l'inéluctable. Ma vision du
monde est binaire ([booléenne](https://fr.wikipedia.org/wiki/Booléen) serait
plus appropriée), en contradiction avec la vision populaire nuancée
- Le terme "robot" fait référence à cette vision booléenne du monde, mais aussi
à ma capacité à me focaliser sur un sujet précis sans en démordre. Mes sujets
sont sourcés, vérifiables. Mais même quand, parfois, je m'aventure dans des
domaines où les idées sont encore indécises, je maintiens mes positions. Ça ne
veut pas dire que je suis fermé à toute discussion, mais cela signifie que si
vous souhaitez me faire changer d'avis, il vous en coûtera (émotionnellement)
- Enfin, "parmi les humains", parce que je ne me sens pas à ma place dans la
société humaine, capitaliste, et... sociale
J'ai bien conscience que présenté de cette façon, je n'incite pas le dialogue.
Pourtant, les rares personnes qui ont des rapports sociaux avec moi ont l'air
d'en être plutôt satisfaits. Je suis en couple depuis quinze ans 😊.
De toutes façons, le but de ce site, pour moi, est surtout de communiquer sur ce
qui m'intéresse. Si cela provoque une discussion intéressante et constructive,
c'est un gros bonus, évidemment. Mais je ne tolère plus les _haters_, en
particulier sur un site que j'héberge moi-même.
Au-delà de ça, j'espère conserver ce site en ligne plus longtemps que les
précédents. C'est la raison pour laquelle j'ai choisi d'utiliser
[Hugo](https://gohugo.io/) plutôt qu'un moteur de blog comme
[WordPress](https://wordpress.com), [dotClear](https://fr.dotclear.org)
(que je connais depuis longtemps) ou hébergé par un tiers. Hugo est moins facile
à "casser" à cause d'un plugin, plus personnel. De plus, un site "statique"
correspond à mes valeurs (peu ou pas du tout de javascript), et à l'usage d'un
blog. Là encore, j'aurai l'occasion de revenir sur ce sujet.
## Le mot de la fin, "Peinture fraîche" ##
Si vous avez tenu le coup jusqu'ici, merci ! Mais attendez-vous à des articles
encore plus longs à l'avenir. Comme je l'ai dit, j'ai beaucoup de choses à dire,
et je ne suis sûrement pas doué pour être concis.
Comme dit précédemment, j'utilise Hugo pour publier ce site. J'ai donc toute
latitude pour en faire ce que je veux, mais pour l'instant, c'est encore un peu
vide. Patience: il y a plein de choses que j'aimerais faire ici...

287
content/blog/2021/01/03/presentation-de-cyca.md

@ -0,0 +1,287 @@
---
title: "Presentation de Cyca"
date: 2021-01-03T02:03:36+01:00
tags: ["Auto-hébergement", "Cyca", "PHP", "Laravel"]
toc: true
---
> ⚠️ Cyca est en cours de réécriture, le dépôt git est toujours disponible mais
> pas le site officiel.
Je vous présente aujourd'hui mon principal projet: Cyca, un gestionnaire de
favoris et de flux.
- [~~Site officiel~~](https://www.getcyca.com/) (🇫🇷, 🇺🇸)
- [Dépôt git](https://git.athaliasoft.com/richard/cyca)
<!--more-->
<!-- Capture de Cyca -->
## (Bref) Historique du projet ##
L'histoire de Cyca démarre il y bien longtemps. Au début, c'était une
application de bureau écrite en C#, et disponible pour Windows uniquement. Par
la suite, devenant de plus en plus à l'aise en PHP, j'en ai fait une application
web. Mais que ce soit en C# ou en PHP, Cyca a toujours été mon projet
"laboratoire": chaque fois que je voulais tester une technique, un framework,
une bibliothèque, je le faisais sur Cyca. Aujourd'hui, évidemment, les process
de développement ont bien changé (parfois en bien), et ce n'est plus un projet
laboratoire victime du syndrome de Frankenstein mais bien une application
fonctionnelle depuis **septembre 2020** et l'apparition de son dépôt sur GitHub.
## Introduction ##
Cyca est un gestionnaire de favoris et de flux:
- Libre (publié sous licence [GNU GPL](http://www.gnu.org/licenses/gpl-3.0.html))
- basé sur le web (écrit en [PHP](https://www.php.net/))
- multi-utilisateurs
- _desktop-centric_ (pensé pour le bureau avant le mobile)
- non-intrusif (pas de notifications surgissantes ou visuellement agressives)
- respectueux de la vie privée (via différents moyens, mais en particulier par
l'**absence de système de télémétrie**)
- aussi **simple** à utiliser que possible (peu de formulaires)
- destiné à récolter autant d'informations que possible à propos de vos favoris
et de vos flux
### Technique ###
La _stack_ de Cyca repose sur:
- [Laravel](https://laravel.com)
- [Vue](https://vuejs.org/)
- [TailwindCSS](https://tailwindcss.com/)
Puisque Cyca fait appel au framework Laravel, l'application supporte:
- une base de données MySQL/MariaDB, PostgreSQL, SQLServer ou SQLite (non
recommandé pour des raisons de performance dans le cas d'une utilisation
intensive)
- Redis pour le cache, les sessions, les files d'attente
D'autres outils peuvent également être utilisés, tels que BeanStalkd, memcached,
Amazon SQS, etc. De plus, le système de stockage de Cyca permet l'usage de
systèmes de fichiers tels que FTP, Amazon S3 en plus du stockage local. En
effet, Cyca est amené à stocker un certain nombre d'informations additionnelles
et offre donc le choix de leur emplacement.
## Fonctionnalités ##
### Arborescence ###
Cyca permet la gestion de favoris (ou _documents_) au sein d'une arboresence de
dossiers (par opposition à un système de _tags_, qu'il sera toujours possible
d'implémenter ultérieurement s'il y a une demande). Cette arborescence constitue
le premier panneau de l'interface, occupant le côté gauche de l'écran.
En outre, chaque utilisateur peut créer ou rejoindre un ou plusieurs groupes.
Un groupe permet de partager avec plusieurs utilisateurs la même arborescence de
dossiers, de documents et de flux, avec des permissions attribuables par
utilisateur et par dossier, par le créateur du groupe.
<!-- Capture de Cyca -->
Chaque nouvel utilisateur se voit attribuer son propre groupe, par défaut
inaccessible aux autres ("Seulement sur invitation").
Un groupe peut être directement rejoint par un utilisateur, ou seulement sur
invitation. Une fonctionnalité prévue dans la _roadmap_ impliquera un système
de fédération, où il sera possible d'accéder à un groupe hébergé sur une autre
instance de Cyca.
Il existe actuellement trois types de dossiers, chaque type ayant certaines
caractéristiques:
- Le dossier _Éléments non-lus_ permet de lister tous les documents possédant
des éléments de flux non-lus
- Le dossier _Racine_, où seront stockés les autres dossiers et les documents
- Les dossiers créés par l'utilisateur
Chaque groupe possède sa propre arborescence de dossiers, incluant un dossier
_Éléments non-lus_ et un dossier _Racine_ qui lui sont spécifiques.
L'utilisateur a la possibilité de basculer d'un groupe à l'autre très facilement
grâce aux liens situés au-dessus de la liste des dossiers.
<!-- Capture de Cyca -->
Sur cette capture, vous pouvez voir le groupe en haut (avec le nombre total
d'éléments non-lus dans ce groupe), puis, en dessous, l'arborescence appartenant
à ce groupe.
Un formulaire simple permet de créer ou renommer chaque dossier (à l'exception
des dossiers _Éléments non-lus_ et _Racine_). Le _drag'n'drop_ permet de
déplacer dossiers et documents.
Chaque dossier peut être déployé ou réduit (_expanded_ ou _collapsed_), comme
dans toute arborescence digne de ce nom, avec toutefois une subtilité: il est
possible de déployer ou réduire un dossier **et** ses sous-dossiers en
maintenant un clic long sur l'icône en forme de triangle à gauche du dossier.
Pratique pour cacher ou voir un sous-ensemble des dossiers en quelques instants.
<!-- Capture de Cyca -->
### Documents ###
Un dossier peut contenir un nombre illimité de documents. Cette liste occupe la
partie médianne de l'écran. Elle peut afficher des listes différentes en
fonction du dossier sélectionné: soit les documents effectivement liés au
dossier en cours, mais aussi les documents contenant des éléments non-lus si le
dossier éponyme est sélectionné.
Là encore, le formulaire pour ajouter un document est extrêmement simple: il
suffit de renseigner l'URL du document (ou du flux) qui nous intéresse dans le
panneau des détails (occupant la partie inférieure droite de l'écran).
Si vous renseignez l'URL vers un flux (RSS ou Atom), Cyca analysera ce flux à la
recherche du document parent. Cyca ajoutera alors à vos favoris ce document à la
place du flux RSS, qui, lui, sera associé au document.
Vous avez ensuite la possibilité de découvrir les informations collectées par
Cyca à propos de l'URL qui vous lui avez soumise en sélectionnant le document,
ce qui provoquera la modification du panneau de détails en bas à droite de
l'écran:
<!-- Capture de Cyca -->
Vous constaterez sur la capture ci-dessus la présence d'un flux RSS qu'il est
possible d'ignorer. Cyca l'a automatiquement découvert, et me proposera donc
l'actualité de ce site dès qu'elle sera disponible.
Vous remarquerez en outre la coloration de certains éléments des adresses
affichées dans Cyca, dans le but d'améliorer leur lisibilité, et éviter certains
[problèmes de sécurité](https://crealinks.biz/la-faille-punycode-comment-se-proteger/)
les conçernant, malheureusement pas en évitant ces problèmes (Cyca ne peut pas
deviner si le site que vous avez ajouté à vos favoris soit bien celui qu'il
prétend être, en tout cas pas à ce stade), mais en vous présentant l'URL que
vous venez d'ajouter d'une façon plus claire, plus lisible, en vous permettant
de différencier rapidement les caractères disposant d'une graphie similaire
(ce qu'on appelle les [homoglyphes](https://fr.wikipedia.org/wiki/Homoglyphe)).
Enfin, vous noterez en bas de cette capture un groupe "Réponse HTTP" dépliable
qui contient toutes les informations récoltées lors de la requête HTTP au
serveur.
Ces informations ont un but informatif. Ce n'est pas un outil de sécurité, qui
ne cherche ni à récolter des données auxquelles il n'a pas accès, ni à faire
usage de ces données à des fins malencontreuses. Les données récoltées par Cyca
sont des données publiques, accessibles à tous, telles que la version du
protocole, les en-têtes de la réponse, le type MIME, etc. Par ailleurs, aucune
donnée personnelle n'est envoyée au serveur distant, pour qui c'est Cyca le
client.
Pour les connaisseurs, c'est la librairie [Guzzle](https://docs.guzzlephp.org/en/stable/overview.html)
qui est mise en oeuvre ici.
### Flux ###
Dès qu'un document est créé dans Cyca, l'application va automatiquement
découvrir les flux associés de deux façons différentes:
- la méthode classique, consistant à analyser les balises ```<link>``` à la
recherche de flux **déclarés**
- la méthode brute, consistant à tester certaines URLs connues (par exemple,
_/feed_, _/rss_, etc.)
Grâce à ce fonctionnement, et c'est le but de Cyca, même si vous ignorez que
certains sites déclarent un flux, ou même si vous ignorez ce qu'est un flux,
vous aurez accès à l'actualité de vos favoris, même si vous n'êtes pas encore
consommateur de flux. Autrement dit: Cyca a été conçu pour vous engager sur la
voie de la consommation des flux RSS et/ou Atom.
### Éléments de flux ###
Les éléments de flux sont affichés dans le panneau situé en haut à droite, et
se présente sous la forme d'une liste, mêlant éléments lus et éléments non-lus
dans tous les dossiers, à l'exception du dossier _Éléments non-lus_ qui ne
listera que les éléments... non-lus.
<!-- Capture de Cyca -->
Vous pouvez voir ici que Cyca liste les éléments lus en gris clair, tandis que
les éléments non-lus sont affichés en blanc. On dispose par ailleurs du titre
du flux dans lequel chaque élément a été publié, ainsi que la date de
publication.
Enfin, on aperçoit une fonctionnalité intéressante de Cyca: la mise en
surbrillance, qui vous permet de mettre en exergue certaines expressions qui
vous intéressent en particulier (ici, "Apple").
Cyca respecte la décision des éditeurs de flux de ne pas inclure la totalité du
texte dans leur flux. Certains, particulièrement les geeks, les revues
scientifiques ou les systèmes d'alerte incluent le texte complet de leur
publication, parfois même avec des pièces jointes (que Cyca ne supporte pas
encore), mais d'autres se contentent d'un résumé, voire d'un simple lien.
Cyca n'a pas et n'aura jamais la volonté d'aller plus loin. Il existe des outils
spécifiques à cet usage, mais ils ne respectent pas l'éthique que je veux pour
Cyca.
### Mises en surbrillance ###
<!-- Capture de Cyca -->
Cyca vous permet de définir des mises en surbrillance, qui vous vous permettre
d'isoler, dans la liste des éléments de flux, ceux qui vous intéressent
particulièrement.
Il vous suffit pour cela de définir une expression et une couleur associée.
Cette expression peut être un simple mot, ou une
[expression régulière](https://fr.wikipedia.org/wiki/Expression_régulière).
### Autres fonctionnalités ###
- Cyca supporte un thème sombre et un thème clair, soit forcé soit adapté
automatiquement en fonction du système d'exploitation
- Cyca est actuellement capable de lire les méta-données d'une image et d'un
fichier PDF
## Fonctionnalités à venir ##
- J'aimerais intégrer un système de fédération permettant, comme dit plus haut,
de rejoindre un groupe hébergé sur une autre instance de Cyca
- J'ai commencé à travailler sur une [librairie](https://git.athaliasoft.com/richard/php-gemini)
pour le protocole [gemini](https://gemini.circumlunar.space/), qui permettra
d'ajouter des liens sur ce réseau à Cyca...
- ...puis, en créant une abstraction des protocoles, permettre à Cyca de gérer
des favoris sur n'importe quel réseau (FTP, Gopher, etc.)
- J'aimerais introduire un moteur de recherche local, permettant de retrouver
facilement documents et éléments de flux (en cours lors de la publication de
cette présentation)
- J'aimerais ajouter la possibilité de trier les documents et les flux selon
les préférences de l'utilisateur
## De quoi Cyca a besoin ? ##
- D'argent: j'arrive en fin de droits au chômage, ce qui signifie que je ne
pourrais plus travailler sur Cyca à temps plein. Mon objectif était de monétiser
Cyca par la mise en place d'un service hébergé, mais je n'ai plus le temps
d'atteindre cet objectif. Les dons me permettraient de financer l'électricité,
le matériel, et le travail que je fournis sur Cyca, en attendant d'atteindre
l'indépendance financière.
- De traducteurs: Cyca n'est pour l'instant disponible qu'en anglais et en
français.
- De "colporteurs": si vous avez lu mon premier post sur ce blog, vous savez
déjà qu'il me manque un réseau social, de personnes en mesure de tester Cyca,
en parler autour d'eux, et me remonter problèmes et suggestions.
## Conclusion ##
J'ai développé Cyca parce que j'estime que c'est une application qui répond à
deux besoins que j'ai en tant qu'Internaute: gérer des favoris (en grande
quantité) et des flux (de même). Il me semblait logique de faire les deux au
même endroi.
C'est, pour moi, pour mon usage quotidien, une application essentielle, qui
répond à ces besoins de la meilleure manière possible, selon mes critères.
Mais je souhaite qu'elle puisse répondre aux vôtres aussi, afin qu'elle figure
dans le rang des outils "essentiels", au même titre qu'un gestionnaire de mots
de passe, ou d'un éditeur de texte.
Merci d'avoir lu cette présentation. J'espère qu'elle vous donnera envie de
donner sa chance à Cyca, et d'en parler à vos contacts.
~~N'hésitez pas à [me contacter](https://microblog.richard-dern.fr/@richard) sur
ActivityPub !~~

278
content/blog/2021/01/04/installer-gitea-sur-nas-synology.md

@ -0,0 +1,278 @@
---
title: "Installer Gitea sur un NAS Synology"
date: 2021-01-04T11:16:36+01:00
tags: ["SysAdmin", "Synology", "Git", "Gitea"]
toc: true
---
Je vous propose un tutoriel sur l'installation de la forge Libre Gitea sur un
NAS Synology avec une petite nuance par rapport à ce qu'on trouve habituellement
sur le sujet: on n'utilisera pas Docker...
<!--more-->
En effet, j'ai à ma disposition un
[DS216play](https://global.download.synology.com/download/Document/Hardware/DataSheet/DiskStation/16-year/DS216play/enu/Synology_DS216play_Data_Sheet_enu.pdf), basé sur un processeur STM Monaco
[STiH412](https://www.st.com/resource/en/data_brief/stih412.pdf), processeur ARM
à double-coeur à 1.5GHz (plus quatre coeurs dédiés à la vidéo). Un bon NAS pour
un usage courant, mais qui ne supporte malheureusement pas Docker, ce qui aurait
considérablement simplifié l'installation et la maintenance de logiciels tiers,
en particulier celui qui nous intéresse aujourd'hui:
[Gitea](https://gitea.io/en-us/).
La méthode que je vais décrire ici pourrait également être appliquée avec un NAS
où l'on pourrait (techniquement) utiliser Docker, mais sans le vouloir. Je pars
du principe que votre NAS est à jour (version 6.2.3 au moment d'écrire ce
tutoriel), mais il est probable que cela fonctionne pour des versions
antérieures.
## Installation de paquets supplémentaires ##
Notre procédure exige l'installation de paquets Synology supplémentaires. Allez
dans le _Centre de paquets_, et installez:
- Git Server
- MariaDB 10
- phpMyAdmin
Tous trois se trouvent dans les paquets _Tierce partie_.
Notez le mot de passe que vous allez saisir dans MariaDB, vous en aurez besoin
plus tard.
Ouvrez ensuite MariaDB via le lien présent dans le menu principal, afin de
cocher la case "Activer la connexion TCP/IP", sur le port 3307.
## Activer SSH sur le NAS ##
Connectez-vous à l'interface d'administration de votre NAS, puis allez dans le
_Panneau de configuration_. Activez le _Mode avancé_ en cliquant sur le lien en
haut à droite, puis ouvrez _Terminal & SNMP_. Activez _SSH_, et laissez-le sur
le port 22 pour le moment. Cliquez sur _Appliquer_.
## Créez un dossier dédié à Gitea ##
Allez maintenant dans _Dossier partagé_, et créez un partage _Gitea_.
- [x] Cacher ce dossier partagé dans "Mes emplacements réseaux".
- [x] Masquer les sous-dossiers et les fichiers des utilisateurs sans autorisations.
- [ ] Activer la corbeille.
Ne donnez aucun accès à personne pour le moment (c'est-à-dire, laissez tous les
autres paramètres à leurs valeurs par défaut).
## Créer un utilisateur pour Gitea ##
Toujours dans le _Panneau de configuration_, ouvrez la page _Utilisateur_, et
créez-en un nouveau, appelé comme vous le souhaitez, mais partons pour _gitea_.
Affectez-lui un mot de passe dont vous vous souviendrez.
Laissez-le dans le groupe _users_. Par contre, donnez-lui les accès en lecture
et en écriture dans le dossier partagé _gitea_ que vous venez de créer.
Vous pouvez éventuellement attribuer des quotas, mais laissez tout le reste aux
valeurs par défaut.
## Se connecter en SSH au NAS ##
Depuis votre terminal préféré, initiez une connection SSH vers votre NAS, avec
l'utilisateur _admin_.
```bash {linenos=false}
ssh admin@nas
```
Une fois votre mot de passe saisi, vous devriez être connecté.
## Télécharger Gitea ##
On va stocker Gitea dans son propre répertoire, dans le dossier partagé créé
précédemment.
```bash {linenos=false}
cd /volume1/gitea/
mkdir bin
cd bin/
wget https://dl.gitea.io/gitea/1.13.1/gitea-1.13.1-linux-arm-6
ln -s gitea-1.13.1-linux-arm-6 gitea
ls -alh
```
Vous devriez voir la sortie suivante, qui vous montre la création d'un lien
symbolique _gitea_ vers le binaire téléchargé _gitea-1.13.1-linux-arm-6_, ce qui
simplifiera les commandes futures.
```plaintext {linenos=false}
lrwxrwxrwx+ 1 gitea users 24 Jan 4 00:12 gitea -> gitea-1.13.1-linux-arm-6
-rwxrwxrwx+ 1 gitea users 96M Dec 28 19:50 gitea-1.13.1-linux-arm-6
```
## Tester ##
```bash {linenos=false}
chmod +x gitea
export GITEA_ROOT="/volume1/gitea"
./gitea --port 13000 --custom-path $GITEA_ROOT/custom --config $GITEA_ROOT/custom/conf/app.ini
```
Le port 3000 étant déjà utilisé, on demande à Gitea de démarrer sur le port
13000, et on lui indique où stocker ses données.
La dernière ligne de la sortie provoquée par cette commande devrait ressembler à
ça:
```plaintext {linenos=false}
2021/01/04 00:19:43 ...s/graceful/server.go:55:NewServer() [I] Starting new server: tcp:0.0.0.0:13000 on PID: 26230
```
Confirmez en ouvrant votre navigateur, puis en allant à l'adresse de votre NAS,
sur le port 13000:
> http://nas:13000/
En théorie, vous devriez voir la page d'accueil de votre instance Gitea.
N'y faites rien pour l'instant, on ne l'a pas démarré avec le bon utilisateur:
c'était juste une _proof-of-concept_, il est maintenant temps de lancer Gitea
avec son utilisateur attitré.
Retournez dans votre terminal, puis stoppez le processus avec
<kbd>CTRL</kbd>+<kbd>C</kbd>.
## Démarrage de Gitea ##
Allez dans le _Panneau de configuration_, puis dans le _Planificateur de
tâches_. Créez une nouvelle _Tâche déclenchée_. Nommez-la "Gitea", affectez
l'utilisateur _gitea_, à l'évènement "Démarrage". Allez ensuite dans l'onglet
"Paramètres de tâche". Le temps des tests, je vous recommande de cocher la
case permettant d'envoyer les détails d'exécution par email. Une fois qu'on se
sera assuré que tout fonctionne, on pourra aussi cocher la case "Envoyer les
détails d'exécution uniquement lorsque le script se termine de manière
anormale".
Dans la zone de texte du bas, "Script défini par l'utilisateur", copiez-collez
ceci:
```bash {linenos=false}
export HOME="/volume1/homes/gitea"
export GITEA_ROOT="/volume1/gitea"
$GITEA_ROOT/bin/gitea --port 13000 --custom-path $GITEA_ROOT/custom --config $GITEA_ROOT/custom/conf/app.ini
```
Enregistrez, puis faites un clic droit sur la tâche et _Exécuter_.
Si vous pouvez accéder à l'interface web de Gitea, comme pendant le test
précédent, et qu'aucun mail ne vous est envoyé avec une sortie de programme,
c'est qu'on peut passer à la configuration...
## Base de données ##
Dans le menu principal de DSM, ouvrez _phpMyAdmin_. Connectez-vous au compte
_root_, avec le mot de passe spécifié pendant l'installation du paquet MariaDB.
Dans la barre en haut, cliquez sur _Comptes utilisateurs_, puis _Ajouter un
compte d'utilisateur_.
Donnez-lui un nom (par exmple, _gitea_), un mot de passe, puis cochez les cases:
- [x] Créer une base portant son nom et donner à cet utilisateur tous les privilèges sur cette base.
- [x] Accorder tous les privilèges à un nom passe-partout (utilisateur\_%).
Puis cliquez sur le bouton _Exécuter_ tout en bas à droite.
## Configuration de Gitea ##
De retour dans l'interface de Gitea, on peut remplir les champs liés à la base
de données.
Le serveur MariaDB sur le NAS écoute sur le port 3307, au lieu du 3306 habituel.
Le nom d'utilisateur et le nom de la base de données devraient être _gitea_ si
vous avez suivi mes indications, et le mot de passe est celui que vous venez de
donner à l'utilisateur _gitea_ dans MariaDB.
Il est important maintenant de définir les chemins d'accès aux fichiers:
- Emplacement racine des dépôts: /volume1/gitea/gitea-repositories
- Répertoire racine Git LFS: /volume1/gitea/bin/data/lfs
- Chemin des fichiers log: /volume1/gitea/log
Vous devez aussi vous assurer que les noms de domaines mentionnés correspondent
à celui utilisé pour accéder à votre NAS.
Placez le port d'écoute SSH sur le port 10022, puis continuez la configuration
avec les paramètres facultatifs.
## Tester ##
Allez dans la configuration de Gitea, une fois que vous y serez connecté, puis
dans "Clés SSH/GPG".
Récupérez votre clé publique depuis une autre machine:
```bash {linenos=false}
ssh-keygen -t rsa
cat ~/.ssh/id_rsa.pub
```
La clé aura cette forme:
```plaintext {linenos=false}
ssh-rsa <série de caractères> <utilisateur>@<ordinateur>
```
Dans Gitea, faites un copier-coller de cette clé publique dans "Ajouter une
clé".
Créez maintenant un dépôt de test qui sera supprimé ensuite. Gitea vous donne
même la marche à suivre:
```bash {linenos=false}
touch README.md
git init
git add README.md
git commit -m "first commit"
git remote add origin ssh://gitea@<domaine>:13000/<utilisateur>/test.git
git push -u origin master
```
Arrivé là, il est fort à parier qu'un nom d'utilisateur et un mot de passe vous
sera demandé, à la place de l'identification à clé publique. C'est tout
simplement parce que les permissions du dossier _.ssh_ de l'utilisateur _gitea_
ne sont pas les bonnes, et parce que Gitea n'a pas lancé son propre serveur SSH.
Dans votre terminal, toujours en tant qu'_admin_, exécutez les commandes
suivantes:
```bash {linenos=false}
sudo su
cd /volume1/homes/gitea
chmod 0711 ./
chmod 0711 ./.ssh/
chmod 0600 ./.ssh/authorized_keys
```
Vous devez également ajouter un paramètre à la configuration de Gitea, située
dans le fichier _/volume1/gitea/custom/conf/app.ini_.
Dans la section _[server]_, rajoutez:
```ini {linenos=false}
START_SSH_SERVER = true
```
Arrêtez Gitea en faisant:
```bash {linenos=false}
killall gitea
```
Et relancez la tâche planifiée créée plus tôt. Gitea doit démarrer et un _push_
ou un _pull_ vers votre dépôt de test devrait fonctionner.
## Mise à jour de Gitea ##
À chaque nouvelle version, il vous suffit de télécharger le fichier binaire, et
de changer le lien symbolique vers lui, comme on l'a fait avant. Vous stoppez
ensuite Gitea, sauvegardez les données comme vous le faites d'habitude avec DSM,
et relancer la tâche planifiée.

47
content/blog/2021/01/26/un-livre-en-approche.md

@ -0,0 +1,47 @@
---
title: "Un Livre en approche"
date: 2021-01-26T21:18:11+01:00
tags: ["Livres", "L'humain, cette espèce primitive", "Réflexions"]
---
Après la publication de deux billets sous une bannière commune, "L'Humain, cette
espèce primitive", j'ai voulu aller plus loin dans la réflexion, et en écrivant
un troisième "chapitre", je me suis dit: "Pourquoi pas ?". Pourquoi n'en
ferais-je pas un "vrai" livre, plutôt qu'une simple série de billets de blog ?
<!--more-->
Une vingtaine de jours plus tard, j'apporte les dernières touches à ce qui va
devenir mon premier livre publié. Je suis actuellement en phase de relecture.
C'est un moment très stressant: est-ce que j'en ai trop dit ? pas assez ? est-ce
que ça va plaire ? vais-je déchainer les _haters_ contre moi ? y aura-t'il
quelqu'un pour me lire ? Les questionnements se bousculent dans ma tête,
générant une peur tenace. Mais je finis toujours par me dire: j'ai _envie_ de le
faire. J'ai écrit ce dont j'avais _envie_, et c'est sûrement ça, le plus
important (même si savoir que ce qu'on a écrit est lu est quand même très
agréable !).
On m'a souvent reproché d'être "aggressif" dans mes écrits antérieurs. C'est
d'ailleurs probablement la raison pour laquelle je n'ai jamais voulu publier
sous une autre forme que le blog. Mais, l'âge aidant probablement, je me suis
assagi, posé. Et je suis _un peu_ fier d'y être parvenu: contrôler mes émotions
est parfois difficile en tant que neuro-atypique, mais je crois que, dans ce
livre, et malgré le titre que certains jugeront sûrement provocateur, je m'en
sors plutôt bien. Les quelques personnes qui ont accepté leur rôle de
relecteurs, connaissant mes anciens écrits, m'ont tous jugé sur cet aspect
spécifique: je ne suis plus aussi "condescendant" ou "moralisateur". Ils avaient
envie de lire, et ont trouvé ça intéressant. Je sais que ça n'a pas vraiment de
valeur pour mes futurs lecteurs, mais ça m'encourage. J'ai - enfin ! - ce
sentiment d'avoir progressé.
À tel point que j'ai déjà un second livre dans les cartons, mais dans un tout
autre registre...
Une fois la relecture terminée et après quelques derniers fignolages, je rendrai
le livre public. Comme j'ai besoin de me nourrir, me loger, et surtout d'avoir
Internet (notez les priorités), le livre ne sera pas gratuit, mais il sera
**libre**, publié sous la licence
[CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/deed.fr). Je
mettrai évidemment à disposition (gratuitement) les sources du livre dans un
dépôt git qu'il me reste à définir (auto-hébergé ou sur GitHub).

71
content/blog/2021/02/28/rant-raspberry-pi-4.md

@ -0,0 +1,71 @@
---
title: "Rant : Raspberry Pi 4"
date: 2021-02-28T23:11:30+01:00
tags: ["Raspberry Pi", "Rant", "ODROID", "Banana Pi", "Orange Pi", "Linux", "BSD"]
toc: true
---
Je suis un utilisateur de Raspberry Pi depuis longtemps. Je possède au moins un exemplaire de chaque itération "grand public", à l'exception du 2. Chaque itération apporte son lot de nouveautés, d'espérences, et de déceptions. Voici un tour d'horizon de ce qui me frustre avec ces petites machines.
<!--more-->
## Le système d'exploitation
Pour commencer, il n'existe pas de version 64bits stable du système d'exploitation "officiel", Raspberry Pi OS. Une version "bêta" est en développement depuis au moins le [28 mai 2020](https://www.raspberrypi.org/forums/viewtopic.php?p=1668160). Je trouve ça plutôt embêtant parce que :
- Le Raspberry Pi 3 dispose d'un processeur 64bits [depuis 2016](https://www.raspberrypi.org/blog/raspberry-pi-3-on-sale/)
L'architecture ARM 64bits existe [depuis 2011](https://en.wikipedia.org/wiki/ARM_architecture#64/32-bit_architecture). Toutefois, l'absence de système 64bits officiellement supporté par la fondation Raspberry Pi à l'heure actuelle n'est pas entièrement de sa faute : l'architecture ARMv8 n'est disponible "que" [depuis 2019](https://www.debian.org/releases/buster/) sous Debian (distribution sur laquelle repose Raspberry Pi OS).
- De nombreuses distributions tierces offrent une version 64bits pour le Raspberry Pi 3
C'est le cas de nombreuses distributions GNU-Linux, telles que [Ubuntu](https://ubuntu.com/download/raspberry-pi), [Alpine Linux](https://alpinelinux.org/downloads/), mais aussi [FreeBSD](https://www.freebsd.org/where/). Dès lors, on se demande pourquoi Raspberry Pi OS ne dispose pas déjà d'une version 64bits.
Je regrette toutefois que la plupart des systèmes d'exploitation "tiers" ne supportent pas officiellement le Raspberry Pi 4. Le problème, c'est que tout le monde annonce un support à 100% du Pi 3 _aujourd'hui_. Quand ils annonceront un support à 100% du Pi 4, je m'attends à ce qu'un hypothétique Pi 5 sorte sur le marché. Il y a un décalage assez désagréable entre la vente du matériel et la mise à disposition du logiciel.
Ce décalage est d'autant plus problématique qu'il est sans doute la source des problèmes assez graves qui ont miné les débuts du Pi 4, notamment en ce qui concerne l'[USB-C](https://bgr.com/2019/07/10/raspberry-pi-4-usb-c-charging-issue-how-to-fix-the-power-problem/), et d'autres manquements, en particulier du boot sur USB.
- Le Raspberry Pi 4 offre jusqu'à 8Go de mémoire vive, dont ne peuvent pleinement bénéficier que des applications 64bits
- Il y a un [gain de performance](https://matteocroce.medium.com/why-you-should-run-a-64-bit-os-on-your-raspberry-pi4-bd5290d48947) significatif à passer sur un système 64bits, même sans disposer de 8Go de mémoire
Pour une utilisation "desktop", le gain est appréciable notamment dans la navigation web. Pour une utilisation "serveur", c'est le réseau et la gestion mémoire qui bénéficient du passage à 64bits. Je crois d'ailleurs me souvenir (sans pouvoir retrouver la source, malheureusement), que la fondation Raspberry Pi avait freiné le développement de la version 64bits, prétextant que le gain de performance n'était pas justifié, ce qui n'avait pas manqué de me rappeler [la légende](https://www.wired.com/1997/01/did-gates-really-say-640k-is-enough-for-anyone/) selon laquelle Bill Gates aurait affirmé que "640Ko était une quantité de mémoire suffisante"...
- Les choix logiciels tendancieux
Dernière critique en date : l'inclusion par défaut - et sans prévenir les utilisateurs - d'un dépôt Microsoft pour VSCode, surgie de nulle part. Problème éthique, problème de télémétrie, même partielle, et puis problème de confiance : comment faire encore confiance à Raspberry Pi OS ? Comment ne pas voir un rapprochement de Microsoft qui a déjà officialisé il y a longtemps un système de son cru pour cette plateforme ? Comment ne pas envisager que Microsoft ait des vues sur cette petite carte, et qu'il va finir par l'avaler ?
## Le matériel
- Supports de stockage
Le support de stockage de prédilection du Raspberry Pi est la carte micro-SD, qui n'est pas réputé être le plus fiable, notamment à cause de la durée de vie des cellules mémoire, mais aussi à cause de la fragilité et de la sensibilité du support. Je n'espère plus faire tourner un serveur 24h/24 sur un Raspberry Pi 4 et carte SD plus d'un an (et je n'achète que du SanDisk).
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/blog/2020/08/raspberry-pi-4-ssd-booting-enabled-trim).
- Wifi
J'ai voulu tester le Raspberry Pi 4 en tant que point d'accès sans-fil pour un réseau hétérogène. À vrai dire, c'est pour cette raison précise que je les avais acheté initialement. Le but était de remplacer mes deux [Synology RT1900ac](https://global.download.synology.com/download/Document/Hardware/DataSheet/Router/16-year/RT1900ac/fre/Synology_RT1900ac_Data_Sheet_fre.pdf). Idéalement, je voulais faire du mesh, mais je me serai contenté de l'auto-sélection 2.4/5GHz, c'est-à-dire pouvoir configurer un SSID unique accessible sur les deux bandes de fréquence, mais aussi en 802.11g/n/ac, comme c'est le cas sur mes actuels [MR2200ac](https://www.synology.com/en-us/products/MR2200ac).
Malheureusement, je n'ai pas réussi à le faire, ni via [OpenWRT](https://openwrt.org), ni sur Raspberry Pi OS. Je ne sais pas si c'est une limitation matérielle ou logicielle, et je ne me suis pas posé la question depuis que j'ai opté pour les MR2200ac.
- Coût de possession
On vante le bas prix du Raspberry Pi, mais je trouve le coût total de possession très élevé comparativement à ses performances. Un rapport qui tend à diminuer avec la puissance offerte par le Pi 4, encore que son _form-factor_ ne permet pas de réutiliser les anciens boitiers, jusque là compatibles avec toutes les versions B de la carte. En plus, au-delà du _form-factor_, il faut aussi s'accomoder d'une hausse de température en fonctionnement, et donc opter pour un boitier adéquat, plus cher à cause de la présence d'un radiateur, voire d'un ventilateur. En comptant alors le Pi, le boitier, la carte SD, l'alimentation USB-C officielle pour éviter les problèmes de compatibilité, et un câble micro-HDMI (spécificité du Pi 4, les versions antérieures utilisaient un connecteur HDMI classique), on arrive facilement aux 80 euros pour une carte donnée à moins de 30 euros. Le geek excité par la découverte puis la possession de l'objet fait alors les comptes, et réalise trop tard que ce n'est pas si intéressant au final...
- Pilotes non-libres
Broadcom n'offre pas de pilotes ou de firmware libres pour ses composants matériels, en particulier le GPU et le réseau. J'avoue que depuis mon premier Pi 1B, j'espère voir arriver une version qui puisse tourner avec 100% de Logiciels Libres...
## La concurrence
J'ai conscience des difficultés que peut représenter le développement d'une telle machine, et son support logiciel. Ce qui m'embête, c'est qu'il existe une concurrence, qui dispose parfois de très nets avantages au niveau matériel. C'est notamment le cas de [ODROID](https://www.hardkernel.com), qui fait de **très** bons produits dans une gamme variée, y compris à base de CPU x86. Et je ne parle pas de la quantité impressionnante de clones, tels que le [Banana Pi](http://www.banana-pi.org), l'[Orange Pi](http://www.orangepi.org), etc.
De mon point de vue, ces solutions ne disposent pas de la même force "marketing" que la fondation Raspberry Pi, soit que ce soit pour des raisons financières ou culturelles. En effet, la plupart des concurrents du Raspberry Pi sont d'origine asiatique, tandis que le Pi est d'origine européenne (britannique pour être précis). Et c'est heureux pour son fabriquant, parce que je n'ai pas l'impression que le Pi dispose d'arguments suffisants pour être plus apprécié que ses concurrents.
## Relativisons...
En soi, ce n'est pas une mauvaise machine, loin de là. Le CPU est très bon, la quantité de mémoire disponible est appréciable, et en outre, le Pi 4 a fait un formidable bond en avant en ce qui concerne le réseau. Il y a des points à améliorer, c'est certain, et cela signifie que d'autres versions devraient voir le jour. Mais il faudrait que chaque nouvelle version matérielle s'accompagne d'un meilleur support logiciel au même moment, au moins en ce qui concerne le système d'exploitation officiel, et certains choix techniques devraient être reconsidérés : je préfèrerai par exemple un maximum de 4Go de mémoire vive, ce qui me semble amplement suffisant sur une telle machine, et utiliser l'espace physique ainsi gagné sur la carte pour y placer au moins 8Go de mémoire flash, avec des performances et une fiabilité accrue. J'aimerais aussi avoir le choix dans les sorties vidéo : deux prises micro-HDMI ne me semble être qu'une démonstration technique plutôt que le témoin d'un besoin réel. On pourrait très bien imaginer une version avec ces deux prises pour un usage desktop, voire une unique prise Display Port, et une version avec une seule prise HDMI au format classique pour un usage plus occasionel de la sortie vidéo (comme sur un serveur par exemple).
Bref, je _rant_ contre le Pi, mais je continue de l'utiliser, et j'achèterai surement la prochaine itération...

25
content/blog/2021/03/05/plaidoyer-en-faveur-de-l-intelligence.md

@ -0,0 +1,25 @@
---
title: "Plaidoyer en faveur de l'intelligence"
date: 2021-03-05T21:53:34+01:00
tags: ["Réflexions", "Intelligence", "HQI", "Neuro-atypisme", "Société"]
---
Je ne supporte plus l'acceptation sociale de la ségrégation de l'intelligence. Comment peut-on considérer comme acceptable la maltraitance dont sont victimes les gens intelligents, de leur plus jeune âge jusqu'au moment de leur isolement social total ? Comment peut-on voir des oeuvres culturelles tourner en dérision l'enfermement d'un « intello » dans un vestiaire, moquer ses passions et centres d'intérêts, mépriser ses choix de vie sans éprouver au moins de la gêne ?
À une époque où les mouvements sociaux se font de plus en plus fréquents et intenses, où chaque groupe revendique à raison le droit d'exister, les gens intelligents font toujours l'objet d'exclusion sociale. Le regard qu'on porte sur eux est toujours imprégné de dégoût, de répulsion, de mépris. On les croit égocentriques, on les croit bizarres, on les croit mégalomanes. On leur prête de mauvaises intentions, on se persuade qu'ils vont manipuler les autres pour arriver « à leurs fins », sans même savoir ce qu'elles sont.
Même le milieu médical n'a aucune considération pour l'intelligence des patients. Pourquoi les médecins pressent-ils tout le monde à faire du sport, alors qu'ils ne pressent personne pour entretenir leur activité intellectuelle, alors même que l'on sait à quel point cette activité est essentielle pour ralentir la dégénérescence du système nerveux et permet donc de se maintenir en bonne santé ? Comment accepter qu'un psychiatre traite un patient de nazi parce qu'il souhaite intégrer une association comme Mensa, sous prétexte que c'est de la « discrimination intellectuelle », alors que c'est exactement ce que fait le monde du travail en exigeant des quantités invraisemblables de diplômes et de compétences, ces mêmes diplômes qui ont permi à ces mêmes médecins d'accéder à leurs fonctions ?
Pourquoi l'intelligence fait-elle si peur ? Personne ne se sent menacé par un sportif de haut niveau, et pourtant, tout le monde se sent menacé par les gens intelligents. Comment peut-on dire que c'est « fatiguant de réfléchir », ou au contraire, que les métiers intellectuels sont réservés aux oisifs ? De quel droit peut-on placer les gens intelligents à de telles extrêmités sur le spectre de la perception individuelle ? C'est réducteur, désobligeant, en plus d'être faux.
Ce n'est pas le football qui produit des téléphones portables. Ce n'est pas le rugby qui envoie des satellites dans l'espace. Ce n'est pas la chasse qui informe le monde. Ce ne sont pas les activités physiques qui permettent l'évolution de la société et de la technologie, la communication d'un bout à l'autre du monde, la guérison des maladies, ou l'intégration sociale. Et pourtant, ce n'est pas l'intelligence qui est récompensée, reconnue. L'intelligence ne déplace pas des dizaines de milliers de personnes dans des stades. L'intelligence n'est pas suivie par plus de deux milliards de personnes à la télévision.
Je dénonce l'attitude scandaleuse de la société à l'égard des personnes intelligentes. Même le terme « intelligent » indigne, offusque, comme si l'on s'adressait à un dictateur qui méprise son peuple ; un terme dont on a fait une insulte, crachant le venin du mépris à la face de « ceux qui savent ». Comme si « savoir » était l'affaire d'une élite dénigrée par le bas-peuple qui ne cherche pas à comprendre quoi que ce soit, haïssant juste pour haïr.
Je suis intelligent, et je ne veux plus avoir peur de le dire. Je veux que toutes les personnes intelligentes puissent se sentir comme des athlètes qui gonflent leurs muscles pour montrer ce qu'ils valent et suscitent l'admiration. Je veux que toute personne intelligente soit appréciée, intégrée à la société, valorisée, comme le sont les sportifs. Je veux qu'on suive avec autant de passion la remise des Prix Nobels que la Coupe du Monde de football. Je veux qu'on puisse dire : « Je suis intelligent », et que cela soit aussi anodin que dire : « Je suis fort ». Je veux que l'intelligence soit banale, commune, appréciée de tous, et non plus moquée, dévalorisée, ou méprisée. Je ne veux plus que les gens intelligents aient à subir de harcèlement, comme c'est actuellement le cas dans l'indifférence générale.
Le temps est venu désormais pour apprécier l'intelligence, car il ne serait rien de ce que la société possède aujourd'hui sans elle. On ne peut continuer à l'exploiter de la sorte sans un juste retour de bâton. Il n'existe aucune raison pour que cette situation perdure, pas même celle de ne pas offusquer les moins intelligents. Seriez-vous capable de tenir ne serait-ce qu'un semi-marathon ? Est-ce pour autant que vous dénigrez ceux qui y parviennent ? Alors pourquoi dénigrez-vous ceux qui connaissent les mathématiques ou la physique, ou qui ont de la culture générale ?
Haussons-donc le ton, face à ces petits chefs méprisants, face à ces brutes pour qui l'école est ennuyante, et face à toutes ces personnes étrangères à l'instruction. Révoltons-nous contre le diktat du bien-être physique, et contre l'élitisme nauséabond de la culture d'entreprise qui exige des compétences qu'elle ne valorise jamais. Ne tolérons plus aucune forme de harcèlement et rappelons à tous que l'intelligence n'est pas la bénédiction ou le don qu'ils croient ou qu'ils jalousent.
#HQItoo

BIN
content/blog/2021/03/09/mon-reseau/images/T34.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

BIN
content/blog/2021/03/09/mon-reseau/images/ak34.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

BIN
content/blog/2021/03/09/mon-reseau/images/gn41.jpeg

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

BIN
content/blog/2021/03/09/mon-reseau/images/reseau.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

BIN
content/blog/2021/03/09/mon-reseau/images/shaper-pipe.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

BIN
content/blog/2021/03/09/mon-reseau/images/shaper-queue.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

BIN
content/blog/2021/03/09/mon-reseau/images/shaper-rule.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

BIN
content/blog/2021/03/09/mon-reseau/images/station-meteo.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 458 KiB

310
content/blog/2021/03/09/mon-reseau/index.md

@ -0,0 +1,310 @@
---
title: "Mon réseau"
date: 2021-03-09T02:04:16+01:00
tags: ["SysAdmin", "Réseau", "Hardware", "Linux", "Debian", "Raspberry Pi", "Cockpit", "OPNsense", "free", "IPv6", "OVH", "Wifi", "TP-Link", "Synology", "NAS","Routeur", "Serveur", "DNS", "Reverse-proxy", "Caddy", "HomeAssistant", "Domotique", "ESP8266", "Station météo", "Thermostat", "LEDs", "Tablette", "Auto-hébergement", "Apple"]
toc: true
---
J'avais envie d'honorer une vieille tradition geek : présenter mon réseau, son architecture, son contenu, etc. Deux objectifs sont poursuivis : un objectif de mémoire - un jour, je relirai cet article avec nostalgie... - et un objectif d'échange - si vous trouvez des infos intéressantes ici, ou si vous avez des idées d'amélioration.
<!--more-->
**Il n'y a aucun lien d'affiliation dans mes articles, et celui-ci ne fait pas exception.**
## Généralités
Je suis client [free](https://portail.free.fr) depuis 2004. Malgré l'arrivée de la fibre dans ma commune, free ne figure pas encore dans les [FAI](https://fr.wikipedia.org/wiki/Fournisseur_d'accès_à_Internet) disposant d'une offre commerciale, et je n'ai aucunement l'intention de changer juste pour avoir la fibre.
En conséquence, mon débit actuel est d'environ 13 Mbits/s en descendant et 1 Mbits/s en montant. Cela peut vous sembler peu si vous êtes habitués à la fibre, mais honnêtement, on n'en souffre pas.
On est deux à utiliser Internet : moi de toute façon, et mon épouse, particulièrement depuis la pandémie de Covid-19, avec beaucoup de visio-conférences. Malgré cela, ni elle ni moi n'avons de problèmes de débits, de latences ou de lenteurs avec Internet ou avec le réseau en général.
Nous n'avons pas de téléphone fixe : mon épouse a le forfait mobile illimité et moi le forfait mobile gratuit (je n'utilise mon portable que pour recevoir des appels). Nous ne regardons pas la télévision « conventionnelle », exclusivement la VoD via [Netflix](https://www.netflix.com/), [Amazon Prime](https://www.primevideo.com/) et [AppleTV+](https://www.apple.com/fr/apple-tv-plus/). Pour un replay occasionnel, on utilise [Molotov](https://www.molotov.tv/).
### Freebox
Ma Freebox est une [Révolution](https://www.free.fr/freebox/freebox-revolution/) configurée en bridge (j'attends la fibre pour la renouveler). Je dispose d'une adresse IPv4 « full-stack », demandée dès que l'option était disponible, et de l'IPv6 natif.
### Topologie simplifiée
Voici la topologie simplifiée (et plutôt conventionnelle) de mon réseau. Je n'ai pas mis les machines « clientes ». Le switch est un [TP-Link TL-SG1016](https://www.tp-link.com/fr/business-networking/unmanaged-switch/tl-sg1016/).
![Topologie simplifiée de mon réseau](images/reseau.png)
### Wifi
J'ai deux [Synology MR2200ac](https://www.synology.com/fr-fr/products/MR2200ac) configurés en mesh. Cela confère un certain nombre d'avantages :
- toute la configuration de mon réseau sans-fil se fait depuis une seule interface (ce n'est pas spécifique à Synology)
- je n'ai à configurer qu'un seul SSID sur toutes mes machines, qu'elles utilisent la bande de 5GHz, 2.4GHz, en wifi g, n ou ac
- la connexion est stable, même en basculant d'un point d'accès à l'autre
Avant cela je disposais de deux RT1900ac et la configuration était pénible et instable à l'usage en l'absence du mode mesh.
En outre, j'ai mis en place un vieux TP-Link TL-WA801N en guise d'extension du réseau à l'usage quasi exclusif de la station météo située à l'extérieur.
### Outils communs
Sur toutes les machines « serveurs », à l'exception du routeur, j'ai installé [cockpit](https://cockpit-project.org/) et dnsmasq.
Vous me reprocherez sûrement de ne pas être un vrai barbu, mais j'aime bien avoir une UI. Je dirai même, j'en ai besoin : j'ai un besoin primaire de « voir » mes machines, via des graphiques et des icônes, des tableaux et des couleurs. C'est un choix personnel et sensible, en aucun cas une prérogative au fonctionnement de mon réseau. C'est à ce besoin primaire que répond cockpit, qui me permet d'ailleurs d'accéder à l'ensemble des machines de mon réseau depuis la même interface, ainsi qu'à leur shell, et à différentes statistiques et fonctionnalités que j'aime bien avoir à portée de main.
Toutefois, je reproche à cockpit quelques manquements, en particulier l'état SMART des dispositifs de stockage qui le supportent, ou la température des composants.
J'installe aussi dnsmasq afin de limiter les requêtes au serveur DNS principal. dnsmasq fait alors office de simple cache pour chaque machine. Le but n'est pas tellement de limiter les connexions réseau (bien que cela constitue un corollaire appréciable) mais surtout de limiter les accès disque sur le serveur DNS principal qui est un Raspberry Pi dont le support de stockage est une carte SD.
## Routeur
![](images/ak34.jpg)
Mon routeur est un [AWOW AK34](https://awowtech.com/collections/mini-pc/products/awow-mini-pc-ak34-intel-celeron-n3450-6gb-ddr-128gb-ssd-dual-lan-ports-dual-band-wi-fi-hdmi-windows-10). Il dispose d'un Celeron N3450, 6Go de DDR4, un SSD de 128Go et surtout, deux ports gigabit. Il est installé sous [OpnSense](https://opnsense.org/).
L'un des ports est relié à la Freebox ; du point de vue de OpnSense, c'est l'interface _WAN_. L'autre port est relié au switch ; c'est l'interface _LAN_.
### Particularités
#### IPv6
J'ai eu beaucoup de difficultés à disposer d'un réseau en IPv6 fonctionnel, et même maintenant, tout n'est pas parfait. Bien que tout a l'air de bien fonctionner côté client, je ne me suis toujours pas décidé à rendre disponibles mes sites et services sur IPv6. Je ne comprends pas encore comment ça fonctionne et j'ai peur de compromettre la sécurité du réseau.
En tous les cas, free fait plutôt bien les choses de ce côté puisqu'ils mettent à disposition huit préfixes IPv6. C'est six de plus que ce dont j'ai besoin pour mon réseau à l'heure actuelle, j'aime bien avoir de la marge.
Dans OpnSense, on va dans _Interfaces_, _Overview_, et on récupère l'IPv6 « link-local ».
Dans l'[interface de configuration de la Freebox](http://mafreebox.freebox.fr), on va dans _Paramètres de la Freebox_, puis _Configuration IPv6_. On colle cette IPv6 dans les deux premiers champs « Next Hop ». On déclare ainsi que la Freebox doit envoyer tous les paquets réseau à destination des adresses de ces préfixes à notre propre routeur. On en profite pour noter l'IPv6 de lien local de la Freebox.
De retour sous OpnSense, on va dans _Interfaces_, _[WAN]_, pour y définir _IPv6 Configuration Type_ à _Static IPv6_. Plus bas, dans _Static IPv6 configuration_, on définit l'adresse IPv6 qu'on souhaite attribuer à notre routeur, sachant que _<prefixe_1>::1_ correspond à l'adresse IPv6 de la Freebox et ne doit donc pas être utilisé. Traditionnellement, je lui attribue donc l'IPv6 _<prefixe_1>::2_. Il faut encore ajouter une _IPv6 Upstream Gateway_, qui pointera vers l'IPv6 de la Freebox sus-mentionnée (_<prefixe_1>::1_ donc).
Même procédure dans _Interfaces_, _[LAN]_, sauf que cette fois, on utilisera le deuxième préfixe offert par la Freebox, que la Freebox ne dispose pas d'IPv6 sur ce deuxième préfixe, et qu'aucune passerelle n'est à créer. Donc, on va mettre _<prefixe_2>::1_ dans le champ _IPv6 address_, et laisser les autres valeurs par défaut.
Dernière étape, il faut aller dans _Services_, _Router Advertisements_. Pour chaque interface, _[LAN]_ et _[WAN]_, on configurera comme suit:
<!-- Capture de OPNsense -->
Pour le _[LAN]_, on mettra _<prefixe_2>_ dans _Advertise Routes_.
<!-- Capture de OPNsense -->
Il ne reste plus qu'à activer le serveur DHCPv6 sur le _LAN_.
##### Problèmes
Les périphériques clients sont incapables d'obtenir une adresse IPv6 fournie par le serveur DHCPv6 d'OpnSense dans la plage que j'ai défini, comprise entre _<prefixe_2>::ffff:1_ et _<prefixe_2>::ffff:ffff_, alors qu'ils récupèrent bien l'IPv6 du serveur DNS configuré. Évidemment, le serveur DHCPv6 est désactivé sur la Freebox, et il n'y a pas d'autre serveur DHCPv6 sur le réseau. Cela fait partie des nombreuses choses que je ne comprends pas encore sur l'IPv6...
#### Firewall
Si je n'ai qu'un seul conseil à donner par rapport à la gestion du firewall sur OpnSense, c'est d'**utiliser massivement les alias**. C'est simple à gérer, très puissant, et simplifie toute la configuration du firewall. En l'occurrence, je créé deux alias par serveur (un pour l'IPv4, un pour l'IPv6), plus un s'il est accessible depuis l'extérieur, contenant la liste des ports à rediriger.
En outre, je veux que toutes les machines du réseau (en particulier celles dans lesquelles je ne peux pas avoir confiance, telles que le Windows de travail de mon épouse, ou la SmartTV) utilisent mon serveur DNS (un Raspberry Pi) et mon serveur NTP (le routeur lui-même). Pour ce faire, il faut créer des règles de Port Forward dans la configuration du NAT, une pour l'IPv4 et une pour l'IPv6, donc deux par protocole. Ce sont les quatre dernières règles de la capture d'écran suivante.
<!-- Capture de OPNsense -->
##### Problèmes
Ces règles sont facilement outrepassées par DNS-over-TLS.
#### DNS
J'utilise unbound sur OpnSense, mais uniquement pour l'association entre le nom des machines et leur adresse attribuées par le serveur DHCP. Toutes les autres requêtes DNS sont envoyée au serveur DNS interne qu'on verra plus tard. Pour que le routeur lui-même utilise ce serveur, j'ai renseigné ses IP v4 et v6 dans _System_, _Settings_, _General_, et j'ai désactivé _Allow DNS server list to be overridden by DHCP/PPP on WAN_ : je ne veux pas utiliser les serveurs DNS de mon FAI (ni « aucun » autre, en fait : on verra plus tard ce que j'entends par là).
#### Sauvegarde de la configuration
J'utilise un plugin très pratique, à installer depuis _System_, _Firmware_, _Plugins_ : _os-git-backup_. Il fait exactement ce que son nom entend : il sauvegarde _automatiquement_ toute la configuration d'OpnSense dans un dépôt git, dès qu'une modification survient et avant application de toute mise à jour.
#### IPS/IDS
J'ai activé l'_IPS_ (Suricata), en mode _IDS_, mode dans lequel Suricata doit bloquer les intrusions qu'il détecte. Cependant, dans l'onglet _Alerts_, je ne vois pas de mention des paquets bloqués - seulement _Allowed_ dans la colonne _Action_. Je ne sais pas si c'est normal.
### Performances
Je dois dire que je suis agréablement surpris par les performances de cette machine, en particulier malgré l'activation de l'IDS. La charge moyenne est inférieure à 0.40, l'utilisation CPU reste sous les 5%, la consommation mémoire sous les 1.5Go, et l'espace disque utilisé est de 2.5G, de quoi assurer une durée de vie conséquente au SSD de 128Go (en théorie).
## Serveur DNS
Le serveur DNS est hébergé sur le serveur domotique. C'est un pi-hole dans un container docker, et unbound en tant que serveur récursif. Tout est expliqué dans [la documentation de pi-hole](https://docs.pi-hole.net/guides/dns/unbound/).
<details>
<summary>Supprimé le 12/03/2021</summary>
Le serveur DNS est un Raspberry Pi 4 2Go (malgré [mes déceptions](/blog/2021/02/28/rant-raspberry-pi-4/) concernant cette machine) sur lequel j'ai installé Raspberry Pi OS Lite 32 bits, [pi-hole](https://pi-hole.net) et unbound.
pi-hole en tant que tel se contente de vérifier que les domaines dont on lui demande la résolution figurent (ou pas) dans ses listes de blocage. Il transfère la résolution des domaines non-bloqués à un serveur tiers. Je veux que ce serveur tiers soit le mien, et pas Google ou CloudFlare. D'où l'installation de unbound, qui va agir en tant que serveur DNS récursif.
C'est très facile à faire, tout est expliqué dans [la documentation de pi-hole](https://docs.pi-hole.net/guides/dns/unbound/).
À l'heure actuelle, j'ai 2 047 579 domaines blacklistés. Sur 24h, il y a eu 54 000 requêtes provenant de 31 clients (dont 12 500 provenant du Windows du boulot de mon épouse, c'est deux fois plus que mon serveur web principal, quatre fois plus que mon propre poste de travail sous macOS...), et 9 274 requêtes bloquées. Le tout avec une charge moyenne de 0 (!) et une consommation mémoire de 6.4%. Plutôt pas mal, je trouve...
</details>
## NAS
Mon NAS est un Synology DS216play sur lequel j'ai notamment [installé Gitea](/blog/2021/01/04/installer-gitea-sur-nas-synology/), ce même Gitea depuis lequel vous pouvez [télécharger les sources](https://git.athaliasoft.com) de mes différents projets. Il est doté de deux SSD Samsung 860 EVO de 500Go. Il est intéressant de noter que je n'utilise que 93Go des 460 de disponibles : je ne stocke pas de vidéos (j'ai une blu-ray-thèque très conséquente, plus la VoD déjà mentionnée) ni de musique (je ne suis pas très consommateur de musique et celles que j'aime sont sur CD).
## Reverse-proxy
Le reverse-proxy est hébergé sur le serveur web public (voir plus bas).
<details>
<summary>Supprimé le 12/03/2021</summary>
Le reverse-proxy est aussi un Raspberry Pi 4 de 2Go sous Raspberry Pi OS Lite 32 bits. La seule application installée est le serveur [Caddy](https://caddyserver.com/).
J'aurai pu héberger le reverse-proxy sur OpnSense. Après tout, entre ha-proxy et nginx, il y a le choix. Par contre, cela représente un risque (probablement mineur) en terme de sécurité, mais surtout, c'est incroyablement compliqué.
C'est une question philosophique qui appelle à de nombreuses réflexions. Pour commencer, OpnSense est un système BSD, pas nécessairement réputé pour être accessible. Si GNU-Linux joue clairement la carte du grand public depuis longtemps maintenant, et est sorti du carcan des geeks, BSD est clairement plus élitiste, dans la mesure où l'utilisateur est totalement libre de ses choix - et on ne le tient pas par la main... Cela se traduit par des interfaces ultra-complètes, des options à profusion et richement documentées, des menus et sous-menus, des onglets et des sous-onglets (dans OpnSense en tout cas).
Avec cette liberté vient le problème de la complexité. On est tellement libres de faire ce qu'on veut qu'on ne sait pas comment faire les choses les plus simples. Je n'ai jamais réussi à faire fonctionner ni ha-proxy ni nginx avec Let's Encrypt sur OpnSense en tant que reverse-proxy, parce que je ne comprends pas le tiers des options qui me sont offertes, ni comment elles interagissent les unes avec les autres.
Je ne blâme pas OpnSense pour ça, au contraire. Mais à l'echelle du système d'exploitation, je trouve que cela créé un fossé entre le geek hobbyiste et le professionnel, fossé comblé par un support technique payant dans le cas de pfSense et raison principale pour laquelle je lui préfère OpnSense depuis quelques années : je trouvais OpnSense plus accessible au geek hobbyiste. C'est toujours vrai pour l'ensemble du système d'exploitation, mais ces plugins spécifiques au cas d'usage du reverse-proxy sont clairement destinés à des personnes qui maitrisent ha-proxy et nginx sur le bout des doigts, ce qui n'est pas mon cas. Ce que **moi** je veux, en tant que geek hobbyiste, c'est une application qui me demande le moins possible, mais qui propose des fonctionnalités complètes et complexes **si je veux** creuser le sujet.
C'est ce que m'offre Caddy. En une soixantaine de lignes de configuration en JSON, j'ai réglé l'accès à l'ensemble de mes sites publics, avec du Let's Encrypt partout, et des valeurs par défaut optimisées et relativement sécurisées, sans prise de tête avec les éventuels certificats auto-signés de certains services internes incapables de fonctionner sans. Et si je veux lui demander plus que ça, je peux : c'est dans la documentation.
Le premier contact avec Caddy ne pourrait pas être plus simple, alors que les plugins d'OpnSense offrent par défaut une complexité rebutante et anxiogène : si je configure mal une option, ou que j'en oublie une autre, j'ouvre une potentielle faille de sécurité sans le savoir. Je ne dis pas que Caddy est plus sûr que les autres... Je dis que c'est peut-être plus difficile de commettre une erreur d'inattention avec Caddy que nginx ou ha-proxy sur OpnSense.
</details>
## Serveur web public
![](images/gn41.jpeg)
C'est un [Kodlix GN41](http://www.kodlix.com/view/45.html). Processeur Celeron N4100, 8Go de DDR4. J'y ai installé un SSD Samsung 750 EVO de 120Go, afin d'économiser les 64Go d'eMMC intégrés (et pour une question évidente de rapidité). Je suis très surpris par les performances de cette machine : la charge moyenne est d'environ 0.30 avec une utilisation CPU inférieure à 5%, et moins de 3Go de mémoire utilisée. Pourtant, les applications que j'y ai installé ne sont pas particulièrement légères :
- [misskey](https://github.com/syuilo/misskey)
- [pixelfed](https://docs.pixelfed.org/)
- [Cyca](https://www.getcyca.com/)
Sans compter leurs dépendances (particulièrement PostgreSQL et Redis). Cette machine héberge également mes sites statiques (dont celui que vous êtes en train de lire). Je vous laisse apprécier la rapidité d'accès à mes services, en n'oubliant pas que ma connexion montante est limitée à 1 Mbits/s.
C'est Caddy qui fait office de reverse-proxy. J'utilise [GoAccess](https://goaccess.io) pour générer quelques statistiques de fréquentation.
## Serveur domotique
![](images/T34.jpg)
Le serveur domotique est un [Beelink T34](http://www.bee-link.com/portal.php?mod=view&aid=152), doté d'un Celeron N3450, de 4Go de mémoire vive et de 64Go de eMMC. J'y ai installé [Home Assistant](https://www.home-assistant.io/) dans sa variante « container Docker », donc pas supervisé et pas d'accès aux add-ons. Ça rend toute la configuration un peu plus complexe - encore que - mais au moins, j'ai accès à mon système pour y faire ce que je veux, et en particulier une chose que ne me permet pas de faire Home Assistant dans ses variantes _OS_ et _Supervised_ : disposer d'un serveur CalDAV.
J'utilise en effet CalDAV pour gérer l'automatisation de l'éclairage et du chauffage de la maison. Ça me permet un contrôle précis et facile, non seulement des horaires mais aussi des profils d'éclairage ou de chauffage. Grâce à cette méthode, je peux définir les dates et heures pendant lesquelles je veux certaines scènes d'éclairage. Je définis un éclairage « type » pour toute l'année, mais un éclairage type « chaudron ardent » (flamme orangée vacillante) pour tout le mois d'octobre, et « chaudron magique » (flamme violette) pour le 31 ! Ça me permet également de planifier un mode hors-gel pour le chauffage pendant une absence prolongée, en plus des modes « Présent » et « Absent » pour le reste de l'année. Une configuration aussi fine me permet de faire des économies d'énergie, même si ces économies sont difficiles à chiffrer de part l'irrégularité de la météo (on a chauffé beaucoup plus cette année que l'année dernière, à cause d'un froid particulièrement prononcé), la variation des tarifs et abonnements à l'électricité, etc.
Après avoir testé un certain nombre de solutions, j'ai fini par opter pour [Radicale](https://radicale.org/3.0.html). J'ai ajouté le module [RadicaleInfCloud](https://radicale.org/3.0.html#documentation/supported-clients/infcloud-caldavzap-and-carddavmate), afin d'avoir une solution complètement autonome : même si les chances sont maigres, dans le cas hautement improbable où j'aurai en même temps besoin de modifier le calendrier de l'éclairage ou du chauffage **et** que je n'ai pas accès à un de mes ordinateurs, pas besoin de configurer un client (en particulier, de se souvenir de l'URL pour accéder aux calendriers, un point particulièrement pénible parce qu'elle varie en fonction des serveurs **et** des clients...)
J'ai intégralement conçu et manufacturé toute la domotique de mon logement. J'ai dessiné les circuits imprimés, et je les ai réalisés grâce à la bonne vieille méthode du bain au perchlorure de fer, apprise plus de vingt ans plus tôt en cours de technologie...
Ma domotique est donc constituée des éléments suivants, tous construits autour d'[ESP8266](https://www.espressif.com/en/products/socs/esp8266) :
- 1 station météo
Elle fait ma fierté, parce que j'ai passé beaucoup de temps à la concevoir et qu'elle fonctionne parfaitement bien et sans interruption depuis près de deux ans.
![](images/station-meteo.jpg)
Elle dispose de son propre système de régulation de température et d'humidité, basé sur un contrôleur de ventilateurs PWM (et de deux ventilateurs Noctua, de 8cm en aspiration sur le dessous et 12cm en extraction sur le dessus), d'une [résistance PTC de 80℃](https://www.amazon.fr/gp/product/B07FJZQLMK/) (disposée sur un vieux radiateur de processeur afin de répartir la chaleur dans le boitier) et d'un capteur [SHT31-D](https://www.sensirion.com/en/environmental-sensors/humidity-sensors/digital-humidity-sensors-for-various-applications/), afin de s'assurer que l'alimentation et l'électronique soient maintenues à des températures et humidité relative acceptables (c'est-à-dire, selon les normes de fonctionnement préconisées par les constructeurs des différents éléments constitutifs de l'électronique de la station). Le contrôleur de ventilateurs et la résistance sont pilotés par des MOSFET IRLZ34N (placés chacun sur un circuit imprimé, en haut à gauche de l'image ci-dessus)
Elle dispose d'un capteur de luminance [TSL2561](https://ams.com/TSL2561), d'un capteur de température, humidité relative et pression atmosphérique [BME280](https://www.bosch-sensortec.com/products/environmental-sensors/humidity-sensors-bme280/), et d'un capteur d'orage [MOD-1016](http://www.embeddedadventures.com/as3935_lightning_sensor_module_mod-1016.html).
Une alimentation de 12V 5A fourni le courant à l'ensemble des composants. J'ai choisi cette puissance pour tenir compte de la résistance chauffante et des ventilateurs. De plus, une alimentation capable de délivrer plus que ce dont elle a besoin signifie souvent qu'elle chauffe moins. À l'exception du BME280 et du MOD-1016, tous les composants de la station météo prennent place dans un boitier spécifique planqué sous la véranda. Le BME280 et le MOD-1016 sont placés dans un boitier de ma conception, basé sur des tuyaux de 10cm de diamètre : une section droite centrale contient un circuit imprimé sur lequel les capteurs sont enfichés, et une section coudée à 90 degrés de chaque côté, ouverture vers le bas. Ainsi, les capteurs sont à l'air libre, mais protégés des intempéries. Ils sont reliés à la station principale par un câble ethernet blindé, qui fait transiter le signal I2C et l'alimentation.
- 5 thermostats
Ils disposent de deux modes, « Présent » et « Absent ». Les plages horaires de chaque mode sont définies dans un calendrier spécifique à chaque thermostat. L'ESP8266 présent dans chaque boitier mural contrôle simplement un relais, et capte la température et l'humidité de la pièce via un SHT31-D.
- 7 lumières, dont 6 bandeaux de LEDs et une prise Sonoff S20
J'ai défini deux entrées dans Home Assistant, respectivement pour l'extinction et l'allumage « inconditionnel » de l'éclairage. Ainsi, quoiqu'il arrive, les lumières automatisées (certaines ne le sont pas parce que ce n'est pas nécessaire) ne s'allumeront jamais dans cette plage horaire (typiquement entre 2h30 et 5h45, soit entre l'heure à laquelle je me couche et celle à laquelle mon épouse se lève).
En outre, les lumières automatisées ne s'allument que si la luminance extérieure fournie par la station météo est en dessous d'un certain seuil que je peux définir pour chacune d'entre elles. Enfin, le calendrier me permet de définir les plages horaires pendant lesquelles elles doivent présenter une scène particulière. J'ai défini quatre types d'ambiance : heures de passage (pour un éclairage à pleine puissance), éclairage normal, éclairage tamisé, et éteint.
Un bandeau de LEDs est contrôlé par un capteur de mouvement de type PIR, dont la seule dépendance est la luminance extérieure : même en présence de mouvement, il ne s'allumera pas s'il fait encore jour. Un autre bandeau est uniquement contrôlé par un bouton poussoir. Un dernier ne peut être contrôlé que par Home Assistant.
Au niveau électronique, chaque contrôleur pilote simplement trois MOSFETs (également des IRLZ34n), et dispose de deux entrées (pour un bouton ou un capteur de mouvement). C'est mon premier projet électronique à usage réel.
- 2 horloges
J'aime bien avoir l'heure partout où je suis. Si j'ai la date complète, et la température extérieure, c'est encore mieux... Alors j'ai conçu deux horloges dotées d'un écran LCD 16x2 piloté en I2C par un ESP8266. Rien de compliqué, rien qui nécessite un circuit imprimé, juste quelques câbles.
- 1 bouton d'appel
Utilisé pour que mon épouse puisse me signifier sans hurler à travers toute la maison qu'elle va faire dodo quand je suis enfermé dans mon bureau... Quand elle appuie sur son bouton d'appel, j'ai une alerte sur mon tableau de bord. Un appui de ma part sur le tableau de bord éteint sa LED pour lui signifier que j'arrive.
- 1 bouton « Linge »
Pour que mon épouse puisse m'indiquer s'il y a du linge à étendre ou à passer au lave-linge, je lui ai créé un petit boitier logé près de la machine à laver, dérivé du bouton d'appel, et doté de deux boutons et deux LEDs. Cela provoque l'affichage d'un avertissement sur mon tableau de bord.
Tous ces périphériques tournent sur des ESP8266. En conséquence, j'ai installé [ESPHome](https://esphome.io/) qui gère tout ça via de simples fichiers de configuration yaml, et connecte le tout à Home Assistant. Ça rend tout le processus très agréable et facile à utiliser et maintenir au quotidien.
J'ai également installé une caméra sous [motionEyeOS](https://github.com/ccrisan/motioneye/) sur un Raspberry Pi 0W. Elle transmet le flux vidéo à Home Assistant via un container docker motionEye.
Les données de la station météo sont envoyées à un container [InfluxDB](https://www.influxdata.com), ce qui me permet d'utiliser ensuite [Grafana](https://grafana.com) afin de visualiser ces données à long terme.
## Tableau de bord
Le tableau de bord que je mentionne depuis avant est une tablette Asus T100TA. Elle m'a coûté des peines infinies à faire fonctionner sous debian sid, en particulier à cause de l'UEFI 32 bits démarrant un système 64 bits, et du chipset wifi non supporté par défaut.
J'ai installé openbox et chromium dessus, en mode kiosk. Par contre, c'est très lourd, et la connexion réseau est très instable. Je suis obligé de la redémarrer au moins une fois par jour, et c'est évidemment très pénible. Mais quand elle fonctionne, elle fonctionne bien, alors je ne me risque pas à essayer d'installer autre chose.
<!-- Capture de Asus T100 -->
## Station de travail
Ma station de travail est un Mac mini M1. Là encore, vous allez sûrement me critiquer vertement. C'est Apple, c'est pas Libre, etc. Et je vous répondrai ceci.
Je suis passionné d'informatique depuis que j'ai cinq ans (j'en ai presque 40). J'ai touché à tout ou presque (grand bien m'en fasse, je n'ai jamais vu un AS400 de ma vie). J'ai passé un gros tiers de ma vie informatique à bidouiller des machines sous Windows, toutes versions depuis 3.1 jusqu'à Windows 10, en passant par Windows 2000, Server 2003, Home Server, etc. À la grande époque des versions pirates, j'ai touché à tout l'écosystème Microsoft, y compris ISA, Exchange, etc.
Suite à ça, je me suis laissé tenter par GNU-Linux. Pendant un deuxième gros tiers de ma vie informatique, j'ai bidouillé des Mandrake, des Knoppix, des RedHat, des Suse, pour finir par adopter définitivement debian. Je passais des heures à essayer de faire fonctionner un modem USB, à essayer et échouer à compiler le noyau, à desespérer devant mon incapacité à faire fonctionner correctement une carte graphique ou une carte son un peu exotique. Et bien que j'ai fini par pouvoir travailler confortablement avec debian et KDE, je ne pouvais me résoudre à supprimer purement et simplement Windows pour jouer (ce que je n'ai réussi à faire que récemment).
Tout ça, jusqu'au jour où j'ai acheté un iPhone à mon épouse. Puis son iPad. Puis _mon_ iPad. Puis l'AppleTV 4. Puis mon MacBook Pro 13" Retina 2015. Puis une AppleTV 4K. Puis mon Mac mini M1. Mon amour pour cet écosystème n'a fait que grandir. Parce qu'enfin, après les deux premiers tiers de ma vie à _bidouiller_ l'informatique, je pouvais enfin _utiliser_ l'informatique. Tout fonctionne. Pas de hack, pas de configuration étrange, pas de bizarrerie que je dois exécuter sans comprendre. Pardonnez-moi l'expression, mais : « ça juste marche ». Le moment où je n'avais plus envie de bidouiller mais simplement utiliser est venu.
Et quand j'ai vu la conférence d'Apple annonçant sa première puce maison depuis... je ne sais pas combien d'années puisqu'avant l'iPhone de mon épouse, je n'avais cure d'Apple que je détestais presqu'encore plus que Microsoft, j'ai su qu'il me fallait le Mac mini M1, surtout considérant son prix. Si cette machine tenait ses promesses et qu'elle coutait bien ce qu'ils annonçaient, ça allait être énorme.
<!-- Mac mini -->
Et le fait est que _c'est_ énorme. Cette puce est monstrueuse en termes de performances, comparativement à sa consommation électrique. C'est réellement la révolution qu'ils promettaient. Ce Mac mini M1 est probablement le meilleur investissement de toute ma vie, et vous pouvez me croire, j'en ai eu des ordinateurs (et j'en ai encore, bien plus que listé ici...).
Et même via la couche de compatibilité Rosetta 2, même avec plein d'applications lancées en même temps, tout va plus vite. Tout est _quasi_ instantané. C'est magique. Ça fonctionne, c'est simple, intuitif, esthétique (même si c'est personnel). Mon double-écran en 2x 240Hz fonctionne sans problème, ma souris SteelSeries Rival 3 et mon clavier Corsair Strafe RGB fonctionnent sans soucis (même si c'était déjà le cas avec le MacBook Pro). J'ai enfin du _plaisir_ à utiliser mon ordinateur. Contextuellement, ma station de travail doit m'aider, pas se mettre sur mon chemin. Un serveur, oui, ça se configure aux petits oignons, je prends mon temps pour l'installer et le paramétrer. Mais ma machine de travail doit fonctionner, tout de suite, et ne doit pas nécessiter mon attention toutes les deux secondes pour autre chose.
## Station de jeu
Ma station de jeu est un Core i7 7700k, doté de 16Go de DDR3, de deux nVIDIA GT1070 8Go, et d'un Crucial MX500 de 1 To. Elle tourne sous debian stable, avec XFCE4, steam, firefox, et... c'est tout. Et tout fonctionne parfaitement bien. Le travail fait sur Proton par steam est excellent : tous mes jeux se lancent sans problème de compatibilité et avec d'excellentes performances. Je n'ai pas eu besoin de hack ou de configurations exotiques : tout fonctionne _out-of-the-box_. Je peux enfin me passer définitivement de Windows, qui n'existe plus que sur la machine de travail de mon épouse.
## Consommation électrique
Je dispose d'un onduleur Eaton Ellipse 1200 Pro qui présente la caractéristique intéressante de me fournir la consommation réelle de ce qui est branché dessus. Ainsi, je peux dire que mes trois serveurs x86, les deux Raspberry Pi 4, un des deux MR2200ac, le switch et le NAS consomment au total un maximum de 47W. Je trouve que c'est très satisfaisant. L'onduleur pourrait ainsi fonctionner pendant une heure à une heure-et-demi sur batterie si une coupure de courant devait survenir. Largement de quoi voir venir...
## Évolutions
J'écris cet article en partie parce que je viens de reconstruire l'ensemble de mon réseau. Les trois machines principales de l'infrastructure (l'AK34, le GN41 et le T34), les point d'accès sans-fil, même les SSD du NAS ont moins d'un an. Donc je vois peu de changement à venir.
J'aimerais bien, à l'occasion, virer le SSD du routeur pour le mettre sur le serveur domotique en remplacement de son stockage eMMC : un SSD lui profiterait plus qu'au routeur, où je pourrais installer OpnSense sur une carte SD ou une clé USB sans risquer de la flinguer au bout de six mois.
Je pense que la prochaine machine à remplacer sera le NAS, qui commence à se faire vieux, et qui est fortement limité par son CPU. Et je pense que j'opterai pour un mini-PC, comme les trois autres serveurs. J'aime bien ce format : je peux disposer de bons CPUs, économes en énergie mais assez puissants pour être versatiles. Il faudra donc que je veille à me doter de bons boitiers externes pour y loger les SSD. Une autre solution, moins coûteuse, pourrait consister à rassembler au sein d'un même serveur les usages du NAS et d'autre chose (peut-être le serveur domotique). Ça sera à tester au niveau des performances.
Du côté du routeur toujours, j'aimerais arriver à mettre en place une QoS. Je n'ai pas compris comment fonctionne le _shaping_ sur OpnSense. J'aimerais, par exemple, que _jusqu'à_ 8 Mbit/s de ma bande passante totale soit allouée à la VoD, ou qu'un maximum de 70% de ma bande passante montante soient destinés _en priorité_ à mon serveur web, afin de m'assurer que mes visiteurs puissent consulter mes sites et services confortablement, sans nuire à mon propre usage du réseau.
## Mise à jour du 09/03/2021, 13:18
Le [Journal Du Hacker](https://www.journalduhacker.net) a cassé mon Internet 🤣. Suite à la publication de cet article, ma bande passante a beaucoup souffert... Ce qui m'a incité à me pencher sérieusement et urgemment sur la question de la QoS (_Traffic shaping_).
C'est grâce à [cette conversation](https://microblog.richard-dern.fr/notes/8j5g54i0y9) que j'ai pu m'en sortir. Merci à [@badprocess@mastodon.social](https://mastodon.social/@badprocess) pour son aide !
Donc au final, j'ai mis en place une limitation du traffic montant depuis mon serveur web. Sur 1 Mbits/s, il peut utiliser au maximum 700 Kbits/s. Ça se passe dans _Firewall_, _Shaper_, et on ajoute un _Pipe_, une _Queue_ et une _Rule_ comme suit:
![](images/shaper-pipe.png)
![](images/shaper-queue.png)
![](images/shaper-rule.png)
Il faudra encore que je creuse pour le shaping pour la VoD mais je comprends un peu mieux comment ça marche, et surtout, ça a résolu les problèmes (inédits) que j'ai rencontré suite à cet afflux "massif" de visiteurs...
## Mise à jour du 10/03/2021, 00:00
Après plusieurs heures d'investigation, j'ai fini par trouver le problème, et le Journal du Hacker est hors de cause 😅
Par défaut, OpnSense surveille les passerelles du _WAN_. En IPv6, c'est directement la Freebox, mais en IPv4, c'est l'IP du serveur DHCP qui m'a attribué mon IPv4 (généralement x.x.x.254 chez free). Or, il me semble que free ne permet plus le ping passerelle depuis quelques années déjà, et j'avais configuré OpnSense pour faire ses ping sur une autre adresse IPv4 (en l'occurrence, chez OVH).
Sauf que quand OpnSense détecte que ces pings sont hors de certains seuils, il désactive la passerelle. Or, l'IP surveillée avait, semble-t'il, quelques soucis, entrainant pertes de paquets et latence très élevée.
Je m'étonnais de la régularité du phénomène, mais en fin de compte, ça prend tout son sens : OpnSense ping une fois par minute...
J'ai changé l'IP à surveiller - temporairement - pour une IP censée être stable et fonctionnelle, _8.8.8.8_, qui appartient à Google, et que je voulais donc éviter. Et là, tout est rentré dans l'ordre : une latence normale, et plus de pertes de paquets.
Une mise en pratique de la [Loi de Murphy](https://fr.wikipedia.org/wiki/Loi_de_Murphy) : ça survient pile quand je me fais linker par Le Journal du Hacker...
## Mise à jour du 12/03/2021
Les problèmes de ping que j'avais étaient malheureusement dûs à l'[incendie qui a ravagé le site d'OVH](https://www.franceinter.fr/economie/un-important-incendie-touche-l-hebergeur-francais-ovh-plusieurs-sites-internet-hors-service) à Strasbourg. J'ai complètement désactivé le ping de connexion.
Entre temps, j'ai sorti les deux Raspberry Pi 4 du réseau. J'estime que Raspberry Pi OS est trop instable et bloaté, et la charge CPU/mémoire des applications que je faisais tourner dessus ne justifie pas l'emploi de machines dédiées. Caddy est donc désormais sur le serveur web, et pihole sur le contrôleur de domotique.

85
content/blog/2021/03/14/ecommerce-et-auto-hebergement.md

@ -0,0 +1,85 @@
---
title: "E-commerce et auto-hébergement"
date: 2021-03-14T02:25:43+01:00
tags: ["SysAdmin", "eCommerce", "Auto-hébergement", "PrestaShop", "Magento", "OpenCart", "PHP", "L'humain, cette espèce primitive"]
toc: true
---
Un état des lieux non exhaustif des Logiciels Libres d'e-commerce disponibles en auto-hébergement. _Spoiler alert_ : c'est affligeant.
<!--more-->
## Contexte
Suite à une discussion privée avec [@Shinra](https://mastodon.social/@Shinra) sur mon [~~ActivityPub~~](https://microblog.richard-dern.fr/@richard), je prends conscience que tout le monde n'a pas nécessairement envie d'acheter mon premier livre, [_L'Humain, cette espèce primitive_](https://www.richard-dern.fr/livres/) sur [Amazon](https://www.amazon.fr/dp/B08VF4D2NT). Comme j'ai d'autres projets de livres dans les cartons, je me suis dit que ça serait bien d'offrir une petite boutique en ligne où mes lecteurs pourraient acheter directement mes écrits, via PayPal, ApplePay, ou même, soyons fous, par carte bancaire.
Mon cahier des charges est le suivant :
- Logiciel Libre
- Sécurisé
- Léger, rapide
- Facile à installer
- Prévu pour des produits dématérialisés (intégré ou en plugin, je m'en fout)
## Disclaimer
Je suis développeur web depuis plus de quinze ans, j'en ai vu du code moisi, j'en ai aussi vu du très bon. Mais, d'expérience, le très bon code n'est pas _mainstream_, contrairement au code de merde. Je préfère vous prévenir, je ne vais pas faire du politiquement correct dans cet article.
## Solutions testées
### PrestaShop
- [Site officiel](https://www.prestashop.com/fr)
- [Dépôt de code](https://github.com/PrestaShop/PrestaShop)
PrestaShop est au e-commerce ce que WordPress est au blog : un vieux monstre, immonde, effroyable, terrifiant, encore en vie sans qu'on sache comment c'est possible. C'est mal pensé, mal exécuté, buggué comme pas possible, et pas du tout orienté auto-hébergement tel que je l'entends (_« read our guide on installing PrestaShop for development »_, sous-entendu que si tu veux l'installer à ta sauce, c'est que pour du dev...)
[Pas de support officiel](https://devdocs.prestashop.com/1.7/basics/installation/system-requirements/) d'autre chose que MySQL 5.7 (exit donc PostgreSQL) et php7.4 (pas de php8). [La documentation du container docker](https://hub.docker.com/u/prestashop/#!) est spartiate et ne dit pas comment persister les données. En gros, il faut créer un volume vers ```/var/www/html```. C'est tout sauf propre. Vu les pré-requis, je ne tiens pas à casser mon serveur, je n'ai donc pas essayé autre chose que le container.
Une fois installé, c'est lent, inacceptablement lent. Il y a des requêtes vers Google et l'api de PrestaShop dans tous les sens. Des dizaines, voire des centaines de requêtes vers l'extérieur de mon serveur alors que je n'ai encore rien fait. C'est blindé ras-la-gueule de tutos vidéos et d'assets chargées depuis des URLs distantes. C'est crade, c'est franchement la gerbe. En plus, comme je bloque au niveau DNS les requêtes vers certains domaines de Google, l'interface est pétée. C'est immonde. Je n'ai rien fait d'autre que charger la page d'admin, j'ai arrêté le massacre très très vite.
### Magento
- [Site officiel](https://magento.com)
- [Dépôt de code](https://github.com/magento/magento2)
Un peu moins pourri au niveau du code que PrestaShop. Pas difficile, en même temps. Par contre, c'est toujours aussi lourd. Je ne parle même pas du temps de rendu ou de la charge serveur. Le code en lui-même est propre, bien écrit et documenté, mais fouiller là-dedans est un calvaire.
Toujours [pas de support officiel](https://devdocs.magento.com/guides/v2.4/install-gde/prereq/prereq-overview.html) d'autre chose que MySQL et MariaDB, et toujours pas de php8. Par contre, Elasticsearch est requis, et donc, Java... Bonjour la légèreté.
### OpenCart
- [Site officiel](https://www.opencart.com)
- [Dépôt de code](https://github.com/opencart/opencart)
**OpenCart est visiblement en train de subir pas mal de mises à jour importantes dont certaines visent à corriger les problèmes que je vais évoquer ici.**
Là non plus, pas de support officiel de PostgreSQL. La documentation n'est pas à jour, et le processus d'installation est buggué, même en respectant les pré-requis. Par exemple, la documentation annonce le support de php7.4, mais l'installateur ne veut rien d'autre que php8. Une fois installé, impossible de faire quoique ce soit à cause de bugs bloquants.
Le code est mal structuré, le dossier _vendor_ complet est versionné (heu... [oui](https://github.com/opencart/opencart/tree/master/upload/system/storage/vendor)...), le code n'est pas documenté, et pas prêt pour le passage à php8 alors que l'appli l'exige.
J'espérais beaucoup de OpenCart : il me semblait bien correspondre à mon cahier des charges, mais absolument pas utilisable en production à l'heure actuelle.
## Solutions non-testées
- Thirty bees : Fork de PrestaShop 1.6. Hérite donc de tous ses défauts. Le code est toujours aussi dégueulasse et pas documenté.
- WooCommerce : Plugin de WordPress. Heu, non merci...
- osCommerce : [Une version 4 serait à venir cette année](https://www.oscommerce.com/Us&News=177). La version précédente [semble dater de 2016](https://github.com/osCommerce) (notez l'organisation étrange des dépôts). Je n'ai pas spécialement envie d'utiliser une version obsolète, et de faire une grosse mise à jour à une date indeterminée.
## À propos des licences
Les deux poids lourds du "marché" que sont PrestaShop et Magento ont opté pour une licence [OSL](https://opensource.org/licenses/OSL-3.0). Ils ont adopté cette fâcheuse tendance à planquer au fond de sous-menus obscurs les liens vers leurs dépôts de code source. Je n'aime pas cette pratique parce qu'elle relègue de façon à peine voilée l'accès au code source aux contributeurs exclusivement. J'ai envie de voir le code source pour voir ce que l'application fait (au titre de la confiance que je vais - ou non - lui accorder, une confiance que mes propres visiteurs devront m'accorder aussi), pas forcément pour y contribuer.
OpenCart est sous licence [GNU GPL](http://gnugpl.org). En ce qui me concerne, ça me met déjà plus en confiance.
## Bilan
Je déplore la qualité médiocre, au mieux, des applications que j'ai testé, ou dont je me suis limité à la lecture de la documentation. On a l'impression que ça a été bricolé à la va-vite par un pseudo geek des années 2000, et que ça a évolué en lui greffant des tas d'immondices pour faire genre, exactement comme WordPress (en fait, c'est littéralement ce qui s'est passé). Le code de PrestaShop mériterait bien d'être cramé au lance-flamme et de repartir sur des bases saines. Magento s'en sort mieux sur ce point, mais trop lourd pour ce que je veux en faire. Le reste, malheureusement, est mort, mourrant, ou en attente de résurrection.
Rien d'utilisable en fait.
Alors, vous me direz : « T'es développeur, t'as une grande gueule, t'as qu'à faire/contribuer ».
1. D'une, je suis aussi écrivain, et c'est pas parce que vous savez écrire que vous allez contribuer à mes livres sous licence Libre.
2. De deux, il est hors de question que je contribue à une merde comme PrestaShop (j'ai déjà donné à titre professionnel) ou à un truc supporté par Adobe comme Magento, parce qu'ils ont assez de moyens financiers pour ne pas s'offrir mes services gratuitement.
3. De trois, c'est peut être exactement ce que je vais faire...

35
content/blog/2021/03/18/les-gafam.md

@ -0,0 +1,35 @@
---
title: "Les GAFAM"
date: 2021-03-19T14:47:20+01:00
tags: ["Informatique", "Google", "Amazon", "Facebook", "Apple", "Microsoft", "Baidu", "Orange", "Rant", "Alapage", "Huawei", "Samsung", "Xiaomi", "Tencent", "Yandex"]
---
Ça fait depuis longtemps que je veux m'exprimer sur la question. Mes sources d'information ont relativement abandonné cet acronyme, ne titillant plus mon exaspération. Mais mon arrivée sur ActivityPub a quelque peu changé la donne.
<!--more-->
GAFAM. Google, Amazon, Facebook, Apple, Microsoft. On utilise cet acronyme pour désigner - certains - des géants du net. Je déteste cet acronyme à plus d'un titre. Voici pourquoi.
Ces cinq entreprises sont américaines. Et s'il y a une chose que j'ai bien constaté en France, c'est notre racisme envers les américains. Je ne sais pas d'où il vient, quelle rancune peut justifier une telle haine pour un peuple issu en partie de la France, dont nous avons aidé l'établissement face à l'empire britannique, qui nous a sauvé pendant la Seconde Guerre Mondiale, qui nous apporte tant, et qui nous a longtemps aimé plus que nous ne l'aimions (ce n'est plus le cas, et ça se comprend).
On dénigre ces cinq entreprises américaines rien qu'avec cet acronyme, en écartant toute entreprise chinoise ou Russe. Pourquoi contribuer à marginaliser la domination de Samsung, Baidu, Huawei, Xiaomi, Tencent, Yandex, en continuant d'utiliser un acronyme ne désignant que des entreprises américaines ?
Notre rancoeur vient sans doute du fait que nous disposions, un jour, d'un solide concurrent à Amazon : [alapage](https://fr.wikipedia.org/wiki/Alapage), que nous avons démembré. Peut-être le regrettons-nous, et déversons notre haine vers Amazon pour cette raison.
En outre, nous n'avons pas de "géant du net" français. Nous essayons, bien sûr, mais c'est un simple fait : nous n'avons pas développé ou nous avons tué la concurrence internationale à Google, Amazon, Facebook, Apple, ou Microsoft. Et je crois que c'est dû à notre légendaire prétention nationale. À force de prôner qu'une entreprise est française, comme si c'était un argument commercial valable à l'étranger, il n'y a bien que des français pour en être client.
J'ai l'impression que le message diffusé contre l'utilisation des "GAFAM", c'est surtout de ne pas envoyer les ressources françaises à l'étranger (argent, données, personnelles ou non), et plus précisément, aux États-Unis. Alors que le discours devrait réellement être plus philosophique et nuancé.
Aurons-nous la même haine contre une entreprise française qui se sera hissée dans les mêmes niveaux de capitalisation boursière ? Je parie que non, et qu'au contraire, on en serait fiers. Ou alors, on le passera sous silence. Avez-vous une bonne opinion d'Orange ? Moi non plus. Pourtant, c'est une entreprise française, présente à l'international, dont la capitalisation boursière est de plus de [28 milliards d'euros](https://fr.finance.yahoo.com/quote/ORA.PA). Et si, pour être un "GAFAM", il faut un mélange de monopole et de pratiques _borderline_, Orange mérite sûrement sa place dans l'acronyme.
Parce que finalement, c'est sûrement comme ça que le terme _GAFAM_ se définit dans l'imaginaire collectif : un ensemble d'entreprises qu'il faut détester. Ils sont leaders dans leurs domaines respectifs, parfois même plusieurs d'entre eux, ce sont donc des cibles à abattre. C'est très réducteur, et ne peut aboutir à aucune solution viable. S'il y a un leader, c'est qu'il y a une hiérarchie, et que le leader sera remplacé par le second. Si on parle de capitalisation boursière, il y a une foule qui attend avec avidité de prendre la place d'un _GAFAM_. Super. Une fois érigée à ce rang, la société concernée sera haïe. Simplement parce qu'elle réussi.
En fin de compte, nous ne haïssons pas les _GAFAM_, nous haïssons leur réussite, et c'est une preuve de jalousie. Cibler spécifiquement des entreprises américaines est en plus une preuve de racisme. Est-ce vraiment ainsi que vous voulez définir un mouvement intellectuel ? Personnellement, ça ne m'intéresse pas.
Lutter pour la protection de nos données personnelles, empêcher leur centralisation, notre tracking publicitaire. Empêcher ces entreprises de relier des points qu'elles ne sont pas censées relier (géopolitique - santé - publicité comme Google, éducation - systèmes d'exploitation - hébergement de données comme Microsoft, commerce - hébergement de données - exploration spaciale comme Amazon, etc.). Les empêcher de détruire des écosystèmes. Oui, là, ça m'intéresse.
Mais ça ne se limite pas aux _GAFAM_. Et ce n'est pas parce que ce sont des sociétés américaines. **Les idées contre lesquelles nous nous opposons sont mises en oeuvre aussi par des sociétés françaises, et le fait qu'elles stockent leurs données en France, ou paient leur impôts en France ne justifie en rien qu'elles le fassent.**
Je rappellerai enfin qu'on a vertement critiqué les États-Unis dans leur opposition à Huawei, qu'on accueilli à bras ouverts en France, avant de se rendre compte de leur méfaits.
Arrêtez de parler de _GAFAM_. Ça ne veut rien dire. Et ce que ça exprime est faux, en plus de donner une mauvaise image de nous.

46
content/blog/2021/04/02/covid-19-vous-avez-tous-tort.md

@ -0,0 +1,46 @@
---
title: "Covid-19 : Vous avez tous tort"
date: 2021-04-01T17:57:23+02:00
tags: ["Politique", "Santé", "Covid-19", "Rant"]
---
Vous n'êtes pas obligés de lire cet article si vous n'avez pas envie de vous sentir insultés. Mais je vous préviens : tout le monde va en prendre pour son grade.
<!--more-->
## Disclaimer
Quelques éléments pour comprendre d'où vient cet article.
J'ai le respect des individus, pas du peuple.
Et ça commence par notre Chef d'État. Il l'a éloquemment rappelé en temps voulu : c'est Monsieur le Président ou Monsieur Macron, pas "Manu", ni "Macron", ni aucun autre sustantif irrévérencieux. Posez-vous la question : si le Chef d'État s'adressait directement à vous, par votre prénom ou même un surnom, comment le prendriez-vous ?
Exactement.
Et vous n'êtes pas à la tête d'une nation.
Le Chef d'État, que ce soit Monsieur Macron, Madame Michu ou Tartempion, c'est pas votre pote de beuverie, c'est le taulier. Dans une gentille dictature, il vous mettrait à la porte. Dans une dictature telle que vous la fantasmez, eh bien, demandez des nouvelles à Alexeï Navalny.
Pour rappel, il n'y a pas si longtemps que ça, tout le monde se fouttait de la gueule des Chinois parce qu'ils portaient un masque en permanence. Qu'est-ce que ça dit de nous, aujourd'hui ? Et notez par ailleurs que ça n'a pas empêché la pandémie - tirez-en les conclusions que vous voulez.
La "guerre" contre le virus est avant-tout une guerre psychologique, et le peuple la perd. Pas aujourd'hui : depuis le début. On est peu nombreux à bien supporter la situation, et c'est symptomatique de l'état psychologique de la société dans son ensemble.
##
Vous faites partie de ceux qui râlent contre l'instauration du troisième confinement ? Alors pour rappel, là encore :
- on vous a prévenu, depuis un an en fait, que ça allait arriver (les scientifiques et même les politiciens)
- non, **on ne vous prive pas de vos libertés**, on fait respecter celle de tout citoyen français au droit de vivre : ne pas respecter cette règle, c'est **bafouer un droit élémentaire**, celui des autres - réfléchissez-y
- vous ne haïssez pas Monsieur Macron, vous haïssez le Chef d'État, peu importe son nom, ça ne changerait rien à votre comportement réactionnaire
- c'est bien fait pour vos tronches : vous aviez la possibilité de faire preuve de bon sens, vous avez choisi l'égoïsme - maintenant, assumez
Je rappelle aussi que chaque pays a fait ses propres choix concernant la "stratégie" à adopter face au virus, ce qui, en soit, est la pire des stratégies. On le dit depuis le début : seule une réponse globale et unanime peut être efficace contre une pandémie. Le virus n'a pas de frontières et s'en tape de nos considérations humaines, qu'elles soient sociales, familiales, ou économiques. Le virus s'en tape que vous voulez larguer vos enfants à l'école pour que vous puissiez vous rendre à votre travail en présentiel pour avoir un semblant de vie sociale. Le virus s'en tape que votre restaurant n'a plus de client, ou que votre cinéma est à l'arrêt. En faisant le choix de l'ignorer, vous contribuez directement à sa propagation, et aux conséquences politiques qui s'ensuivent, du genre couvre-feu ou confinement.
Il y a un code de la route. Il est destiné à protéger l'ensemble des conducteurs contre une minorité qui exerce leur liberté de façon égoïste, risquant la vie des autres. Des règles qu'on pourrait juger liberticides. Elles sauvent pourtant des vies. Pourtant, chaque année, on déplore au moins 3 500 victimes des accidents de la route.
Le Covid-19 a tué, en un an, 95 640 personnes en France. Avant le Covid-19, on estimait que 10 000 morts par an "seulement" était imputables à la grippe. C'est simple, ce sont les chiffres officiels, il n'y a pas lieu de tergiverser sur la façon de présenter les "chiffres". Ils sont juste là, sous nos yeux. Le Covid-19 a fait neuf fois plus de morts que la grippe sur la même période. Et on savait que ça allait arriver. Et c'est encore pire si l'on considère le modèle de l'Inserm, pour qui il n'y aurait que 431 décès par an directement imputables à la grippe.
Alors : non, le Covid-19 n'est pas une petite grippe, et oui, il justifie des mesures exceptionnelles, et exceptionnellement contraignantes.
D'autant plus que vous attendez que le gouvernement vous tienne la bite pour pisser. Où avez-vous planqué votre bon-sens, votre citoyenneté, votre solidarité, votre humanité, pour après gueuler quand le gouvernement vous le rappelle ?

3
content/blog/_index.md

@ -0,0 +1,3 @@
---
title: "Blog"
---

3
content/critiques/films/_index.md

@ -0,0 +1,3 @@
---
title: "Films"
---

12
data/mois.yaml

@ -0,0 +1,12 @@
1: "janvier"
2: "février"
3: "mars"
4: "avril"
5: "mai"
6: "juin"
7: "juillet"
8: "août"
9: "septembre"
10: "octobre"
11: "novembre"
12: "décembre"

9
docker-compose.yml

@ -0,0 +1,9 @@
version: "3"
services:
hugo:
image: klakegg/hugo:latest-ext
command: server
volumes:
- ".:/src"
ports:
- "1313:1313"

1121
package-lock.json

File diff suppressed because it is too large

17
package.json

@ -0,0 +1,17 @@
{
"name": "richard-dern.fr",
"version": "1.0.0",
"description": "Code source de mon site personnel",
"main": "index.html",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "Richard Dern",
"license": "CC-BY-SA",
"devDependencies": {
"autoprefixer": "^10.3.2",
"postcss": "^8.3.6",
"postcss-nested": "^5.0.6",
"tailwindcss": "^2.2.7"
}
}

7
postcss.config.js

@ -0,0 +1,7 @@
module.exports = {
plugins: [
require('tailwindcss/nesting'),
require('tailwindcss'),
require('autoprefixer')
]
}

44
tailwind.config.js

@ -0,0 +1,44 @@
const colors = require('tailwindcss/colors');
module.exports = {
purge: {
enabled: true,
content: [
'./themes/202108/**/*.html'
]
},
darkMode: 'class', // or 'media' or 'class'
theme: {
colors: {
transparent: 'transparent',
current: 'currentColor',
black: colors.black,
white: colors.white,
gray: {
400: '#9CA3AF',
800: '#262626',
900: '#171717'
},
blue: {
200: '#BAE6FD',
500: '#0EA5E9',
600: '#0284C7'
},
purple: {
300: '#D8B4FE',
500: '#A855F7'
},
yellow: {
400: '#FB923C',
600: '#EA580C'
}
},
extend: {},
},
variants: {
extend: {},
},
plugins: [
require('autoprefixer')
],
}

20
themes/202108/LICENSE

@ -0,0 +1,20 @@
The MIT License (MIT)
Copyright (c) 2021 YOUR_NAME_HERE
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

82
themes/202108/assets/css/highlight.css

@ -0,0 +1,82 @@
/* Background */ .chroma { color: #f8f8f2; background-color: #282a36 }
/* Other */ .chroma .x { }
/* Error */ .chroma .err { }
/* LineTableTD */ .chroma .lntd { vertical-align: top; padding: 0; margin: 0; border: 0; }
/* LineTable */ .chroma .lntable { border-spacing: 0; padding: 0; margin: 0; border: 0; width: auto; overflow: auto; display: block; }
/* LineHighlight */ .chroma .hl { display: block; width: 100%;background-color: #ffffcc }
/* LineNumbersTable */ .chroma .lnt { margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: #7f7f7f }
/* LineNumbers */ .chroma .ln { margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: #7f7f7f }
/* Keyword */ .chroma .k { color: #ff79c6 }
/* KeywordConstant */ .chroma .kc { color: #ff79c6 }
/* KeywordDeclaration */ .chroma .kd { color: #8be9fd; font-style: italic }
/* KeywordNamespace */ .chroma .kn { color: #ff79c6 }
/* KeywordPseudo */ .chroma .kp { color: #ff79c6 }
/* KeywordReserved */ .chroma .kr { color: #ff79c6 }
/* KeywordType */ .chroma .kt { color: #8be9fd }
/* Name */ .chroma .n { }
/* NameAttribute */ .chroma .na { color: #50fa7b }
/* NameBuiltin */ .chroma .nb { color: #8be9fd; font-style: italic }
/* NameBuiltinPseudo */ .chroma .bp { }
/* NameClass */ .chroma .nc { color: #50fa7b }
/* NameConstant */ .chroma .no { }
/* NameDecorator */ .chroma .nd { }
/* NameEntity */ .chroma .ni { }
/* NameException */ .chroma .ne { }
/* NameFunction */ .chroma .nf { color: #50fa7b }
/* NameFunctionMagic */ .chroma .fm { }
/* NameLabel */ .chroma .nl { color: #8be9fd; font-style: italic }
/* NameNamespace */ .chroma .nn { }
/* NameOther */ .chroma .nx { }
/* NameProperty */ .chroma .py { }
/* NameTag */ .chroma .nt { color: #ff79c6 }
/* NameVariable */ .chroma .nv { color: #8be9fd; font-style: italic }
/* NameVariableClass */ .chroma .vc { color: #8be9fd; font-style: italic }
/* NameVariableGlobal */ .chroma .vg { color: #8be9fd; font-style: italic }
/* NameVariableInstance */ .chroma .vi { color: #8be9fd; font-style: italic }
/* NameVariableMagic */ .chroma .vm { }
/* Literal */ .chroma .l { }
/* LiteralDate */ .chroma .ld { }
/* LiteralString */ .chroma .s { color: #f1fa8c }
/* LiteralStringAffix */ .chroma .sa { color: #f1fa8c }