Qt6 QtCreator Crash After Install on Ubuntu 21.04

Hopping Linux distributions, I came to Ubuntu 21.04, and one of the first things I do is install Qt manually. I have described the process in a previous blog post on Linux Mint, and it is the same for Ubuntu. Except for a tiny detail. On Ubuntu, the bundled QtCreator immediately crashes and triggers a "Send Diagnostic" dialog.

$ /opt/Qt/Tools/QtCreator/bin/qtcreator
qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was 
found. This application failed to start because no Qt platform plugin could be 
initialized. Reinstalling the application may fix this problem.

Available platform plugins are: eglfs, linuxfb, minimal, minimalegl, offscreen, vnc, 
xcb.

The fix is simple.

sudo apt install libxcb-xinerama0

I hope this helps. Thank you for reading.

Customize Nautilus Default Bookmarks

Nautilus is the default file manager in basically all Gnome-based distributions. I wonder why I cannot configure the default Bookmarks in the left panel through a context menu with that wide adoption. Is there no demand?

I managed to achieve my goal by editing two files. One is for the user, and the other one is a system file. I have not tried multiple user accounts, but I assume it affects everyone that uses the computer.

I wanted to remove "Desktop", "Public", "Templates", and "Video" because I never need that. What I ended up doing was to also change the location of "Documents", "Music", and "Pictures" to point to their respective OneDrive equivalents. That saves me from creating symbolic links, as I have explained in one of my OneDrive posts.

First, the user file.

vim ~/.config/user-dirs.dirs

#XDG_DESKTOP_DIR="$HOME/Desktop"
XDG_DOWNLOAD_DIR="$HOME/Downloads"
#XDG_TEMPLATES_DIR="$HOME/Templates"
#XDG_PUBLICSHARE_DIR="$HOME/Public"
XDG_DOCUMENTS_DIR="$HOME/OneDrive/Files"
XDG_MUSIC_DIR="$HOME/OneDrive/Music"
XDG_PICTURES_DIR="$HOME/OneDrive/Pictures"
#XDG_VIDEOS_DIR="$HOME/Videos"

Next, the system file. If you only remove entries from the user file, they will be added again the next time you log in. My tests showed that it is enough to customize the location in the user file. The other way around does not work, however.

sudo vim /etc/xdg/user-dirs.defaults

#DESKTOP=Desktop
DOWNLOAD=Downloads
#TEMPLATES=Templates
#PUBLICSHARE=Public
DOCUMENTS=Files
MUSIC=Music
PICTURES=Pictures
#VIDEOS=Videos
# Another alternative is:
#MUSIC=Documents/Music
#PICTURES=Documents/Pictures
#VIDEOS=Documents/Videos

Finally, you need to log out and log in again for this change to take effect.

I hope this helps. Thank you for reading.

OneDrive Sync On Linux Part 3, With abraunegg/onedrive As Daemon

In a previous blog post, I showed another way of syncing OneDrive folders on Linux as an alternative to using RCLONE. It was the Open-Source project “onedrive” by Github user “abraunegg” (a fork of an abandoned project by user “skilion”). One thing I was having trouble with was the installation as a daemon. I used an @reboot crontab workaround to achieve my goal instead. However, I was not satisfied, so I went back to the documentation to see if I missed something. And miss I did. To my defense, other steps I had tried are omitting a necessary detail required to make it work.

I have mentioned the installation in the other post, but I also left out a thing or two that I came across. That is why I will include the setup process again, this time in more detail, and refer you to the other blog post for configuration tips. That is the part I will skip here.

My test system is the same Fedora 34 distribution, and I have also tested the steps on Pop!_OS, which means it should work on the other Ubuntu derivates.

Read More »

OneDrive Sync On Linux Part 2, With abraunegg/onedrive

Edit: There is a part 3 that solves the daemon problem.

It has been about a year since my first blog post about syncing Microsoft’s OneDrive cloud storage on Linux. The last time around, I used RCLONE, which required a more hands-on approach. I have found a new tool that I think is better because it can sync automatically in the background without scripting or manually hacking. It is aptly called onedrive that you can find on Github.

Its name might suggest that Microsoft finally ported their Windows and Mac clients to Linux, but, unfortunately, that is not the case. I would still like to see this happen, and if there is ever a time for Microsoft to do it, it is probably now.

