March 2022.

January 2022

February 2022

What I read in March:

  • https://jvns.ca/blog/2022/03/13/celebrate-tiny-learning-milestones/ Years ago already, Julia also encouraged people to write what she calls bragging documents. It's a bit of what inspired this diary and helps to put things into perspective. I have yet to do it at work which was the main point in her bragging documents. If you don't know Julia's work, please check out her blog and shop, she's excellent at vulgarizing computer stuff.
  • https://www.xda-developers.com/best-youtube-vanced-alternatives/ How I learned that YouTube Vanced is shutting down. I've been using it for a couple of years now, specifically the Music app, pretty sad to see it go since YouTube in browser requires the screen to stay on and that is how I burned in my screen... I'll see if NewPipe can replace it but it was too much oriented on videos and less music (which I used my phone mainly for as I spend already too much time on YouTube on my PC).
  • https://www.wired.com/story/salary-transparency-gender-pay-gap/ Transparency is a very good thing for things that can be as taboo as salary. French people have a tendency to compare themselves based on the income and judge hard on the amount some people they know are paid. Hence why money is taboo in my opinion. Salary opacity hurts people, particularly minorities and benefits only the company which can spare some money on the back of its employees. I am not sure it'll be a short-term benefit for France but I believe it'll help in the long run.
  • https://www.wired.com/story/hybrid-working-original-fix/ I've yet to find the right balance. I like my solitude and people tire me, so not fully in-office works great for me but I fear going too much remote will hurt my social life/skills since I just love staying at home so much. But working neither fully remote nor fully in-office is a great thing for my health right now, so I'll try to remember to alternate a bit more often :)
  • https://www.wired.co.uk/article/remote-working-rude-colleagues "There’s just an emotional element missing when you’re trying to manage someone from behind a screen, so things get lost in translation.". This is a regular "issue" in online communities where we only very sporadically meet in person and the majority of discussions are over text, either via e-mail, IRC or GitHub/GitLab issues/pull-requests. This is already hard for native speakers but add people who only speak English as their second, third, etc... language and it gets messy very quickly. Soft skills are even more important online than they are when in person. Now add the pandemic, forced remote work and companies, managers and employees first experiencing with online-only communication and you've got a ticking bomb in your hands. The one rule: NEVER answer or send a mail when angry. Wait a few hours or next day when you've digested the info and can have another look at it, in a different mood/mindset.
  • https://psyche.co/guides/how-to-support-a-friend-going-through-a-difficult-time This shall become my monthly re-read because it basically teaches you how to deal with different kind of people and contexts when people are going through a rough patch. When struggling yourself, it could also be a way to help the person you're sharing things with give you the kind of support you feel like you need at the moment.
  • https://hbr.org/2022/03/how-supportive-leaders-approach-emotional-conversations Kind of a professional approach of the previous link. Employees are people and some struggle too :)
  • https://www.theatlantic.com/family/archive/2022/03/enjoyment-not-pleasure-creates-happiness/627583/ Made me realise that I go too much for pleasure and less for enjoyment. Need to change that :)
  • https://www.bbc.com/worklife/article/20220322-the-realities-of-the-four-day-workweek if you ever wondered what's the capitalistic take on the 4-day work week... /me facepalms

What I cooked/baked in March:

  • Goat cheese, rocket and pesto quiche. Forgot to take a picture but I'll make this recipe again one day :)
  • Homemade Maultaschen. It was absolutely delicious fresh, but I need to work on how to keep it in the fridge because they all just stuck together and the taste had changed overnight. I followed this recipe for the filling and that one for the dough. Homemade Maultaschen
  • Slow-cooked pork loin, the return. Still too dry, next time I'll use conventional mode instead of convection since I assume this might be what dries it out. Slow-cooked pork loin
  • Oat flakes, coconut oil cookies from last month (minus the chocolate because I can't be bothered). Still an amazing find, need to find a way to make it into a cereal bar for hikes or rides :)

What I worked on in March:

What I discovered/learned in March:

  • My cat has an auto-immune disease which makes her scratch herself so much she had wounds on her chin and very irritated lips. She got some treatment, we'll see how often we'll need to get her treated. She was meowing soooo much because she was constantly hungry and she woke me every night multiple times to try to get me to feed her.
  • Socializing after so many months of just seeing colleagues. Long overdue and I really had a nice time (and ate homemade paella made by a Spanish friend, and homemade Spätzle by an Austrian friend). Will need to do this more, I just tend to forget to check on people.

What entertained me in March:

  • 📺 The Haunting of Hill House. I was hooked quickly and enjoyed watching it a lot. A bit disappointed by the last episodes though.
  • 📺 The Haunting of Bly Manor. A bit less on the horror side than The Haunting of Hill House but as enjoyable. A bit less adrenaline overall but worth a watch (and didn't get a disappointing ending like the first season).
  • 📺 Attack on Titan, last season (still a few episodes to air though). Still the great TV series it was :) I am not entirely sure I'll start watching other anime TV shows though, if they all follow the same structure of almost one scene per episode. It's just too frustrating and "forces" me into binge watching the series.
  • 🎥 Spider-Man: No way home. A decent entertainer but not much to it, which is what I feel about most action movies anyways.
  • 🎥 Turning Red. While it's obviously about PMS, to me it was also about accepting and dealing with your emotions. It was a nice movie.
  • 📖 Big Little Lies, by Liane Moriarty. Loved the book, can recommend it. Weirdly enough, even if there were many characters in it, I could quickly remember who was who in a sentence or too and made the "reading-while-commuting" experience quite enjoyable. It's basically a drama based on parents of children going to kindergarten.

What I'm excited about for April (and later):

  • Finally received my Seeed XIAO BLE boards so I'll try to play with Zephyr OS a bit, at least get the LED blinky example to work :)
  • Riding season should start if the temperatures rise to 12-15°C (there was a last dance from winter this week, hopefully not for too long).
  • I would like to try making some ravioli myself. Let's make that the goal of next month :)

Februdiary 2022.

January 2022

What I read in February:

What I cooked/baked in February:

  • Fully (except tomato sauce, not really the season for fresh tomatoes :) ) home-made lasagnas. The dough was too thick this time. I need to try again. Oh no. What a shame.
  • Bread (yeah, it'll be a regular, get used to it :) ). This time tried with much more whole grain rye flour than usual (350g + 150g bread wheat flour), I very much like it this way.
  • First ever white bread (for a club sandwich recipe and also Croque Monsieur very soon),
  • Moussaka, followed this recipe (without the potatoes)
  • Almond-chocolate cookies. First time replacing butter with coconut oil. The smell and taste were amazing. There was some oats in it and I got a nostalgia flashback of the chocolaty cereal bars from my childhood.

What I worked on in February:

What I discovered/learned in February:

  • https://unicode.party/ for Emojis to insert in my Markdown-based blog :)
  • https://vivent.at/gratis-ins-museum/ for a list of Viennese museums freely accessible. Bookmarked for when the pandemic's over.
  • I needed to support two different display panels with the same device tree and driver and apply the correct settings at runtime from the kernel driver. The auto-detection mechanism relied on some MIPI DSI Display Command Set (DCS) command being sent to retrieve the panel register ID. However, this can only happen when the display is powered. Moreover, the display modes are different between the two variants. Since the display is powered and correctly configured only in .prepare or .enable callbacks, this is where the auto-detection mechanism needs to happen. Sadly, most MIPI CSI controllers do a copy of the modes of the display when the panel gets attached to the controller. This means that after mipi_dsi_attach is called, any change to the modes of the panel won't be applied to the modes internally used by the controller. This could be modified by having the controller save a pointer to the modes data structure from the panel. However, the modes are applied after getting retrieved from the driver with .get_modes callback in the panel driver which happens before .prepare callback is called. Therefore, since .get_modes is called before the panel can exchange MIPI DSI DCS commands, it cannot be used for auto-detecting the display. This also means that the modes will be wrong. By chance, in our custom Linux kernel, the panel gets configured twice, once for the framebuffer and once for the MIPI DSI controller, meaning we could modify the modes variable in .prepare so that the second call to .get_modes will return the correct value for the detected display. This is obviously a brittle work-around and a more robust solution would be to implement MIPI DSI DCS commands for this MIPI DSI controller and display panel in U-Boot and select a different Device Tree or Device Tree Overlay for the kernel.
  • I2C drivers do not necessarily need an of_device_id to match against a compatible from the Device Tree. Instead, the match callback of the i2c bus driver will try multiple things to match a device against a driver, one of them being i2c_match_id which iterates over the compatible string of an i2c device Device Tree node until if finds an exact match in one of the drivers name. This explains why one can add a Device Tree node for a MEMSIC MXC4005 with a compatible "memsic,mxc4005" and have only "mxc4005" as i2c_device_id in the driver and have the i2c bus driver probe this device correctly.
  • check-wheel-contents to - you guessed it - check the content of Python wheel packages.
  • jless for viewing and going through JSON content on the command line. Note: Firefox (and probably Chrome with this extension too) can do the same (while obviously NOT allowing this to be done from the command line :) ).

