Logiciel de devis des masses

SIREHNA

En tant qu'ingénieur logiciel chez SIREHNA, j'ai été chargé de développer un logiciel de devis des masses qui répondait aux besoins spécifiques de nos clients. En utilisant le langage de programmation Python, j'ai travaillé sur le cœur de l'application, en créant une API centrée sur la base de données, indépendante de l'interface utilisateur. Je me suis concentré sur l'implémentation d'opérations robustes de lecture et d'écriture de fichiers, et sur la gestion des données incorrectes ou manquantes. J'ai notamment utilisé la bibliothèque pandas pour lire des fichiers Excel et gérer des dataframe. J'ai utilisé une base de données relationnelle pour garantir l'intégrité des données, tout en offrant des calculs efficaces. Cela impliquait de travailler avec SQL pour interroger et mettre à jour le stockage du logiciel. En outre, j'ai mis en œuvre des fonctionnalités afin de gérer correctement l'historique des données, en utilisant Git comme outil de gestion des versions. Pour assurer la qualité du code, j'ai suivi plusieurs bonnes pratiques, notamment l'utilisation de formateurs de code et de linters (black, pylint, isort...), la conteneurisation avec Docker, et l'intégration continue avec Gitlab CI et la revue de code. Tout au long du projet, j'ai collaboré étroitement avec les clients pour comprendre leurs besoins et construire un logiciel qui leur soit vraiment utile. Ce projet est en cours au moment où j'écris ces lignes.

Python SQL SQLite Docker Git GitLab GitLab CI CI/CD VS Code Pytest Pandas PySide PyQT

PhoneHistory

Application Android

Phone History est une application Android qui récupère l'historique de l'utilisation du téléphone. Elle obtient l'utilisation du téléphone à partir du système Android et l'affiche dans une liste en commençant par l'utilisation la plus récente. Elle explore également le stockage du téléphone afin d'afficher les modifications de fichiers, telles que les photos prises ou les fichiers téléchargés. Enfin, l'application affiche des statistiques sur l'utilisation du téléphone au cours des dernières 24 heures. Ces statistiques comprennent les 10 applications les plus utilisées par l'utilisateur en termes d'utilisation et la durée associée, ainsi qu'un graphique chronologique de l'utilisation du téléphone par heure. Techniquement, l'application utilise l'API UsageEvents pour récupérer l'utilisation des applications. Un algorithme est dédié à la lecture des données de cette API, qui ne renvoie que des événements. Le système Android ne conserve l'utilisation du téléphone que pendant quelques jours, de sorte que l'application n'est pas en mesure d'afficher l'utilisation d'applications plus anciennes. Par conséquent, PhoneHistory stocke l'utilisation des applications dans une base de données SQL interne, afin d'afficher l'utilisation du téléphone sur du plus long terme. Cette application est - au moment où j'écris ces lignes - mon application la plus téléchargée sur le Google Play Store.

Android Java XML UI Design SQL IntelliJ IDEA Android Studio

E scooters

Application mobile pour un projet scolaire

