Développeur

Sylvain Maitre

Développement bas niveau, systèmes et web.
Passionné par l'infrastructure auto-hébergée et les projets techniques ambitieux.

C / C++ TypeScript Python Docker Linux 42 School
En ligne

Projet web

Infrastructure

Serveur personnel

Démos

Projets personnels

Pong

Pong en ligne jouable directement dans le navigateur, développé en Javascript vanilla côté client et Node.js côté serveur.

L'IA locale est un réseau de neurones Javascript Vanilla. Il ne lui suffit que de quelques neurones et un entraînement quasi instantané pour devenir imbattable.

TypeScriptNode.jsWebSocketCanvas

Fourmi de Langton

La fourmi de Langton est un automate cellulaire sur une grille 2D. La règle est minimaliste : sur une case blanche, la fourmi tourne à droite, retourne la case en noir et avance ; sur une case noire, elle tourne à gauche, retourne la case en blanc et avance.

Malgré cette simplicité extrême, le comportement est chaotique dans les premières milliers d'étapes, puis la fourmi construit spontanément une "autoroute" périodique infinie - un exemple classique d'émergence.

La simulation est rendue en Canvas 2D avec un rendu incrémental (seules les cases modifiées sont repeintes à chaque tick). La vitesse est configurable, le zoom et le pan permettent d'explorer la grille à grande échelle.

Des variantes multi-couleurs (règles LLRR, LRRL...) sont également disponibles, générant des motifs visuels radicalement différents.

JavaScriptCanvasWeb

Blackhole

En cours de développement.

J'avais fait ce projet dans l'espoir de voir quand une ou plusieurs étoiles de notre galaxie allaient tomber dans Sgr A*. Au bout de plusieurs milliards d'années, j'ai fini par comprendre que ça pourrait ne jamais arriver, alors j'ai ajouté une étoile faite pour tomber dedans…

Pourquoi les étoiles S ne tombent pas

Sans perturbation extérieure, seule l'émission d'ondes gravitationnelles (Peters-Mathews) fait décroître l'orbite. Temps calculés par le simulateur, avec une masse stellaire supposée de 10 M☉ :

péricentre [R_S] fusion Peters [ans]
S2 1409 1,7·10¹³
S29 1192 2,0·10¹³
S38 2580 1,3·10¹⁴
S42 9078 1,7·10¹⁶
S55 2784 1,3·10¹⁴
S60 10 629 3,3·10¹⁶
PLUNGE 3,9 4,3·10⁴

L'âge de l'Univers est de 1,38·10¹⁰ ans. PLUNGE est l'objet compact fictif ajouté pour tomber : a = 400 mas, e = 0,9999.

Modèle

Orbites publiées par GRAVITY (S2, S29, S38, S42, S55, S60) et Gillessen et al. 2017 (S13), avec M• = 4,297·10⁶ M☉ et R₀ = 8277 pc ; positions sur le ciel et vitesses radiales de S2 vérifiées contre les mesures publiées. Le demi-grand axe et l'excentricité décroissent selon Peters-Mathews (intégrateur de Heun, réversible à rebours).

Deux temps coexistent : l'image reçue par l'observateur, résolue par bissection avec le retard de la lumière et le délai de Shapiro, et la position de l'étoile au même instant sur place, ≈ 27 000 ans plus tard. La trajectoire parcourue entre les deux est tracée. Déplacer l'observateur conserve l'instant de la source : l'image et la date observée changent, pas l'étoile. Capture à l'horizon, image figée à l'horizon, déformation de marée, sauts de 10³ à 10⁶ ans.

Observation

Tout est calculé dans le repère terrestre des éléments orbitaux (nord, est, ligne de visée) ; la vue par défaut est celle depuis la Terre, nord en haut, est à gauche. Le champ est le rayon angulaire du plus grand cercle de l'écran, avec échelle, barre d'échelle et grossissement décomposé (distance × optique) ; l'horizon est dessiné à l'échelle dès qu'il est résolu.

