cv-online/pages/projects.md

32 KiB

# Contributions to Matrix

Matrix is a protocol for secure decentralized communication, that provides a fairly easy to use JSON/REST API for application developers.

Currently it's mainly used for chat using Riot, but the protocol is quite versatile and can be used in many different ways like blogging, communicating with home assistant, IOT control, virtual reality, ...

The community around Matrix is pretty strong, and many people have created alternative clients, and bridges for synchronizing other chat platforms (IRC, Slack, Mattermost, Telegram, Discord, ...) with Matrix. Progressively Matrix is becoming the one chat platform to rule them all.

Contributions

You can find my contributions here.

Projects around Matrix

# Fan controller

I came up with this because my gaming PC has a home-made watercooling system and its motherboard does not have any external sensor pins for the water temperature sensor.

So I had 3 choices for controlling the fan speeds:

  1. Always keep fans at like 70% so the water never gets too hot.
  2. Control fan speed using the SSD temperature sensor (the SSD does not heat up very much, and is placed next to a watercooling radiator, so we can deduce very approximately the water temperature with it)
  3. Find or build an external fan controller, which uses the water temperature sensor

Solution 1 is barely acceptable.

Solution 2 would require to build a custom program to get the temperatures and set fan speeds using the motherboard closed-source / nonexistent / even Linux can't / they're lame APIs.

So I designed a small board around an Arduino nano, that can take multiple temperature inputs from external sensors (Water and Air), and adjust fan speed accordingly using a simple temperature/speed curve. I also put a small OLED screen (SSD1306) to display all this information, a button to force high / low / auto fan speeds, and an alarm if the temperature reaches critical values (or the sensor is disconnected / short circuited).

Since then I can barely hear my PC, even during intensive tasks :)

Skills

  • PCB design
  • Some C++ programming on Arduino

More

# Hackathon with _Reporters Without Borders_

Ask me personally if you want to learn more about it (there are some parts I can't disclose here for privacy reasons).

# _Harden your code_ course

In 2017 I gave a 2-hour course in ISEN Brest with the Electronics Club, to introduce students to Quality Assurance and Test Driven Development, with a language agnostic approach.

Course topics:

  • Quality Assurance definition
  • Unit testing: Good practices, test driven development, unit tests as documentation
  • Coverage analysis: examples
  • Contract programming: in/out checks, invariants
  • Continuous Integration: auto testing, online coverage analysis, contribution process on some open source projects (i.e. PR merge checks)
  • Misc: stubs / mock-ups, exception versus assertion, compiler and language tooling, static / dynamic code analysis, fuzzing, code verbosity / factorization, code formatting, profile-guided optimizations

More

# Neverwinter Nights 2 related stuff

Library for parsing game engine files (nwn-lib-d)

  • Parsing and serialization of GFF files, a general purpose, treelike binary storage format.
    • Profiling and optimizations. There are currently two versions of the parser: one read/write that may be slow as it instantiates all data structures in memory, and the second one which is read only, very fast and memory efficient as it only crawls over the file without allocating memory. Some work is in progress to make the second read/write.
    • Keep the structure of the stored data as is (other existing parsers reorder elements). The checksum of the binary file should not be modified if the file is not changed between parsing and serialization.
  • Reverse engineered TRN.ASWM data, a structure containing compressed 3D mesh with pathing information (pathfinding pre-calculated data, foot step sounds etc.)
  • Other NWN2 simple data structures like TLK (translation tables), ERF (tar-like archive), and FoxproDB (used by NWN2 as a persistent key/value database)

Skills

  • D language
  • Reverse engineering binary files
  • 3D model generation for visualizing map information (shapes, face junctions, face properties, pathfinding data, ...)
  • Pathfinding and 3D mesh-cutting and merge algorithms
  • Profiling, optimizations
  • Heavy unit testing, coverage analysis

More

Account manager

It's a big project aiming to provide to players a web interface and an open API for managing their server account and browsing characters. It makes heavy use of my nwn-lib-d library to extract information distributed across ~300MB of various game files as fast as possible.

The backend is written in D, using the Vibe.d web framework and nwn-lib-d parsing library (the main reason being that D is a good prototyping language, and is fun to write :) ).