What entertained me in February:

  • 📺 Peacemaker - A different kind of superhero TV shows. Flirts dangerously with cringey at times but had a good time overall!
  • 📺 How I Met Your Father - The spin-off definitely does not live up to the original series I liked to watch. Most "jokes" fall flat. Trying to push through the first season but every week is a reminder I should probably stop losing my time :)
  • 📺 Boba Fett - A bit disappointed by the ending to the point that I didn't know it was the season (series?) ending until the week after when a new episode didn't drop. All in all, it was a good entertainment nonetheless.
  • 📺 Maid - I felt uncomfortable during the whole series, especially during the first episode which was hard to watch.. showing it was well acted/directed/produced since it's talking about abuse and everything the main character had to go through to try to start a new life for her and her child.
  • 📺 The Wheel of Time - A bit confused by how little was shown/introduced/explained during the first season. It felt to me like a 7h long trailer to the actual series. I'll probably watch the second season once out to decide what to think of it. Really shallow scenario for me at the moment.
  • 📺 Fleabag - What I think is meant by "British comedy"? I binge watched it over two evenings. The story telling is much different that what I was used to, but got quickly and easily hooked and it's the strength of the series for me. It's funny and emotional at times. Can recommend, the seasons and episodes are short and easy to watch.
  • 📖 Murder on the Orient Express by Agatha Christie - I rarely read a book in long sessions so it needs to be easy to get back to but this book was not. Too many characters and details to remember to be able to enjoy the book. Story was okay but I probably would have enjoyed it more, had I had the time, energy and will to go through multiple chapters in long reading sessions.
  • 📖 Verity by Colleen Hoover - What could probably be labeled as erotica mixed with thriller genre. A bit too much on the sexual side, but the thriller part was nicely and slowly brought up. I just couldn't stop reading. Loved it :)

What I'm excited about for March (and later):

  • 🏍️ (Slow) start of the motorbike riding season,
  • Hopefully receiving my two Seeed XIAO BLE,
  • More cooking recipes to discover and try,
  • Going out of my apartment and seeing some friends,
  • Attack on Titan final season should be about to end, so I'll start watching it at the end of the month :)
  • Peaky Blinders final season episodes dropping every week, so need to watch the old seasons again to prepare for the new season :)

Python binary packages (and origin story of récitale)

Don't care about your origin story, gimme the good stuff

I used Prosopopée for a while for my photo blog and contributed some fixes back then. This software lets you define albums (aka galleries) with photos (and videos, audio files, text, HTML, iframes, ...) and then creates thumbnails for those photos so that your website does not make your user load 500MiB of data for your 20-photo album.

However, with 25+ albums and 1000+ images, it was not as small as a photo blog as it used to be in the beginning. After a hiccup on the server hosting my blog, I had to reinstall everything from scratch and with my slow upload link, a few GiB of pictures and thumbnails would be just too much. So instead, I uploaded the originals and "compiled" the blog on the server (like I've done it for years already, though making use of previous build cache). The thing is... it took FIVE HOURS AND A HALF to build this from scratch.

And this is where all this madness began.

I discovered that the whole Python project was single-threaded. But that it was using subprocess Python module to call GraphicsMagick which happens to be multi-threaded. While it was sub-optimal because GraphicsMagick could be running faster by converting all thumbnails from a single picture all in one command instead of having it load the base image for each thumbnail, I also discovered that there is some nice image manipulation library in Python called Pillow. I created a small Proof-of-Concept and it was slower than GraphicsMagick... because Pillow is single-threaded. So, time to go for multithreading. This is where I learned about the Python Global Interpreter Lock (aka GIL) which means that threads in Python are only really ever useful for when you're doing IO-intensive tasks, when the CPU is waiting on some peripherals. So, threads... no go since I want all cores to be running at the same time at 100%. Then I discovered the multiprocessing Python module which is side-stepping the GIL. Proof-of-concept... and as hoped, multiprocesses with each having its own image to create thumbnails for was much faster than GraphicsMagick. The homemade benchmarks ran on my Asus C101-PA Chromebook (Rockchip RK3399, 6-core ARM64 SoC) and I could get between 5 to 8 times faster with multiprocessing + Pillow compared to GraphicsMagick.

I imagined the rework of the original project (prosopopée) to be too much work compared to the likeliness that the full rework would be accepted by the original maintainer. I thus started a "fork" from scratch, just reusing the templates. One proof-of-concept later, I shared it with the maintainer of prosopopée and explained all the challenges I faced along the way (who would have known that the GIL was SO hard to side-step while keeping one's own sanity?). They were interested so I started to work on a proper fork with proper commits so that I could send a pull request to the original project and see where it'd go from there. Many months of work and lots of headaches later (supporting multiple versions of Pillow turned out to be painful, with a handful of quirks and hacks to implement), the fork was in a good enough shape to be contributed back to the original project... but wait... With so many (big and drastic) changes, one needs benchmarks to highlight how much the situation improves!

While setting up multiple computers of different architectures (Aarch64, x86_64) and of different levels of power (absurdly slow to pretty fast), I was surprised to see some computers only improved by a factor of 50% the speed of the build. I discovered that for x86_64 SoCs with SIMD support, a fork of Pillow exists: Pillow-SIMD which claims to be much faster than the original Pillow. Tested and confirmed, much faster on computers that support SIMD of Intel x86_64 instruction set. However, Pillow-SIMD is not compatible with Aarch64 instruction set (well... any other than Intel's x86_64 actually). And that is unfortunately not something I want to support officially since I want to be able to use prosopopée on my Chromebook or have people use it on a Raspberry Pi (a friend generates and hosts his photo blog on one so I "had to" support it officially :) ). But it's good for benchmarking nonetheless! Also stumbled upon an explanation as to why it's hard to contribute it back to Pillow which helped me understand a bit more the packaging world of computer distributions.

Back to my benchmarking :) Since I don't like having multiple sources for software packages, I usually install them from the distribution package manager (dnf on Fedora). Since I wanted to support multiple (and more recent than the one available in distribution official package repositories) versions of Pillow I however had to use pip. After benchmarking for a while, I discovered that my numbers for pip-installed versions were worse (by a non-negligible factor) compared to the version that came with my distribution. Then I did the unthinkable: I tested the exact same version of Pillow, one from pip, one from my distribution. And the one from my distribution was almost twice faster than pip's. For. The. Same. Version. After some digging, I saw that Pillow was not using my distribution's jpeg library - libjpeg-turbo - but its own - the original, and slower, libjpeg. Stay til the end for the explanation :) Leave a like and subs... ah no, not YouTube.

I also discovered that one can build Python packages from source delivered by pip by using python3 -m pip install --no-binary :all: pillow (after making sure Pillow package was entirely removed from my system). And with that, my distribution's jpeg library (libjpeg-turbo) was used for Pillow and the perfs were similar. Phew.

Time for some (year-old) benchmarks. For 31 galleries and ~1400 photos:

Computer Graphicsmagick Pillow 8.1.0 Built Pillow 8.1.0 Pillow-SIMD 7.0.0.post3
Intel Q6600 (4c/4t @2.4GHz) 4GB RAM (Fedora Desktop 33) 1:37:13.06 26:57.71 17:43.66 N/A
Intel Atom N2800 (2c/4t @1.86GHz 2GB RAM (Fedora Server 33) 5:35:32.57 1:44:21.93 1:16:32.42 N/A
Intel Celeron G1610T (2c/2t @2.3GHz) 4GB RAM (Fedora Server 33) 1:42:33.79 46:10.00 26:10.30 17:30.49
Intel Core i7-8700 (6c/12t @3.2GHz) 32GB RAM (Ubuntu Desktop 20.04.2) 33:01.63 6:00.16 3:40.09 2:16.03
RaspberryPi 4 4GB RAM (Ubuntu Server 20.10) 3:44:57.00 44:43.67 33:29.86 N/A

Seems like the months hard at work proved to be useful after all!

I sent the Pull Request and called it a day.

Fast forward a few months, the maintainer had merged some other pull requests of mine but didn't take the time to review this (big) pull request. So after some careful thinking, I decided to start my own fork, récitale.

And the second round of madness started. I now have a pip package on pypi and wanted to create a container image for the project. Since I started to use container images, I've always tried to use Alpine-based container images as they are more lightweight than others and apparently also offer some decent security practices. I shall therefore create an Alpine-based container image for my project. I tried for hours and hours and pip's Pillow would always try to get compiled from source instead of taking the prebuilt version (aka wheels). Some evenings spent in the matrix and here's my summary of why that is:

Probably most of us only ever developed pure Python scripts. One that only needs a Python interpreter to run and that would be it. Another kind of Python software exists though: Python extension modules. Those are actually coded in C (or C++) with the Python API and can get imported and used as Python modules in your Python scripts. Since C language is compiled and not interpreted like Python, Python extension modules need to be compiled in order to be usable. Pillow actually mostly contains and make use of Python extension modules. Therefore it needs to be compiled. The reason for such Python extension modules is that some code is much faster if coded in low-level languages like C or C++ compared to Python. (As a side note, while there are multiple Python interpreters coded in different languages, CPython is the most widely used and is coded in C as its name suggests).

Since having users compile source code before being able to use software is not the best adoption strategy, there needs to be a way to share prebuilt Python extension modules. The prebuilt Python extension are compiled and shared as shared libraries (commonly .so files on UNIX systems). The compilation and packaging is being handled by wheels and we don't have to worry about that. However, shared libraries almost always depend on (link against) other shared libraries, at the very least against the standard C library (aka libc). So, the maintainer of the Python extension module will compile it into a shared library with wheels and then package it and publish it on some Python package index such as PyPi. Here comes the first problem: the shared library against which the Python extension module was linked may not be the same as the one installed on user computers. This would result in the inability to run the Python extension module anywhere else than on the maintainer computer, which kind of defeats the purpose of being able to share them.

Instead, Python community decided to redact a contract that each maintainer Python extension module should fulfil in order to be publicly shared. This contract is defined in PEP-0513. wheels packages for Linux systems with the manylinux1 tag expect a given set of system libraries to be present on the user computer, each with a specific major version, and guarantee that they do work in that environment. This is great since there's no need to share those system libraries with the Python extension module in PyPi, since they have to be on the system so that the Python package manager (e.g. pip) is able to fetch the prebuilt version of the modules. The not-so-nice thing is that it means this environment will probably get outdated over time since the source code of those system libraries do evolve too and will eventually have some backwards incompatibility. Meaning prebuilt modules will only be available for rather old systems. That's when PEP-0599 comes into play with the manylinux2014 tag and updated contract for the set of system libraries installed on user computers. (Additionally, this PEP brings support for non-Intel architectures, such as ARM or PowerPC). So now the maintainers need to compile two different wheels packages, one fulfilling the manylinux1 contract and another for manylinux2014's. And multiply this by the number of architectures they want to support. This is also where another issue arises: the PEP "contracts" needs to be constantly updated to match what is done on computer distribution. This is tedious for the Python community and therefore, they came up with another contract: PEP-0600. This PEP defines new tags, each one targeting a specific GNU libc (aka glibc) version (major and minor being used to discriminate the version) and a given CPU architecture. Therefore, any shared library not part of the glibc is not part of the new manylinux "contract".

All that being said, the contract only ever mentions a very small set of system libraries and it is very likely some Python extension modules will link against other shared libraries. Such is the case of Pillow. After installing Pillow with pip, one can find the Python extension module shared libraries in ~/.local/lib/python3.7/site-packages/PIL/ directory. One can discover which shared libraries they are linked against by running the following command:

$ ldd ~/.local/lib/python3.7/site-packages/PIL/_imaging.cpython-37m-aarch64-linux-gnu.so
        linux-vdso.so.1 (0x000000766a429000)
        libjpeg-35e8c64c.so.62.3.0 => /home/qsdevices/.local/lib/python3.7/site-packages/PIL/../Pillow.libs/libjpeg-35e8c64c.so.62.3.0 (0x000000766a277000)
        libopenjp2-ae40752c.so.2.4.0 => /home/qsdevices/.local/lib/python3.7/site-packages/PIL/../Pillow.libs/libopenjp2-ae40752c.so.2.4.0 (0x000000766a1c4000)
        libz-21b81fdb.so.1.2.11 => /home/qsdevices/.local/lib/python3.7/site-packages/PIL/../Pillow.libs/libz-21b81fdb.so.1.2.11 (0x000000766a183000)
        libtiff-e22335e6.so.5.7.0 => /home/qsdevices/.local/lib/python3.7/site-packages/PIL/../Pillow.libs/libtiff-e22335e6.so.5.7.0 (0x000000766a081000)
        libxcb-be71eb15.so.1.1.0 => /home/qsdevices/.local/lib/python3.7/site-packages/PIL/../Pillow.libs/libxcb-be71eb15.so.1.1.0 (0x000000766a00c000)
        libpthread.so.0 => /lib/aarch64-linux-gnu/libpthread.so.0 (0x0000007669fc9000)
        libc.so.6 => /lib/aarch64-linux-gnu/libc.so.6 (0x0000007669e57000)
        libm.so.6 => /lib/aarch64-linux-gnu/libm.so.6 (0x0000007669d9a000)
        liblzma-4da4ab69.so.5.2.5 => /home/qsdevices/.local/lib/python3.7/site-packages/PIL/../Pillow.libs/liblzma-4da4ab69.so.5.2.5 (0x0000007669d39000)
        libXau-21870672.so.6.0.0 => /home/qsdevices/.local/lib/python3.7/site-packages/PIL/../Pillow.libs/libXau-21870672.so.6.0.0 (0x0000007669d08000)
        /lib/ld-linux-aarch64.so.1 (0x000000766a3fb000)

Here you can see that this _imaging.so library is linking against libjpeg.so.62.3.0 from /home/qsdevices/.local/lib/python3.7/site-packages/PIL/../Pillow.libs/libjpeg-35e8c64c.so.62.3.0 and not my system's. And this is where I discovered that the shared libraries that aren't part of the manylinux contract are actually shared and installed with the wheels package. This seems to be handled automatically by auditwheel repair. So now you understand why, with the exact same Pillow version installed from pip or my distribution package manager, the benchmarks were so different. Prebuilt Pillow ships with the original libjpeg while the one I get from my distribution links against libjpeg-turbo, thus being much faster. This also explains why recompiling Pillow from source with pip instead of taking the wheels package would make it so similar to my distribution's: Pillow being built locally, it would find libjpeg-turbo from my system instead of libjpeg and use the former. As a note, Pillow 9.0.0 and later wheels are now built against libjpeg-turbo. I did a very quick test on my Intel Q6600-based system from above. Pillow 8.4.0 would take around 29 minutes for the current state of the blog against 17 minutes for Pillow 9.0.1. No need anymore to compile Pillow from source to have better perfs! (Though Pillow-SIMD is likely to still be more performant for computers that support it).

If you paid attention earlier, I stated that the manylinux tag is a contract for packages linking agains the glibc. It happens that Alpine Linux is not using glibc but rather musl. Therefore, when pip tries to find a wheels package that can fulfil a contract with the musl libc, it certainly couldn't find any (because none existed). This means that pip could only fetch the source version of the Python module extension and had to compile it. This is why using Alpine container for Python packages was so discouraged. However, that is now history because there's a new PEP-0656 which introduces a contract for musl-based systems with the musllinux tag. Pillow still does not support it though but one can only dream it'll be supported soon enough :)

I'm happy to have decided to work on my recitale fork for that taught me a lot about Python and packaging :)

Now let's see how long I keep torturing myself with multiprocessing in Python instead of reimplementing it in a more adapted language (and probably much faster too).

Dear Diary. January 2022.

I saw Paul Barker work on an ambitious weekly diary and told myself I might be able to enjoy doing it too, though monthly is probably more realistic for me :) So here we are, first (and last?) entry for this year's diary.

What I read in January:

What I cooked/baked in January:

  • Bread (once a week :) ).
  • Savory porridge with wallnuts, wallnut oil, shiro miso and an egg. 3/5 stars. I have a picky stomach in the morning. Savoury porridge
  • French crêpes.
  • Karaage (japanese; double-fried chicken). Twice. I like it. A lot. Karaage
  • Started my own kimchi (korean; spicy fermented nappa cabbage). Fermented alright, container almost exploded to my face after 2 days. Tasting session in a few months :) kimchi
  • Tried "slow"-cooking a pork loin (seared in pan then put into 80-90°C oven til center reaches 66°C). Still a bit overcooked but getting there. Pork slow-cooking