La vue tourne au trackball, à la souris ou aux doigts, repérée par lacet, tangage et roulis par rapport à la Terre. Chaque objet s'active ou se désactive ; sa fiche donne la position sur le ciel, la vitesse radiale, le décalage spectral (relativité générale et Doppler transverse), les éléments et les temps Peters. L'écran entier s'exporte en texte.

L'écran d'accueil montre la scène figée à travers un hublot, la caméra tournant autour de Sgr A* devant un fond d'étoiles.

Technique

JavaScript sans compilation. Physique en double précision dans un Web Worker, transmise par SharedArrayBuffer ; rendu WebGL avec three.js. Les trajectoires sont échantillonnées selon ce qui est visible : corde de 3 px dans le champ, pas grossiers hors champ, révolutions confondues à l'écran omises.

Pas encore modélisé

Précession de Schwarzschild, régime proche de l'horizon (PLUNGE passe à 3,9 R_S, hors du domaine d'un modèle képlérien moyenné), interactions entre étoiles, spin de Sgr A*.

Sources

GRAVITY Collaboration 2018 (A&A 615, L15), 2022 (A&A 657, A82 et L12), 2024 (A&A 692, A242) ; Gillessen et al. 2017 (ApJ 837, 30).

JavaScriptWebGLWeb

Cub3D

Version WebAssembly du raycaster cub3D, compilée depuis C et jouable directement dans le navigateur.

CWebAssemblyRaycasting

Effet papillon

Simulation en temps réel du système de Lorenz, affichée en 3D dans le navigateur et écrite en pur HTML, CSS et JavaScript.

Le système de Lorenz

En 1963, le météorologue Edward Lorenz publie un modèle très simplifié de la convection dans l'atmosphère, c'est-à-dire de l'air chauffé par le bas qui monte, se refroidit et redescend. Le modèle tient en trois équations.

ẋ = σ(y − x)
ẏ = x(ρ − z) − y
ż = xy − βz

x, y et z décrivent l'état du système à un instant donné, et les équations donnent la vitesse à laquelle cet état change. Avec les valeurs choisies par Lorenz (σ = 10, ρ = 28, β = 8/3), le système est chaotique.

L'attracteur étrange

Chaque point de l'espace correspond à un état du système. En partant d'un point, on suit une trajectoire. Presque tous les points de départ mènent à la même forme en deux boucles, appelée attracteur. Les trajectoires y tournent indéfiniment sans jamais repasser par le même chemin, et passent d'une boucle à l'autre sans régularité. On parle d'attracteur étrange. C'est une fractale, de dimension environ 2,06.

L'effet papillon

Dans la démo, les trajectoires rouge et bleue partent de points qui ne diffèrent que d'un dix-millième. Au début, elles sont superposées à l'écran. Puis leur écart grandit et elles finissent par suivre des chemins sans rapport.

Le système ne contient aucun hasard. Le moindre écart de départ est amplifié de façon exponentielle, en moyenne multiplié par 10 toutes les 2,5 unités de temps. Mesurer l'état de départ dix fois plus précisément ne fait donc gagner que peu de temps de prévision.

Lorenz a résumé cette idée en 1972 par une question restée célèbre : un battement d'ailes de papillon au Brésil peut-il provoquer une tornade au Texas ?

À quoi ça sert

Lorenz a découvert ce comportement par accident en 1961. Il avait relancé une simulation météo en recopiant des valeurs arrondies à trois décimales, et obtenu une prévision complètement différente. Son article de 1963 est à l'origine de la théorie du chaos.

La conséquence la plus connue concerne la météo. On ne mesure jamais l'état de l'atmosphère parfaitement, donc une prévision détaillée ne peut pas dépasser deux semaines environ, quelle que soit la puissance des ordinateurs. Les services météo lancent plusieurs dizaines de simulations en modifiant légèrement les conditions de départ, puis comparent les résultats. C'est la prévision d'ensemble, et la démo fait la même chose avec la paire rouge et bleue.

