Blog about software development

On this blog I write about programming, system administration, and other tech topics that I love. You can find more about me on GitHub and LinkedIn. — Maurits van der Schee

AI Assisted Programming = Context Engineering

In software engineering, thinking is the expensive part. It always has been. Writing code? That’s the cheap bit. Typing fast is great, but don’t let that speed fool you. Here’s something to remember: code is read many times but written only once (ref: Robert C. Martin). The real cost comes later, when you have to fix bad design. That’s when you pay, and you pay a lot. The real work is in the judgment calls, the choices, and the structure you set up at the start. That’s what makes an engineer valuable. ...

January 26, 2026 · Maurits van der Schee

TQDBProxy: A Go cache for MariaDB and PostgreSQL

There are excellent database proxies out there. pgpool-II, MaxScale, and ProxySQL are battle-tested, feature-rich, and used in production by thousands of companies. I’ve built TQDBProxy as a learning project to explore a different approach: what if caching decisions lived in the application code itself? Custom client libraries for PHP, TypeScript, and Go allow you to (optionally) specify a cache time-to-live (TTL) as an extra argument to a query method. Queries with a TTL are cached for the specified duration and are served stale while revalidating in the background. ...

January 23, 2026 · Maurits van der Schee

TQMemory: A Go Memcached alternative

I have built TQMemory as a high-performance, in-memory cache that can be used as a drop-in replacement for Memcached. It uses the same CLI flags, speaks the same protocol, and under some conditions it exceeds Memcached performance. When used as a Go package, it circumvents network, and can handle over 2.5 million GET requests per second (about 9x faster than Memcached over sockets). See: https://github.com/mevdschee/tqmemory What is TQMemory? TQMemory is implemented in Go, and can be used as both as an embedded library and as a standalone server. It speaks the Memcached protocol (both text and binary), meaning that in server mode it works out-of-the-box with existing clients. ...

January 17, 2026 · Maurits van der Schee

TQCache: A Go Redis/Memcached alternative

I have built TQCache as a fast and simple key-value store that can be used as a drop-in replacement for Memcached or as an alternative to Redis. While surely not as mature, it does offer a specific set of trade-offs that may interest you. It is designed for workloads where both memory efficiency and persistence are priorities, such as session storage. See: https://github.com/mevdschee/tqcache What is TQCache? Implemented in Go, TQCache works as both an embeddable library and a standalone server. It speaks the Memcached protocol (both text and binary), meaning it works out-of-the-box with existing clients, including PHP’s native memcached session handler. ...

January 9, 2026 · Maurits van der Schee

Jinja-like templating for HTML written in PHP

PHP has built-in templating, but mixing PHP and HTML gets messy quickly. Separate template engines like Twig or Smarty add dependencies and complexity. I wanted a small implementation with Jinja-like syntax that’s easy to understand and modify. So I wrote MintyPHP Template. It allows you to write things like: <h1>{{ title }}</h1> {% if user.is_admin %} <span class="badge">Admin</span> {% endif %} <ul> {% for item in items %} <li>{{ item.name }}</li> {% endfor %} </ul> All output is HTML-escaped by default. Variables use {{ }}, control structures use {% %}, and comments use {# #}. ...

January 4, 2026 · Maurits van der Schee

Translating gettext PO files with Google Translate

Managing translations for multilingual software can be tedious. You maintain a POT template with all your strings, and then need to keep multiple (gettext) PO files synchronized and translated. I wrote a small command-line tool in Go called “potranslate” to automate the translation part using Google Translate. Use it from the command line: # Scans for default.pot and PO files in ./locales potranslate --source-lang en ./locales Point it at a directory with POT and PO files, and it will: ...

December 31, 2025 · Maurits van der Schee

Context Engineering: Mastering AI Tools

There’s an old saying: “A craftsman is only as good as their mastery of their tools.” Carpenters master their saws and chisels, surgeons master their scalpels, and software engineers master their IDEs, languages, and frameworks. Today, AI coding assistants are our newest tools. The question is: do you know how to master them? The AI revolution has levels We’ve moved through distinct levels of AI assistance over the past few years. We started at level zero with no AI at all, then progressed to copy-pasting from ChatGPT. We got autocomplete, then inline editing. Now we have tools that can make project-wide changes and act as agents. The most advanced level is where AI helps with architectural thinking itself. ...

December 29, 2025 · Maurits van der Schee

Avoid BigQuery SQL injection in Go with saferbq

When building BigQuery applications using the Go SDK you may allow users to select tables or datasets dynamically. This means you need to include user-specified identifiers in your SQL queries. I was surprised that the BigQuery manual and code examples do not warn about SQL injection vulnerabilities when doing this. Even more surprising: BigQuery does not provide a built-in mechanism to safely handle user input in table or dataset names. The official SDK supports parameterized queries for data values using @ and ? syntax, but these cannot be used for identifiers that need backtick escaping. You may be tempted to use string concatenation, but that opens the door to SQL injection, and should be avoided. This post explains the problem and introduces saferbq, a Go package I wrote to help you write injection-free BigQuery SQL. ...

December 13, 2025 · Maurits van der Schee

Using the AnkerWork C310 webcam on Linux

I recently upgraded the webcam of my main Linux machine from an Ankerwork C200 (2k webcam) to an Ankerwork C310 (4k webcam). The C200 worked pretty well out of the box without having to update firmware or adjust settings in Windows or on MacOS. Unfortunately the C310 was showing a very overexposed picture that was only fixed by moving my face out of the center of the (captured) image. This led me to believe that some option of the Ankerwork C310 was turned on that should have been turned off. ...

December 7, 2025 · Maurits van der Schee

Evaluating PDF24 Toolbox with Simplewall

You can view a PDF in your browser, Firefox does this fast and accurately, no need for Adobe Reader. But even if you want to edit a PDF, you don’t need Adobe Acrobat. On Linux we can install PDF toolkit with a single “sudo apt install pdftk”. But even on Windows there are some good PDF tools available, like PDF24, which even costs nothing. With PDF24 you can do all of the following: ...

December 5, 2025 · Maurits van der Schee