What I worked on in January:

  • stretching almost daily since I challenged myself to do a front split by the end of the year.
  • keeping up with my daily yoga morning routine: https://www.youtube.com/playlist?list=PLui6Eyny-Uzyp5P3Vcuv5qCHQOC8W6grN.
  • released a new alpha version for récitale which fixes a few things, publishes a container image per new release, shows a progress bar while reencoding video/audio files, adds some unit tests and other stuff. See https://github.com/recitale/recitale/releases/tag/v2.0.0a2.
  • finally started to upstream some patches for the Linux kernel, feels good to be back :) simple DTS fixes for now.
  • trying to find a shop that sells a Ryzen 5300GE or 5600GE to build myself a new, more powerful, NAS with the same power consumption as today's. Didn't manage to yet, impossible to find the GE variants for some reason.

What I discovered/learned in January:

  • that my work laptop wasn't using Wayland for everything /o\ dmenu (the default app finder on sway) is using XWayland so I switched to bemenu instead.
  • that sway needs to be configured correctly so that it does not get killed by systemd-oom when compiling Yocto images/Buildroot images/Linux kernel. I use sway-systemd right now. See https://bugzilla.redhat.com/show_bug.cgi?id=1933494.
  • that sway does not detect my NVIDIA GPU (nouveau driver of course :) ) on my work laptop. Not that it's a big deal since the iGPU from Intel is doing its job quite ok.
  • that Firefox and Thunderbird both use X11/XWayland by default. Install (and run!) thunderbird-wayland and firefox-wayland on Fedora to use Wayland instead.
  • how to switch Chromium flatpak from X11/XWayland to Wayland: flatpak run org.chromium.Chromium --enable-features=UseOzonePlatform --ozone-platform=wayland. Note: Chromium crashes every now and then. Since I use it only to connect to the awful Microsoft Teams website, I don't care too much when it does crash.
  • how to also allow screencasting in Chromium flatpak: flatpak run org.chromium.Chromium --enable-features=UseOzonePlatform --ozone-platform=wayland --enable-features=WebRTCPipeWireCapturer.
  • how to connect my Jabra Elite 85h via Bluetooth and use as a headset on Linux. It is not perfect but it works okay. I just need to switch between profiles to be able to use the embedded microphones but doing so switches the audio output to mono of bad quality.
  • WirePlumber to manage my sound devices (mainly used right now to switch between headset and headphone modes my Jabra Elite 85h). wpctl status and wpctl set-profile DEVICE_ID MODE_ID.
  • how to have git hooks specific to a git worktree: git config extensions.worktreeConfig true and git config --worktree core.hooksPath /some/path. The goal was to have a directory with all upstream source code checked out and then use worktrees per customer/project. One project is using Gerrit though, so I needed its git pre-commit hook to add the Change-Id but didn't want the Change-Id to make it to my patches destined for upstream.
  • that Python binary packages pip can fetch only get fetched for glibc-based distribution... which Alpine isn't (musl-based). This means that pip will fetch the source of the Python package and build it locally on those distros. This results in tons of additional dependencies and an increased build time. So I based the container image I built for récitale off a slim Debian instead.
  • that Python binary packages for musl-based distributions are in fact now possible! See the musllinux tag from PEP-656. It's still very new but hopefully more packages over time will be available for that kind of distros.
  • an unofficial, pre-PEP656, Python package index for musl-compatible Python binary packages: https://alpine-wheels.github.io/index (to be used with pip's --extra-index-url) https://github.com/alpine-wheels
  • https://caniuse.com/ for CSS/HTML features support list per browser and browser version (and their market share). Will come in handy when working on récitale :)