The frontend is written in Typescript using Angular2+, MaterializeCSS (JS, JQuery, SCSS)

  • Provides a way to access player's
    • Characters
      • Basic information
      • Quest status
      • Dungeon completion
      • ...
      • Public status to share characters infos with other players
      • Custom notes
    • Account settings
      • Authorized application (token-based)
      • Password change
  • Authentication portal, similar to OAuth (OAuth2 compatibility is a milestone)
  • Cache system & rate limiting to prevent from DOSing the service.
  • Localization using the NWN2 translation files (TLK).

Skills

  • D language, with Vibe.d web library
  • Frontend design, with Angular / MaterializeCSS
  • plus the skills detailed in nwn-lib-d

More

Server infrastructure

The previous server was hosted on a Windows XP machine, behind a home connection.

Since the OS was aging (understand utterly out of date), and most software do not run anymore on the platform (and the lack of decent remote control / automation), I decided to setup a brand new server running GNU/Linux, with a light windows virtual machine just to run the game server (the game server only runs only under Windows, and require DLL injection support for plugins, which puts Wine out of the game).

General

  • Dedicated server hosted on Kimsufi (OVH) servers (low budget / second hand servers)
  • Ubuntu 17.04 (LTS) host system (when created)
    • MariaDB used by nwn2server
    • LcdaApi and LcdaAccounts services
    • Automated nwn2server updates
    • Automated player data & server backup
    • Other web services like a Wiki, LcdaAccounts, LcdaApi, ...
  • KVM Virtualization
    • Running only the nwn2server process, on Windows Server 2012
    • VirtIO for fast network and disk access
    • SPICE remote control only accessible through a SSH tunnel
  • Automated setup using Ansible
  • Automated game server updates
    • Manually updating the game server files is very cumbersome and error-prone
    • Now all tasks are automated and updating the server is a "one click" process

Ansible

Since Kimsufi services do not provide disk redundancy nor KVM (Keyboard/Video/Mouse) access to the machine (they are the cheapest dedicated servers available), the setup is fully automated using Ansible scripts.

In case of a disk failure, the server can be reinstalled in a few hours (mostly spent on Windows guest setup & updating), and backed up data can be restored quickly.

More

Skills

  • Server administration
  • Ansible automation
  • Optimized virtualization, Nested KVM debugging
  • Windows server administration :( (We needed DLL injection support for the nwn2server, which isn't supported by either Wine or ReactOS)
# Rhum roll !

A funny one-day project.

I built a conveyor belt actioned by a small reduced DC motor, controlled by a raspberry PI (with a H bridge for power separation). Every 3 hours, the bottles rotate for about 3 π / 4, so my rum is gently blended and get a better taste faster :)

Skills

  • PCB design & some basic electronics
  • DIY: the conveyor belt is made of tire inner tube

More

  • Not much source code, since it's mostly electronics
  • If you insist, here is the bash script: echo 1 > /sys/class/gpio/gpio$PIN/value; sleep 10; echo 0 > /sys/class/gpio/gpio$PIN/value

D Language

The D language is a recent language much similar to C++ in term of features, but with a much cleaner syntax.

I like the D language because it makes possible to write nice and robust applications within a very short time.

Here are some small projects I have done using D:

Served

Served is a lightweight file-sharing web service (a bit like Google Drive) written using the web server library vibe.d.

It is designed to be quick and easy to deploy. Its default configuration serves the folder given by command line and uses UNIX users/passwords (via PAM Authentification) to upload/view files respecting file permissions.

By default, the file named index.md gets rendered atop of the file list.

More

NWN2 Log web access

The goal was to provide a common web interface to browse and search log entries written by the Neverwinter Nights 2 server La Colère d'Aurile. These entries are written in different files/databases, use different syntaxes and timestamps relative to different time zones.

The log viewer has been written to be as easy as possible to extend and maintain: If you want to add a log page, you just have to write a class. The menus, interface, search parameters, the instantiation are auto-generated at compile time.

More

NWN2 GUI viewer

Neverwinter Nights 2 lacks of third applications. This one renders NWN2 GUI without launching the whole game, and updates itself on file change.

It allows developers to write the XML GUI code with their favourite editor, while seeing the result in real time in another window, with extra debugging information that NWN2 doesn't provide.

Right now it has some quirks on text alignment and font handling, but the result is still close to the in-game rendering.

More

Phobos

Phobos is the standard library of the D language.

I have fixed a few bugs in the library, and I am looking to fix more of them in the near future :).