Dans le cadre d'un projet scolaire, j'ai fait partie d'une équipe chargée de trouver une idée pour une application mobile. Nous avons décidé de créer une application qui regroupe toutes les marques de trottinettes électriques à Stockholm. L'idée était que l'utilisateur n'ait besoin que d'une seule application pour comparer les emplacements et les prix des trottinettes électriques à proximité, et y accéder. Nous avons d'abord créé une application web. En utilisant React JS et Tailwind CSS, nous avons conçu le front-end. L'application était standalone, car la partie back-end était constituée des API des marques de trottinettes électrique directement. Je me suis concentré sur l'utilisation de la bibliothèque Leaflet pour afficher la carte, la position de l'utilisateur et des trottinettes électriques. Les autres membres de l'équipe ont développé différentes parties de l'application, comme la communication avec les API des marques de trottinettes. Au final, nous avons obtenu une application web standalone qui affichait les emplacements des trottinettes électriques, mais sans la possibilité de louer une. Dans la deuxième partie du cours, nous devions créer une application native. Nous avons choisi d'utiliser React Native pour être cross-platform et en quelque sorte proche de ce que nous avions fait lors de la première mission. Une fois de plus, j'étais chargé de m'occuper des fonctionnalités de la carte. Cependant, je n'ai pas trouvé de bibliothèque facile à utiliser et cross-platform pour React Native permettant d'afficher une carte, comme le fait Leaflet avec React JS. J'ai donc implémenté moi-même le workflow des Map tiles, en utilisant les données Open Street Map, reproduisant ainsi le comportement d'un composant cartographique. Cela a fini par fonctionner correctement, à l'exception des fonctionnalités de zoom. Nous avons atteint presque le même point avec l'application native qu'avec l'application web. Cette expérience m'a permis de travailler au sein d'une équipe, entièrement en anglais puisque nous venions de différents pays d'Europe, et de développer mes compétences en développement web frontend et cross-platform. J'ai également acquis de l'expérience dans l'utilisation de React et React Native, ainsi que dans le travail avec des cartes, en utilisant les données Leaflet et Open Street Map. Cela m'a également aidé à comprendre les défis et les différences dans le développement d'une application web et d'une application native.

React JS React Native Tailwind CSS Leaflet JavaScript UI Design Web Mobile API VS Code

Environnement de gestion des simulations et des données

Stage de fin d'études chez Sirehna

J'ai travaillé sur un projet pour SIREHNA, une entreprise qui effectue des simulations de dynamique des fluides numériques (CFD) pour évaluer les performances des navires (entre autres). Mon rôle dans ce projet était de créer un environnement de simulation et de gestion de données qui aiderait l'équipe de SIREHNA à suivre et à récupérer ses données, ainsi qu'à automatiser les tâches à faible valeur ajoutée. Après avoir travaillé sur la compréhension des besoins des utilisateurs, j'ai participer avec l'équipe sur la définition de l'architecture de l'environnement. Nous avons choisi d'utiliser un serveur web comme pierre angulaire de l'architecture. Nous avons mis en évidence les besoins fonctionnels tels que l'authentification, la gestion des utilisateurs et le stockage des données, puis nous avons procédé à une analyse comparative des technologies. J'ai utilisé la bibliothèque Girder pour instancier un serveur web dédié à la gestion des utilisateurs, de leur authentification et de leurs permissions. L'utilisation de cette bibliothèque nous a permis de gagner du temps dans la mise en œuvre des fonctionnalités d'authentification et de gestion des utilisateurs. Pour répondre au besoin de stockage de données volumineuses - provenant des géométries impliquées dans les simulations CFD qui peuvent peser des dizaines de Go - j'ai mis en place une instance MinIO. Comme MinIO utilise les normes Amazon Simple Storage Service (S3), j'ai pu facilement connecter l'instance au serveur web basé sur Girder. Une autre partie importante de l'environnement, qui a pris beaucoup de temps, consistait à automatiser certains processus de simulation CFD. Partant du fait qu'un serveur GitLab était hébergé en interne à l'entreprise, j'ai utilisé ses fonctions de pipelines (qui sont principalement conçues à des fins de CI/CD) pour automatiser entièrement une simulation. L'idée était d'utiliser l'ordonnanceur de pipeline de GitLab pour séparer les principales étapes de la simulation. Les scripts de calcul proprement dits ont été exécutés à l'aide de scripts Makefile, tandis que les communications avec le serveur web Girder ont été effectuées à l'aide de scripts Python. Afin d'exécuter les calculs efficacement, nous avons installé un GitLab Runner sur un appareil doté d'une grande puissance de calcul. La dernière pièce du puzzle a été la création d'une interface web conviviale à l'aide des composants web Girder, permettant aux utilisateurs de lancer facilement des calculs automatisés, de surveiller leur progression et de garder une trace de leurs résultats.

Python Girder Git GitLab GitLab CI Docker Docker compose MinIO MongoDB Vue JS JavaScript API VS Code

TakeNews

Application mobile Web pour garder le contact

