AMD and NVIDIA Do Not Want To Make GPUs Gamers Want To Buy

It is June 2023, and gamers are still waiting for NVIDIA or AMD to release a GPU that is a no-brainer for any of the different price points of the mainstream market. I accept that the RTX 4090 and the RX 7900 XTX are halo products with an accordingly high price tag. Especially the RTX 4090 is impressive in all aspects. But what about the people who do not have over 1000 Orens to burn or do not want to spend that much? The controversy and discussions about NVIDIA’s sub-1k lineup down to the RTX 4060 Ti got me thinking. These cards would be a significant or even gigantic performance upgrade for me, yet I am not interested in them. What about AMD? Seriously, what about AMD? When are they moving their butts and joining the fray?

I am aware that it is about maintaining margins and keeping all their Scrooge McDucks happy. I also know that gaming products do not sell for as much as professional workstation- or enterprise products, with AI being the new hotness.

(Let’s hope it turns out to be more useful compared to the mining energy waste.)

How much time did NVIDIA dedicate to gaming hardware at Computex 2023? But is this really worth antagonizing a vast and vocal audience that has enabled AMD and NVIDIA to get where they are? From the looks of it: Yes. When considering a younger Jensen Huang’s statements, NVIDIA’s position is especially curious.

Read More »

Horizon Forbidden West: Burning Shores DLC Review – More Great Horizon (PS5)

Of all the games I played last year, Horizon Forbidden West was my absolute favorite. I love the lore, the lead character and supporting cast, the storytelling, and the combination of action combat and adventure-like exploration and exposition. It should come as no surprise that I was very excited about the Burning Shores DLC when it was announced last year.

With that being said, expansions are usually not my thing. Most spin their own standalone tale within the framework of the main game but do not extend it or move it forward. Unless the gameplay is outstanding and the sole driver of the experience, DLCs face an uphill battle trying to convince me. And even in those gameplay-is-king cases, like Control, the expansions failed to entertain. I want more lead protagonist, more main story. Random side content that may or may not have ties to the main events rarely tickles my fancy. The issue comes down to the importance and meaningfulness of the new adventure. What could be significant enough to jump back into a game when the main objective is completed and the big bad boss is defeated?

(Rhymin’ and stealin’)

Horizon Zero Dawn’s expansion, The Frozen Wilds, was a new adventure, yet it also laid some groundwork for what would come in Horizon Forbidden West. Together with the fact that I just really enjoyed Zero Dawn, I happily played it. Forbidden West was an even better game, and I expected something similar from its DLC. In fact, it was my most anticipated “game” in 2023.

Burning Shores did not disappoint and delivered more of what made the base game an extraordinary experience: gorgeous visuals, entertaining combat, a couple of new machines, new skills, another Zenith threat, and a new side to Aloy’s character.

I immensely enjoyed my time in the destroyed and flooded future Los Angeles, and I want more Horizon because of that.

(Tomorrow, if possible. Kthxbye)

I think I can keep this review relatively short since the game’s core is still the same. We’ll see how it went when I write my famous last words 😉.

Read More »

CMake Multi-Project Template With Library, App, Tests

CMake is a powerful tool but can also be very complicated and daunting when starting out. Much of my C++ career took place in Microsoft’s Visual Studio on Windows, so I am mainly used to the IDE maintaining the build system and relying on a graphical interface to configure dependencies. I started my WorkTracker utility this way – Visual Studio in combination with the Qt plugin.

Eventually, I migrated to Qt’s build system, qmake, and after that, to CMake. This is how I managed to build WorkTracker on macOS. If I am honest, though, I took a minimalist approach and learned only as much as was necessary to get it working. I like building an application, not knowing about build tools.

As a result, the resulting build script was mostly a hodgepodge of somewhat modern and outdated CMake. My lack of more profound knowledge – which I still do not claim to have – and the convoluted CMakeLists file of WorkTracker somehow presented a mental obstacle for me to start improving it or build other C++ tools.

