layout | title | date | order | permalink |
---|---|---|---|---|
page |
CV |
2016-11-25 21:25:00 +0100 |
3 |
cv/ |
- Ingénieur en Informatique et Mathématiques Appliquées (ENSEEIHT, 2008)
- Diplôme Universitaire de Technologie Informatique (IUT du Havre, 2005)
Je participe principalement au développement du lecteur multimédia VLC ([contrib]({{ site.baseurl }}/contrib/#vlc)).
En particulier, j'ai implémenté la nouvelle playlist (voir [article]({% post_url 2019-05-21-a-new-core-playlist-for-vlc-4 %})).
C, C++.
Je participe au développement de rav1e, l'encodeur AV1 de Mozilla/Xiph ([contrib]({{ site.baseurl }}/contrib/#rav1e)).
En particulier, j'ai ajouté le support de tile encoding (voir [article]({% post_url 2019-04-25-implementing-tile-encoding-in-rav1e %})).
Rust.
J'ai développé une application qui permet de voir et de contrôler des devices Android à partir du PC.
Nous l'avons publié en open source : scrcpy ([contrib]({{ site.baseurl }}/contrib/#scrcpy)).
C, libav/FFmpeg, SDL, Java, Android.
J'ai développé un outil qui permet aux devices Android d'utiliser la connexion du PC sur lequel ils sont branchés (reverse tethering), sans accès root.
D'abord écrit en Java, je l'ai réimplémenté en Rust pour obtenir un binaire natif.
Nous l'avons publié en open source : gnirehtet ([contrib]({{ site.baseurl }}/contrib/#gnirehtet)).
À cette occasion, j'ai contribué à la library d'I/O asynchrone que j'ai utilisée : [mio]({{ site.baseurl }}/contrib/#rustmio).
Java, Android, Rust.
J'ai développé un outil permettant de contrôler un périphérique Android en utilisant une souris ou un clavier USB branché sur le PC. Il permet notamment d'enregistrer une séquence pouvant être rejouée sur plusieurs périphériques simultanément.
À cette occasion, j'ai corrigé un [bug sur libusb]({{ site.baseurl }}/contrib/#libusb).
J'en ai profité pour faire une présentation en interne sur la gestion des ressources sans pointeurs en C++, dont j'ai repris le contenu pour écrire un [article]({% post_url 2017-01-12-cpp-sans-pointeurs %}). J'y présente notamment l'API du [wrapper C++ de libusb]({% post_url 2017-01-12-cpp-sans-pointeurs %}#libusb-wrappers) que j'ai implémentée.
C, C++, libusb, Qt.
Pendant plus de 2 ans, j'ai travaillé sur Genydeploy, d'abord pour sa refonte complète (la version 3), puis pour le développement de nouvelles fonctionnalités (les projets présentés ci-dessus ont en fait été réalisés dans le cadre de Genydeploy).
C++11, Qt5, Java, Android.
En mission chez Softbank Robotics (anciennement Aldebaran), j'ai conçu l'API Android du robot Pepper.
Pour cela, j'ai d'abord implémenté des bindings Java/JNI pour exposer les
promise
/future
C++ de leur library libqi en Java. Cette partie est open
source : libqi-java.
J'ai ensuite développé une API Android de plus haut niveau qui expose plus simplement les fonctionnalités du robot (chaînage automatique d'appels asynchrones…).
C++, Java, JNI, Android, NDK, AOSP.
J'ai travaillé au développement d'un système vidéo pour set-top box Android, destiné à être installé dans toutes les chambres d'une chaîne d'hôtels.
J'ai intégré LibVLC dans une application Android pour lire des flux vidéos UDP multicast.
J'ai traqué et [contourné]({{ site.baseurl }}/contrib/#vlc) un deadlock pouvant survenir lors de l'arrêt du flux UDP sur VLC.
J'ai également intégré un outil permettant la lecture de flux vidéos UDP multicast avec le lecteur natif d'Android (voir [article]({% post_url 2014-03-18-compiler-un-executable-pour-android %})).
C, Java, Android, NDK, AOSP, CyanogenMod, LibVLC.
Pour notre babyfoot au travail, mes collègues ont développé une application Android qui comptait les points automatiquement (grâce des capteurs branchés sur un Raspberry Pi).
Je me suis occupé du système vidéo.
J'ai développé un outil permettant de décaler le flux vidéo live quelques secondes, afin de revoir les buts facilement (voir [article]({% post_url 2014-01-20-lecture-differee-de-la-webcam-dun-raspberry-pi %})).
Pour Android, j'ai développé un lecteur vidéo qui supportait à la fois le
lecteur natif et LibVLC, et à la fois sur SurfaceView
et TextureView
(pour
des raisons de compatibilité avec différentes tablettes).
C, Java, Android, Bash.
J'ai intégré la gestion du ChromeCast dans l'application Android CanalPlay.
À cette occasion, j'ai [corrigé]({{ site.baseurl }}/contrib/#googlecast) une petite fuite mémoire sur la library de Google pour communiquer avec un ChromeCast.
Java, Android.
J'ai aussi participé à d'autres missions chez des clients :
- intégration du timeshifting vidéo dans AOSP pour ExpWay ;
- analyse et modifications d'architecture du SDK de FollowAnalytics pour corriger des bugs récurrents ou aléatoires ;
- modifications sur les applications Android et Android TV de MolotovTV.
Java, Android, C++.
En utilisant le projet Serval, j'ai développé une application Android permettant la communication entre téléphones Android (rootés) sans réseau mobile ni Wifi, avec les fonctionnalités suivantes :
- communication audio (talkie-walkie) à plusieurs ;
- messagerie textuelle ;
- géolocalisation sur des cartes IGN téléchargées intégrées avec osmdroid (OpenStreetMap) ;
- partage décentralisé de fichiers.
Ce projet a été l'occasion de [contribuer]({{ site.baseurl }}/contrib/#servalbatphone) à Serval.
Par ailleurs, pour implémenter le talkie-walkie à plusieurs utilisateurs, j'ai développé une solution simple de mixage audio, dont j'explique les principes dans cet [article][mix].
[mix]: {% post_url 2013-01-29-le-mixage-audio %}
Java, C, Android, NDK.
Lors de mes premiers pas sur Android, j'ai développé des applications e-mail et Twitter pour la tablette intégrée au tableau de bord de la voiture Renault Zoé.
Java, Android.
J'ai principalement réalisé une mission de 3 ans chez Sanofi-Aventis, pour développer une application Java/Flex de recherche de molécules.
Java EE, Adobe Flex, ActionScript.
En dehors des langages principaux listés dans mes expériences profesionnelles, j'en utilise quelques autres.
Je développe en Python de manière très occasionnelle. J'ai par exemple écrit [SHAdow]({% post_url 2017-03-01-shadow %}) pour générer des fichiers différents ayant le même SHA-1, ou encore un [solveur de serpent-cube][snakesolver].
[snakesolver]: {% post_url 2011-09-27-resoudre-le-cube-serpent-en-python %}
Bash est mon shell par défaut. Il m'arrive d'écrire des scripts, par exemple un [prompt pour git]({% post_url 2012-04-04-prompt-bash-pour-git %}) ou un outil de [reverse sshfs]({% post_url 2014-06-15-sshfs-inverse-rsshfs %}).
Je m'intéresse également au développement kernel : je participe au challenge eudyptula sur mon temps libre (mais avec 2 enfants, le temps libre n'existe pas). Pour l'instant, j'ai validé les 8 premiers exercices sur 20.
Vous trouverez sans doute d'autres choses dont je n'ai pas parlé ici dans mes [articles] ou mes [contributions open source][contrib].
[articles]: {{ site.baseurl }}/articles/ [contrib]: {{ site.baseurl }}/contrib/
J'aime beaucoup les problèmes de multithreading et synchronisation (mutexes, atomics, barrières mémoire, réordonnancement des instructions par le compilateur ou le CPU…) et les conséquences des [undefined behaviors][ub].
[ub]: {% post_url 2014-10-22-comportement-indefini-et-optimisation %}
J'aime bien les casse-têtes de programmation ([1][metahanoi] [2][reveng] [3][quines] [4][snakesolver]…).
[metahanoi]: {% post_url 2015-03-27-executer-un-algorithme-lors-de-la-compilation-templates-c %} [reveng]: {% post_url 2015-07-21-challenge-reverse-engineering %} [quines]: {% post_url 2011-11-14-programmes-auto-reproducteurs-quines %}
Les problèmes faisant intervenir des mathématiques sont les plus intéressants (par exemple, j'ai beaucoup aimé trouver une solution pour [mixer][mix] plusieurs sources audio en une seule).
J'aime moins développer des interfaces utilisateur et je suis nul en design graphique.
Mes ordinateurs sont sous Debian. Je travaille sous Linux (m'imposer un poste de travail principal sous Windows ou Mac est rédhibitoire).
- Thinking in Java
- The C Programming Language
- C++ Primer
- Effective Modern C++
- The Rust Programming Language
- The Rustonomicon
- The Art of Multiprocessor Programming (la partie Principles, soit les 6 premiers chapitres)
- Clean Code
- Digital Signal Processing
- Pro Git
- Linux Device Drivers
- Linux Kernel Development
- The Linux Programming Interface
- OpenGL ES 3.0 Programming Guide