TakeNews est un site web orienté mobile construit avec React, des composants MUI et Tailwind CSS. Le but de ce projet était de créer une application web qui permet aux utilisateurs de rester en contact avec leurs proches régulièrement. L'application est conçue spécifiquement pour les mobiles car l'objectif principal était d'explorer le potentiel d'une application web pour tirer parti de diverses fonctionnalités des appareils mobiles, de la même manière que les applications mobiles natives. Tout d'abord, l'application utilise la fonction de stockage local (local storage) des navigateurs, qui permet un stockage spécifique à l'utilisateur côté client. L'objectif étant de créer un site web autonome (i.e. standalone, c'est-à-dire sans back-end), ce type de stockage répondait à tous les besoins. J'ai également pensé à utiliser l'API IndexedDB, mais comme les données stockées étaient peu nombreuses, j'ai priviligié l'utilisation de localStorage. Ensuite, le but de l'application étant de permettre à l'utilisateur de garder des contacts avec ses amis et sa famille, elle est capable d'ouvrir l'application d'appel téléphonique. Cela se fait simplement en utilisant le schéma tel:. Dans le futur, j'espère pouvoir ouvrir d'autres applications externes, comme Facebook Messenger. Enfin, en utilisant l'API expérimentale Navigator.contacts, l'application est capable (sur Chrome uniquement) de parcourir la liste des contacts du téléphone et de permettre à l'utilisateur d'en choisir un pour l'importer dans l'application. Le développement de l'application est toujours en cours (bien qu'en pause), et j'aimerais activer les notifications, qui rappelleraient à l'utilisateur de contacter les personnes avec lesquelles il n'a pas parlé depuis un certain temps. Techniquement, TakeNews est hébergé sur les pages GitHub en tant qu'application web standalone. Elle est construite avec React JS en utilisant des composants MUI et Tailwind CSS. ESLint et Prettier sont utilisés localement et dans les workflow d'intégration continue pour imposer le format du code. Docker est également utilisé, pour offrir un conteneur portable, utilisable quel que soit le système d'exploitation.

TypeScript React JS MUI Tailwind CSS GitHub GitHub pages GitHub actions CI/CD Docker Prettier ES Lint VS Code

Mon portfolio

Site web statique mettant en avant mes expériences