Les mêmes équations décrivent d'autres systèmes physiques, comme une roue à eau dont le sens de rotation s'inverse de façon irrégulière, certains lasers ou certains modèles de dynamo.

Réalisation

La démo n'utilise aucune bibliothèque. Le rendu 3D ne passe pas par WebGL. Les rotations et la projection en perspective sont calculées à la main, puis tracées sur un canvas 2D. Un cube sert de repère, et ses arêtes sont redessinées par-dessus les trajectoires quand elles passent devant. Les trajectoires sont calculées pas à pas avec la méthode d'Euler, et chaque nouveau segment s'ajoute au dessin sans effacer les précédents.

JavaScriptHTML

Régression logistique

Démonstration du projet dslr de 42 : prédire la maison de Poudlard d'un élève à partir de ses notes, par régression logistique un contre tous. Le projet porte sur 1 600 élèves, quatre maisons et dix matières ; l'atelier réduit le jeu à 30 élèves, trois maisons et deux matières, pour que chaque nombre reste lisible et que la frontière de décision se trace dans un plan.

Parcours

Un schéma de douze nœuds suit l'ordre du code : données, imputation par la médiane, standardisation, puis pour chaque maison la boucle de correction (score, probabilité, perte, gradient, mise à jour) jusqu'au critère d'arrêt, enfin la décision au plus grand score et la prédiction des élèves réservés. Avec la validation croisée, l'entraînement est rejoué sur cinq plis stratifiés avant le modèle final.

Chaque étape affiche sa formule, le calcul déroulé avec les nombres de l'élève sélectionné et le tableau des élèves d'entraînement, dont les colonnes suivent l'étape : x, z, p, ℓ, p − y, contributions au gradient. Chaque symbole donne sa définition au survol.

Descente de gradient

Toutes les descentes sont calculées dans le navigateur au chargement, puis rejouées : une frise les met bout à bout, avec curseur, sauts ±1 et ±10, lecture et saut à l'arrêt. Critère d'arrêt : ‖∇J‖ < 10⁻³, ou 6 000 itérations. Le jeu est construit pour que la descente ait quelque chose à montrer : deux notes corrélées, un problème mal conditionné et des élèves qui changent de camp jusqu'à plusieurs centaines d'itérations.

Figures

Sept figures suivent l'itération : frontière de décision dans le plan des notes, scores z, sigmoïde, courbe de perte, courbe ROC, et en relief la surface de probabilité et la trajectoire des poids sur la surface de J. Matrice de confusion, précision, rappel et F1 par maison.

Technique

JavaScript vanilla en modules ES, sans compilation ni appel réseau. Figures en Canvas 2D, reliefs avec Plotly, formules avec MathJax. La descente est un portage de celle du projet Python (sigmoïde à deux branches, softplus, même critère d'arrêt), vérifié valeur par valeur sur un cas calculé à la main.

Thèmes clair et sombre sur les échelles Radix Colors, contrastes vérifiés par script (7:1 pour le texte), navigation au clavier et annonces aria-live.

JavaScriptMLCanvas
42 School

Projets scolaires

FdF

Projection fil de fer

C42
image à venir

Minishell

Shell UNIX en C : parseur, pipes, redirections, variables d'environnement et built-ins.

CUnixShell42
image à venir

ft_transcendance

Pong multijoueur full-stack en temps réel avec OAuth2, profils, amis et historique de parties.

TypeScriptNestJSReactWebSocket42
image à venir

Cub3D

Moteur de raycasting en C inspiré de Wolfenstein 3D ; rendu en première personne, textures, collisions.

CRaycastingMLX42
image à venir

ft_irc

Serveur IRC RFC 1459 en C++ ; gestion multi-clients via poll(), canaux, modes et opérateurs.

C++NetworkIRC42

Régression linéaire

Implémentation from scratch avec descente de gradient et visualisation des courbes de convergence.

PythonML42

Projet Java

Projet orienté objet axé sur les design patterns et les bonnes pratiques de la POO.

JavaOOP42