# Ludum Dare 32

Ludum Dare is an online community best known for “Ludum Dare”, the Accelerated Game Development Event of the same name (also called a “Game Jam”).

For the Ludum Dare 32 (April 2015), Thomas Abot and I developed a little game on the theme "An Unconventional Weapon", using the Unity 3D game engine.

Adventurers are coming to get your treasure, you are controlling your ultimate weapon to protect it : the Boss.

You are controlling the Boss and you need to end up with as much waves of enemies as possible. To help you, you can place walls to block enemies, traps (who can be activated by clicking on it) to damage enemies, and hire goblins to help you (but beware not hurting them!).
You can get gold by killing enemies (by attacking them or by activating traps while enemies are on it).

How long will you resist ?

Used skills

  • Unity 3D game engine
  • C#
  • 48 hours of intense game jam coding ♥

More

Tempest Autonomous sailboat

My 4th year project at ISEN Brest was the development of an autonomous sailboat, in order to participate in the Microtransat in few years.

Microtransat

The Microtransat Challenge is a transatlantic race of fully autonomous sailing boats, measuring less than 4 meters.

This race was created in 2006 and no one has ever succeeded, with 7 trials from university and engineering school teams.

The goal of ISEN Brest is to participate and win this race in 1 or 2 years.

Our work

We (Thomas Abot and I) were charged to work mainly on the software part: receiving processed sensor values to make some decisions, and send command values to the servo-motors. However we ended up working on the full stack from hardware choice, interfacing, data processing to the boat intelligence and networking.

The boats embeds a Beaglebone Black card (similar to the Raspberry Pi, but more hardware-oriented). We also designed the electronic add-on for the Beaglebone to connect the different sensors and actuators.

This project had many challenging (understand interesting) parts:

  • Design a socket interface so the hardware acquisition can be developed independently from the intelligence.
  • Provide a modular simulation web interface to test and debug the program as much as possible.
  • Wind optimization: the boat goes faster windward than downwind.
  • Tacking: The boat cannot go directly upwind, and the program needs to handle this correctly.
  • Fixing the kernel PWM drivers that had a bug preventing to generate more than 2 PWM.
  • Find solutions for:
    • Cable jamming around the servo-motors.
    • Van design, placement and electronics.

Used skills

  • Interface sensors and actuators with the program
  • Defining sail boat intelligence
  • D Language
  • Cross-compiling D code using GCC/GDC
  • Inter-process communication

More

Courses on Git

In 2013, I gave 3 courses of 2 hours on Git, a version control system (like Subversion, Mercurial, ...) at ISEN Brest, for voluntary students and teachers.

This course aims teaching the use of Git in collaborative projects, from the basis (add, commit, push, pull, ...) to more complex things (branch, merge, conflicts, stash, ...).

More:

# Arcade console

In 2014, I worked on an arcade gaming console with the Electronics Club of ISEN Brest, that is available to students in school.

I worked on the 3D Design, structure cutting/assembling, Archlinux configuration and development of the game selector.

Used skills

  • DIY
  • Solidity-constrained design
  • ArchLinux configuration
  • Development of the game selector in D

More

# Portfolio / Online CV

In 2013, I decided to put online a detailed personal presentation website in addition to my CV.

It allows me to detail precisely each project I've done since I began programming.

Used skills

  • Website design (inspired from GNOME Shell 3)
  • HTML5, CSS3/SCSS, Javascript, PHP
  • Update 2015:
    • Removed PHP (yay!)
    • Using EmberJS
    • Articles rewritten in Markdown
  • Update 2017:
    • Removed Ember ! (yay! npm dependent project are a nightmare to maintain)
    • Using Marked.js for in-page rendering (I should switch to server-side md rendering)
    • Just plain JS/CSS/HTML, should last much longer

More:

# 3D Printer

In 2013, I assembled a 3D printer kit, with the Electronics Club of ISEN Brest. This was a RepRapPro Mendel monocolour.

Presentation video (fr):