Projet de construction de mon portfolio, en utilisant des technologies de haut niveau et en centrant le développement sur les données. L'idée était d'abord d'écrire mes expériences, mes projets, mon profil, ma formation, etc. et ensuite de construire un site web de portfolio autour de cela. Cela s'est terminé par un simple fichier yaml, un site web et des scripts python. Vous lisez probablement ceci sur le site web résultant de ce projet (https://antoine.mandin.dev). La première - et principale - partie de ce projet, ce sont les données proprement dites. J'ai condensé mes expériences, mes projets et mes compétences dans un seul fichier yaml. La deuxième partie du projet est le site web portfolio. Il est construit en utilisant Jekyll, et hébergé en tant que page GitHub. J'ai utilisé un thème préexistant (nommé Beautiful Jekyll) auquel j'ai ajouté des styles personnalisés inspirés d'autres thèmes Jekyll. En utilisant un plugin, j'ai réussi à créer presque entièrement le site web à partir du fichier de données yaml. J'ai également implémenté une barre de recherche en utilisant la bibliothèque MiniSearch. Enfin, j'ai introduit la traduction de mon site web, initialement en anglais, et ici en français! Au final, j'ai construit un site web statique, hébergé sur les pages GitHub, avec son propre style, son propre moteur de recherche et son propre nom de domaine. Enfin, la troisième partie du projet était un petit module python dédié à la gestion des données du portfolio. Cela inclus la vérification du format des données et leur traduction intéligente. J'ai construit un fichier de grammaire en yaml, représentant le contenu attendu des données (par exemple, un projet doit avoir un titre, qui est un texte, et peut avoir une date de fin au format jj-mm-aaaa). En effet, l'idée était d'avoir un site web cohérent, où les projets peuvent être liés à un emploi, et un emploi à une entreprise, etc. Ce module python a été accompagné de formateurs et de linteurs, et utilisé dans un workflow d'intégration continue, pour s'assurer que les données sont bien formatées tout au long de leur durée de vie.

Jekyll GitHub pages GitHub actions GitHub Git JavaScript CSS HTML Web UI Design Python CI/CD VS Code

Exploration de données et identification des zones conflictuelles

Stage dans un laboratoire de recherche en informatiques

Lors de mon stage au sein du laboratoire de recherche LIRIS, j'ai été chargé de trouver des méthodes de calcul pour analyser un jeu de données avant l'entrainement d'un algorithme de Machine Learning. J'ai fini par créer des modules python capables d'analyser et de mettre en évidence d'éventuelles données incorrectes ou des valeurs problématiques pour l'entrainement d'un algorithme de Machine Learning. Au tout début de mon stage, j'ai appris les théories sur les méthodes et technologies de Machine Learning, appliquées à Python. Je me suis familiarisé avec les concepts d'intéligence artificiels et de Machine Learning tels que l'apprentissage supervisé/non supervisé ou l'underfiting/overfiting. Suivant une thèse, l'idée du projet était de construire des scripts capables d'identifier des données incorrectes dans un grand ensemble de données. L'idée générale était la suivante : Visant un algorithme de classification, le jeu de données a plusieurs attributs d'entrée qui sont utilisés pour deviner un attribut cible. L'objectif était alors d'évaluer la possibilité de deviner l'attribut cible en partant de l'idée que, s'il existe plusieurs instances dans l'ensemble de données avec les mêmes attributs d'entrée mais une cible différente, alors tout algorithme (quelle que soit sa complexité) sera incapable de réussir à 100 %. Illustrons cela avec un jeu de données courant dans l'apprentissage automatique : l'ensemble de données Iris. Il est constitué de données sur les fleurs d'iris et contient 5 attributs : la largeur et la longueur des sépales, la largeur et la longueur des pétales et l'espèce. Un algorithme de classification doit alors deviner l'espèce en fonction de la largeur et de la longueur des sépales et des pétales. Appliquée à cet ensemble de données, l'idée du projet était de vérifier si deux fleurs ont la même longueur/largeur des sépales et des pétales tout en étant de deux espèces différentes. En considérant l'égalité parfaite comme la fonction de comparaison entre les attributs d'entrée, l'algorithme a une complexité de O(n.log(n)) (en utilisant une Map comme structure de données). Cependant, en considérant une tolérance dans la fonction de comparaison, l'algorithme naïf a une complexité de O(n²), ce qui n'est pas acceptable pour les grands ensembles de données. Mon objectif était donc de trouver des moyens d'effectuer cette recherche dans un temps de calcul acceptable. J'ai effectué une recherche bibliographique pour résoudre le problème de la comparaison de chaque élément de l'ensemble de données à tous les autres éléments dans un temps de calcul raisonnable. Ensuite, j'ai mis en œuvre une méthode appelée Blocking. L'idée sous-jacente est la suivante : Mapping - Tout d'abord, les valeurs sont mappées en blocs de valeurs similaires. L'objectif est d'éviter les comparaisons entre des valeurs manifestement différentes. Reducing - La deuxième étape consiste à comparer les valeurs, à l'aide d'un algorithme naïf, bloc par bloc. Cette étape peut être parallélisée, car chaque bloc est indépendant. J'ai ajouté une étape au processus, afin de m'assurer d'être exhaustif, en profitant du fait que nous connaissons la tolérance dans la fonction de comparaison. Cette étape consiste à dupliquer les valeurs aux bords des blocs au sein des blocs environnants, de sorte que chaque valeur soit comparée à toutes ses voisines, quelle que soit sa position absolue dans l'ensemble de données. L'algorithme qui en résulte renvoie des paires de valeurs contradictoires, c'est-à-dire des valeurs dont les attributs d'entrée sont similaires alors que les attributs cibles sont différents. Ces valeurs peuvent être introduites dans des visualisations de zones problématiques/conflictuelles, c'est-à-dire des zones du jeu de données qui contiennent un grand nombre de valeurs contradictoires. Ce type de visualisation peut être utile aux experts de la source de données pour expliquer pourquoi des valeurs contradictoires sont apparues à ces "endroits" ou pour remettre en question la manière dont les données ont été collectées. Enfin, les paires contradictoires peuvent faire l'objet d'un post-traitement afin de rechercher l'ensemble minimal de valeurs à supprimer de l'ensemble de données pour qu'il n'y ait plus de paires contradictoires. Cette recherche est similaire à la recherche d'une couverture minimale de sommets, en ayant comme sommets les valeurs et comme arêtes le fait d'être contradictoires. En effet, si une seule valeur est contradictoire avec 10 autres, on peut facilement conclure à la suppression de cette valeur, mais dans le cas de réseaux plus complexes, la décision est plus difficile à prendre. La recherche de la couverture minimale des sommets est prouvée comme étant NP-complet. Au final, les scripts python développés ont été capables d'identifier en 30 minutes les paires de valeurs contradictoires sur un jeu de données pour lequel l'algorithme naïf aurait pris environ 1 an de calcul. Ce projet m'a permis d'apprendre les concepts et les problèmes liés au Machine Learning, ainsi que d'approfondir mes compétences en algorithmies et en calcul parallèle.

python algorithm machine learning artificial intelligence parallel computing research sphinx

Skillect

Site portfolio full stack

Dans le cadre d'un projet personnel, j'ai cherché à créer un back-end basé sur une base de données relationnelle pour stocker et servir mes expériences et mes compétences. L'objectif était d'utiliser ce back-end dans un site web de portfolio, à la fois pour afficher mes compétences à n'importe qui et pour me permettre d'éditer les données. À partir d'une template complète utilisant FastAPI, PostgreSQL et Vue JS, j'ai développé un site web complet. Le back-end était basé sur FastAPI, qui offre une API REST à partir d'un serveur HTTP WSGI (pour lequel j'ai utilisé Gunicorn). Via la bibliothèque SQLAlchemy, j'ai conçu le modèle de données, à la fois pour l'authentification de l'utilisateur et les flux d'autorisation et pour représenter et stocker des compétences professionnelles. Les bonnes pratiques d'utilisation de linters/formateurs (black, pylint et isort ici), d'intégration continue (avec GitHub Actions) et de conteneurisation (avec Docker) ont été utilisées. Le front-end est basé sur React JS, MUI et Tailwind CSS (en opposition à Vue JS qui était utilisé dans le modèle original). Le front-end utilise Axios pour communiquer avec le back-end, notamment pour l'authentification. Là encore, les bonnes pratiques d'utilisation de linters/formateurs (Prettier et ESLint), d'intégration continue et de conteneurisation ont été appliquées. J'ai également mis en place un reverse proxy, basé sur Traefik, chargé de rediriger correctement les appels à l'API REST vers le back-end. Il utilise Let's Encrypt pour renouveler automatiquement un certificat SSL (nécessaire pour activer le protocole HTTPS). L'architecture est décrite en utilisant Docker Compose, qui inclut le back-end, le front-end, le reverse proxy, et d'autres services comme la base de données PostgreSQL. Le back-end a été hébergé sur Amazon Web Service (AWS), en utilisant une instance Elastic Compute Cloud (EC2). Un nom de domaine personnalisé (mandin.dev) a été dédié à ce site web. Enfin, des workflows de déploiement continu ont été mis en place pour déployer automatiquement les mises à jour du site web en production. Au cours de ce projet, qui a finalement été abandonné, j'ai appris à construire un site web complet, des fonctionnalités techniques (comme l'authentification) au déploiement (actions GitHub, AWS, nom de domaine, certificats SSL, etc.) J'ai également appris à mettre en place un reverse proxy et à travailler avec diverses bibliothèques et technologies telles que FastAPI, React et SQLAlchemy.