Let me briefly explain how I have installed and configured the onedrive tool to suit my needs. Thanks to good default values, it is straightforward, and you might not need any configuration at all.

(I wonder how I managed to not find this tool a year ago)

Read More »

Xbox Series S – Is It Any Good Or Do You Need a Series X?

In a recent blog post (that I somehow accidentally deleted; thank you to WordPress for having a Trashed section from which you can restore), I already summarized my first impressions of the smaller variant of the new Xbox consoles, the Series S. Now that I have had the Xbox Series S for a couple of months, it is about time that I go into more detail.

There are a few reasons why I bought the Series S:

  • Overall hardware shortage, especially GPUs because I wanted a PC upgrade
  • The Series X was available nowhere or only overpriced (even worse for PlayStation)
  • It was the only console of the new generation available in Germany for MSRP

Before I took the plunge, I was very conscious about what to expect. I watch Digital Foundry videos regularly where their team investigates the performance and target resolutions of many console games, old and new, among other things. From my experience with connecting my PC to my 4K TV, I was confident that a resolution of 1080p is actually good enough for me to enjoy a game. Sure, I can see the difference to 4K. But my TV does an excellent job of upscaling, and the picture does not wash out and become a blurry mess. Therefore, the Series S should not disappoint. And it didn’t. There is a caveat, though, and I will address it in a later section of this probably pretty long wall of text that is going to come.

Read More »

Delete Windows System Folders From Former OS Drive

I demoted a former Windows OS drive to a data drive recently without formatting it. The SSD still contained my OneDrive folder, and I did not want to download it again or copy it from a backup. Therefore, all of the Windows system folders were still on the drive. I tried to delete them, but whatever I did using the GUI, Windows slapped my fingers. I was not able to remove the Program Files and Windows folder.

There is a solution using the command line, though. You must execute all commands in an Administrator command prompt.

Example for the Program Files directory.

takeown /f "Z:\Program Files" /a /r /d Y
icacls "Z:\Program Files" /t /grant administrators:F
rd /s /q "Z:\Program Files"

Gotcha: I have noticed that I had to execute the statements a second time on some folders to delete them finally.

An exception is the Windows directory. It cannot be removed using these commands. I have found another workaround that tricks Windows into believing it is a previous Windows installation. Rename the Windows directory to “Windows.old” and then run Disk Cleanup -> Clean up system files. Windows will detect this as an old installation and offer to remove it.

Documentation

  • takeown
    • /f – Path to folder
    • /a – Give ownership to Administrators group
    • /r – Recursive
    • /d Y – Do not require confirmation
  • icacls
    • /t – “Recursive”
    • /grant – Replace previous permission with new owner and full access (:F)
  • rd
    • /s – Recursive
    • /q – Quiet mode, do not require confirmation

Titanfall 2 Review

It has been a long time since I have played a first-person shooter in single-player mode. The last playthrough was probably the original Half-Life as a Let’s Play on YouTube about three years ago (I expected it to be longer, though). Since then, it has mainly been 3rd person shooters or action adventures. The majority of 1st person shooting games I have played are the Borderlands franchise and Counter-Strike until version 1.6. There have been a couple of others, of course; big names like Half-Life 2, Doom, Unreal (Tournament), Serious Sam, and so on. But that was at a time I would now call my youth. I like the skill aspect of shooters, but other than that, I have not found many that got me interested in a way that made me want to continue to play them. I have barely played through any of the previous games (Half-Life 2 being the exception 😉). In the here and now, I am looking for a well-told story and character development. And by that, I mean the main character’s personality and the relations the character has with others, not a role-playing system.

I have heard many praises about the quality of Titanfall 2, despite it not being a huge hit. When I discovered this game for a whopping 2.99€ in the Xbox game store, I figured why not try it out. Since I usually try to write reviews for games I find noteworthy in a specific way, be it good or bad, there must be something about Titanfall 2 that made me mash some keys on my keyboard and publish it on the Internet. Is it a Witcher 3 or a Battlefield 4? Curious?

Read More »

Xbox Game Pass, Play Anywhere, I Think I Get It

