Pull-request of my life
I created this pull-request today. I guess that's it: the best pull-request of my life. I'll never be able to top it.
(no functionality has been lost in the process)
I created this pull-request today. I guess that's it: the best pull-request of my life. I'll never be able to top it.
(no functionality has been lost in the process)
I'd never attempted to refund a digital product. Most services explicitly state that they don't do refunds, so I just accepted that reality. There are exceptions, of course, like Steam and you-know-what-VPN. But I think Steam was forced to add a refund feature by law, while for you-know-what-VPN it's probably a marketing strategy: only a small number of users actually invoke their money-back guarantee.
At some point, I learned that people sometimes get refunds through customer support. Today I had the chance to try it myself - and it worked!
I added a few more options for those who might want to contact me, so check out this new contact me page! Previously, there was only my email, and a few people even wrote me (not all of theme were spammers btw).
I included a few other channels, such as:
I thought about IRC and LinkedIn. I might still add IRC (placebo @ LiberaChat), but LinkedIn isn't the place for daily communications for me. It's rather a site I feel obligated to check out from time to time because how relevant it is (was?) for IT jobs in Estonia.
In any case, thanks for your attention to this matter!
I was recently learning how to play a new song on the guitar. While it sounded fine - considering my skill level - when I practiced with a metronome, I struggled a lot to play along with the actual recording. With how some songs are mixed, it can be difficult to pick up the drum track. Even if there is a backing track, the lead guitar can sometimes start alone and be on its own for the first several bars.
At some point I thought: why not add a metronome track to the recording? It would provide a rock-solid rhythmic reference! There must be a way to do this, right? Audacity can do exactly that in just a few clicks.
I recently bought a laptop that came with an RTL8852BE network controller. After installing Debian, I faced an issue with the wireless connection: it wouldn't disconnect or show any errors, but traffic would stop moving. So I went online, looking for a solution.
I wrote about WireMock last year. It's a very powerful tool that lets us replace external services with stubs while testing. Since it can be configured on the fly by tests, it allows us to validate virtually any behavior. Here's how I use it:
In this sequence diagram, a test tells WireMock to return a JSON body for every request to /fetch-details. During execution, the test calls /some-endpoint to validate it. This endpoint needs data from an external service to produce a response, so it requests /fetch-details and gets the JSON body that the test fed WireMock at the start. By changing what /fetch-details returns, we can easily simulate various scenarios.
In this post, I want to cover a case I dealt with recently: form data with decimal numbers.
Navigraph is probably the most popular source of navigation data for flight simulators. Roughly once a month they release a new data package with updated waypoints and metadata, such as altitude and speed restrictions, as well as changes to procedures at airports around the world. Updating this data can be a bit tedious, so they offer a program to help us with that - which, of course, isn’t available on Linux. There isn't much information on this topic online, so hear me out, world wide web: you can run FMS Data Manager using WINE.
As more and more companies migrate from Java to JavaScript for UI and API testing, I decided to study it too. After all, even this blog is powered by React. One of the features I sometimes used in Java is function overloading, which I thought wasn't possible in JavaScript. However, as I've recently learned, TypeScript adds this functionality. Well, kind of.
I've recently switched from Plasma to Cinnamon, and so far, I like it. However, while the latter is more stable, it's also less feature-rich - at least on Arch Linux. So, when I'd installed GNOME Sreenshot, I realized that I can't really configure it through the user interface. It's rather basic, with no settings in the menu to change the default directory or file format.
Search results on the subject were old, with posts dating back 10-15 years, which always makes me suspicious: how relevant is that information today? That's why I decided to jot down my findings.
Today I received a scary looking letter from abuse@hetzner.de, which is my German hosting provider. The text started as follows:
We have received a notification from the German Federal Office for Information Security...
Knowing how notorious German laws are when it comes to intellectual property, I immediately thought: "What did I do?" and "How big is the fine?" To my best knowledge, my blog doesn't violate any rules, yet I didn't expect a message from a Federal Office without any wrongdoing.
Awaitility is an excellent Java library. It's especially useful for working with eventually consistent APIs. For instance, when a client sends a POST, PUT, or DELETE request, you might need to make several GET requests before observing the changes, which is terrible for automated tests. A common solution to this problem is to use Awatility. You can ask it to execute code for n seconds until the request succeeds or the timer expires.
await()
.atMost(Duration.ofSeconds(5))
.until(() -> apiClient().get(id).getStatus().equals("expected"));
Unfortunately, the default error messages could use some work.
Postman has long been, and continues to be, an industry standard for API testing. Numerous beginner courses for QA engineers dedicate sections to explaining how to use it. Software developers, product owners, database administrators, and many others often have Postman installed as well. Another prominent tool is Insomnia.
Both, unfortunately, push their users to create accounts and share often commercial information with their cloud services. I don't mind online collaboration, it can be really helpful, especially in large teams. However, I dislike when perfectly capable products start introducing artificial barriers that persuade customers to use features they don't need and never asked for. Do I need a cloud workspace to work on a course project? No. There's a term for that: enshittification.
A few months ago, I discovered another API client called Bruno, which offers a healthy alternative.
I found myself in a rather silly situation, where I had to replace my perfectly capable smartphone. Even though its battery wasn't good after eight years - once I'd finished a carsharing trip two minutes before it died - the device was more than sufficient for all my use cases. I could take pictures, chat in instant messengers, browse websites, read emails, use an online bank, and so on. From that perspective, it totally satisfied my needs.
With dread in my heart, I connected to the world wide web. I wanted to learn how to code the switch between light and dark themes for this blog, expecting some messy javascript hacks to load either one css file or another. To my pleasant surprise, I found a relatively new function that solves this exact problem: light-dark(). It essentially accepts two arguments: a color for the light theme and a color for the dark theme. Since the browser knows what the user wants, it picks the suitable color. That's it!
It was inevitable, wasn't it? After working on raweceek.eu with its old-school design and spending time looking at other websites a similar aesthetic, I couldn't not update my own blog. After all, this is my personal space on the internet, and right now, I want it to feel more fun and less sterile. This is the first redesign in my blog’s life, and quite frankly, I’m surprised I’m still using it after 1.5 years. Anyway, if you don’t see major changes, try refreshing the page with ctrl + shift + r.
When I created raweceek.eu last year, I quickly decided to build it with React due to my familiarity with the library. However, over time I realized that using so much client-side code for such a simple website was silly. It was like using a sledgehammer to crack a nut. Even worse, older systems couldn’t display the page because browsers like IE6 and its predecessors don’t support contemporary JavaScript features. So I decided to change that.
I stumbled upon a talk by a principal engineer at Financial Times, Katie Koschland. She discussed how their authors apply large language models that her team is developing, the challenges they face, and shared some advice on prompt engineering.
I recently learned about a trie data structure. While it may not be as widespread as arrays, hash tables, linked lists, or binary trees, there are applications where it excels. The main advantage of a trie is that you can search in constant time, regardless of how many elements it contains. This makes tries useful for autocomplete systems, spell checkers, dictionaries, and similar applications.
Last year, I created a tool for rFactor 2 to visualize racing stints. Here's what it produces:
Since then, I'd moved away from GitHub and made all my repositories private just to avoid confusion caused by having the same projects hosted in various places with different code. This led to GitHub Pages restricting access to the visualizer, which I had previously hosted there.
Yesterday I brought it back online. You can now find it here: rf2sv.fakeplastictrees.ee. For anyone unfamiliar with the tool, please refer to my original post, where I spoke about its purpose and limitations.
I was working on the service that powers this blog when I stumbled upon an odd issue.
[INFO] -------------------------------------------------------------
[ERROR] COMPILATION ERROR :
[INFO] -------------------------------------------------------------
[ERROR] /app/service/src/main/java/ee/fakeplastictrees/blog/service/user/model/UserExceptionFactory.java:[8,1] cannot find symbol
symbol: static withData
location: class ee.fakeplastictrees.blog.service.core.exceiption.PublicExceptionFactory
There were 52 more errors like this in different classes. I hadn't changed the Java version or any dependencies since the previous build. Moreover, most of the files that reported failures had absolutely no changes in them. I was able to build this code not long ago! It was as if lombok had suddenly stopped working for no obvious reason. Nothing in maven's log pointed to the root cause.
Photo: not exactly me, but the same energy.
Search results were misleading and suggested that my project was configured incorrectly, even though it had worked in the exact same environment just a couple of weeks ago. Eventually, I found the answer!