222 private links
A definitely good reading. Why have they better perfornance than HDD ? Some explications here 👍
Note: an SSD is fast and efficient if there is free space on it.
How to remove credentials inadvertenly inserted in the git repo
Yet another guide on python decorators.
Well written 👍
Un autre article expliquant les premiers concepts de Rust. Pour une fois, c'est de la pratique en évitant l'ownership/borrowing, lifetime, etc...
Dans un context avec de nombreux conteneurs, il vaut mieux partager les ressources que de créer des binaires statiques. Pour cela, toutes les images doivent partir de la même image de base.
Les binaires statiques ont un avantage : ils vont être utilisés dans des environnements hétérogènes.
Nettoyage de binaires et compression:
- suppression des symboles de debug avec l'outil
strip
- mettre les assets en dehors des conteneurs 🤔
- des outils exotiques:
- dockerSlim qui semble supprimer les fichier inutilisés
- Distroless si la taille compte vraiment, sinon Alpine fonctionne très bien :D
- Bazel pour les gros builds, mais vraiment très gros. C'est un outil complexe !
- Nix (le package manager) en combinaison avec Nixery: Nixery, c’est un registre de conteneurs “magique” : il génère à la volée des manifests d’images de conteneurs qui référencent des layers qui correspondent aux objets du Nix store.
- Récupérer les certificats SSL des autorités:
COPY --from=alpine /etc/ssl /etc/ssl
pour copier le dossier SSL de l'image Alpine - Récupérer les fichiers de timezone:
COPY --from=debian /usr/share/zoneinfo /usr/share/zoneinfo
; puis vérifier avec un retour deTZ=Europe/Paris date
- Pour les fichiers concernant les UID/GID, notamment pour exécuter des apps de bureau dans des conteneurs, on peut les génßerer localement, ou dans le conteneur, ou faire un
bind-mount
depuis l'hôte (via les volumes dans le dockerfile ?). Cf: un blog post
Donc la meilleure solution ? Ça dépend !
Sur Go et ses binaires statiques
Et Alpine Linux ❤️
→ 5Mo, avec un environnement Unix GNU/Linux cependant complet
→ son package manager rapide: dpk
→ Alpine utilise musl à la place de GNU C en tant que bibliothèque C standard, et comme ces deux bibliothèques ne sont pas compatibles, il faut compiler le binaire avec musl: soit avec des images officielles qui ont des tags :alpine
, soit directement depuis l'image Alpine.
Exemple de dockerfile :
FROM alpine
RUN apk add build-base
COPY hello.c .
RUN gcc -o hello hello.c
FROM alpine
COPY --from=0 hello .
CMD ["./hello"]
Pour java, il faut mettre la main dans le cambouis.
Pour les langages interprétés, ça passe oklm... sauf si des bibliothèques externes sont utilisées: soit le build est très long, soit on cherche le compromis avec des images taggés :slim
. Puis mettre les mains dans le cambouis pour savoir laquelle d'Alpine ou celle taggée :slim
produit la plus petite image.
Pour Rust ❤️ , il y a rust:alpine
et les binaires s'exécutent bien avec alpine
. La documentation renseigne sur la génération de binaires statiques
- Utiliser les multi-stage builds pour générer les artefacts dans l'environnement que l'ont veut, puis utiliser la dernière stage pour build l'image.
- Utiliser FROM scratch et construire des binaires statiques au besoin
A great entry point into the RSS format
Selectors: * [attribute] > ~ +
With the part two about pseudo -classes and elements selectors. Examples used in development are explained 👍
How to use hexagonal grids. It is complete ! Wow well done.
Everything is here to create a game based on hexagons :)
command | meaning |
---|---|
${parameter:-defaultValue} | Get default shell variables value |
${parameter:=defaultValue} | Set default shell variables value |
${parameter:?"Error Message"} | Display an error message if parameter is not set |
${#var} | Find the length of the string |
${var%pattern} | Remove from shortest rear (end) pattern |
${var%%pattern} | Remove from longest rear (end) pattern |
${var:num1:num2} | Substring |
${var#pattern} | Remove from shortest front pattern |
${var##pattern} | Remove from longest front pattern |
${var/pattern/string} | Find and replace (only replace first occurrence) |
${var//pattern/string} | Find and replace all occurrences |
${!prefix*} | Expands to the names of variables whose names begin with prefix. |
${var,} | Convert first character to lowercase. |
${var,pattern} | Convert only if the pattern match |
${var,,} | Convert all characters to lowercase. |
${var,,pattern} | Convert only if the pattern match |
${var^} | Convert first character to uppercase. |
${var^pattern} | Convert only if pattern match |
${var^^} | Convert all character to uppercase.} |
${var^^pattern} | Convert only if pattern match |
Wow ! Charts are only created with HTML and CSS, making them very efficient