The start of Q4 2020 was supposed to be an incredible time for PC gamers – or gamers in general. Firstly, Microsoft and Sony released their latest Next-Gen consoles, the Xbox Series X and S and the PlayStation 5. Secondly, AMD and NVIDIA battled it out in the GPU market, and AMD unleashed the Ryzen 5000 CPU family that ate Intel’s 10th generation for breakfast. And lunch. And supper, and dinner, and as a snack in between. Unfortunately for Intel, the only thing the 11th generation of Core Processors can do is hold AMD’s beer. In theory.

Excellent Hardware, No Stock, High Prices

I think by now, about six months later, we all know how things played out. It is not about having the best performance anymore. Instead, it is about who can get products on the shelves or into retailers’ warehouses so people can buy them. It seems like the price does not even matter. Some affluent enthusiast gamers may be more willing to overpay for their hobby, and first-time builders might not know any better. I am neither in the first nor in the last category. I could afford new PC hardware, but I am not willing to overpay a single Oren for any of it. The reasons for these prices are manifold, and many YouTubers discussed this very topic in many a video.

The story I want to tell you today is how all of that brought me into Microsoft’s console hardware and gaming service arms. Well, I guess I kind of already spoiled the reason: PC hardware is ridiculously overpriced, let alone readily available to buy. But there is more to it than that.

Read More »

Disable Banners on Sony Android TV (2019 Model)

I’ll try to make this quick. I started gaming on my 2019 Sony Android TV, and it frequently displayed a banner at the top with connection and resolution information. I hate when things constantly pop up, but it also blocked a pretty large portion of the screen. After some research, I found references about older versions of the operating system where Banners have their own menu item. Not on my TV, though, and I was starting to become very frustrated.

The option is there! It is in a location where I did not expect it. Open the settings and navigate to "Watching TV".

I associate that with a cable connection which is why I never looked there in the first place. I do not have cable. Next, disable "Info banner" and feel relieved.

My First Time Playing Battlefield, I Quit After 15 Minutes

I recently purchased the smaller of the Xbox Series, and it came in a bundle with three months of Game Pass Ultimate. As part of Game Pass Ultimate, you get access to EA Play games and, therefore, some of the Battlefield franchise. Since I have never played this game before, and I was in the mood for a simple shooter, I wanted to try it out. I am only interested in the single-player campaign and have no interest in the multiplayer modes. Hence, I base my thoughts on the single-player experience.

The idea of the introduction is not bad. You find yourself trapped in a car with the rest of your squad. It is apparent that there was an accident, and one of your buddies is badly injured or trapped and cannot get out. The situation is intense because the car is sinking in a lake or river or some other large body of water. Panic starts to break out, especially since your leader wants you to leave him behind. He hands you his handgun and orders you to shoot the windows so you and your fellow soldiers can get out. They, on the other hand, do not want to leave him behind. And from there, the game rewinds to where it all began.

Read More »

Ryse: Son of Rome Review

Germany-based company Crytek is best known for its Crysis and early Far Cry games and the CryEngine technology. Ryse: Son of Rome is probably not as well-known, and it certainly is not very popular. The game’s Metacritic score is 61, and the user score is 6.8. The biggest complaint I was able to ascertain was a lack of freedom and extreme repetitiveness. While I cannot argue with that, I also see it as a strength instead of a weakness. If you want to know why I encourage you to continue reading.

Read More »

Sign and Verify JWT With Hashicorp Vault REST API

Cryptography is complicated in more than just one way. Therefore, it is commonly recommended not to roll your own, but instead, employ tried and tested methods. Unless you are an experienced cryptographer, it is likely to overlook crucial things, for example, when to authenticate an encrypted message – before decrypting or after? This blog post is about JSON Web Tokens that are digitally signed with an RSA key. Instead of implementing the signing and verification code yourself, you should be using a dedicated server component to do the complex crypto for you, like Hashicorp Vault.

Read More »

Write ID3 mp3 Tags, Cover Art with Python and eyed3

In March 2019, I wrote about using Python with the "pytaglib" library to read and modify audio files’ metadata. This solution worked nicely for what I needed at the time, but as I rewrote my WAV-to-MP3 conversion in Python, I found that it lacked support for adding cover art to the files. After a bit of research, I found eyed3. It also comes with a nice side-effect: it does not require installation of the Taglib C++ library.

Installation is simple.

pip install eyeD3

Additionally, on Windows, you need this, too:

pip install python-magic-bin

