• +43 660 1453541
  • contact@germaniumhq.com

Blog

Use Ansible Don't Clone VMs

Recently I got to be an admin over a few hosts. These hosts were all CentOS-based and in terrible shape. Missing repos, different versions, weird software installed on them. It turns out administrators cloned the VMs, and as time passed, they updated some of them, leaving some behind.


Read more

Writing BPMN Let's Encrypt Kubernetes Operators in Python III

Having event deduplication is a game-changer for several reasons, that finally made the operator writing possible. Let's have a look.


Read more

How to Create Qt5 Python Applications Using PySide2

When doing GUIs in Python, I always see tutorials on either TkInter or PyQt5. Most people don't realize that "The Qt Company" (that's their name, really) has their own API, called PySide2, and it's trivial to use. Let's explore how.


Read more

Germanium Robot Bindings

Germanium has now Robot bindings. That means you can spin it up in your robot test-cases with zero effort. As a bonus, it can also work with your existing Selenium test cases. Let's see how this works:


Read more

Architecture, Customer Value, and Integration Tests

I had an interesting discussion today that I think is worth writing about. I mentioned having a problem with having a very fat component in a system since integration tests usually become a nightmare. The idea was raised that architecture should not be driven by integration tests, but rather by customer requirements and value. While at face value, this seems intuitively correct, is that so?


Read more

Errata on Better Closures

This article is an errata to the previous article I just wrote. Why? It turns out I was wrong in stating that ordinary objects would be better than nested functions. How do I know? Benchmarks. Let's see them now.


Read more

Better Closures in Python Using Regular Objects

If you remember, a while back, I've run into an issue regarding creating callbacks that were bound to the local context. Namely, the garbage collector pressure, and memory usage, since these functions are invisibly linking to the previous stack frames. I found an easy pattern to break these links down, using regular Python objects.


Read more

Python BPMN Event Deduplication With Adhesive

What happens when we might receive many events, but only need to process the last one? For example, in a Kubernetes operator, where events from a custom resource keep streaming in, we want to process only the custom resource's last state. This approach is called event deduplication. Before we created a whole scaffolding around in BPMN, that would wait using locks and manually track the events. Using this is prone to problems that we'll analyze and see the bundled solution offered by Adhesive.


Read more

Vim Auto-Formatting for Asciidoc and Markdown

When writing a Markdown file, or an Asciidoc, you might want to use the vim formatter, to do automatic text wraps. You type gq to call the formatter, and the text splits and wraps correctly. Oh, wait a minute, now all the lists are broken. Now what?


Read more

Python: Fighting the Invisible Memory Thief

I noticed that when processing a lot of events, adhesive would significantly slow down. I always assumed it was because of the way the processing created the execution tokens - with new callbacks tied to each execution. It's all clear now what was going on.


Read more