Retour au portfolio

Études de cas

Le raisonnement derrière les réalisations.

The reasoning behind the work.

Contexte, contraintes, décisions techniques et résultats vérifiables pour quatre projets représentatifs.

01 · Mandat client · 2026

Une application métier pour fiabiliser le cycle de vie des dossiers

Remplacer un ensemble de feuilles de calcul et de listes manuelles par une source de vérité sécurisée, utilisable par une équipe non technique.

12champs essentiels bloquants
38tests automatisés
16comptes pilotes
6listes d'attente ordonnées
7onglets de statistiques Excel

Le problème

Des données utiles, mais fragiles

Le processus dépendait de saisies manuelles réparties entre plusieurs feuilles. Il fallait conserver la simplicité d'usage tout en ajoutant validation, recherche, traçabilité, listes d'attente et statistiques annuelles.

Mon rôle

Responsabilité de bout en bout

Découverte des besoins, modélisation des données, UX des formulaires, développement Django, contrôles d'accès, 2FA, audit, génération Excel, tests, conteneurisation et préparation du déploiement.

Décision clé

Empêcher les dossiers incomplets à la source

Douze champs essentiels sont validés avant l'enregistrement. Si l'un d'eux manque, le dossier n'est pas créé et l'utilisateur voit exactement ce qui doit être corrigé. C'est une garantie de flux, pas une estimation marketing.

Contraintes

Sécurité et simplicité doivent coexister

Interface française, utilisateurs peu techniques, renseignements sensibles, traçabilité de chaque modification et classement déterministe des listes d'attente par date de premier contact.

ArchitectureDjango · PostgreSQL · Docker · Caddy · Cloudflare · openpyxl

Les données et la capture sont fictives. Certains détails métier et l'identité du client ne sont pas publiés sans autorisation écrite.

02 · Projet d'équipe ÉTS · Funambules Médias · 2025

Convertir une vidéo une fois, puis la diffuser à la bonne qualité

Moderniser deux modules Nextcloud open source afin de convertir des sources volumineuses en DASH et HLS sans bloquer l'interface, puis les lire avec une qualité adaptative.

Rendus configurables

6

Formats adaptatifs

DASH + HLS

Traitement

Asynchrone

Le contexte

Un projet d'équipe livré à une coopérative média

Le projet de fin d'études, réalisé avec Funambules Médias, visait un système souverain et auto-hébergé pour convertir des vidéos H.264 de 2 à 20 Go et les diffuser depuis Nextcloud.

Ma contribution

Simplifier le pipeline et rendre le projet livrable

J'ai notamment unifié la génération DASH et HLS autour du builder CMAF/FFmpeg, ajouté l'environnement Docker et le build frontend, produit un script de déploiement macOS/Linux et structuré la documentation bilingue.

Décision clé

Un seul pipeline CMAF pour deux sorties

Au lieu de maintenir deux chemins FFmpeg indépendants, le pipeline partagé génère les artefacts DASH et, au besoin, le manifeste HLS. Moins de logique dupliquée signifie moins de divergence lors des correctifs.

Exploitation

Ne jamais immobiliser l'interface

L'API crée un travail persistant, puis un worker PHP supervisé par systemd exécute FFmpeg et publie la progression. L'utilisateur peut quitter la page et revenir consulter l'état de la conversion.

StackNextcloud · PHP · Vue 3 · FFmpeg · MPEG-DASH · HLS · Shaka Player · Docker · systemd

Projet d'équipe. Les interfaces montrées proviennent du logiciel réel; l'instance locale, les noms de fichiers et les états de tâches utilisés dans l'aperçu sont fictifs.

03 · Automatisation Python

Synchroniser un horaire public sans créer de doublons

Transformer des données municipales changeantes en événements Google Calendar fiables, sans intervention manuelle quotidienne.

Cadence

1 fois / heure

Couverture vérifiée

14 tests

Relance inchangée

0 nouvel événement

Le problème

Un horaire utile, difficile à suivre

Les séances pertinentes changent dans une API publique, alors que l'utilisateur organise son quotidien dans Google Calendar. La valeur vient d'une synchronisation fiable, pas d'un simple import ponctuel.

Décision clé

Concevoir l'idempotence dès le départ

Chaque exécution compare l'état souhaité avec les événements existants. Une relance sans changement conserve les événements, plutôt que d'en ajouter de nouveaux.

Fiabilité

Observer avant de modifier

Un mode d'exécution à sec expose le plan de synchronisation. Quatorze tests couvrent notamment l'analyse, la sélection et les comportements de mise à jour.

Exploitation

Une automatisation réellement autonome

GitHub Actions déclenche le service chaque heure. L'état peut être conservé dans SQLite ou dans les propriétés des événements Calendar selon l'environnement.

StackPython · Google Calendar API · SQLite · GitHub Actions · OAuth

04 · Intelligence artificielle en Java

Chercher profondément sans dépasser la limite de décision

Construire un adversaire Lines of Action qui améliore progressivement son choix, puis rend toujours un coup dans la fenêtre disponible.

Limite de décision

4,9 s

Benchmark d'ouverture

5 profondeurs

Décision mesurée

B8→D6

Le problème

Un vaste espace de recherche, très peu de temps

La qualité d'un coup dépend de la profondeur explorée, mais toute recherche doit s'arrêter avant l'expiration du temps accordé.

Décision clé

Approfondir par itérations complètes

L'approfondissement itératif garde en mémoire le meilleur résultat de la dernière profondeur terminée. Le moteur peut donc s'interrompre proprement et toujours retourner un coup valide.

Performance

Élaguer et réutiliser

L'élagage alpha-bêta réduit les branches inutiles. Une table de transposition indexée par hachage de Zobrist évite de recalculer certaines positions déjà analysées.

Architecture

Séparer règles, état et stratégie

Les règles de déplacement, l'état du plateau, l'évaluation et la recherche restent séparés afin de rendre le moteur testable et modifiable.

StackJava · Minimax · Alpha-beta · Iterative deepening · Zobrist hashing

La suite

Ces projets ressemblent à ce que votre équipe doit résoudre?

Parlons d'un rôle en développement ou d'un mandat Teknos Dev.

bonjour@teknos.dev