To remedy this situation, I started looking at the bare minimum modern CMake. I set up a template repository containing a library, an application based on that library, and a Googletest-based testing application. This should provide a good starting point for new projects and give me enough knowledge to slowly start dissecting parts out of WorkTracker and create one or more libraries from it.

Read More »

Detroit: Become Human Review – The AI Game (PS5 + PC)

Yes, this is a controversial title, and I am definitely playing the clickbait game. Yet, I also believe that it is not that far off the truth. Depending on your viewpoint, you can interpret “The AI Game” as a game generated by AI or as a game whose core idea revolves around artificial intelligence. Detroit: Become Human falls into the latter category.

Broadly speaking, our contemporary understanding of AI focuses on generating text or images, and attempts at creating music also exist. The results are truly astonishing and also frightening. Imagine the political damage a convincing AI-generated deep fake could cause. Leaving this discussion aside, Detroit: Become Human takes AI further and introduces Androids into a not-so-distant future version of Detroit. These Androids look and behave like human beings and are supposed to follow a specific programming for given tasks. Still, circumstances enable some to break free of their restrictions and start thinking and feeling like living beings. And at that point, the question becomes: are they living beings?

Read More »

Ratchet & Clank: Rift Apart – A Technical Showpiece I Recommend (PS5)

Ratchet & Clank: Rift Apart is my first Ratchet & Clank ever. I did not even know this franchise existed until I saw it being part of the early PlayStation 5 launch titles. As a Digital Foundry subscriber, I received all my information, especially what made it a technical showcase, from their excellent coverage and discussions. I was interested in the tech, but impressive visuals or other technical prowess alone do not make for a good game. The gameplay looked fun, however, and I stored that title on my maybe-if-I-ever-get-a-PS5-I-might-play-it list.

That day has come, and my recent test of Sony’s version of Game Pass afforded me a 50% discount on that title. Considering Sony still charges 80€ on their digital store, it was quite the price reduction. Amazon isn’t any better, either.

I called Kena Bridge of Spirits “essentially an interactive animated Pixar movie “. Ratchet & Clank falls even more so in this category. Kena focuses more on gameplay and combat, whereas Ratchet & Clank: Rift Apart strongly concentrates on characters, the narrative, and cinematic storytelling. If you string together all cutscenes and in-game conversations, you essentially get an entertaining, family-friendly animated movie. And all that is wrapped in a visually stunning real-time package.

Let’s get into it and look at a few nice pictures, shall we?

Read More »

Connect Spring Cloud Stream With Kafka Binder to Azure Event Hub

In two previous blog posts, I explained how to create a Kafka consumer and producer with the Spring Cloud Stream framework. In the Famous Last Words section of the producer, I already hinted at the notion of utilizing this technology for connecting to Azure Event Hub. While doing so, I discovered an error in one of Microsoft’s examples that has cost me about two days of work. I show you how to avoid the dreaded “Node -1 disconnected” error.

In this tutorial, I explain how to use the exact same code to connect to Azure Event Hub using a Shared Access Signature Token (connection string) and a Service Principal.

I have good news and bad news. Which one first? The bad? Okay, here we go:

There will not be any code in this tutorial, only YAML configuration.

Now to the good part:

There will not be any code in this tutorial, only YAML configuration.

This is the beauty of Spring Cloud Stream. Granted, I am not even swapping the binder for an Azure-native variant. So why would there be any code changes? But let me say this: I briefly plugged in the Event Hub Binder without changing the code in my research on getting this to work. Even the updates to the config were minimal. A few Event Hub-specific settings, especially the Storage Account for checkpoints, and that was it.

Enough foreplay; let me explain what you likely came here for.

Read More »

Produce Messages With Spring Cloud Stream Kafka

Update:

In a recent post, I explained how to create a Kafka Consumer application with Spring Boot using Spring Cloud Stream with the Kafka Binder. In this installment, I explain how to build the other side of the Kafka connection: the producer.

The main concepts are the same. The most significant change is that instead of a Consumer<T>, you implement a Supplier<T>.

