On Google Mentoring

A few years ago, I had the opportunity to attend a few sessions of Google Mentoring. I took notes of our meetings that I unearthed recently.

Playing Good Old Games on Apple Silicon

My daughter suddenly wanted to play Fallout 2 (do not ask me why). I bought the game a long time ago on GOG, so I downloaded the game that was supposed to run with Wine… and it did not start on my MacBook Air M1.

Recorder workshop in Pully

I had the opportunity to attend the Week-end musical de Pully in Switzerland with a friend to watch several concerts. I was also able to attend a recorder workshop led by recorder player Lucie Horsch. I took some notes on how to improve my recorder technique.

One year on the recorder

I started learning the recorder (and music!) just about one year ago. When I started, I did not expect to still be at it now.

Upgrading Jetty and Spring

After upgrading to Java 17, the third-party dependencies that only run on Java 17 could finally be upgraded: Jetty and Spring. The upgrade was much more complex than upgrading the Java version.

From Java 11 to Java 17+

After moving from Java 8 to Java 11, it was now time this year to move to Java 17 and 21. The transition was much easier than last year.

Migrating hosting provider

My blog and other content was hosted on Online.net. Instead of relying too much on Google, I also had all my emails synced to a secondary mail provider as a backup. I recently changed hosting providers due to a pricing change and a significant increase that no longer matched my needs.

Reducing unit tests time

The piece of software at work is comprised of different tech stacks that compose different applications. Each part has its own unit tests. As we have thousands of tests, they were taking a long time to run. It was time to optimize them to improve the feedback loop.

Keeping up to date with third party dependencies

At work, the software we develop and ship comes with a lot of third party dependencies, so we must keep track of their licenses. The process was very manual and was improved by automating it so that it could also scale with the company’s growth.

Reducing string concatenations from ngTemplates

A new Chrome update suddenly broke our application. It improved string parsing, but at the same time significantly increased memory usage due to excessive string concatenations in a single expression. This pattern was heavily used by grunt-angular-templates in our codebase at work.

Detecting Conflicting Dependencies with Gradle

At work, we use a complex Gradle build shared across multiple projects. This complexity also introduces some redundancies in how dependencies are computed between different projects. We recently reworked our dependency system to remove those redundancies.

Groovy and Java Strings

I am completely new to Groovy, and while using it a bit for our CI (Jenkins), I stumbled upon the non-intuitive difference between a Groovy and a Java String.

Git ghost commits

A commit was reverted at work. The commit was present in the repository history, but there was no trace of it in the GitHub file history log.

Learning the recorder

I decided on a whim to learn music. Having zero knowledge and having forgotten everything from school, I had to start from scratch. I wanted an instrument that seemed easy, inexpensive, and small. If I gave up after two days, it would not matter. I set my eyes on the recorder.

From Java 8 to Java 11+

For compatibility reasons, the product shipped at work is still compiled with Java 8, but can be run with both Java 8 and Java 11. It was now time to move to a new Java version: compile with Java 11 and support running with Java 11 and Java 17.

From JUnit 4 to JUnit 5

Our unit test suite at work was started almost 10 years ago, and is comprised of thousands of tests. A few months ago, there was an initiative to migrate from JUnit 4 to JUnit 5.

From Ant to Gradle

The build system at work was comprised of an ant build for Java with various node and npm scripts, as well as lots of bash to bundle our software. It did the job, but showed its age due to lack of parallelization and good system dependency. It was time to migrate to something more robust and modern.

From R to Python

A few years ago, I was asked to help on a R codebase. However the performance was really slow and the program really hard to maintain. I decided to rewrite it in Python.

Teenager books

For a 14 years old teenager, it is sometimes hard to find books that suit her own taste. Fortunately, a great colleague gave me a great list (in french) that is published here as a reminder.

Backpack craziness

My old backpack was starting to wear off in different places, so I thought it was time to get a new one.

Fixing a faulty git merge