What entertained me in January:

  • Finished The Legend of Zelda: Twilight Princess.
  • First season of Arcane. Looking forward to the second :)
  • 7th season of American Horror Story. Really liked the first part of the season, which is really the kind of thriller I'm interested in, less for the remaining.
  • American Psycho. Forced myself to read all the 40% of the book before giving up a few years back. Movie was as uninteresting to me as the book was.
  • Last Night in Soho. Really liked it... except for the ending.
  • Harry Potter 20th Anniversary: Return to Hogwarts. Had a nice time, so much nostalgy :)
  • The Book of Boba Fett. Same musical ambiance and story rythm as The Mandalorian so I really like the hour or so I spend watching it :)
  • Trumbo. I'm always baffled by historically-inspired movies. You really think some things could never had happened, yet.. here we are, about 50 years later after the event.

What I'm excited about for February (and later):

  • Bought myself a pasta machine/rolling mill. Fresh lasagna, fresh tortellini, fresh ravioli, fresh Maultaschen, fresh tagliatelle, fresh puff-pastry dough (the one sold in Austrian supermarkets is HORRENDOUS).
  • I ordered two Seeed XIAO BLE SBCs to play with Zephyr, BLE and Zigbee and try to setup some home "automation" this year.
  • Stumbled upon the new (?) module from Olimex based on an RK3328 SoC from Rockchip which looks kinda perfect in terms of perf and budget for my forever-dream of building my own motorcycle GPS.
  • Starship to replace oh-my-zsh.
  • The Legend of Zelda: Ocarina of Time - Master Quest. Just started :)
  • More improvements to come to récitale :)
  • Finding a place closer to work so the commute is less time-consuming.

Install Fedora on headless remote servers

Context

I run this website on a dedicated server hosted by OVH from their Kimsufi product range. I've had this server for a long time now and even though they publicly advertise that one can install Fedora (and many other) distribution on that product line, they cannot (or don't want to) give me the option to do it on my dedicated server, therefore I had to come up with something to install Fedora without OVH giving me the option to do so.

I did this 2 years ago, it was painful but I thought it was a one time thing to do, so I didn't document the process. Fast forward to about a month ago, I started the Fedora 34 upgrade. When the packages are installed, Fedora reboots into a very simple system where old version packages are replaced by new version packages. In that scenario, obviously no network is needed so the server does not respond to pings. Turns out I had monitoring of my server enabled and the technician seeing a logging screen but no ping hard rebooted my server while it was upgrading. I tried to recover it for a day, gave up and went through a day and half of pain to reinstall Fedora. The hard thing with those servers is that there's no console access, only SSH is available, so if your distribution does not setup the network or does not boot, you have no indication on what went wrong. Now that I've struggled twice, it's time for me to document the process so that next time my server is messed up or I change my server, I can reinstall Fedora in the blink of an eye.

Steps

  • Install an officially supported distribution from your cloud provider dashboard. From my Kimsufi dashboard, I selected CentOS 7 because it's made by Red Hat too but any distribution which uses GRUB2 as bootloader will do just fine.
  • SSH to your new server OS,
  • Download the PXE boot images from Fedora. For release 34, they are available here. I installed wget by running yum install wget and then ran:
wget https://mirror.karneval.cz/pub/linux/fedora/linux/releases/34/Server/x86_64/os/images/pxeboot/initrd.img
wget https://mirror.karneval.cz/pub/linux/fedora/linux/releases/34/Server/x86_64/os/images/pxeboot/vmlinuz
  • Put both files in the /boot directory. I renamed the file to more or less match the naming convention in my /boot directory. vmlinuz became vmlinuz-fc34 and initrd.img became initrd-fc34.img.
  • Check whether the /boot directory is in its own partition or not by running this command: df /boot. If you have /boot in the column Mounted on, it is on its own partition, therefore no /boot prefix needed in the next step. If it says /, then you need to have /boot as a prefix in the next step. On my CentOS 7 installation, /boot is mounted on / so I add the /boot prefix in the next step.
  • In order to have access to the Fedora installer that starts with the PXE boot image on a headless server, you need to access it via VNC. This can be done by adding inst.vnc and inst.vncpassword=<password>. <password> should be 7 characters long. 6 and 8 characters length are supposed to be supported but it didn't work for me.
  • Edit your GRUB2 configuration file to add a GRUB entry for this kernel and initrd images. On CentOS 7, you just need to add your entry to /etc/grub.d/40_custom file since all files in /etc/grub.d/ are appended to the final configuration file. The file should look like this:
menuentry 'FedoraNetInstall' {
   load_video
   set gfxpayload=keep
   insmod gzi
   insmod part_msdos
   insmod ext2
   set root='hd0,msdos1'
   linux16 /boot/vmlinuz-fc34 ip=dhcp inst.repo=https://download.fedoraproject.org/pub/fedora/linux/releases/34/Server/x86_64/os inst.vnc inst.vncpassword=test123
   initrd16 /boot/initrd-fc34.img
}

N.B.: on Debian 9 and Fedora 34, the linux16 and initrd16 are respectively linux and initrd but the content stays the same (+- the /boot prefix).

N.B.2: Check that the settings before linux16 are similar to the ones you have in entries listed in /boot/grub2/grub.cfg, specifically the set root one.

N.B.3: Quadruple check that there are no typo anywhere in this file (I lost a few hours because I put /boot/initramfs-fc34.img instead of the above after initrd16)

  • Make a backup of /boot/grub2/grub.cfg: cp /boot/grub2/grub.cfg /boot/grub2/grub.cfg.bak
  • Add your menuentry to grub.cfg by running: grub2-mkconfig -o /boot/grub2/grub.cfg
  • In order to make sure you boot next time into your new menuentry but that if it fails to boot the next menuentry to be selected at next boot will be your current OS, run grub2-set-default 0 and grub2-reboot FedoraNetInstall.
  • Reboot your machine.
  • Check there's a ping after a few minutes (servers take a much longer time than consumer desktops or laptops to boot so be patient :) ).
  • Install a VNC client on your computer. I used TigerVNC on Fedora which I installed with dnf install -y tigervnc. From the command line, run vncviewer <remote server IP>:<vnc port>. Or from the GUI, just start TigerVNC and configure it to connect to your server. By default, vnc port is 5901. One can use the 1 equivalent too.
  • Configure your new Fedora installation and wait for it to reboot.
  • Profit.

Source:

On mental health

Photo by Sasha Freemind Photo by Sasha Freemind on Unsplash

This blog's been too long without a new article, though I'd have hoped for a happier topic to talk about.

These past years, I've had heartfelt discussions with friends about self-harm, suicide, anxiety, depression, burn-out and other not so nice things. They opened to me, I listened. I opened to them, they listened. Talking about feelings, experiences, symptoms, thoughts to someone who can find the words or understand yours, breaking the first assumption everyone suffering from various mental health issues has: you are not alone.

You are not alone.

Keeping this pain to yourself for so long, to finally be able to talk openly, shamelessly, is truly freeing. However liberating it is, I rarely could talk about those topics for long as it's mentally draining. But it's always been a relief. Knowing you have people who can grasp your world you can talk to if need be. You have a crutch. Broken, too, but it's support nonetheless.

You are not alone. Talk to someone.

Everyone's a functioning adult. There's no other way. How would everyone cope with life otherwise, silently? People don't talk. In just under two years, I remember talking to 7 different people about our mental health issues. Mind you, I don't have many friends, so, that's quite a lot more than I would have expected. Some were diagnosed, some haven't sought professional help (yet?). It's going to pass, you lie to yourself. It passes. It actually does feel like it passes! In reality, you've just swept dirt under the carpet. And every time it creeps back in, there's less and less room under the carpet.

You are not alone. Talk to someone. Seek help.

I did some therapy sessions a few years back. It helped enough, I thought, so I stopped. Here we are, 4 years later, it's never been that bad. It does not pass anymore. It's there. There's no creeping in. It's in broad daylight. There's no night. I knew it was creeping in back in earlier this year. I asked a doctor for therapy. Covid happened. Postponed it. I was doing fine enough. I had time. I'm not doing okay. I don't have the luxury of waiting months again. I could have worked on it, but I didn't.

You are not alone. Talk to someone. Seek help. Don't wait.

It is hard to recognize you need help. It is even harder to put yourself in such a vulnerable situation, talking to someone you don't know about your issues that you would rather not even acknowledge. It's not a cold. It's not a sprain. It's your brain. Your brain is sick. And for some reason, it makes you ashamed. But there's no shame in having mental health issues. People have it harder than you. You might believe that. You don't need to put yourself on a scale. Pain is pain. You deserve help as much as anyone else.

You are not alone. Talk to someone. Seek help. Don't wait. You deserve help.

