Ce sur quoi je travaille cette année

Les cours de 3e année que je suis en ce moment (semestre 5, septembre à décembre 2026), avec ce que j’y fais et des extraits de mon code. Mis à jour le 13 octobre 2026.

🧪 Qualité de développement En cours

Une API ASP.NET Core propre et testée

TD fil rouge TPRevision : une API REST de gestion de produits (EF Core, PostgreSQL), refactorée selon les principes SOLID.

  • Interfaces séparées par rôle (lecture, écriture, requêtes DTO)
  • DTO et AutoMapper pour ne jamais exposer les entités
  • Tests unitaires (MSTest, Moq) et tests d’intégration sur une vraie base PostgreSQL

En ce moment : client Blazor Server en MVVM qui consomme l’API

C#ASP.NET CoreEF CoreAutoMapperMSTestMoqBlazor
Page détaillée : rendus, démos et révisions → Voir les extraits de code ↓
🐍 Programmation avancée (R5.A.05) En cours

Flask, données et IA

TP en groupe, déployés avec Docker Compose sur un serveur de l’IUT.

  • Flask-SQLAlchemy sur la base de données Chinook
  • Tableau de bord de séries temporelles avec InfluxDB
  • Reconnaissance de chiffres manuscrits (MNIST) avec TensorFlow, servie par Flask

En ce moment : une application Flask complète à rendre (base de données, upload d’images, modèles d’IA)

PythonFlaskSQLAlchemyInfluxDBTensorFlowDocker Compose
Page détaillée : rendus, démos et révisions →
🌦️ SAE 5.01 — projet de groupe En cours

Astraeus, plateforme éducative sur la météo

Équipe Scrum de 4 : exploration 4D des phénomènes, quiz et WeatherGuessr, un jeu où le joueur affronte la prévision d’un modèle.

  • Mon rôle : la partie IA et le traitement des données
  • Notre propre modèle de prévision à base de réseaux de neurones, en commençant par un LSTM sur la température
  • Prévision jusqu’à 3 jours, calculée pendant que le joueur devine

En ce moment : cahier des charges et conception

PythonLSTMScrum
📐 Modélisation mathématique En cours

Les maths derrière le machine learning

Les bases théoriques des modèles que j’utilise ailleurs, codées à la main en Python.

  • Exploration de données avec NumPy et pandas
  • Régression linéaire et descente de gradient implémentées de zéro
  • ACP, classification, perceptron et XOR, puis CNN, LSTM et Transformers

En ce moment : réseaux récurrents et Transformers, en lien avec le LSTM d’Astraeus

NumPypandasscikit-learnKeras
Page détaillée : rendus, démos et révisions →
⚙️ Virtualisation et automatisation En cours

Docker, CI/CD et Kubernetes

18 exercices de pipelines GitLab CI/CD, tous publics sur GitLab.

  • Images Docker construites et publiées dans le registre GitLab, puis testées ensemble (API + PostgreSQL) dans le pipeline
  • Tests de bout en bout (Cypress), de charge (k6) et sur plusieurs versions en parallèle (Python 3.8 à 3.11, Node 16 à 20)
  • Analyse de sécurité automatique (Bandit, Safety, npm audit), variables protégées et GitLab Pages

En ce moment : appliqué à ce portfolio : vérifications automatiques à chaque modification

DockerGitLab CI/CDKubernetesCypressk6GitHub Actions
Page détaillée : rendus, démos et révisions → Voir mes 18 exercices sur GitLab ↗ Voir la CI du portfolio ↗
🎨 Création numérique et veille En cours

3D, image et technologies émergentes

Des cours plus créatifs, dont une partie en anglais.

  • Blender : modélisation, textures et UV mapping d’un personnage
  • Photoshop, cours en anglais : « Avatarize yourself », un avatar créé à partir de ma photo
  • Veille technologique en groupe sur WebAssembly

En ce moment : retouche de l’avatar et synthèse de la veille

BlenderPhotoshopWebAssembly

Extraits de code