I came upon a situation where a target release branch was unintentionally merged into a base release branch, and several commits were added afterwards. I describe how it was fixed and the git history rewritten cleanly without the faulty commit.

Adding a source dependency to a Gradle build

Gradle allows adding source dependencies to a build since 4.10. Even though the process is quite simple, I stumbled upon a small problem when using them.

Adding an environment variable to a Gradle build

I had to add an environment variable to a Gradle build at work, but the Gradle task I used does not support setting environment variables.
TLDR: add it to the gradlew script.

Visiting the Loire Valley without a car

We decided to visit the Loire Valley, but as a 100% Parisian family, we do not have a car and no driving license, and we are also not very comfortable with bikes. I describe here the schedule we had for the small trip across the Loire Valley, as organizing everything was a bit of a challenge.

Goodbye to my cat

Thoughts on my cat who just left us after almost 18 years.

On Pull Request merge strategies

I sometimes run into discussions with colleagues on how to merge a Pull Request (PR). Here is my take on it and why I usually favor squash merges.

Killing child processes when the parent fail

At work, we often need to run computation-heavy workloads which involve using multiple processes to distribute computations on different cores of a single machine (and also a cluster). When the parent process sometimes dies, its children remain alive and running. We want to ensure they also exit as fast as possible to prevent using too many resources.

Comments in a Dockerfile

This is a note to my future self after spending way too much time finding why my Dockerfile did not work: Dockerfile comments start at the beginning of a line.

Python 3.6 and Matplotlib 2 on macOS Big Sur

After upgrading to macOS Big Sur (11.2), I had to use Python 3.6 and Matplotlib 2.2.5. It turned out to take more time than anticipated. I use Pyenv to manage multiple Python versions and Homebrew as a general package manager.

Python, unicode and exceptions

Code compatibility between Python 2 and Python 3 is tedious. I have recently stumbled upon some unexpected behavior when using unicode (Python 2) and str (Python 3) for string formatting and exceptions.

Handling different Git configurations

Having different Git repositories with different identities, I used to configure Git for every repository I checked out. I recently stumbled upon the Git includeIf which allows loading an overriding configuration file depending on the repository location.

Accessing a Git repository behind an http gateway

A project I worked on had a Git repository behind a Citrix NetscalerGateway and only accessible over http. It was at first impossible to clone the repository, but Git has an option to bypass that.

Adding a local jar to Maven

A supplier has given a couple of jars to add to our Java project which uses Spring Boot and Maven. Those files are not published in any Maven repository and we do not have one at work yet. There are several different ways to add them.

Eyewear craziness

I recently got a prescription for full time glasses and chose rimless glasses. After a few months of wearing them, I got tired of the “mostly” invisible look, so I started looking for something that would best fit my tastes.

Using Gitlab Nginx as SSL Reverse Proxy

Gitlab bundles nginx as a web server. It can also be used as a reverse proxy to host other services while listening on the same port and make use of other SSL certificates.

Upgrading Apache 2.2 to Apache 2.4 on Debian or Ubuntu

After answering several times the question “Why do I get a 404 error on all my services after upgrading Apache?” at work, I decided to write about it.

Changing MTU size to connect to a service behind a VPN

Recently at work, we had a problem when connecting to a service behind a VPN, itself being behind a firewall. Packets would get truncated between the service and the computer we used. It turned out to be an MTU problem not set to the correct size.

How to recycle?

I am launching https://recycleme.yuen.fr (in French) to try recycling packages based on product bar codes. However, the database is small!

Getting outside of China

I have been to China many times, but I have never felt the Great Firewall presence as much as now. I describe below my experience with accessing external services from China.

Cython cheatsheet

Cython is a great tool to improve speed on computation-heavy parts of a Python program, but the documentation is somewhat not very clear on where to start.
The following sums up different steps to more easily dive into Cython.

Very old news

Very first web update… at last.
Right now, only the About section is available, with various information along with résumés.

Much more to come later?