Mensuel Shaarli
January, 2023
Un excellent guide pour l'animation de SVG, avec quelques bonnes pratiques d'optimisation
L'auteur présente l'intérêt de AWS Direct Connect, et les bases théoriques à avoir pour l'utiliser intelligemment.
Un mini tuto sur l'utilisation de Vite avec Symfony. Côté Laravel, Vite est devenu le builder officiel depuis les dernières versions.
Un résumé d'une conférence à propos de la duplication de code - généralement à éviter mais avec quelques exceptions
L'auteur présente un système de création de comptes utilisateurs sur invitation, avec Laravel (via https://happytodev.substack.com/p/quoi-de-neuf-les-devs-numero-19 )
Les conférenciers parlent de 2 cas de collecte de données : la télérelève de la consommation électrique des trains, et la performance énergétique des bâtiments. Ces 2 cas posent des problématiques différentes, et les conférenciers expliquent les solutions retenues.
Il s'agit de notes prises par l'auteur à propos de l'utilisation de Rust en production : avantages et inconvénients.
L'auteur montre comment créer son propre dépôt Helm avec ses charts.
Pour résumer, ne pas mettre d'unité dans le code CSS suivant : line-height - cela évite bien des soucis si l'utilisateur redimensionne sa police de caractères (via https://www.hteumeuleu.fr/demain-la-veille-1/ )
Tout est dans le titre
Des exemples de cas d'usages pour le sélecteur :has()
L'auteur montre l'utilisation de Crowdsec, un bon candidat à la succession de fail2ban
L'auteur présente Jenkins, et montre comment il l'a installé.
L'auteur présente BitdNET-Pi, un logiciel s'installant sur un raspberry pi et qui permet de faire de la reconnaissance de chants d'oiseaux
La transcription d'une conférence de Ploum contre la publicité
Tout est dans le titre
Une petite présentation de l'API fullscreen et de ses possibilités
Tout est dans le titre
L'idée est de construire un objet automatiquement à partir de paramètres de l'URL... ce que permet de faire l'ArgumentResolver de Symfony (remplace le ParamConverter)
Dans ce vieil article, l'auteur montre les dangers de nouveautés introduites par PHP 7.2, notamment le possible mauvais usage du type "object". D'une manière générale, il insiste sur le fait de préciser au maximum la classe / interface des objets plutôt qu'un type générique ne donnant aucune information sur les champs / méthodes possibles.
Scott Young fait une rétrospective de l'évolution de ses idées sur l'apprentissage.
Une BD humoristique sur les problèmes liés à CORS... avec quelques liens pour les résoudre
L'auteur vulgarise l'architecture de Von Neumann : comment fonctionne la RAM, sa relation avec le CPU, etc. L'article est long mais se lit très bien
Tout est dans le titre
La librairie boto3 facilite le développement sur lambda AWS ou l'écriture de code d'infrastructure AWS. L'auteur montre l'installation d'une extension boto3 dans VSCode qui fournit l'autocomplétion
Tout est dans le titre
L'auteur présente les avantages de Symfony UX / Turbo / Stimulus
Dans un projet Symfony, un service peut avoir besoin d'autres services, mais ce besoin varie en fonction du contexte d'exécution...Au lieu d'injecter tous les services pouvant être utilisés dans le constructeur, on peut utiliser un "service subscriber" à la place. L'auteur montre comment faire.
L'auteur propose 2 choses : utiliser webp, et appliquer un très léger flou gaussien aux images
L'auteur explique de manière synthétique les différences entre DAS, SAN, NAS et stockage cloud.
L'auteur montre le monitoring des logs d'une application Symfony via Monolog / Filebeat / Elasticsearch et Kibana
Tout est dans le titre
L'auteur montre comment envoyer dans Domoticz les données des capteurs collectés par HomeAssistant via MQTT
Suite de l'article précédent sur la gestion de volets roulants avec Home Assistant : le cas concret
Un concurrent de Chocolatey
Il s'agit d'un tutoriel pour les débutants : l'auteur montre l'initialisation d'un dépôt git en local, et comment faire son premier commit
Korben présente ntfy, un projet open source qui permet d'envoyer une notification à votre téléphone.
L'auteur explique certaines particularités / problèmes des types en PHP7.
Il préconise l'utilisation du mode strict et de ne jamais avoir besoin de typage faible. On devrait toujours connaître le type précis de nos variables. Enfin il faut éviter au maximum le type nullable.
L'auteur montre comment combiner un conteneur Docker pour Nginx avec Fail2Ban.
L'auteur montre l'utilisation de l'API d'OpenAI dans un projet Symfony.
L'auteur présente ses principes en tant qu'auteur et développeur :
- l'état d'esprit (mindset) précède les outils
- la qualité est au dessus de la quantité
- se concentrer sur les fondamentaux
- écrire des articles qui resteront vrais dans le futurs et cohérents
- l'expérimentation est la clef
Tout est dans le titre
L'auteur s'interroge sur la place des particularités sensorielles dans le diagnostic des troubles du spectre de l'autisme. En effet, ces particularités pourraient s'avérer bien plus déterminantes qu'on ne le pensait jusqu'à présent.
L'auteur explique les raisons de son choix de Gitea comme forge logicielle Git. Il montre ensuite comment l'installer et la configurer sur son serveur
Tout est dans le titre
Vous tentez de vous connecter à un serveur auquel vous vous connectez sans problème d'habitude... et vous tombez sur l'erreur
The authenticity of host 'mon_super_serveur' can't be established.
RSA key fingerprint is SHA256:le_fingerprint.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])?
Généralement, vous choisissez yes sans réfléchir. Il s'agit d'une pratique TOFU ("Trust On First Use") et ce n'est pas terrible d'un point de vue sécurité.
L'auteur montre comment utiliser plutôt des certificats SSH, qui permettent de n'avoir plus de TOFU.
L'auteur présente un guide pour choisir le bon type de visualisation de données.
BDX I/O est un conférence bordelaise sur le thème de la programmation et de ses métiers annexes. L'auteur fait un compte rendu des différents talks auxquels il a assisté.
Le taux de couverture de code (code coverage) est un indicateur très incomplet, dont l'auteur montre bien les limites. Il propose d'utiliser, en plus, le taux de couverture des chemins d'exécution (branch coverage) qui pallie certains défauts du code coverage.
Un lanceur d'applications
L'auteur présente une manière de connecter Joplin à son instance Nextcloud afin de limiter l'accès au strict nécessaire
Apache Guacamole sert à la prise en main à distance d'applications bureautiques, via le support de protocoles tels que VNC, RDP et SSH mais aussi via le navigateur web grâce au HTML5. L'auteur détaille une procédure d'installation pour les applications suivantes :
- Audacity
- Blender
- Darktable
- Digikam
- Doublecommander
- Filezilla
- Firefox
- Kdenlive
- Libreoffice
- Mysql-workbench
- Pidgin
- Qdirstat
- Remmina
- Sqlitebrowser
- Wireshark
Pluto est un outil cli qui vérifie si vos fichiers yaml de configuration Kubernetes sont à jour vis-à-vis de l'évolution de Kubernetes.
document.elementFromPoint permet d'obtenir l'élément directement présent aux coordonnées x,y
Il existe aussi document.elementsFromPoint qui liste l'ensemble des éléments (par inclusion)
L'auteur présente une alternative aux UUID qui permet de conserver l'ordre : les ULIDs - Universally Unique Lexicographically Sortable Identifier
Tout est dans le titre
Tout est dans le titre
Un article très intéressant sur le choix d'une clef primaire : depuis le simple auto incrément jusqu'aux différentes versions des UUID, l'auteur explique les avantages et inconvénients de chaque possibilité avec application pratique sur PostgreSQL
Tout est dans le titre
Tout est dans le titre
Tout sur les tunnels SSH avec une chouette cheatsheet en prime (via https://happytodev.substack.com/p/quoi-de-neuf-les-devs-numero-19 )
Tout est dans le titre, sauf le mot "log" :)
L'article survole le processus de création d'émulateurs
Les notes d'une conférence sur la conception d'une architecture : le choix entre différents styles, les contraintes, etc.
Tout est dans le titre
Il y a pas mal de bizarreries qui peuvent arriver lorsqu'un document yaml est interprété - l'auteur recommande d'utiliser plutôt toml ou de s'imposer de toujours mettre les chaînes de caractères entre quotes
Tout est dans le titre
Un autre cas d'utilisation de :has()
Tout est dans le titre
Par défaut, Podman associe l'utilisateur courant avec le root du container lancé... mais il est possible de changer ce comportement
Tout est dans le titre
Tout est dans le titre
L'auteur nous explique sa réflexion sur le choix
Uncle Bob explique sa prise de conscience qu'il ne faut pas hésiter à utiliser des structures de classe dans la programmation fonctionnelle, même quand le langage (ici le clojure) ne dispose pas de mot clef spécifique pour ça. L'idée est de bien classer les données / méthodes qui vont bien ensemble.
Une place pour toute chose, chaque chose à sa place
L'auteur présente WebAssembly, à travers quelques exemples de programmes.
L'auteur détaille les outils qu'il utilise et ses méthodes - voici le résumé :
- Noter ses idées dans Google Keep
- Définir les objectifs de son projet : objectifs généraux et objectifs "temporels" (court, moyen et long terme)
- Demander des retours au bon moment, aux bonnes personnes (définir son audience)
- Apprécier le temps de développement (choix des technos, frameworks, etc.) - utilisation de la méthode Pomodoro. S'il ne se sent pas motivé, l'auteur tente pendant 10 min de coder... Souvent ça suffit, mais sinon il s'arrête.
- Moins on s'éparpulle, mieux c'est - utilisation de Kanban avec Trello, une seule tâche "en cours" à la fois - pas d'évaluation précise du temps mais un macro sizing
- Prendre des habitudes - méthode "ne pas briser la chaîne" pour s'assurer de consacrer un minimum de temps chaque jour.
- Ne pas se mettre de pression inutile
- Éviter le perfectionnisme en se donnant des limites
L'auteur présente la solution d'IAM (Identity and Access Management) de Scaleway, notamment vis à vis de son intégration à Terraform.
L'auteur évalue les avantages et inconvénients du principe DRY - don't repeat yourself - tel qu'énoncé dans le Pragmatic Programmer. Ce principe explique surtout qu'il y a un gros avantage à avoir une seule source de vérité pour la connaissance métier. Cela n'implique pas que le code ne soit jamais dupliqué - "la duplication est bien moins coûteuse qu'une mauvaise abstraction"
Un service Symfony a besoin d'un autre service, mais ce besoin varie selon le contexte d'exécution. L'auteur montre l'utilisation des tags pour injecter automatiquement tous les services utilisés.
L'auteur présente Open Source Vulnerability Detector aka osv-detector qui permet de détecter les vulnérabilités des dépendances de tous types de projet (utilisation de npm, de composer, etc.) Il a même créé une image docker pour l'utilisation dans une CI
Une explication en profondeur du fonctionnement d'OpenZFS, le système de fichier au coeur de TrueNAS
La gestion de fichiers en python
L'auteur présente le data binding dans React, et donne quelques bons conseils pour éviter les quelques pièges.
L'auteur montre une astuce pour l'élément table, astuce qui permet de donner une largeur minimale à une colonne. Les commentaires de l'article donnent une autre solution (plus propre à mon avis)
L'auteur montre la création d'un moteur de gestion de volets génériques sous Home Assistant.
L'auteur montre comment filtrer et assainir les données en PHP
L'auteur détaille pas-à-pas la création d'une arborescence en CSS, en combinant CSS et éléments HTML bien choisis
L'auteur développe l'idée que le code lisible est infiniment supérieur au code "intelligent". Pour juger de la lisibilité, il se demande si un junior pourrait comprendre le code sans souci...
L'auteur montre l'existence de propriétés JavaScript sur les éléments de formulaire (validity) et comment s'en servir pour customiser l'affichage des erreurs de validation.
Je cite l'auteur
Les blob URLs sont des URLs (Uniform Resource Locators) générées dynamiquement qui permettent d'accéder aux données binaires stockées dans un objet Blob (Binary Large OBject) en JavaScript.
L'utilisation de clamp pour de la typographie fluide dans un contexte de design responsive n'est pas sans causer quelques problèmes d'accessibilité : le zoom peut être perturbé. L'auteur explore quelques pistes pour remédier à cela
Via Korben - https://korben.info/convertir-code.html - , un outil en ligne de conversion de code (JavaScript vers JSON, Markdown vers HTML, XML vers JSON, etc.)
L'auteur explique l'installation de la CLI AWS sous Windows, Mac et Linux. Il donne ensuite quelques astuces (configuration, alias, etc.)
L'auteur explique comment filtrer les appels nuisibles via l'interface web de Free Mobile.
Installation et configuration sous Linux, MacOS et Windows
L'article concerne Postgres mais il est possible que ça puisse s'adapter à d'autres SGBD. Je cite l'auteur
Lorsqu’on identifie une requête lente, on remarque parfois qu’en forçant l’utilisation d’un index (avec enable_seqscan = off), le temps d’exécution est sensiblement réduit, parfois d’un facteur 100 ou 1000. Un DBA peut alors être tenté de jouer sur le paramètre random_page_cost pour favoriser l’utilisation de l’index. Mais celui-ci ne devrait dépendre que de la performance du stockage.
Dans un cas comme celui-là, il est vraiment nécessaire de s’attaquer à la cause première, qui est l’erreur d’estimation sur le nombre de lignes retournées. Parfois, le nom des colonnes donne un indice sur la façon dont elles sont corrélées, comme ici avec freqmin < freqmax, hypothèse qu’il est nécessaire de faire valider par le métier, pour ensuite en tirer profit, avec des statistiques étendues lorsque cela est possible, ou avec une ré-écriture de la requête.
Le hash est la partie de l'URL après le #. Sa particularité est de ne pas provoquer de rechargement de page lorsqu'il change. L'auteur montre comment utiliser l'événement hashchange.
Sebsauvage partage ses astuces pour faire des sauvegardes efficaces, en vérifiant l'intégrité des données.
L'auteur montre comment installer Stable Diffusion en local
L'auteur montre comment se créer son petit système d'intégration continue, à partir d'une machine compatible unix. L'idée est d'héberger des dépôts git "bare" et d'utiliser des hooks "post-receive" (après exécution d'un git push) pour lancer des tâches. Ces hooks passent en paramètre les "git ref" nécessaires pour connaître le contexte d'exécution (branche pushée) L'auteur propose d'utiliser redis pour stocker les messages (statut, ref, etc.)
Dans ce tutoriel, l'auteur montre comment configurer un serveur Web Apache de manière à bloquer l'accès à notre site Web à certains pays, ou à l'inverse, autoriser uniquement certains pays à se connecter.
L'auteur utilise Redis et la création d'un attribut PHP (décorateur) pour marquer certains points d'entrée comme "lockables" pendant un certain temps (sémaphore).
Les navigateurs fournissent les propriétés booléennes window.personalbar, window.locationbar, et window.menubar properties
Dans cet article, l'auteur présente une alternative à Elastic Search APM, plus légère : Jaeger. Il propose l'utilisation d'Elastic en production, et Jaeger en développement (pas de compte à gérer, etc.)
Il montre l'installation de Jaeger
L'auteur poursuit son exploration de Jenkins, et montre comment le configurer via un Jenkinsfile. Il donne aussi quelques extensions VSCode utiles à cet effet.
L'auteur démontre l'assertion selon laquelle la taille d'un mot de passe est l'élément le plus important de sa sécurité.
Tout est dans le titre
Je cite l'intro de l'article :)
Vous avez besoin de tester des features sur un environnement existant ? Ou vous avez des contraintes de certificats TLS ou de finops pour votre workflow GitOps ?
Nous allons voir comment utiliser ArgoCD et Traefik pour mettre en place une solution de header routing pour une application dans Kubernetes.
Tout est dans le titre
Il s'agit d'un tutoriel montrant la création d'un WAF (Web Application Firewall) sur AWS, avec Terraform.
Une présentation succincte de Playwright, une solution open source de Microsoft pour l'automatisation de navigateur, dans la veine de Puppeteer
Tout est dans le titre
Tout est dans le titre
Enix présente son outil qui permet de mettre en cache les images utilisées par des clusters k8s. Cela évite les problèmes de surconsommation
Tout est dans le titre
Tout est dans le titre
Un constat pas très rassurant et quelques mesures permettant d'améliorer sa sécurité
L'auteur montre l'utilisation de quelques outils comme l'empreinte sha1, le perceptual hash et l'identification des metadata. Il a même développé un outil PHP pour extraire les metadata basé sur ExifTool
L'auteur présente des cas d'utilisation du sélecteur CSS :has()
Dans la foulée de son précédent billet, Uncle Bob montre qu'il est possible d'écrire des classes dans un langage fonctionnel, le Clojure.
Une présentation de la fonction CSS clamp
Une introduction à Svelte
Passionnant, le hollandais volant explique les implications de la définition plus précise de la seconde
L'auteur donne de bons conseils pour gérer ses side projets
Tout est dans le titre
L'auteur décrit les 7 étapes dans son apprentissage du TDD
Étape 1. Le lâcher prise : barrière psychologique
Étape 2. Petit à petit, on est moins petit : la vraie valeur de TDD
Étape 3. Abuser de son IDE
Étape 4. La liberté du refacto : la confiance en notre code
Étape 5. Ne pas refacto trop tôt
Étape 6. Tests techniques versus tests métier
Étape 7. Double loop BDD TDD <3
Tout est dans le titre
Le code css pour avoir un dark mode minimaliste
@media (prefers-color-scheme: dark) { html body {filter: invert(1);} /* the following really should be managed by a cascade layer */ html img, html img.book.cover, html img.book.cover.big, html [#archipelago](./add-tag/archipelago) a:hover img {filter: invert(1);} html [#thoughts](./add-tag/thoughts) figure.standalone img { box-shadow: 0.25em 0.25em 0.67em [#FFF8](./add-tag/FFF8); } }
Remplacer la commande kubectl de Kubernetes par oc d'OpenShift
L'auteur montre, via ce tutoriel, l'utilisation de Behat pour tester une commande Symfony. Il donne des solutions pour quelques problèmes que l'on pourrait rencontrer : utilisation du service locator, contexte d'exécution, etc.
Tout est dans le titre
L'auteur explique la mise en place et le déploiement d'un site statique généré grâce à Hugo
Il s'agit d'un concurrent à Electron, qui permet de développer des applications Desktop en utilisant des technologies web
Une explication du fonctionnement de rsync, très ingénieux
L'auteur montre l'utilisation de la librairie ijson pour le traitement de gros fichiers json en python
:has est un sélecteur CSS3 qui "plante" en cas d'erreur sur le contenu de la sélection. Par exemple :has(h2) fonctionne alors :has(h2, ul, ::-truc-qui-rate) ne fonctionnera même pas pour h2 ou ul.
Un compte rendu de conférences auxquelles a assistées l'autrice... et un compte rendu très sympa de son expérience de bénévole
Pour résumer, apprendre surtout à communiquer ^^ Plus on devient senior, plus on est amené à communiquer
Des réflexions autour de la qualité de code et du problème de la transmission de la connaissance ayant amené au code
L'auteur explique les avantages d'utiliser DateTime plutôt que les fonctions date, mktime et autres en PHP.
Ceph est une solution libre de stockage distribué. L'auteur montre comment créer un cluster sur une seule machine (tester, apprendre)
L'auteur montre comment utiliser les formulaires Symfony, tout en gardant des entités représentant réellement des concepts du domaine métier. Le point principal est la possibilité de vérifier des contraintes sur la partie "setter" et de donner un nom métier au setter.
Tout est dans le titre
Il s'agit d'un guide complet sur le terminal : histoire, configuration et utilisation... passionnant !
L'auteur explique le fonctionnement de la pile (stack) et du tas (heap) dans le contexte de l'exécution d'un programme Rust.
yt-dlp est le successeur de youtube-dl, qui permet de télécharger des vidéos depuis différents sites de partage dont youtube.
Bitwarden permet de gérer ses mots de passe. L'auteur montre comment l'installer via docker (image VaultWarden, plus légère)
Il est recommandé de gérer des conteneurs Docker directement en ligne de commande (plus rapide, conçu pour) Mais il est possible d'utiliser une interface graphique depuis le navigateur web : Portainer. L'auteur présente cet outil et son installation.
L'auteur présente les formats utilisables tels que les noms de couleur, rgb et hsl, mais aussi des formats à venir / en cours d'implémentation comme lch.
Il termine en préconisant hsl car ce format est bien plus intuitif (couleur devinable) et manipulable (facile d'éclaircir / assombrir)
L'auteur explique en quoi consistent les Web Workers, et quels sont leurs avantages et utilité. Il donne plusieurs contextes, côté client mais aussi côté serveur.
L'auteur montre comment utiliser des instances AWS EC2 pour provisionner, par exemple, des machins de tests avec molecule pour développer des rôles et collections Ansible.
Tout est dans le titre
Scott Young décrit en quoi consiste l'étape d'apprentissage appelée "plateau intermédiaire". Il s'agit du moment où l'acquisition de nouvelles compétences dans un domaine est de plus en plus difficile.
Il donne 3 causes possibles à ce problème, et propose 1 solution pour chaque.
L'auteur explique les choix qu'il a fait en matière d'hébergement :
- un cluster de Raspberry Pi sur lequel tournent des containers d'application
- réseau géré via Docker Swarm
- un stockage distribué avec Gluster
- sauvegarde toutes les nuits sur un NAS et toutes les semaines chez un hébergeur
- supervision avec Prometheus / Grafana
L'auteur présente des exporters Prometheus qui peuvent s'avérer pratiques pour administrer un cluster Kubernetes.
L'auteur explore comment se conformer à la Clean Architecture en utilisant Symfony.
Les navigateurs fournissent des événements liés à l'impression : beforeprint et afterprint
L'un des problèmes de la récursivité est le dépassement de mémoire, chaque appel récursif ajoutant des données à mémoriser. Il est possible d'éviter cela tout en conservant la récursivité en utilisant la récursion terminale. Au lieu d'écrire
function factorielle(int n) { if (n <= 1) { return 1; } return n * factorielle(n - 1); }