Read More »

Package Qt6 macOS App Bundle With Translation Files In CMake

Recently, I wrote about how you can create a macOS app bundle with CMake for a Qt6 application. I omitted the inclusion of translation files, which also required code changes. Well, I figured it out and will briefly explain what I had to do.

In my WorkTracker application, I store the language files in a folder called “l10n” at the project’s root. The first thing to do is instruct CMake to copy the *.qm files to the app bundle’s “Resource” folder. I have done that before for the app icon, and the process is similar for this kind of file.

set(l10n_files
    "${CMAKE_SOURCE_DIR}/l10n/qt_de_DE.qm"
    "${CMAKE_SOURCE_DIR}/l10n/de_DE.qm"
    "${CMAKE_SOURCE_DIR}/l10n/en_US.qm"
)

set_source_files_properties(${l10n_files} PROPERTIES 
    MACOSX_PACKAGE_LOCATION "Resources/l10n")

qt_add_executable(WorkTracker MACOSX_BUNDLE 
    ${worktracker_src} 
    ${app_icon_macos} 
    ${l10n_files})
  1. Define a variable l10n_files that contains all the files.
  2. Tell CMake that these files shall end up in the app bundle, in the “Resources/l10n” folder, to be precise.
  3. Include the files in the call to the qt_add_executable function.
A macOS Finder window showing the contents of the "Resources/l10n" folder in an app bundle.

Now that the translations are part of the bundle, a minor modification to the code tells the application where to find them. The Qt documentation contains a section about using macOS APIs to determine the bundle location. That is not necessary, though. Qt also has a helpful method to achieve the same goal, QApplication::applicationDirPath().

#if defined(Q_OS_LINUX)
    // On Linux the translations can be found in /usr/share/worktracker/l10n.
    auto l10nPath = "/../share/worktracker/l10n/";
#elif defined (Q_OS_WIN)
    // On Windows the translations are in the l10n folder in the exe dir.
    auto l10nPath = "/l10n/";
#elif defined (Q_OS_MAC)
    // On OS X the data is somewhere in the bundle.
    auto l10nPath = "/../Resources/l10n/";
#endif

auto appDir = QApplication::applicationDirPath() + l10nPath;

This method returns the absolute path to the “MacOS” folder inside of the bundle, the folder where the application’s binary is located. Appending /../Resources/l10n/ first navigates up to the “Content” folder (via /..), which is more or less the bundle’s “root” directory, and from there, goes to “Resources/l10n”. Finally, the language files are loaded like on Windows, and the translation works as expected.

I hope this was helpful because I could not find much information on this specific topic.

Thank you for reading.

Pentiment Review – I Recommend 66% Of It (PC & Xbox Series X)

It may come to you as a shocker, but I have never played a point & click adventure game, like the well-known Monkey Island series, for example. It is something I know exists and is beloved, yet I never touched it, despite several releases of the franchise being of my time. Pentiment falls into the same game category, and the coverage I follow had high praise for that title.

So, when I got sick recently, I figured this would be a chill game to pass the time while trying to recover.

Read More »

Package Qt6 App as macOS App Bundle With CMake

The Qt documentation contains all the necessary pieces to create a macOS app bundle. Some steps require CMake configuration, while others require manual labor, i.e., terminal commands. Ideally, you, the developer, want to automate the whole thing and not enter the commands every time you build a release.

You can do that with CMake, and this How-To will show you what to do. I am taking my WorkTracker application as an example since it isn’t just a little toy with an executable binary. It is a fully functional application I use daily at work (albeit on Windows) with icon resources, language files, and several Qt libraries and plugins.

Note: I will not elaborate on the language file topic, as it requires code changes to find the translations in the bundle file. This post focuses on automating the app-bundle creation and setting an application icon.

Read More »

Consume Messages With Spring Cloud Stream Kafka

Update:

Spring Cloud Stream is a very complex topic and a remarkable piece of technology. It builds on other intricate Spring technologies like Spring Integration and Spring Cloud Function, and when you add Apache Kafka to the mix, you have a steep learning curve on your hands.