Docker Docker compose React JS MUI Tailwind CSS TypeScript FastAPI Python PostgreSQL Traefik CI/CD GitHub GitHub actions SQL Alchemy AWS Elastic Compute Cloud EC2 RabbitMQ SSL Certificate VS Code

sphinx-mermaid

Extension Sphinx pour permettre les graphs mermaid dans de la documentation

Dans le cadre d'un projet personnel, j'ai développé une bibliothèque python résultant en une extension Sphinx permettant d'activer les graphiques Mermaid dans la documentation générée. Cette bibliothèque permet de créer des graphiques interactifs et visuellement attrayants dans la documentation Sphinx, la rendant plus informative et conviviale. J'ai appris à créer une extension Sphinx et à déployer un paquet Python sur PyPI (Python Package Index). Personnellement, j'utilise beaucoup les graphs mermaid, faciles à utiliser et permettant de créer de beaux graphiques à partir de très peut de configuration. Par conséquent, je voulais une extension Sphinx avec une licence ouverte (ici MIT), qui permettrait l'utilisation de tels graphiques dans les documents générés. Ce projet est Open Source sur GitHub. Pendant le développement de cette extension, un ensemble de bonnes pratiques a été mis en place. Tout d'abord, des linters et des formateurs ont été utilisés (black, pylint et isort), pour imposer le format du code. Deuxièmement, une intégration continue, via les actions GitHub, a été mise en place. Elle était chargée de s'assurer que les règles de formatage étaient respectées. Enfin, un déploiement continu a également été mis en place sous la forme d'une action GitHub, poussant le paquet python vers PyPI lorsqu'une release GitHub était créée. Cette expérience m'a permis d'améliorer mes compétences en développement Python et en gestion de paquets, ainsi que ma compréhension du système de documentation Sphinx.

