Sapphire Pure Radeon RX 9070

I bought this video card recently. Here’s a mini review.

Fast and quiet GPU. Performance is good enough for any game. I’m playing mostly with 4k resolution, making use of FSR (resolution scaling), especially when FSR4 is supported. 16 GB VRAM is good for the future. FSR4 is a big upgrade over the previous version. Fans are almost inaudible. I wanted the 3 fan version, so it would be quieter. The lowest end “Pulse” has only 2 fans, which should be ok too. There’s LED lights, which I just disabled right away (I don’t care about LEDs). Pure is factory overclocked. Basically, it runs at the same clocks as stock RX 9070 XT, although with less cores it’s still a bit slower. On the other hand, TDP is lower as well. I actually wanted to see if I can underclock it back to “stock” 9070 levels, but that was not possible at least with the official tools.

Main drawback: there’s a little bit of coil whine, depending on FPS. It’s inaudible under 100 FPS. It gets more noticeable at 150 FPS and very noisy at 200 FPS. I tend to limit FPS to 120, so it’s usually not a problem, but I would be careful buying this video card for high FPS monitors (above 200).

Continue reading “Sapphire Pure Radeon RX 9070”

Using value types and aliases for IDs

I really like creating custom value types for encapsulating behavior and additional type safety. Recently, I started adding strongly-typed entity IDs. However, the method I took is slightly different from that other blog post. I figured most of the IDs are going to be the same, only the associated entity type is different. For example, OrderId and UserId, the only difference should the associated Order or User type. Additionally, it’s useful if we can create IDs in generic methods, such as GetNewId<TEntity>().

Continue reading “Using value types and aliases for IDs”

Migrating from log4net to Serilog

I recently got excited about structured logging and decided to migrate from old log4net to Serilog. Adding more classification data to log events is something that will definitely benefit many applications. I tried to search for pros and cons, but it’s difficult to find a real world comparison for a large, complicated web application. Here are my experiences and opinions.

Continue reading “Migrating from log4net to Serilog”

Builder pattern in C# with nested objects

I’ve used the builder pattern a lot recently for writing unit test setups, filling data into in-memory database. It can be used with nice fluent syntax too.

var document = new DocumentBuilder()
  .WithName("My document")
  .WithIcon("mydoc.png")
  .Build();

But what I’ve been trying to figure out, what’s the preferred way to do nested objects (or parent-child-relationships). Let’s say that I’m trying to build a document folder tree. I have folders, inside folders I have documents and sub-folders.

Continue reading “Builder pattern in C# with nested objects”

Proper REST API design is hard

REST (Representational state transfer) is arguably the most popular architectural style for designing HTTP-based web APIs these days. While the basic idea is easy to understand, there’s a lot of corner cases that are not so straightforward. This has been on my mind lately while trying to revise the conventions for VocaDB’s REST API. It turns out that finding answers to some of these questions is difficult, and finding concrete examples of “proper” REST APIs that follow the conventions as precisely as possible is even more difficult. I decided to write something about the issues I’ve faced.

Continue reading “Proper REST API design is hard”