Everyone experiences their mental health issues differently. For me, as far as I can remember, it's been a cycle. I would feel shit for a week or two and be "okay" for a few months. Every iteration, the cycle shortens slightly and the "okay" is less "okay" and the shit is shittier. I just don't see it because it's a long process but I just accepted the cycle, the not-so-okay part because it was still better than the shitty part of the cycle. And then the iceberg tipped over and I've more shitty days than "okay" days and the cycles feel like the biggest rollercoaster.

I often have digestive issues, lost appetite or cannot eat much because my stomach complains about whatever I feed it. My short memory is a complete disaster. I can barely concentrate. My brain is working at 50%, taking much longer to read and understand things. It's getting harder to communicate in English. My brain is foggy, my vision is tunneling and blurry. I feel weak and my fingers shake as if I was low on sugar. I have higher than usual heart rate. I feel like anything is a mountain to climb... it's just doing the groceries once a week or go to work. I struggle with coming up with solutions, but once I do, I cannot pick between any of the solutions. I always was woken up by my alarm clock, I now wake up an hour before, unrested. There are no longer longer nights during week-end. I'm irritable. I don't feel joy anymore.

I've been diagnosed again. I suffer from depression, a severe anxiety disorder and a couple of other mental disorders.

I'm getting help, too late, again, but I am. I'll be fine, eventually, or at least much better.

I obviously don't like sharing that part of me, because even though I acknowledge it, I still don't understand parts of it. I share so that maybe it can help someone. I read a few articles in the past, most didn't resonate with me, a few moved me. For some reason, discovering the struggles of Mac Miller, Kevin Love, DeMar DeRozan and some more anonymous people's blog post on their mental health helped me understand there are many more people suffering than I thought there were.

I wish society would make talking about those issues easier and more acceptable. Making it normal to talk about the hard times be they temporary or recurrent. There's still this stigma about weakness in acknowledging and talking about oneself's mental health issues. I wish it wasn't so taboo that people don't know how to react to someone sharing their disorder or distress. Heck, even I don't know how to react to other people's struggles.

I wish we were less ashamed to share our struggles so that other people could identify theirs earlier. Going back in time, I can see times during which knowing something not normal was happening would probably have helped me to recognize disorders and seek help earlier.

For French readers, I feel like the "Entre mecs" Youtube series is worth your time. It tries to put on the table taboos among men and discuss them. It's not specificially about mental health but it's a good step forward. A friend of mine really likes "Et tout le monde s'en fout" Youtube channel.

Have a read at Kevin Love open letters: https://www.theplayerstribune.com/en-us/articles/kevin-love-everyone-is-going-through-something, https://www.theplayerstribune.com/en-us/articles/kevin-love-mental-health.

This post is vague for the most parts. It's just that I haven't figured things out for myself yet, obviously, otherwise there wouldn't be an article in the first place. It's probably for me too that I write this, taking the time to put words on feelings. A way to start my journey.

Anyway, signing off, there is a "couple" of things I need to work on. Do you too?

Take care of yourself.

Set up your Canon PIXMA MP495/499 to use WiFi

Even if I doubt you'd ever be able to buy this Canon printer/scanner now (I bought it 6 years ago), maybe this tutorial could help you set up your MP495/499 to connect to your personal WiFi and get the scanner and printer to work wirelessly in Linux. To be fully honest with you, I'm only writting this so I can have a straightforward tutorial next time I need to set it up again since I've had to set it up already 5 times and I always spend too much time to find out how to do it.

Configure your printer's WiFi settings

The MP495 WiFi settings are set up from a webpage on the printer itself. For that, you need to access it wirelessly (don't you see the irony here?). The MP495 is expecting a Wireless Network with the following "features":

  • SSID: BJNPSETUP
  • No password
  • DHCP server activated

The printer will now automatically connect to the WiFi network once the WiFi has been activated. To do so, power up your MP495 and wait for it to initialize.

Once it's done its whole init process, press the Maintenance button (A) until the 7-segment display (B) shows something looking like the letter G. Then press the Color button (C). Wait a few seconds and the WiFi logo on the front panel should light up.

Settings panel

Find out the IP address of your printer by going on the webpage of your Access Point or connect your computer to the BJNPSETUP network and run nmap -sP 192.168.1.0/24 (192.168.1.0/24 being the network on which you are when connected to BJNPSETUP). This should return three IPs: the AP's, yours and your printer's.

Enter the IP address of your printer in your web browser. You'll be greeted by a page, you'll click Advanced, you'll note the Network Printer Name, and then click Network Settings.

Select Use wireless LAN and enter the SSID of the network you want your printer to connect to. Click on Modify next to the Encryption Method label. In the opened page, set up the settings of your WiFi network.

Then click save. Of course, you'll lose the connection to your printer since it is now expecting another WiFi network. So go back to your AP and set it back up to what it was before you modified it.

Now, you'll certainly want your printer to have the same IP address for ever so you don't have to reconfigure your printing and scanning tools on your computer. Either you do that in the Network Settings of your printer or on your AP (if it supports it) by giving it a static DHCP lease. I recommend the latter.

Check on your AP or with your computer that the printer is connected on your WiFi network (and get its IP address thanks to the Network Printer Name you noted earlier).

Configure printer on Linux

Then you can configure your printer with the tools available in your distro. On Xubuntu, open system-config-printer and click on Add and select Find Network Printer in the Network Printer dropdown menu. Enter the IP address of your printer and once it's been found, click Forward.

It'll first look for drivers and then ask you which one you want. Select Canon and then either PIXMA MP495 or PIXMA MP499 depending on which one you got. Print a test page to be sure your printer is well configured.

Configure scanner on Linux

XSane and simple-scan are broken right now on Xubuntu for the MP495 (16.10 at the moment of article redacting) so most people will tell you to install the driver from Canon. I had really a hard time to install it and I generally avoid using vendor's drivers. So after searching a bit, I found out that XSane had its support for the MP495 broken only if libsane library's version is 1.0.25 (which it was on my system). After adding some repo and updating libsane, I could scan over WiFi.

sudo add-apt-repository ppa:rolfbensch/sane-git
sudo apt-get update
sudo apt-get upgrade

Factory reset the printer

If for any reason you misconfigured your printer, factory reset it by pressing the Maintenance button until you see the small letter t on the 7-segment display and then press on the Color button.

Disable WiFi on MP495

Press the Maintenance button until you see the letter G and then press the Black button (on the left of the Color button).

My first conference (and talk!)

As I explained previously in the article presenting my feedback on my internship, I'm now part of Free Electrons' engineering team. The most exciting part is the upstreaming of the work we do with some clients. I'll certainly get into more details on that on my "2016-summary" article planned for the end of the year. The second most exciting part of my job is going to Linux conferences.

That's an awesome event where you can find people tremendously contributing to Linux, people who definitely "know their shit". We're all gathered to share what we have done the past few months, years or decades. What were the trouble we ran into, how we managed to resolve them, how to use such subsystem for your driver, how this subsystem works, how this hardware component works, etc.

This is a place where you can finally meet people you were talking with over the mailing list the whole year.

Well, that's enough propaganda for now!

If you read the article on my internship, you'd know I built a lab to do continuous integration for the Linux kernel thanks to LAVA and KernelCI project. I struggled a bit while building it on which components to choose for the lab, how to build it, how to automate things, how to do continuous integration, ... I fought with LAVA documentation, because it was a terrible mess at that time.

So, we decided with Antoine Ténart, my internship supervisor, to propose a talk on how to build a board farm and remote control them. You can watch it on Youtube.

You can see the first minutes, I'm really not at ease. The first words were unsure. The stress got me a bit but after few sentences, I was focused on the subject and it was really enjoyable.

It was a great experience (the conference and the talk) and I'm already looking forward to the next ELC (Embedded Linux Conference) in Portland at the end of February.

These conferences are also great opportunities to visit some new cities. I've never been to Berlin before so I decided to spend a few days before the conference to wander through the city. You can find my album here.

Lenovo, biggest disappointment ever

This happend two years ago and I felt some people would be interested on some feedbacks on Lenovo customer support.

After years of struggling with a 6 years old laptop during my Computer Science lessons, I decided it was time to upgrade to a much better, lighter and powerful laptop. Some friends had Lenovo laptops and were really happy with theirs. The quality of the product, the relatively cheap price and the fact it was number one laptop seller in the world definitely convinced me to buy one of their laptop. Therefore, I bought a Lenovo S440 for 900-1000€ (new but not low model of the brand).

After one week, I broke the Q key and had to send it to repair. The keyboard still seemed cheap after that but I was way more careful while using it (the Fn key was unbelievably fragile).

After a year, I started my internship in Amsterdam as a JAVA web developer and two months after, the laptop started to act weirdly. The HDMI output was randomly working: it detected screens attached to it only after longer and longer time. At the beginning it was only for few minutes, then hours and then I couldn't get it to work at all. I even tried to reinstall Windows on it to check if it wasn't some drivers failing on Linux. But no, same for Windows.

It is almost unthinkable to develop programs on a 14 inches screen without dual screening. I therefore sent my Thinkpad into repair November the 10th 2014 while Lenovo told me it would take 5 worked days to get it back. It was perfect timing since I was about to take a week of holiday. I finally received it 3 weeks later (instead of 5 worked days), December the 2nd 2014. I called and mailed them several times during the wait without them having the courtesy to answer any of my contact attempts.

So finally, I can work again. I don't mind I had to wait a bit more since I had my personal big desktop computer I could take to work (but try to ride your bike with a desktop as backpack and you'll see how inconvenient it is). Well... no. They sent me back a laptop which is DEFINITELY NOT WORKING ANY BETTER. They even sent my laptop with a missing rubber foot (or anti-slip pad or however you call it). The HDMI is still not working and worse, both Windows and Linux don't even detect there is a HDMI output available. They didn't even take the time to test the laptop before sending it back.