Python PyPI Sphinx Mermaid GitHub GitHub actions Git CI/CD VS Code

Amélioration de l'interface de la station au sol

Pour le controle de drones

Chez Kissfly, j'ai été chargé d'améliorer l'interface utilisateur de la station au sol. Le fonctionnement des drones était le suivant : une télécommande classique dirigeait le drone tandis qu'un micro-ordinateur embarqué était chargé de diffuser la vidéo en direct du drone en wifi, vers la station au sol. La station au sol pouvait donc être n'importe quel appareil disposant d'un navigateur internet (ordinateur, tablette, téléphone...). En effet, le micro-ordinateur à bord du drone faisait tourner un serveur basé sur Node JS, servant l'interface de la station au sol comme un site web et transmettant la vidéo en peer to peer, en utilisant la technologie WebRTC. Au cours de cette mission, j'ai apporté plusieurs améliorations à l'interface utilisateur de la station au sol. Tout d'abord, j'ai ajouté une représentation 3D de l'état du drone, qui affiche la position du drone par rapport à sa position de départ, calculée via un algorithme de SLAM (qui n'entrait pas dans le cadre de ma mission). Elle affiche également la trajectoire et les angles réels du drone (tangage, roulis et lacet). Cette représentation a été réalisée à l'aide de la bibliothèque Three.js. Deuxièmement, j'ai ajouté des boutons de contrôle à l'interface utilisateur, ce qui a amélioré la capacité de l'utilisateur à contrôler le drone et a rendu l'interface plus intuitive. Cette expérience m'a permis de travailler avec de nouvelles technologies et de comprendre comment améliorer l'expérience utilisateur. J'ai pu améliorer mes compétences en matière de développement frontend, de conception d'interface utilisateur et de résolution de problèmes.

Vue JS ThreeJS JavaScript GitHub Git CSS HTML UI Design

Prix carburants

Une carte et des statistiques sur les prix des carburants français

Au cours de ce projet personnel, j'ai construit à la fois des scripts python pour récupérer des données sur les prix des carburants en France à partir des données ouvertes du gouvernement et un site web statique hébergé sur GitHub pour afficher les prix. La première partie du projet consistait à construire des scripts Python pour récupérer des données sur les prix des carburants à partir des données ouvertes du gouvernement français et les transférer dans un fichier JSON. Les scripts Python sont accompagnés de linters et de formateurs, exécutés dans un pipeline d'intégration continue (via GitHub Actions). Les scripts sont utilisés dans un pipeline CRON dédié à la récupération régulière de nouvelles données sur les prix des carburants en France. La deuxième partie était le site web statique. Je l'ai construit en utilisant Jekyll et JavaScript. Il est hébergé sur des pages GitHub. Il affiche une carte de France, avec les emplacements des stations-service et leurs prix. Il affiche également le prix moyen du carburant par région en France. Les manipulations de cartes sont effectuées à l'aide de la bibliothèque Leaflet. Le code JavaScript est également associé à des linters et formatters qui sont utilisés lors de l'intégration continue pour faire imposer un format au code. Au final, ce projet a permis de montrer comment construire rapidement un site web statique affichant des statistiques à partir de données ouvertes.

Jekyll Leaflet GeoJSON Python JavaScript GitHub GitHub pages GitHub actions CI/CD VS Code

Optimisation de la vidéo en directe de drones

Chez Kissfly

Chez Kissfly, j'étais responsable d'améliorer le système de streaming vidéo en direct qui diffusait la vidéo prise par le drone à la station au sol. Le système était construit avec un serveur Node.js Express tournant sur le drone et une instance de Chromium headless tournant comme client du serveur (sur le drone également), offrant une connexion en peer-to-peer à la station au sol. Cela permettait de diffuser la vidéo en direct prise par le drone via WebRTC (RTC signifiant Real Time Communication). Ma mission était de tester plusieurs configurations dans différents environnements afin d'améliorer la distance de streaming maximale, ainsi que la latence et le nombre d'images par seconde de la vidéo. J'ai effectué de nombreux tests en ajustant les paramètres de WebRTC, ainsi qu'une grande quantité de recherches documentaires. Cela m'a beaucoup appris sur les systèmes en peer-to-peer et sur les dessous du streaming vidéo. Finalement, j'ai réussi à améliorer la distance de streaming maximale jusqu'à l'objectif que nous avions défini au préalable tout en réduisant la latence et en augmentant le nombre d'images par seconde. Cette mission a été un succès, mais j'ai également conclu que ces technologies n'étaient pas adaptées à ce cas d'utilisation spécifique et qu'elles avaient atteint leurs limites. Cette expérience m'a permis de travailler avec de nouvelles technologies et de comprendre leurs limites et capacités. J'ai pu améliorer mes compétences en matière de streaming vidéo en direct, de développement web et de résolution de problèmes.

WebRTC Video streaming JavaScript VS Code Frontend Node JS Tests

Randos map

Site web standalone aaffichant des randonnées en Loire-Atlantique

En tant que projet personnel, j'ai construit un site web statique affichant des trajets de randonnée en Loire-Atlantique. Le site web est construit en utilisant Jekyll et un peu de JavaScript. Il est hébergé sur GitHub en tant que site web monopage. Les données sur les randonnées proviennent des données ouvertes (open data) du gouvernement français, sous la forme d'un fichier JSON. En utilisant la bibliothèque Leaflet, j'ai affiché les randonnées, leur difficulté, leur description et quelques autres attributs tels que la longueur ou la durée estimée. Leaflet est également utilisé pour afficher la position actuelle de l'utilisateur. Enfin, l'utilisateur peut filtrer les randonnées en fonction de leur longueur, de leur durée estimée et de la présence de balises. En fin de compte, ce petit site web statique montre comment utiliser simplement les données ouvertes ainsi que des bibliothèques comme Leaflet pour créer un petit site web facilement.

GitHub GitHub pages Jekyll JavaScript Leaflet Open data

Pile ou Face

Application android

Heads or Tails est la toute première application Android que j'ai publiée sur le Google Play Store. Je n'avais pas d'ambition particulière pour cette application, mais elle a tout de même été installée par plus de 10 000 utilisateurs. Le concept est simple, faire des tirages au sort rapidement. L'application permet à l'utilisateur de créer des tirages au sort entre des choix prédéfinis ou de simples nombres. Ce projet était l'un de mes tout premiers projets d'application Android, et à mesure que j'apprenais à mieux coder et que l'application était encore utilisée par des centaines de personnes, j'ai décidé de refactoriser la base de code. Cela m'a appris l'importance de la documentation et de maintenir une base de code propre.

Android Java XML IntelliJ IDEA Android STudio

SMART VR

Dans le cadre d'un projet scolaire de deux semaines pour l'association ANTS (Advanced Neuro-rehabilitation Therapies & Sport), j'ai fait partie d'une équipe de 7 étudiants en ingénieurie chargés de créer des ateliers de réalité virtuelle pour rendre les exercices de mobilisation plus amusants pour les personnes à mobilité réduite. Le produit final était un jeu fonctionnant sur Oculus Quest, développé à l'aide de Unity. Le joueur s'envole dans une ville réelle et doit effectuer des exercices répétitifs pour passer à travers des portes et collecter des points dans le ciel. Ce projet m'a permis d'apprendre les concepts de la réalité virtuelle et la création de jeux à l'aide du moteur Unity.

C# Unity Virtual Reality GitHub

My data analyser

Application android analysant les données personnelles

En tant que projet personnel, j'ai développé une application Android qui permet aux utilisateurs d'analyser leurs données personnelles provenant de diverses applications telles que Spotify et Facebook Messenger. L'application demande aux utilisateurs de télécharger leurs données personnelles à partir de ces applications, puis les analyse pour afficher des statistiques telles que leurs artistes préférés et le temps passé à les écouter. En effet, cela repose sur le fait que les applications qui collectent des informations sur ses utilisateurs doivent leur offrir un moyen d'y accéder. Ensuite, j'ai trouvé intéressant de creuser dans cette énorme quantité de données personnelles que des entreprises telles que Facebook ou Spotify avaient sur moi. Mon application m'a ainsi montré, à propos de Facebook Messenger, les conversations avec le plus de messages échangés et qui envoyait le plus de messages. À propos de Spotify, l'application affiche l'artiste le plus écouté et l'évolution de la durée d'écoute au fil de l'année. En fait, je pouvais afficher presque tout, car j'avais la main sur les données. Bien que l'application n'ait jamais été publiée, le code source est disponible sur GitHub pour quiconque souhaite en savoir plus sur son développement et ses fonctionnalités. Ce projet m'a permis d'acquérir de l'expérience dans le traitement de données personnelles et dans l'analyse de données.

Kotlin Android Studio GitHub Data mining Data analysis Data visualization

text-checker

Bibliothèque python pour vérifier l'orthographe via reverso

Ce projet personnel est un outil en ligne de commande, construit avec python, permettant à l'utilisateur de vérifier l'orthographe de son texte en utilisant des outils en ligne tels que Reverso. À partir d'un texte, l'outil trouve les erreurs et suggère des corrections. Un pipeline d'intégration continue est mis en place, qui vérifie la structure du code en utilisant black, pylint et isort. L'outil utilise la bibliothèque requests pour interagir avec l'API de Reverso.

Python GitHub GitHub actions API requests Command line tool VS code

NuMemory

Jeu android

Jeu Android publié sur le Play Store qui met au défi la mémoire de l'utilisateur. L'utilisateur voit plusieurs carrés numérotés. Il/elle doit alors cliquer sur les carrés, en commençant par celui numéroté 1 et en suivant l'ordre croissant des nombres. Le jeu commence avec deux carrés et ajoute un carré lorsque le joueur réussit. Il se termine lorsque le joueur commet une erreur dans l'ordre des carrés.

Android Java XML IntelliJ IDEA

Arlanda trip

Ce projet visait à trouver le moyen le moins cher et le plus efficace de se rendre à l'aéroport de Stockholm depuis la ville, sans payer de frais pour le métro direct. En utilisant l'API fournie par la compagnie de transport de Stockholm, j'ai créé un ensemble de scripts Python pour recueillir des informations sur les options de transport. Le résultat était un ensemble de scripts qui pouvaient aider les voyageurs à économiser de l'argent et à trouver le meilleur itinéraire vers l'aéroport.

Python API VS code GitHub

Expériences professionnelles

Éducation