For more details, visit the installation guide. Like my old pytaglib post, I will keep this one short and only show code samples for the most relevant tasks.

Before you do anything, import the eyed3 library, of course.

import eyed3

Load a file.

song = eyed3.load(file)

If the file does not yet have any tags, you must create them before setting any metadata.

if not song.tag:
    song.initTag()

Note that this erases existing tags, so only call that if you start from scratch. Now you are ready to set the individual tags or read them if you need them.

song.tag.artist = "Behemoth"
song.tag.album = "The Satanist"
song.tag.genre = "Black Metal"
song.tag.recording_date = 2014
song.tag.track_num = 4
song.tag.title = "Ora pro nobis Lucifer"

The important piece for me, write cover art.

with open(cover_art_filename, "rb") as cover_art:
    song.tag.images.set(3, cover_art.read(), "image/jpeg")

The value 3 indicates that the front cover shall be set. See the documentation for other values. If you are an iTunes user, then select 0 for "Other". iTunes does not seem to like "Front Cover" 🙄.

You may run into a warning message like the following if you use genre names not defined in the ID3 specification.

eyed3.id3:WARNING: Non standard genre name

You do not need to worry about that. If it annoys you, add the following line to your code. eyed3 still writes the tag without any issue.

eyed3.log.setLevel("ERROR")

Convert Java POJO With Protobuf field to JSON Using Jackson

In this blog post, I will explain how to convert a regular Java class that contains a Protobuf message field to JSON using the Jackson library, for example, in a Spring Boot application as a return value of an @Controller method.

You might wonder, how this is such a big deal? After all, you can create complex POJO hierarchies, and Jackson will pick them up just fine. Well, maybe this error message will convince you.

o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [
    Request processing failed; nested exception is org.springframework.http.converter.HttpMessageConversionException: 
    Type definition error: [simple type, class com.google.protobuf.UnknownFieldSet]; 
    nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Direct self-reference leading to cycle 
    (through reference chain: com.thecodeslinger.ppjs.web.dto.AwesomeDto["awesomePowerUp"]
        ->com.thecodeslinger.ppjs.proto.AwesomePowerUpOuterClass$AwesomePowerUp["unknownFields"]
        ->com.google.protobuf.UnknownFieldSet["defaultInstanceForType"])] with root cause

Java classes that you create with the Protobuf compiler require their JSON converter JsonFormat.Printer. So, how can we get Jackson and JsonFormat.Printer love each other and have a wedding together?

Simple: we create a custom JsonSerializer.

public class ProtobufSerializer extends JsonSerializer<Message> {

    private final JsonFormat.Printer protobufJsonPrinter = JsonFormat.printer();

    @Override
    public void serialize(Message anyProtobufMessage, JsonGenerator jsonGenerator, SerializerProvider serializerProvider)
            throws IOException {
        // The magic sauce: use the Protobuf JSON converter to write a raw JSON
        // string of the Protobuf message instance.
        jsonGenerator.writeRawValue(protobufJsonPrinter.print(anyProtobufMessage));
    }
}

This class is very simple and can work with any Protobuf Message class instance. This way, it is universal and only needs to be written once. The main ingredient is the jsonGenerator.writeRawValue method that takes the input without modification. Since we already ensure a proper JSON format using Protobuf’s converter, this is no problem in this case. Otherwise, be careful with this method.

The last step is to annotate the Message field in the POJO, so Jackson knows what to do.

@JsonSerialize(using = ProtobufSerializer.class)
private final AwesomePowerUpOuterClass.AwesomePowerUp awesomePowerUp;

You can find a complete working example that uses Spring Boot and a REST endpoint on my Github account.

Install Minikube in VirtualBox on Remote Machine for Kubectl

At work, we are using Kubernetes as a way to run our application services. To test and debug deployments before they go into code review and to the development environment, a local Kubernetes is beneficial. That is where Minikube comes into play. Unfortunately for me, our application services require more resources than my work laptop can provide, especially RAM. Either I close all applications and run Minikube, or I have a helpful browser and IDE window open 😉.

Since I need the local K8s cluster from time to time, I wondered if I could run it on my personal computer and access it from my laptop. This way, I can dedicate at least six physical cores and 24 GB of RAM to the VM (even more, but that was a nice number and more than enough).

Read More »