Un article intéressant sur les avantages de Deno.
Il y a de nombreux avantages en DX, notamment le support Typescript directement par Deno mais surtout je découvre un avantage non négligeable en terme de sécurité de la supply chain.
Les scripts (comme les entrées de scripts
dans le package.json
en Node.js) de Deno sont lancés dans un shell isolé spécial (deno_task_shell) et n'ont accès qu'a leur input, ce qui les empêche d'aller farfouiller sur le système (ce genre de truc https://arstechnica.com/information-technology/2022/03/sabotage-code-added-to-popular-npm-package-wiped-files-in-russia-and-belarus/)
L'approche des dépendances via URL est aussi intéressante, on est capable de charger du code depuis une URL tout en respectant des versions, des checksum, etc.
Très intéressante comparaison entre Tailwind et Bootstrap.
Tailwind n'est pas un UI kit opinated comme Bootstrap mais plutôt une librairie de styles/widgets pour créer des composants.
Si je devais faire un parallèle avec Vue.js:
- Bootstap => Composant API
- Tailwind => Composition API
Tailwind permet donc d'avoir plus de flexibilité dans le design d'une application même si il demande un effort plus conséquent au démarrage.
(Merci Théo et Seb)
Un article sur le développement d'un algorithme quantique utilisant des qbits pour trouver une valeur dans un tableau.
C'est une implémentation de l'algorithme de Grover.
Bien sur ce n'est qu'une emulation d'un processus quantique qui fait tourner le programme. IBM (et d'autres) proposent ce genre de services
Une lib d'authorisation avec gestion des permissions RBAC
En plus du RBAC, il y a aussi une gestion ABAC (via les attributs avec un pseudo langage de matching).
La cerise sur le gateau c'est la gestion du multi-tenant (domains)
La persistence peut se faire dans tout type de base de données et ils possèdent des lib dans quasiment tous les langages.
Un serveur FTP entièrement en Node.js.
Il est très simple d'utilisation et très pratique car il abstrait le filesystem. Il est donc possible de lui fournir une classe qui fait autre chose qu'écrire et lire sur le disque.
Par exemple, il est possible de surcharger les méthodes pour écrire et lire dans un bucket S3.
C'est parfait pour s'interfacer avec tous les vieux systèmes qui communiquent encore via FTP.
Je l'utilise en tant que gateway FTP -> HTTP: les fichiers uploadés sont envoyés sur une route d'API
Un article sur une bonne gestion de la dette technique.
J'aime notamment la règle qui impose de créer une issue tagué tech-debt
à chaque PR introduisant de la dette technique.
Excellent article pour aller plus loin avec TypeScript !
Je ne connaissais l'astuce pour retourner des types predicate et aider TypeScript a mieux comprendre le code:
function isCircle(shape: Shape): shape is Circle {
return shape.kind === 'circle';
}
if (isCircle(shape)) {
// Typescript know it's a "Circle"
}
Bref, pleins de bon conseils et d'astuces pour aller plus loin avec le typage.
Attention quand même à ne pas trop complexifier les types, il ne faut pas hésiter à prendre des raccourcis si vous commencez à passer trop de temps à les écrire.
Un serveur web qui permet d'accèder à une base PostgreSQL directement via une API REST!
Exemples:
- SELECT avec WHERE 👉
GET /people?age=gte.18&student=is.true
- un JOIN sur la table
directors
👉GET /films?select=title,director:directors(id,last_name)
Un framework pour créer des extensions PostgreSQL avec Rust.
Je ne savais pas mais à priori Rust est un langage de choix pour les extensions PostgreSQL maintenant.
C'est un très bon usecase car dans une base de données on a justement besoin de performances et de memory safety
Des conseils pour offrir la meilleure expérience possible lorsqu'on utilise des polices de caractères personnalisées.
- Utilisez des petites polices (20-40Kb)
- Servez les vous même (pitié pas Google Font..)
- Ne proposez pas de polices intermédiaires (
font-display: block;
) - Indiquez au browser de pré-charger les polices (
<link rel="preload" ...>
)
Le but est de charger les polices au plus vite car aucun texte ne s'affiche avant et c'est volontaire pour éviter le layour shift (des éléments qui changent de place quand la police est chargée si elle ne fait pas exactement la même taille que la temporaire)
Comment utiliser la commande npm link
pour faire utiliser une librairie que l'on a en local plutôt que de la télécharger depuis NPM.
C'est utile pour travailler sur une lib externe qui est utilisé dans son application.
cd ~/projects/react
npm link # Step 1.
cd ~/projects/kuzzle-saas
npm link react
(Merci Sébastien !)
Un excellent article qui explique le fonctionnement de la Composition API de Vue 3 et les raisons de ce changement de paradigme.
On passe d'une déclaration de composants avec des classes à un paradigme fonctionnel.
Cela permet entre autre:
- un meilleur partage de la logique
- des types plus précis
- une meilleure structure de code
Une lib pour manipuler des données tabulaires (vectors, matrices) de la même manière qu'avec Panda.
Celle la est écrite en Rust donc on peut s'attendre des à des performances ~7x plus rapide que Panda. (Benchmarks)
(Via Alex)
Un point sur les UUID v7 et les ULID qui sont tous deux des améliorations de la spec UUID v4 en incluant un timestamp afin d'obtenir des identifiants ordonnés.
Je trouve les ULID moins lisible que les UUID 0GWWXY2G84DFMRVWQNJ1SRYCMC
par contre les UUID v7 ne sont pas encore très répandus.
Autre chose, les UUID v7 par le même processus auront un compteur auto-incrémenté pour rester séquentiels alors que les ULID auront simplement un bit aléatoire de modifié.
Discussion sur ULID vs ID + sortable created_at (pas de consensus): https://news.ycombinator.com/item?id=28089498
Aussi, les UUID v4 sont très mal compressable donc ça peut rapidement prendre de la place.
Un guide alternative pour comprendre comment fonctionne les flexbox en CSS.
Un projet qui permet de lancer des scripts Python avec des performances natives en compilant le code en bytecode LLVM puis donc en code natif.
Ils affichent des performances x10 à x100.
Par contre toutes les libs ne sont pas forcément supportées donc difficile de faire tourner une grosse codebase avec ça.
J'avais déja parlé de Taichi qui propose le même genre de chose.
Un retour d'expérience sur l'utilisation de Rust plutôt qu'un autre langage dans une startup qui développe un produit de type SaaS.
Sans surprise, c'est moins efficace de développer un SaaS en Rust qu'en Node.js ou en Python.
L'auteur met en avant les points qui freinent le développement de sa startup:
- la courbe d'apprentissage très longue de Rust
- le modèle de mémoire (borrowing) qui ralentit le développement et empêche de faire des "brouillons"
- la difficulté de trouver des développeurs
- la documentation et les lib qui manque de maturité
La moralité: don't jump over the hype train et surtout il faut utiliser les techno pour les usages ou elles ont du sens.
Il est possible d'utiliser le model DreamBooth qui permet de générer des images à partir de photo de soi directement depuis l'API de Replicate!
RESPONSE=$(curl -X POST -H "Authorization: Token $REPLICATE_API_TOKEN" https://dreambooth-api-experimental.replicate.com/v1/upload/data.zip)
curl -X PUT -H "Content-Type: application/zip" --upload-file data.zip "$(jq -r ".upload_url" <<< "$RESPONSE")"
SERVING_URL=$(jq -r ".serving_url" <<< $RESPONSE)
Un article d'investigation puis de correction de problèmes de performances sur un grosse application React utilisant les Hooks.
Très bonne explication des différences entre Nested fields et Object fields pour stocker des tableaux d'objets avec Elasticsearch.
Si on souhaite faire des recherches sur plusieurs propriétés contenues dans ces tableaux, alors on devra utiliser le type nested
car sinon ES "applatit" les champs.
{
"authors": [
{ "name": "Gustavo Llermaly", "age": "32", "country": "Chile" },
{ "name": "John Doe", "age": "20", "country": "USA" }
]
}
Sans préciser le type nested
, cela sera indexé de cette manière:
{
"authors.name": ["Gustavo Llermaly", "John Doe"],
"authors.age": [32, 20],
"authors.country": ["Chile, USA"]
}