Qualité de développement (C#)

Extraits tels qu’ils sont dans mon code. Le dépôt complet du cours est public sur GitHub.

Séparer les rôles : lecture, écriture et requêtes DTO

Chaque contrôleur ne dépend que de ce dont il a besoin (principe de ségrégation des interfaces).

public interface IReadable<T> where T : class
{
    Task<IEnumerable<T>> GetAllAsync();
    Task<T?> GetByIdAsync(int id);
}

public interface IWritable<T> where T : class
{
    Task AddAsync(T entity);
    Task UpdateAsync(T entity);
    Task DeleteAsync(int id);
    Task SaveAsync();
}

public interface IDataRepository<T> : IReadable<T>, IWritable<T> where T : class
{
}

public interface IQueryService<TListDto, TDetailDto>
    where TListDto : class
    where TDetailDto : class
{
    Task<IEnumerable<TListDto>> GetAllDtoAsync();
    Task<TDetailDto?> GetByIdDtoAsync(int id);
}
Entité → DTO avec AutoMapper

Le client reçoit des données prêtes à afficher, et l’état « en réapprovisionnement » est calculé côté serveur.

CreateMap<Produit, ProduitDetailDto>()
    .ForMember(dest => dest.Id, opt => opt.MapFrom(src => src.IdProduit))
    .ForMember(dest => dest.Nom, opt => opt.MapFrom(src => src.NomProduit))
    .ForMember(dest => dest.Type, opt => opt.MapFrom(src => src.TypeProduitNavigation.NomTypeProduit))
    .ForMember(dest => dest.Marque, opt => opt.MapFrom(src => src.MarqueNavigation.NomMarque))
    .ForMember(dest => dest.Stock, opt => opt.MapFrom(src => src.stockReel))
    .ForMember(dest => dest.EnReappro, opt => opt.MapFrom(src => src.stockReel < src.stockMin));
Test d’intégration sur une vraie base PostgreSQL

Le test crée un produit via le contrôleur, le relit, et vérifie le DTO renvoyé, au format Given / When / Then.

// When : création via le contrôleur
var postResult = await _controller.PostProduct(nouveauProduit);

// Then : la création renvoie 201 CreatedAtAction
var createdResult = postResult.Result as CreatedAtActionResult;
Assert.IsNotNull(createdResult);
Assert.AreEqual(201, createdResult.StatusCode);

var produitCree = createdResult.Value as Produit;
Assert.IsNotNull(produitCree);

// When : relecture via le contrôleur (renvoie un ProduitDetailDto)
var getResult = await _controller.GetProductById(produitCree.IdProduit);

// Then : le produit persisté est bien retourné avec 200 OK
var produitRelu = (getResult.Result as OkObjectResult)?.Value as ProduitDetailDto;
Assert.IsNotNull(produitRelu);
Assert.AreEqual("iPhone 17", produitRelu.Nom);
Assert.AreEqual("Apple", produitRelu.Marque);
Assert.IsFalse(produitRelu.EnReappro);

Virtualisation et automatisation (GitLab CI/CD)

Construire les images Docker puis tester l’API avec une vraie base

Un modèle de job réutilisé (.docker), deux images publiées dans le registre GitLab, puis un test d’intégration qui ne démarre qu’une fois le backend construit. Ex12 ↗

.docker:
  image: docker:latest
  services:
    - docker:dind
  before_script:
    - echo "$CI_REGISTRY_PASSWORD" | docker login -u "$CI_REGISTRY_USER" --password-stdin "$CI_REGISTRY"

build-backend:
  extends: .docker
  stage: build
  script:
    - docker build -t "$BACKEND_IMAGE" ./backend
    - docker push "$BACKEND_IMAGE"

integration-test:
  extends: .docker
  stage: integration
  needs:
    - build-backend
  script:
    - docker network create test-net
    - docker pull "$BACKEND_IMAGE"
    # (…) démarrage de PostgreSQL et de l'API sur le réseau test-net
    - docker run --rm --network test-net curlimages/curl -sf http://backend:3000/api/db-health
    - docker run --rm --network test-net curlimages/curl -sf http://backend:3000/api/health
Tester sur plusieurs versions de Python en parallèle

Une matrice lance la même suite de tests sur quatre versions de Python à la fois, et garde un rapport par version. ex16 ↗

test-python:
  stage: test
  parallel:
    matrix:
      - PYTHON_VERSION: ["3.8", "3.9", "3.10", "3.11"]
  image: python:$PYTHON_VERSION-slim
  script:
    - pip install --no-cache-dir pytest pytest-json-report
    - pytest python/test_calc.py --json-report --json-report-file=report_python_$PYTHON_VERSION.json
  artifacts:
    paths:
      - report_python_$PYTHON_VERSION.json