There is a lot of documentation to read and comprehend, and I do not think it helps that your first interaction with the technology is by showing off. Here is the sample in the “Introducing Spring Cloud Stream” section.

@SpringBootApplication
public class SampleApplication {
    public static void main(String[] args) {
        SpringApplication.run(SampleApplication.class, args);
    }
    @Bean
    public Function<String, String> uppercase() {
        return value -> value.toUpperCase();
    }
}

That supposedly is a fully functioning application. The uppercase() method consumes and produces simultaneously, essentially turning it into a way software can pleasure itself. To understand this example, you must know about all the Spring Boot auto-configuration magic happening in the background. Otherwise, it is an opaque magical, and indecipherable showpiece.

This post will show a practical example of a simple consumer application receiving messages from a Kafka cluster. This was my use case, and while the documentation contains a ton of helpful information, it only succeeded in confusing me at first, coming to the technology with fresh eyes. As a result, it took me a long time to put together all the pieces before I understood what was going on.

Read More »

My Year in Gaming 2022 – Game of the Year and Others

Last year, I wrote a summary of all the games I played in 2021. It was one of the ways of coping with the stress I deal with at work. And I like games. And writing. And writing about games. And digressing.

Two does not yet make for a series, but I’d like to continue the idea, and maybe I can turn it into one. So, here is my gaming year 2022 in review. I am not yet confident that I have nailed the format, so this blog post will differ in style from the inaugural version. I will start with a bit of story mode, as I am wont to do. Afterward, I’ll present the games in the order I started (or finished?) them. We’ll see. Lastly, I’ll reveal my Game of the Year in 2022.

AND DON’T YOU DARE JUMP AHEAD WITHOUT READING THE REST!

Read More »

AD Workload Identity for AKS Pod-Assigned Managed Identity (Cross-Post)

Managing credentials and other types of access tokens is a hassle. In Microsoft’s Azure Cloud, you can take advantage of Service Principals and RBAC. But even then, a Service Principal requires a password. There is a better solution in Azure called Managed Identity. But how can you employ this feature when your workload runs in AKS? There is a solution, and I’ve explained all you need to know in an article on my employer’s developer blog.

There was this thing called Pod-Managed Identities, but that was pretty elaborate in its setup. Azure Workload Identity is much leaner, making the configuration and usage more straightforward. Managing credentials and connection strings in Kubernetes microservices is a hassle I have disliked from the start. Assigning a Managed Identity to an AKS pod or even a Service Principal and then relying on Azure RBAC can make your life as a developer or IT ops engineer so much more enjoyable.

Visit the blog linked earlier to read the full version. It’ll contain my usual bad jokes and is not censored in any way. I’d post the same article 1:1 on this blog if I had not researched the topic on company time.

I hope it can help you, and thank you for reading.

Spring Boot Push Micrometer Metrics to Prometheus Pushgateway

Prometheus, as a metrics solution, gets its data by actively reading it from designated services – a process known as scraping. This approach might not work if your workload contains short-lived tasks, as your task may not fall within the scraping time window.

Luckily, Prometheus has a solution for this: the Pushgateway.

It presents a push-based target for your metrics that itself is scraped by Prometheus. But how do you configure this in a Spring Boot application? Let me show you.

Read More »

Spring Boot Custom Field Error Messages in Class-Based Custom Bean ConstraintValidator

This short guide will focus on a single specific aspect of custom bean validation. If you need to catch up on how to write a custom bean validator, check out the tutorial on reflectoring.io. What is usually missing from these how-tos is the handling of validators for an entire class instead of just a field and how to set custom errors for specific field errors in a class.

Why would you want to write a validator for an entire class?

You may run into a situation where the value of one field of a class depends on the value of another field. For example, the field “type” value impacts which values are valid for the field “content”.

But when you define a custom validator, the validation annotation @interface only represents a single error message. The result is that any field error would result in the same error message. In a web service, this is not very helpful for users of your API.

Read More »