Used skills

  • DIY
  • Patience, rigor
# Quad-copter

In 2012, with the Electronics Club of ISEN Brest, started working on a radio-controlled quad-rotor drone.

This project implies everything from electronics and low-level programming to higher level software for the stabilization : we didn't want to build a kit, our goal was to build everything from scratch.

Used skills

  • DIY
  • Electronic card development
  • Brushless motors control
  • ARM development in C++ aimed for raspberry Pi and for STM32F4 (bare metal)
  • TCP/IP network communication
  • User interface with Qt 4.8
  • Presentation of the quad-copter at open days

More

# ConfigFile Parser

After having needed many times a C++ library to parse configuration files, I decided to write my own, using design advice from the The Little Manual of API Design

The goal was to define an easy to use and extensive library, and post it to GitHub as a "real" project (readme, licencing, ...).

Used skills

  • C++ library design

More

# 3D Engine

In 2012, after working on MatrixRun with Irrlicht, I decided to study and write a sample 3D engine using OpenGL

It only handles basic forms, like cubes and height maps (defined in text files), and chain renders the scene, respecting relative positions.

Used skills

  • Source code study of Irrlicht
  • OpenGL 2 API
  • C++ Dev.
# Burger Quizz

In 2012, I realized a web-site with another student, in order to play BurgerQuizz, a game from a French TV Show.

This project was realized after the courses on Apache/PHP/SQL in the second year at ISEN Brest.

Used skills

  • Development of a website (HTML5/CSS3, Javascript, PHP, MySQL)
  • Development of a user interface to edit the database in Java
  • 30-day project with a deadline
  • Version control with SVN

More

# MatrixRun

In 2011, I worked on a 3D video game project, controlled by wiimotes, and detecting the player position with IR diodes.


It has been inspired by WiiDesktopVR from Johnny Chung Lee. The goal of this project was to discover the possibilities offered by the wiimotes and this 3D simulation and to make a game with it.

Johnny Chung Lee project:

[![View on youtube](/img/lowres/matrixrun-wiidesktopvr.jpg)](https://www.youtube.com/watch?v=Jd3-eiid-Uw)

The game goal is to progress with a ship in a tunnel, avoiding obstacles and killing enemies

The ship movements are controlled by the head of the layer, and the guns by two wiimotes held by the player.

In-game video : Random tunnel generation, player movements and fire

Used skills

  • Rigor in code writing, object-oriented model design
  • 3D engine use : Irrlicht
  • Common interface driven input/output
  • Random tunnel generation, by defining each polygon
  • Particle system (for visual effects like explosion and smoke) : Spark Particle Engine
  • Game presentation in ISEN open days, and in some local events

More

# NavalWars

In 2011, I realized a console battleship game with another student, written in C.

This project was my first software project as part of a team, and started my passion of computer sciences.

Used skills

  • Writing a program in a team
  • 5-day project with a deadline
  • AI design and implementation

More

# La Colère d'Aurile

Since 2009, I am in the development team of La Colère d'Aurile, a French persistent role-play/action server on Neverwinter Nights 2 based on the pen&paper role playing game Dungeon & Dragons.

Neverwinter Nights 2

Neverwinter Nights 2 is a role playing game based on the universe and rules of Dungeon and Dragons 3.5, developed by Obsidian in 2006, following the first of the name.

This game offers - in addition to a solo campaign - an online multiplayer mode, with a nice editor that allows to create custom content and host in on a personal server.

The editor is quite powerful, and allows to create 3D maps, dialogs, compiled scripts (in a C-like language), ... and the environment around it is free enough to add custom 3D models, ingame UI or change the core rules of the game (races addition, class addition, spell modification, ..).

Some developers have even found a way to execute C# program on the server-side through pipes with the server process, allowing for example to do SQL requests.

La Colère d'Aurile

La Colère d'Aurile is a public persistent server, launched in Avril 26 2008.

Since 2012, I am the administrator charged of development and integration.

Used skills

  • Team development of the server
  • Handling a non-professional development team (objective attribution, priorities, ...)
  • Creation of maps, scenarios, dialogs, quests, monster balancing, ...
  • Development tools setup : Git, Continuous integration by hook scripts
  • Design and management of a MySQL Database

More