Blog
Highlights
-
Support networks
I wanted to create a community, yet I was oblivious to the oldest support network in the world.
-
The duty to document
If you learn something the hard way, it's you duty to share your lessons with others.
-
Read it as you please
I choose what to write, you choose how you read it.
-
Digital mise en place
Bringing a bit of kitchen wisdom to the digital world.
-
A map for every journey
It's damn nice to know where you are, and where you're going.
-
Digital gardening
A website is a lot like a garden.
-
A matter of maintenance
Long-distance motorcycle travel is a matter of maintenance.
-
Making quieter technology
I spent the last years making technology calm and pleasant to use. This is roughly how I did it.
-
Please ask again
Or how to ask for help on the internet
-
Trading time for money
Paying someone else to do your work isn't such a great deal, and you should probably learn to do it yourself.
-
No script is too simple
I write very short scripts, sometimes for single-line commands. Here's why you should do it too.
-
Berlin now and then
Over the course of a few months, I have mapped and recreated several historical photographs of Berlin.
-
The Liberation of Paris
From D-Day to the liberation of Paris in pictures
-
The Berlin airlift
The grand story of the Berlin airlift in pictures. It's one of my favourite stories, and I couldn't help but share it with you.
Everything else
-
What's new for Berliners in 2025
A brief summary of changes that affect most immigrants in Berlin.
-
A reading list for Japan
Articles and essays that enriched my trip to Japan.
-
Bringing the Bürgeramt appointment finder back online
My tool went offline for a few months. A post-mortem of what happened.
-
Cool URLs don't change
A short rant about websites that move things around and break URLs.
-
Vodafone Germany is throttling upload speed
It's not just you. You don't get the upload speed that you pay for.
-
Cycling across Malaysia
Notes about my bicycle trip from Singapore to Penang for future travellers.
-
Crossing Singaport/Malaysia border on a bicycle
Notes about the Johor Bahru border crossing for future travellers.
-
Fixing TimeoutErrors with Playwright on MacOS
Are you getting random TimeoutErrors with Playwright? It's probably because you switched desktops.
-
What's new for Berliners in 2024
A brief summary of changes that affect most immigrants in Berlin.
-
Slowing down
An ongoing list of things I'm doing to work less.
-
Why ::-webkit-progress-value has no effect
Can't change your progress bar colours in Chrome and Safari? It's probably because of this Chromium bug
-
Assorted travel advice
Lessons learned on the road.
-
Where to buy a bicycle in Seoul
I've been trying to find a used bike for the last few days. Here is what I have learned.
-
File names, unicode normalization problems, and how to fix them
There are multiple ways to represent the same unicode character. This can cause problems. Here's how I fixed it.
-
Nginx redirects with unicode characters
This is how you configure nginx redirects for URLs with accented characters.
-
Rules for calm technology
Calm technology can't just be quiet. It has to be trustworthy.
-
Automated cache clearing on All About Berlin
How I automatically purge pages from the cache when they are saved.
-
How I built currency conversion tooltips
This is how I made euro amounts a little easier to understand on All About Berlin.
-
How to tighten the steering head bearing on a V-Strom
How to fix wobbly forks in 30 minutes. Some special tools needed.
-
How to apply for an Indian Tourist Visa in Kathmandu
This is how you get an Indian Tourist Visa in Nepal.
-
Machine talk
I don't feel so good about AI
-
Renault Kangoo KC torque settings
These are some of the common torque settings on a Renault Kangoo I (up to 2007)
-
How to clear the nginx static cache
This is how you clear the nginx fastcgi cache or proxy cache without restarting nginx.
-
How to write clearly
This is an article about technical writing. It lists the tricks I use to write clear instructions for a wide audience. This is how I write guides for All About Berlin.
-
How to replace the camera lens on a Pixel 5
If you cracked the glass on your Pixel 5's camera, here's how to change it.
-
Halving All About Berlin's load time
A tiny change made the JavaScript code on All About Berlin load twice as fast.
-
10:10 is the best time to look for a Bürgeramt appointment
Does checking for appointments early in the morning really help? I tested it.
-
Road review: DJ703I, Romania
An overview of the DJ703I road in Romania, between Corbi and the Vidraru dam on the the Transfăgărășan.
-
How to extract subtitles with ffmpeg
This is how you extract .srt and .vtt subtitles from a video with ffmpeg.
-
How to replace the air filter on a Renault Kangoo I
Here's how you change the air filter on a first generation Renault Kangoo.
-
How to change the spark plugs on a Renault Kangoo 1
This is how you change the spark plugs on a 1st generation, 1.6L 16v Renault Kangoo.
-
Where to find Renault service manuals
The repair manuals for your Renault vehicle aren't so hard to find, if you know where to look.
-
Renault Kangoo dimensions (first gen)
The full dimensions of the Renault Kangoo I, straight from the owner's manual
-
Fix a Kangoo door that won't open from the inside.
This is how you fix a door that only opens from the outside on a first generation Renault Kangoo.
-
How to enable root login on Ubuntu
This lets you SSH into your Ubuntu server as root.
-
ssh-copy-id does not work with rsync.net or Hetzner
If you tried to use ssh-copy-id with your rsync.net or Hetzner account, it probably didn't work. You're not alone.
-
Every issue I've had with my Airpods, and how to fix them
I bought a pair of Airpods in 2020. I had a few problems with them. Here's how I solved most of them.
-
How to fix an accidental Nextcloud docker image update
Here's what to do if you get "Updates between multiple major versions and downgrades are unsupported" after updating the docker image.
-
Weird things you'll find when reading EXIF data
I wrote code that extracts EXIF data from photographs. Here are some of the weird things you can expect.
-
How to replace the rear brake pads on a V-Strom 650
Here's how you change the rear brakes on a V-Strom 650. Those instructions apply to the 2004-2016 model, and the 2017+ model.
-
How to install heated grips on a 2017 V-Strom 650
A step by step tutorial with lots of photos.
-
Running multiple docker-compose projects on the same ports
How to serve separate docker-compose projects on the same port without merging them together.
-
How to fix a quiet phone speaker on a Samsung S9
What to do if the phone speaker is not loud enough during calls, even at maximum volume.
-
N26 bug: can't confirm transactions
Sometimes the N26 app won't let you confirm a transaction. Here's what to do.
-
How to fix a beeping/buzzing hard drive
If you hard drive beeps or buzz, you might be able to fix it yourself. Here's how.
-
V-Strom won't start? Try this.
A few things to look at if your DL650 won't start.
-
Markdown Notes is going offline
After 7 years, Markdown Notes will disappear from the internet. Here's why, and what to do if you are affected.
-
Why Docker for Mac is making your website slow
My website was painfully slow in Docker on my OS X machine, but really fast in production. I found why.
-
Python 3 urllib examples
How to do basic things with urllib in Python 3.
-
Why I disabled comments on my websites
In early 2020, I disabled comments on every website I run. Here is how and why I did it.
-
How to open a file in Preview or Finder from the Terminal
A simple, easy way to launch file with the default application from your Mac's Terminal.
-
Using a MasterCard in Central Asia
To my surprise, MasterCard isn't accepted everywhere in Central Asia. Here's why you might want to carry a Visa card with you.
-
Driving in Azerbaijan
The ins and outs of driving in Azerbaijan: the paperwork you need, the road conditions, how to find fuel and more.
-
Driving in Armenia
An overview of driving in Armenia: road conditions, requirements, fuel quality and scenic routes.
-
Driving in Georgia (the country)
A summary of the road conditions and driving hazards for Georgia. If you are planning a road trip or a motorcycle trip in Georgia, this is a good starting point.
-
How to fix "The Plugin Store is not available" in Craft
The surprisingly simple solution to this issue, and other cURL SSL errors. You only need to run a single command.
-
My motorcycle packing list for very long trips
When I go on longer motorcycle trips, this is what I pack with me. It has served me well through a variety of situations.
-
How to fix HP scanning errors in MacOS
What to do when your HP scanner won't connect to your Mac.
-
Why Chrome 72 broke your Chromecast app
Chrome 72 made some changes to the Chromecast API. Here's why your Chromecast app suddenly stopped working.
-
Google Drive trash won't empty? Here's the fix
What to do when the "Empty trash" button on Google Drive refuses to work.
-
How to clear Terminal output on Mac
A quick and easy way to clean your Terminal window and start afresh.
-
How to change the default Google Assistant timer and clock
This is how you force "Ok Google" to use the correct timer and clock apps. It's not obvious, but it takes just a minute.
-
How to flatten a directory on Linux and MacOS
How to move all the files in subdirectories to the root directory with a single terminal command.
-
An Abmahnung for using a Creative Commons image
In 2018, I had to pay hundreds of euros because I did not credit a Creative Commons image properly. Here's what happened.
-
Ubuntu: apt-get -f fails, "no space left on device", apt-get autoremove doesn't work.
How to fix this pesky error when running apt-get install or some other command.
-
How to fix "READ ERROR" on Fujifilm cameras
This tricky bug with Olympus X-series cameras is actually caused by Mac OS. Here's how you can fix it.
-
How to fix ImportMismatchError in Python
If you get this error, it's probably a very easy fix. Here's how to fix this error with a single terminal command.
-
How to prevent Chrome from changing text color when printing
When you print a page with Google Chrome, the text colour changes to make it easier to read. Here's how you can prevent this in CSS.
-
Office 2011 activation server unavailable? Here's the fix
The solution was to look for updates to Office 2011. That's it. Saved you a click.
-
Fixing the "protocol error: bad pack header" error in git
In my case, it was because I pulled a corrupted remote Gerrit repository, and tried to push the corrupted data back to the fixed remote.
-
Automatically tagging people for code review in Gerrit
There is a way to tag people by default for all your commits in gerrit.
-
Playing with data: linking soldiers and war graves
Over the past week, I have written about the Canadian Expeditionary Force and the Commonwealth War Graves Commission data sets. After loading both data sets in a common database, it is finally time to bring them together.
-
Cracking open the Canadian Great War Project database
Extracting several hundred megabytes of data from the Canadian Great War Project website.
-
Parsing 65 000 war grave records with Python
This week, we take a look at the 65 000 records of the Commonwealth War Graves Commission's data set.
-
Parsing 575k military records with Python
The Canadian government made the records of the 660 000 Canadians who served in the First World War available as an open dataset. I decided to take a look at it.
-
Fixing Jasmine "encountered a declaration exception"
If you ever come upon a Jasmine unit test that ends with "encountered a declaration exception", it's likely because you have committed a simple, subtle mistake.
-
LocalStorage gotchas in Internet Explorer and Safari
A few localStorage issues with IE and Safari, and the workarounds for each of them.
-
How to create static class constants in ES6
ES6 brings classes to JavaScript, but some things are not immediately obvious or entirely supported. For instance, there is no obvious way to create static class constants.
-
How to speed up apt-get on Digital Ocean
For some reason, downloading packages using apt-get install was unusually slow on DigitalOcean this week. The fix was really easy.
-
How to make sure your og:image is used by Facebook
How EXIF data can prevent Facebook from using your thumbnail images.
-
How to fix "Cannot read property 'failedExpectations' of undefined"
While running Karma unit tests, you might run into the following error. Here's how it's fixed.
-
Deleting directories while preserving symlinks
At work, we needed to replace a pre-existing folder with a symlink. Here's how we did it.
-
Moving from Canada to Germany
The complete guide to moving to Germany, including information about visas, bank accounts and finding a place to live. Contains lots of useful advice for all Americans moving to Europe.
-
The way home
How I remember Montreal, and how it will be to return home in the middle of the winter, eight months after I left.
-
Finding your own phone number in Android Lollipop
If you are a traveller like me, you might often forget your phone number. Here is how to find it.
-
How to throttle scroll events in AngularJS
-
Disable "pull to refresh" in Chrome for Android
In mobile Chrome, pulling the top of the page will reload it. Although it's a convenient UI pattern, it might get in the way. Here's how it can be disabled.
-
What the travel guides omit
A tally of the small differences that make Europe, Germany and Berlin what they are.
-
How to replace accented characters in a Javascript string
-
Multiple git stashes
Did you know git can keep multiple stashes? Here's how to do it.
-
input.select() does not work on iOS
The correct way to do it is to use setSelectionRange on an already focused input.
-
Fixing "/usr/bin/env: node: No such file or directory"
After a fresh install of npm and bower, you may run into this error while running bower install. Here's the fix.
-
Using CSS3 transforms and calc() in Internet Explorer
Although CSS calc sizes are supported in Internet Explorer 10 and above, they do not work when used in transform attributes. Here's the fix.
-
Lessons from a month in Berlin
Travelling solo is not always easy. A short reflexion on my first month in Berlin.
-
How to fix slow file read/write in Node.js
It's probably your antivirus software
-
Berlin at last!
After Brussels and Rome comes Berlin, and it was love at first sight.
-
Second stop: Rome
I missed an opportunity to see Italy two years ago, so I made it my duty to see Rome on my way to Berlin. With five days to myself, I had plenty of time to wander in the eternal city. This is the recap.
-
Le guide du programmeur: Unicode et UTF-8
Vous êtes-vous demandé ce que signifie ASCII? UTF-8? ISO 8859-1? Voici comment ça fonctionne.
-
How to write partial derivatives in LaTeX
The short answer: "\frac{\partial v}{\partial t}"
-
From Montreal to Berlin: what you need to know
A list of important lessons learned by a Canadian travelling to Germany. Health insurance, visas and more.
-
Django DeleteView with AJAX
Djangos generic DeleteView is not really made for AJAX requests. A simple AjaxDeleteView can be implemented instead.
-
Return a user's own objects with Django's class-based views
There is a very simple way to only return the connected user's own objects with Django's generic class-based views.
-
Pagination with Django's generic ListView
-
What is "ReferenceError: Can't find variable: __gCrWeb"?
-
Fixing Tunnelblick disconnecting in OS X 10.10 Yosemite
-
Telling if a field is required in Django templates
If you want to tell whether a field in a template is required, use form.myfield.field.required as in the example below.
-
Diagnosing a bad ping
How to find out why you have a bad ping
-
Specifying a port when connecting with SSH
To connect to SSH on a port other than 22, use the -p flag.
-
Fix garbled file names in SMB shares
If you have files in your SMB networked folders that look like this: TRZB4~J.mp4, there is a very easy fix to get the original file names.
-
Following redirects with the Django test client
When running unit tests with in Django, the test client's default behaviour is to stop at the first response, even if that response is a redirect.
-
Ping once and return true/false
-
Print preview significantly different from Inspector in Chrome?
Are you having issues with the Chrome print media emulator showing different results from print preview? Here's how I solved this problem.
-
What is Cross-Site Request Forgery (CSRF)?
-
.find() vs. .children(): which one should you use?
Two jQuery functions can find children in the DOM. Which one is the right one to use?
-
Fix line break issues with FileZilla
-
Is my router affected by the Heartbleed Bug?
-
PHP preg_match failing for no reason? Blame UTF-16.
-
Disabling font zooming in Chrome on Android
-
What is XSS injection?
An intro to XSS injection, and tips on mitigating such attacks.
-
What is SQL injection?
-
The connection string to use with PHP, dblib and SQL Server
This is how you make PHP connect to SQL server.
-
The cynical developer's dictionary of project management
-
Javascript, jQuery and parent windows
-
Fixing 'Can't use function return value in write context' in PHP
How to fix this error. At least how I fixed it back in 2014.
-
Knowing the difference between mtime, ctime and atime
-
Remove the Chrome notification icon from the Windows task bar
Since a recent Chrome update, a new bell icon popped up in the Windows task bar. Here's how to disable it.
-
Get the number of lines of code for a project
-
How to see how many lines of codes were changed in a day with git
-
Solving AirPort Extreme FTP issues
-
SQL Server: How to add a month to the current date
-
How to force Apache to serve UTF-8 by default in .htaccess
A small Apache config tweak.
-
How to force IE8 to render without compatibility mode
If you still use IE8, something is deeply wrong. Godspeed, you poor soul.
-
Getting the hash of the first commit in git
Get one commit, and show its SHA1.
-
How to create big test files in OS X and Linux
If you need a big file for testing purposes, use mkfile.
-
How to download an image in Python
-
How to push all branches in git
By default, git only pushes the current branch. Here's how to push them all.
-
Push a git to multiple repositories at once
Here is how to have multiple remotes in your git repo.
-
Create a global .gitignore in git
How to ignore files in all git repositories on your machine. It's a good way to make git ignore .DS_Store and other system files.
-
Quick tip: the yellow USB port on ThinkPads
-
Use Sublime Text's Package Control behind a proxy
-
How to install Festival text-to-speech on Ubuntu
-
Common pocketsphinx mistakes and how to fix them
-
Install easy_install on Ubuntu and Linux Mint
If you need easy_install on your Ubuntu or Linux Mint machine, use the following command to install it.
-
Can't output OS X audio to AirPlay? Here's the fix.
-
Having issues with your first Django deployment on Heroku?
-
Twitter apps and localhost
-
Registering a .CA domain - what the CIRA wants
-
How to create aliases to git commands
-
Add some color to the OSX Terminal
If you find the OS X Terminal's lack of color hard on the eyes, here's how to set the colors.
-
Quick tips: text selection
-
How to fix long page load times on Heroku
-
OS X Terminal: Open the current folder in Finder
A nifty little command that opens the current terminal directory in a finder window.
-
How to get a reference to a CodeMirror instance
-
How to use the HTML5 full screen API (with examples)
-
Tastypie: only allow a user to use its own resources
-
How to disable the Chrome notification icon in OS X
-
Where to find php.ini in Ubuntu
At least that's how we did it in 2013.
-
Linux tip: repeat a command as sudo
-
How to remove the dropdown arrow in Internet Explorer
If you need this article in this year of our Lord, I hope you're okay.
-
How to change crontab's location
For a reason or another, you might one to change your crontab's location. Here's how.
-
How to search through your git commit messages
-
How to launch the Windows Phone Emulator without Visual Studio
-
Change the logon keyboard layout in Windows 7
-
OS X: Make a sound when commands finish running
How to get an audible notification after a command ends.
-
How to clone model instances in Django
Django instructions from the year 2013.
-
Django: How to remove fields from a Form
-
How to show grep results results in context
If you are using grep, you might want to give your results a little context and see lines before and after.
-
How to connect to another database in psql
Use the following command to switch to another database
-
How to edit commits and erase mistakes from git history
Here's what to do if you accidentally something that should remain secret, like a password or an API key.
-
Django unit tests: How to populate request.raw_post_data
In the example below, we are testing how our view reacts to a raw POST string sent by another API.
-
Mobile web design: how to disable zooming on your mobile sites
When you are making a mobile website, you might want to disable sideways scrolling and zooming. Here's how you do it.
-
How to prevent Safari from resizing text in iOS
How to prevent Safari from resizing text in iOS
-
How to fade images on load with jQuery
At least that's how we did it back in 2013.
-
How to use different CSS styles depending on screen orientation
Most modern browsers support the orientation media attribute, which allows you to define specific styles for devices in portrait or landscape mode
-
How to convert dates to UTC in vanilla JavaScript
A simple tutorial on removing timezones from JavaScript dates.
-
Adding days to a Javascript Date object
How to add a few days to an existing Date object in JavaScript.
-
How to isolate the date from a Date object in Javascript
How to remove the hours, minutes and seconds from a Date object, and get just the date part.
-
How to fix the "#1046: No database selected" error in phpMyAdmin
Are you getting this error when importing a .sql file in phpMyAdmin? Here's how you can solve it.
-
How to validate email addresses in PHP
The correct and the wrong ways to validate an email address in PHP
-
How to properly validate email addresses in Java
Java comes with the InternetAddress. It validates email addresses for you, so there's no need to write your own class.
-
Comment se connecter à SSH sans mot de passe
Un guide qui vous montre comment vous connecter à une machine SSH distante sans mot de passe. Utile pour les tâches planifiées avec cron.
-
Réglez l'erreur #1046 dans phpMyAdmin
L'erreur "#1046: No database selected" qui se produit lors de l'importation d'une base de données dans phpMyAdmin est facile à régler. Voici la solution facile à un problème commun chez les nouveaux utilisateurs de WampServer et de XAMP.
-
Different PNG image colours in IE and Safari
If your PNG images look different in Internet Explorer and Safari, you're probably using the wrong colour space.