Weekly Shaarli

All links of one week in a single page.

Week 43 (October 24, 2022)

Demystifying Database Performance for Developers
thumbnail

Utiliser correctement une base de donnée relationnelle reste un exercice compliqué car il y a beaucoup de subtilité à comprendre.

Le plus important reste le concept d'index de lecture qui sont des structures permettant de retrouver plus rapidement de la donnée en échange d'un temps d'écriture plus long.

Le plan d'exécution des requêtes est aussi très important, l'auteur présente un exemple simple:

-- compute "now() - interval 3 days" then execute a table scan
publish_date < now() - interval '3 days'

-- for each line, compute "publish_date + interval 3 days and compare to now()"

publish_date + interval '3 days' < now()

Dans le deuxième cas, on va devoir récupérer chaque ligne et faire un calcul pour executer la requête. Il ne faut pas oublier que les bases de données relationnelles sont ensemblistes et donc faites pour fonctionner sur des ensembles de lignes plutôt que sur des lignes individuelles.

Scalable real-time messaging server
thumbnail

Un serveur de distribution de messages en temps réel.

Il supporte de nombreux protocols pour la distribution:

  • Server Side Event (HTTP)
  • Polling (HTTP)
  • WebSocket
  • gRPC
Comment trouver un job quand on est développeur junior sans expérience

A force de voir les développeurs Junior galérer à trouver un premier job, je me suis dit que je pourrais donner quelques conseils:

  • Apprenez des technos en faisant des projets perso
  • Prenez soin de votre image sur LinkedIn

Mais surtout: Contribuez à des projets Open Source.

Ça fait monter en compétence avec les revues de code et les contributions sont publiques donc accessibles aux recruteurs.

When life gives you lemons, write better error messages

De super conseils pour écrire de bons messages d'erreurs à destination des utilisateurs finaux.

Un bon message d'erreur doit:

  • expliquer ce qu'il s'est passé (Unable to connect your account)
  • rassurer l'utilisateur (Your changes were saved)
  • aider à réparer le problème (Please try connecting again)
  • fournir une aide externe (If the issue keep happening, contact support)
Salaires et avantages chez Shine
thumbnail

Un autre exemple de grille de calcul des salaires.

Plusieurs points qui se démarquent du reste:

  • ancienneté totale et pas ancienneté dans l'entreprise
  • bonus personne à charge
  • prime parisienne
What if the team assumes my functional JavaScript is slow?
thumbnail

Il ne faut pas forcément se focaliser sur la performance à tout prix ou sur la maintenabilité à tout prix.

C'est toujours une histoire de compromis entre les deux.

J'aime beaucoup cette citation qui me fait pensé au mécanisme de gestion mémoire de Rust:

Sharing state is fine, so long as we don’t mutate it.
Mutating state is fine, so long as we don’t share it.

Sysdig TRT uncovers massive cryptomining operation leveraging GitHub Actions
thumbnail

Analyse d'une attaque qui vise les ressources gratuites de différents provider pour miner des Monero.

A ce jour les chercheurs ont détecté 30 comptes Github, 2000 comptes Heroku et 900 comptes Buddy impliqués.

Turbopack - The successor to Webpack
thumbnail

Un bundler/builder Javascript pour remplacer Webpack, c'est écrit en Rust et ils affichent des performances de 5 à 10 fois supérieurs.

Pour l'instant c'est que pour les projets Next.js ou Vite.

Understand JavaScript Promise with 10 Examples

10 challenges pour comprendre les promises en Javascript

Why Rust?

Une très bonne explication des nombreux avantages de la programmation avec le langage Rust créé par Mozilla.

Rust offre de très bonnes performances, proches du C et du C++ tout en proposant un modèle de gestion de la mémoire innovant.

Jusqu'ici, la gestion de la mémoire était soit un facteur de dégradation des performances du à l'introduction d'un garbage collector (Java, Go, C#), soit un facteur de risque de sécurité important (buffer overflow, use-after-free, segmentation fault, etc.)

Rust introduit un mécanisme ou une référence peut être soit constante et partagée, soit mutable mais unique (Borrow Checker).

La gestion des erreurs est aussi plutôt pas mal en prenant le meilleur du système d'exceptions (implicite) et du système de retour d'erreur (explicite)

// the "?" operator mean that potential errors will be propagated
let result = foo()?.bar()?;

Un autre avantage est le potentiel de portabilité dans le navigateur avec WASM. Il est possible d'utiliser Rust comme langage fullstack à l'instar de Javascript.

Il y a aussi bien sur des choses plus compliqués avec Rust:

  • la syntax inhabituelle
  • temps de compilation assez long
  • ecosystème naissant
Gently Down the Stream (Kafka)

Une bande dessinée qui explique les raisons d'utiliser un message broker comme Kafka et le fonctionnement de ce dernier.

(Merci Gaël pour le partage)

Mercure.rocks: Real-time APIs Made Easy

Un broker de messages temps réel qui utilise des Server Side Events (SSE)

Comment deux fonds nous ont dépouillés et ont détruit notre boite
thumbnail

L'histoire incroyable de deux fondateurs qui se font évincer de leur société à la suite d'une fraude minutieusement organisée.

C'est dingue ce qu'il leur est arrivé, malgré un pacte d'actionnaires sensé les protéger, deux fonds d'investissements ont fait pression sur eux via des intimidations pour les virer.

Les fonds savaient que ça prendrait du temps de faire valoir leurs droits devant les tribunaux, ils ont du se battre pendant 2 ans.

Ce qui est dingue c'est que même après la décision de la cour d'appel, ils ont du batailler pour retrouver leur poste, notamment avec la surprise de découvrir 240000€ de chèques émis sans factures. Sans compter le "nouveau" PDG qui double son salaire et se facturait en plus comme freelance.

Breega a publié un droit de réponse et ce n'est pas tout blanc du côté des fondateurs non plus: https://breegavc.medium.com/solendro-ou-quand-linvestisseur-a-tout-les-torts-r%C3%A9tablissons-les-faits-832a5550adfa

I made 10x faster JSON.stringify() functions, even type safe
thumbnail

Le processus de stringification de typescript-json est beaucoup plus rapide car la librairie se base sur une liste de types pour les serialiser.

En gros à l'étape de compilation, la librairie va générer le code Javascript pour sérialiser exactement toutes les propriétés d'un objet typé donc on s'épargne les étapes de parcourir de l'objet et de découverte des types des propriétés.

Par contre on ne peut traiter que des payloads ayant un type défini à l'avance.

Exemple de code généré pour un type ({ name: string, age: number):

    const $string = typescript_json_1.default.stringify.string;
    const $number = typescript_json_1.default.stringify.number;
    const $so = [
        input => `{"name":${$string(input.name)},"age":${$number(input.age)}}`
    ];
    return $so[0](http://input);