Of course, I tested with multiple screens and cables. Not working at all.

I called them, sent a mail, sent a reminder after a week and still got no answer from them.

After posting a rant on Twitter and Facebook and calling them some more times, I finally got a mail from Lenovo on December 18th 2014, offering a free replacement of my laptop. I would only need to give a date and place where to pick up the faulty unit and a date and place where to deliver the new one after we agreed on the replacement unit.

I chose a T440s for twice the price of my S440 (keep in mind if I had no desktop computer with me back then, I would not have been able to work at all during my internship, thus cancelling it) which seemed to be a fairly good compensation.

I left Amsterdam January 22nd 2015 as I ended my internship and had to go back to France to pursue my studies. I specifically asked Lenovo to send the replacement laptop to my home in France but guess what... They messed things up again and sent the replacement laptop to my former office in Amsterdam and never told me it had been delivered. I just had to guess it was there (no package tracing). So two months after the pickup, I mailed them to ask what was happening and discovered the cold truth of their complete incompetence. I had them send it back to France and finally, I got it around mid-April 2015.

Thanks Lenovo for your miserable customer support and being without any laptop (excellent situation for a developer) for more than 6 MONTHS. Be sure, I'll NEVER buy any Lenovo laptop again. NEVER.

Feedback on my internship at Free Electrons

I joined Free Electrons February the 1st, 2016 in Toulouse, France for a six months internship as my end-of-studies project in enterprise. It ended August the 5th, 2016 and I've been in holiday since, so now is the time for a little feedback on the last six months.

What's that?

Free Electrons is an engineering company founded in 2004 which offers services for development in Open Source software programs and currently, offers training for the Linux kernel, the Yocto Project and OpenEmbedded, Buildroot or Android. It also offers its expertise in embedded Linux development for companies willing, for example, to use Linux in their products, to upstream drivers in kernel or build a custom Linux system.

Since its creation, Free Electrons is doing its best to contribute to the Free Software community. It does so by releasing all its training materials under free documentation license. The company also strongly encourages clients to share our combined work with the community and thus has a preference for clients willing to interact with and give back to the free software community by sparing some of project’s time on upstreaming modifications to free software programs.

Well, there is some more about the company in my report.

Actual work

The subject of my internship is "Linux kernel continuous integration via KernelCI.org" but once the main subject has been dealt with, I could work on other small projects such as Linux kernel driver development or other projects depending on clients' needs.

Linux kernel continuous integration

Since the kernel supports several thousands of different platforms, when a developer writes new code for the kernel, he cannot test his code on all the platforms and usually tests only on the platforms he owns. Before merging its code to the kernel source code, some users or other developers might test it on other platforms or in other configurations but it is rather rare. Furthermore, the only way to guarantee a modification works on all impacted platforms is to build the kernel in all its configurations and test on all these platforms if the kernel boots. This is extremely tedious and time consuming.

The main goal of KernelCI project is to implement a continuous integration in the kernel so build or boot failures are detected before reaching the end users. There already are several labs contributing to the project: several from Linaro and few from KernelCI founders. However, they are often expensive (i.e. the Linaro’s lab uses several 500$ APC PDU systems to control the power of boards) and we did not want to put that much money in a small part of the lab so one of the challenges is to have working, cheap (but not hackish) solutions.

You can follow the whole process of thinking, building and integrating the lab in my report or in the article series I wrote on Free Electrons' blog. At the end of my internship, we had a functional lab integrated in KernelCI which provides boot reports since May, 2016 and can be checked here.

I also developed lavabo to allow Free Electrons' engineers to remotely control boards in the lab.

Miscellaneous development

I added the support of a new board (the Allwinner Parrot R16 EVB) in both U-Boot bootloader and the Linux kernel. See the contributions here: U-Boot support and Linux kernel support.

I also worked (and still work) on the driver for all Allwinner SoCs' ADC which can be used either as an ADC controller, a touchscreen controller or a SoC thermal sensor. I started from an existing driver which exposes the touchscreen and thermal sensor controllers to add the ADC controller as well. The forth version of my patches to upstream the driver is ongoing.

Report

The paragraphs above are only short summaries of what have been done during my internship, for a whole explanation, take the time to read my report. The first chapter are in French as requested by the school but don't worry, the interesting parts are all in English ;)

Also, I share the LaTeX version of it on a GitHub repository so feel free to take whatever you like for your report.

Conclusion

I had really a lot of fun working for Free Electrons though the building & integration of the lab were not as enjoyable as I thought it would be but I LOVED working on drivers, board's support, etc. I'm also really happy to announce I'll be a Free Electrons' engineer for years to come :)

Lemon Muffins

A small and easy recipe for my favourite dessert: lemon muffins

Ingredients

  • flour: 150g,
  • sugar: 100g,
  • eggs: 3,
  • butter: 100g,
  • baking powder: 10g (or so),
  • juice and zest of a lemon.

Recipe

  • Pre-heat your oven at 190-200°C,
  • Meld the butter,
  • Mix everything together,
  • Put in muffin moulds (almost entirely filled),
  • Put into the oven around 15 minutes,
  • EAT THOSE DELICIOUS MUFFINS.

lemon-muffins

Good lunch deal

As said in a previous article, Dutch people eat mainly sandwiches as their lunch and therefore, it's a perfectly normal to have a fair number of snack bars near working places or open a "to-go" counter in a restaurant.

That's what decided the Bâton brasserie, at Herengracht 82, 1015BS. It's as much a restaurant/brasserie as it is a snack bar for sandwiches to take away.

Bâton brasserie

Their sandwiches are relatively cheap (~5€), prepared in about 5 minutes, are absolutely delicious and enough for small to medium eaters. Big eaters like me could not eat two, if that's a good indicator.

The best sandwich, from far, is the one with chicken, avocado, white cabbage, bacon, tomatoes, cucumber and a delightful sauce (the best part of the sandwich). That's just... AWESOME. I strongly recommend you to try it!

The snack bar is open Monday to Friday from 9am to 3pm. The restaurant is open throughout the day and even on Saturday but it is not as cheap as the snack bar (8€ that same sandwich).

Small tip for students or young workers

While I had the chance to share a house with awesome roommates, I had some problems with my landlord (who was also living there) which made me leave the house (well, it was also a good excuse to get closer to work).

As I said in a previous article, I already had wandered through Facebook pages and Dutch websites before coming to the Netherlands but I heard from an agency which rent only to students or workers with relatively low wage (2800€/mo gross) at a rather interesting price.

This agency is DeKey and its website is destined to expats willing to stay in Amsterdam for several months. The deal is simple, you leave the appartement in the condition you entered it. Not noisy (well, it's still a student housing but when it's momderate, it's okay).

For 2 months and a half, I lived in an appartement rent by DeKey for a bit less than 500€/month in containers (yes, containers) in Stavangerweg (West side of Amsterdam, near the IJ river). It was a small (20-25m²) room with a bathroom, kitchen and few furnitures: bed, fridge, desk and shelf. The thermal isolation is surprisingly good as opposed to sonor isolation which is not satisfying, but hey! we can't get everything! For the rent and the location, it is a very good deal. Of course, there are other rooms to rent, not only in containers but I could not visit or live in an other room rent by DeKey.

This housing is supposed to be for short stays. 6 months for students, renewable once and only once. You can always ask as I did for an even shorter stay, but you'll be redirected to an other service. If you're already in Amsterdam, visit them at their office or you can contact them by mail (do not hesitate to spam them, they're not really responsive).

For students: fill the form and contact them at least 3 months in advance, appartements are very difficult to have. Some even have a queue for several years!

One of the other reason to chose these appartements is that you can have your BSN (see previous article) and because you'll live alone, you can ask for governmental financial help for paying your rent (up to 180€/month for students!). Be patient for that, it really takes a long time and a lot of papers to give. But hey, free money!

Tourists with cars, be careful!

I lived for 4 months and a half in one of Amsterdam suburbs: the Bijlmer. Former highly criminal (drugs, murders and other joyful stuff) part of the city, it is now way calmer. Anyway, that's just to say that I think I'm legitimate to talk about upsetting stuffs that can happen since, during All Saints' day holidays, someone broke my car window to break into it and check if it had any valuable in it. Of course, it hadn't.

So, being a tourist or an expat, especially during national holidays, if you have a car with a foreign license plate, follow the next advices:

  • avoid "angle parking" or "parallel parking" your car. If you have no other choice, chose a place where there is little chance cars will park near yours.
  • do not let anything in your car (well that seems like good sense). You should hide your GPS or phone support and wipe its mark on the windshield.
  • if you've low esteem for your car, feel it with garbage like McDonalds wrappings or pizza boxes, that might help.
  • put down the luggage cover (that induces nothing else in the trunk). That let the thieves know you've nothing in your trunk.
  • Amsterdam town hall freely offers stickers to put on your car to specify your car does not keep anything valuable. Personally, I think that indicates the opposite: who will have the idea to put that sticker? Those who have something valuable inside to avoid someone breaking into their car.
  • paying parking does not mean safe parking!

And voilà, that's if you still don't want to follow my advice to not take your car to go to Amsterdam. If even with these constraints you want to go with your car, be sure your insurance cover damages in foreign countries!

Driving a car in Amsterdam

I legitimately can talk about driving a car in the Netherlands since I went to Amsterdam by car and I still have it. First thing to know: Amsterdam (like any big Dutch city (Haarlem, Utrecht, ...)) hates cars and does anything in its power to limit them.

They see me rollin', they hatin'

Parking

There are very few free parking lots (technically, only very far from the center) and if they are (free), most of the time you can stay only for a limited time.

To pay is the only solution (do not even think about getting a place with a garage or a private parking). At the parking meter, you will be asked to enter your license plate. Don't be fooled, if you can't see it, it is NOT free, you should look better before assuming it is a free space. Count between 1.30€ and 5€ per hour (if you can find a place where to park) for an outdoor parking and between 3€ and 5€ for an indoor parking. Well, in their greatness, they fixed the maximum rate per day to 50€, how generous!

Some tips:

  • Leave your car outside of the city in a P+R which "offers" for 8€, a parking for the day and a round trip in public transport for each one of your (up to 4) carpoolers.
  • If you can't tell if a parking is free or not, it is not. If after a 5 or 10min lookup, you can't find any parking meter, it's because you are not allowed to park here (and that happens a lot in the very center).
  • There a reasonable number of free parking places near the Kraaiennest metro station. The neighbourhood is not really comforting but I got no problem for the moment (parking 24/7 for 2 months now).
  • Avoid like the plague the free parking near the camping and park of Gaasperplas, there are a lot of thieves attracted by this place.
  • Fines are expensive: from 50€ to 100€. Don't forget to pay them quickly, the fines increase a lot with time!

If ever, by any chance, you find a place to live in the center but you're too stubborn to live without your precious car, you can ask for a residential permit to the town hall but it can (and will) take several months. Here is a link to explain a bit all the process (in French).

Some tips:

Gasoline

When I tell you the Dutch government does all it can to limit cars, here is an example (end of 2014): Diesel costs 1€40/L and the SP95 1€70/L (0€30/L more than the French rates), you can even find the Diesel at 1€70/L and the SP95 at 1€90/L on the highway. Therefore, don't forget to fill your tank before passing the Dutch border!

Traffic

The traffic in the center is a real nightmare. Pedestrians, bikes, scooters, tramways, buses and taxis everywhere. Everything's is slow-paced, red lights every 10 meters (due to the canals). You can also find yourself driving on tramway's rails or on pedestrians roads. In other words, that's complete anarchy. But, you have to be careful and aware of everything around you. Leave a considerable space between your care and the sidewalks on each side of the road to let scooters and bikes go: they don't stop and drive fast. A small moment of inattention and you'll run over someone. At each pedestrian crossing or when you cross a cycling lane, even if the lights are green, slow down and check incoming cyclists from both side of the road. Twice.

We often say to follow a car licensed locally when you're lost. Don't do that in Amsterdam if the car is a taxi or any car with a blue license plate. Indeed, these blue license plates allow vehicles to drive on cycling roads, pedestrian-only roads or bus and tramway lanes, which you are not allowed to take.

Let's talk about speed bumps now. Well, slow down! They're not joking here. Some are so tiny you can't almost see them while others will make your bumper touch the ground at 10km/h. It's in the residential areas where they are the steepest.

Highway exits are worthy of German highway exits: short with a quick 45 to 90° turn. I'll not repeat myself enough: slow down!

Good luck with your car, you'll need it :D

Oh, I almost forgot! If someone's tailgating you or honking at the very first second the lights turn green, do not take it personally, it's not an insult, nor a sign of impatience. That's just how it's done in the Netherlands. Well, someone might also cut in front of you, you could too, nobody will swear at you for that. Be careful, that's all!

[Miam Time] Cloudy with a chance of sandwiches

The first thing I've been told when I said I was going to Amsterdam was that Dutch people actually dislike cooking and eat only by necessity. Dutch people won't eat for pleasure, they'll eat to survive.

To be honest, I don't really like clichés or legends and prefer to make up my own mind. And, surprisingly, the reality is not far from what I've been told (well, it's a generality, but most Dutch people are as told).

You just have to take a look at supermarkets' shelves (nothing better to guess natives' habits): wide shelf for fresh bread, an other for sliced meat and an other for sliced cheese. It's almost impossible to find a salad in an other form than a pack of washed leaves. Everything's done so Dutch people don't have to take more than 5min to cook.

The sandwich is the inevitable part of lunch. I tell you, in two months in Amsterdam, I've never eaten anything else for lunch but sandwiches!

We could stop here and tell ourselves: "Meh, a sandwich, that's not bad!". Well, it has vegetables, proteins and starches (with bread) in it. Yes... but no. That's what foreigners think a sandwich is. I've been stared at with my ham-cheese-tomato-bell pepper-cucumber sandwich. Because here, the sandwich for lunch is also the "Nutella with chocolate sprinkles on it" sandwich. Anything sweet and/or chocolate-y is welcome for lunch.

And that, I can't stand it.

Chocolate sprinkles, because why not?

Help, my house's leaning!

Sometimes, mostly in the city very center, either in Amsterdam or in Utrecht for example, you'll surprise yourself thinking: "Well, this house is leaning, isn't it? And that one too!"

Your head's spinning, you start to question everything you know, your inner ear tells you to lean to match house's facades.

Leaning house in Amsterdam

You're not crazy and fortunately, there is an explanation! No, Amsterdam's ground is not sagging as the famous Venice or the leaning tower of Pisa. Neither it is the product of an hysteric architect.

The explanation is rather simple and logical actually. Houses are mostly narrow and have several (up to 8!) floors because of the land price back in time. People would buy a small surface of land and build a house with a lot of floors because building floors wouldn't cost more in taxes. With such narrow houses and so many floors, there are many steep staircases in the house. Do you see yourself moving a sofa between floors using the stairs? I don't, and neither do Dutch people.

That's why houses leans on the street and why on top of each leaning house there is a pulley to move furnitures in the house from the street (like your old sofa).

[Miam Time] Keep calm and curry on

The curry sauce is to the Netherlands what ketchup is to France or what BBQ sauce is to the United Stated: THE sauce which is mixed with anything and everything. My sister is mixing her wheat or gnocchis with ketchup. Well, here, they dip their sandwiches, frikandels, kroketten (we'll see that later, don't worry ;)) or fries in curry sauce. Every food is eligible to drown in an ocean of curry sauce.

Hot dog with curry sauce and frikandel

A little birdie told me it comes from German-ish habits they took after some years. How not to think of the German Curry wurst and more globally, the German love for the curry sauce?

I tell you, here, the curry is everywhere. The majority of meat I could by in supermarket where curry-spiced, be it pork, beef or chicken. No meat escapes from the curry-y coating. The culinary combinations are surprising but it is still of good taste.

[Miam time] THE Dutch specialty: stroopwafel

Stroopwafel

The power of this candy is without limits. To be fully honest, I literally hate caramel and honey (some are made of it) yet, I fell in love with stroopwafels (literally sirup waffels).

It's made of two thin waffels separated by a layer of caramel sirup. Together, it tastes strong and is very sweet, you could reasonably eat only two or three in a row before being disgusted... but your palate would ask for it half an hour later. Very addictive (and definitely not healthy).

This sweet is really famous here, you can find some everywhere, some industrial, some artisanal. It's so much appreciated, they make ice cream taste like stroopwafels (I enjoyed one in Utrecht... Mmmmmmmh that sweet memory). People even make Ice cream sandwiches out of it, two stroopwafels split with a thick layer of ice cream.

Ice cream sandwiches made out of stroopwafels

Most often, the diameter of the stroopwafel is between 6 to 8cm wide, but do not be surprised to find some having a 15cm diameter or even more!

Try it with(out) moderation!

Holland or the Netherlands?

The Netherlands

You're used to say Holland or the Netherlands for that nordic country thinking that's two words for the same thing. Well, I'm afraid I've to tell you you're in the wrong.

Actually, Dutch people don't really care, they seem to have forsaken being mad at foreigners after all these years. But that doesn't forbid us to tell true from false.

Holland is NOT the country (well, there were a County of Holland for four centuries and a Kingdom of Holland for four years) but Netherlands are and actually, the Holland is a part of the Netherlands since it's the union of two of its twelve provinces (North and South Holland).

Provinces of the Netherlands

Amsterdam is situated in North Holland and as it is the biggest city in the country, it would be logical its capital to be Amsterdam. However, that's not the case. Haarlem, a nearby city on the West of Amsterdam, is actually the capital of the North Holland.

For your culture (and because that's way more than I wanted to share in this article), below is a really interesting video on differences between Holland and the Netherlands.

Find a job

It might happen, like me, that you decide to go to Amsterdam thanks to a job opportunity or, like my roommates, that you decide to come to Amsterdam to look for a job. One option is not better than the other. Everything depends on timing or envy.

Anyway, in both cases, the company won't be the one looking for you (that'd be amazing, wouldn't it?), you then have to do your research because believe me, Amsterdam is a city which has the chance to have a plethora of job or internship offers.

Why in hell would I want to work in Amsterdam?

Well, first thing first: Dutch people are almost all (English) bilingual. Therefore, you don't need to learn the Dutch language and that is a really great news (it's not that difficult to understand but there are some sounds I still can't pronounce).

As told by Amsterdam official website's propaganda, the work atmosphere is informal.

Forget the classic, boring, constraining 8am-6pm work hours, in the Netherlands, work hours are flexible. That's a game changer for me!

I don't think you need me to find a job in one of the myriad of multinationals (but we never know, so here or here and that's why I'll only talk about places where you can find a cool job in a start-up.

I'll obviously start with AngelList because that's thanks to them I found my internship in a start-up from Amsterdam. The principle is close to a dating website: you, job seeker, post your résumé online while the companies post a small presentation of themselves and their possible job offers. Each one wander through candidates or companies and once one appeals the job seeker or the company, a mail is sent to the person concerned to know if the appeal is reciprocal.If that's the case, mail addresses are automatically exchanged and people can continue conversing outside of the website. Here is the shortcut to Amsterdam job offers.

Dutch Startup Jobs seems to work on the same principle. Same as before, here is the link for Amsterdam.

You can also look on eu-startup for news on start-ups everywhere in Europe. It's an excellent way to find promising start-ups or the one which did a fund raising (thus, more likely to be looking for someone).

On this website, you'll also be able to find a fair number of start-ups in the Netherlands.

Also, don't forget some start-ups do not have a website or a postal address! Here (and surely like in some other cities and countries), the start-ups are often overseen by accelerators (such as Rockstart in Amsterdam for example). Look for those "hidden" start-ups! You can find a list of Dutch accelerators here.

I wish you good luck in your research!

Get a Dutch phone number

That sounds useless but actually, it's not for anyone willing to settle in the Netherlands.

Well, it could be seen as optional if you plan on paying cash most of the time (remember, not all shops accept VISA credit card !), if you don't want to have any Dutch bank account, which, by extension, prevents public transport subscription (among others) and might prevent your employer to pay you.

I'll only describe "basic", most affordable phone subscriptions. A sine qua non condition is the possibility to terminate the contract whenever I like (well, not everyone wants to stay at least a year). That leaves us with prepaid (or rechargeable) SIM cards since phone subscriptions need the subscriber to have a Dutch account... which in turn needs a Dutch phone number.

Here are two phone providers present in the Netherlands:

  • Lebara

It's a well-known phone provider available world-wide and which allows to call or send messages to foreign countries at low cost. They're also famous for their 10=20 (or 20=40 or even 50=110) offer which means for a 10€ reload, you get 20€ in credit (isn't it amazing?). Moreover, calls between Lebara users are free!

Their SIM card is available almost everywhere and is free (but always bundled with credit, so actually not free).

You can find all rates here: http://www.lebara.nl/prepaid/Tarieven. For your information, calls to France costs 15cts/min to fixed lines and 39cts/min to mobiles.

  • *bliep

*bliep is a new contender and I present it because it's the one I've chosen. This phone provider works as daily subscription. Thus, you pay a subscription which allows you to do different things between midnights. You've three different subscriptions and one option:

  • 0€ subscription: you can freely receive phone calls and messages. You can use your free minutes offered with a reload or pay 25cts/min.
  • 0.50€ subscription: you have unlimited (2GB) access to Internet but with limited speed, you can send unlimited messages to Dutch numbers and phone with free minutes offered with a reload or unlimited calls with *bliep users
  • 1€ subscription: same as 0.50€ subscription but with unlimited calls to all Dutch numbers
  • 0.50€ option to get unlimited (max 3.6Mb/s) Internet speed

When reloading your SIM card, let say with 10€, *bliep offers you 10min call credit (in addition to what your subscription offers).

The biggest drawbacks are the documentation and official papers only delivered in Dutch and the struggle to get one *bliep SIM card (ThePhoneHouse sells it). The SIM card costs 10€ and can be found in shops for 20€ with 10€ worth of credits.

You can change between subscriptions via their app or by sending a message to a (free) special phone number.

You can find the different rates (in Dutch) here: https://www.bliep.nl/#roaming

Don't forget most of French phone providers offer the ability to use your French phone subscription from anywhere in Europe 35 days in a year. Check if your phone provider offers it before subscribing anything.

I voluntarily did not include LycaMobile because of bad reviews (here, here and here).

Get your BSN

After having found your lovely apartment, you have to (you should at least) register as a tenant. Thanks to this registration, you are now able to insure your place, open a bank account.. and pay taxes (it would not be funny otherwise, don't you think?).

You could actually live (illegaly) without this BSN (Burger Service Number) but you would not be able to do most of the things I said earlier and there are also some chances your employer cannot pay you. Too bad, isn't it? Moreover, you being registered might get you some governement help to pay your rent.

I already told you, without BSN, no bank account but you should know that VISA card are not accepted in all shops (the two supermarkets I shop do not for example). You can always withdraw money from an ATM but your foreign bank can charge you because you withdraw from ATM of another bank in another country. In addition, public transports company (GVB, Connexxion, EBS) ask you to pay your abonnement on the Internet via iDEAL.. which is a service only offered by Dutch banks.

To obtain your BSN, you have to take an appointment at the Town Hall (Gemeente in Dutch). You have two options: either you phone them (+31 (0)20 624 1111) or you visit them (Amstel 1, 1011 PN).

Be quick! Like in every public service, you can wait a lot before getting your appointment (at least two weeks!). You'll need your (valid) ID card or passeport, a birth certificate, a rental contract with your landlord, your work contract (if you have one) and a copy of your landlord's ID card if you're his/her first tenant.

Spare an hour and a half of your precious time for this appointment.

You're now a citizen of Amsterdam, how do you feel?

Sources:

http://www.hollandexpatcenter.com/themes/formalities/bsn_and_social_security_number/?region=egh

http://www.iamsterdam.com/en-GB/living/official-matters/registration

Housing in Amsterdam

After having found a job or while seeking one, it is always a good idea not to be homeless. There exists two different options, one being more temporary than the other:

  • youth hostels,
  • room/apartment rental.

Youth hostels

This solution is only of interest if you're staying for few days or to avoid being homeless, the price per night is pretty expensive. Count on 100-150€ per night in the center of Amsterdam during summer or holidays.

However, if you're a bike fanatic, you could go to "Hello, I'm local" which is an hour and half away from Amsterdam center. Situated in Haarlem, the night costs around 30-40€ in a 14-beds dormitory and the owners are lovely. If you're coming by car, you could have a chance to park it in one of those few free parkings nearby.

Anyway, even if you don't chose to stay in Haarlem, definitely take some time to visit the city, it's worth a look :)

14-beds dormitory at Hello, I'm local youth hostel in Haarlem

Appartement/room rental

As I said, you don't want to stay too long in a youth hostel. It's expensive and you need a bit of privacy, don't you think?

So, now you're looking for a room or an apartment to rent or to share. Again, you've two possibilities: illegaly renting an apartment/room (only for the government, I'm not suggesting you to squat an apartment !) or register yourself at the Town Hall.

However, you can only register if the landlord gives you a rental contract (which is quiet uncommon for cheap places).

Why is it so important? you ask. You have to know that most employers, all banks and some organisms can ask you your BSN (or ex-SOFI number) which is given to you after you've been registered at the Town Hall. Without this BSN, no bank account, which means no public transport abonnement, no mobile subscription, no appartement insurance, etc. I will explain all that in a next article.

How would you know the apartment you're interested in is registrable? Appartement hunting websites and landlords often mention "registration" (kijkavond in Dutch) in their ads. The apartments or rooms that are registrable are often more expensive, due to taxes (on wastewater, wastes, ...) being applied on the number of tenants. You cost them money so I guess it's fair to charge you more.

However, it is rare to find landlors which accept you register for a period of less than a year. The reason is simple: once registered, the landlord cannot unregister you until the one-year anniversary date of your registration. If you forget to unregister, the landlord will pay the taxes for a person which is not renting the room or apartment anymore.

Do not spit on "illegal" rentals, it can save you from homelessness at a way lower cost than youth hostels.

Where to find apartment to rent

Some (paid) websites do their business on it. I passed most of my time on Kamernet and Kamertje which ask you a 30 to 40€/month fee to contact landlords. I (shamefully) paid a two-weeks abonnement to Kamernet and sent around ten mails. 7 were replied to but all turned out to be scams :(

The second possibility is to ask agencies to find you an apartment or take an apartment managed by an agency. Most of them have many apartment to rent and allow you to register. However, be careful, like in France, some agencies sell lists of available apartments which are, of course, for 80% of them, already rented. It is an almost mandatory to deal with agencies if you want an apartment in the center.

The last option is to use social networks, Facebook being the most popular for rentals. There exists a big number of pages linking hunters and landlords and that is how I found my room. Those are the two pages I consulted: https://www.facebook.com/groups/Amsterdamapartmentrentals/ and https://www.facebook.com/groups/amsterdam.apartments/. Don't be fooled, there are a lot of demands and few offers which offers a beautiful playground to scammers.

How much?

For a small room in a big shared apartment, count on 600-800€ per month outside of the center, more than 1000€ per month in the center. Are you looking for an apartment for yourself only? Be rich and lucky or you'll find nothing.

How not to be fooled by scammers

Multiple indicators:

  • quick and long answers (often received 30 minutes after my mail),
  • unclear and generic answers,
  • attractive prices (400€ for a 150m² shared apartment in the very center, come on!),
  • unability to visit the appartement,
  • landlord is not in the country at this moment (last minute moving due to his work, mostly in English-speaking countries like the US or in UK),
  • a VERY basic English (utterly weird for a country in which 95% of the population can speak fluently English),
  • asking you to send money by postal way before receiving the keys (by postal way too), but don't worry, you'll have a copy of a contract signed by a lawyer (yeah, right),
  • pictures (or ad) already used for other ads,
  • almost perfect pictures (shot by a professional), it's not AirBnB,
  • the mail address has already been used to scam.

How to prevent being scammed? Demand to visit the apartment, do not send money. Check the mail address on Google or on scammer hunters websites. Check pictures with Google:

Some common sense people!