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. ...
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. ...
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: ...
USB-Soft-KVM: monitor switching with DDC/CI
USB-Soft-KVM is a lightweight Linux solution that turns a simple USB switch into a full-featured KVM solution. By combining an inexpensive USB switch with software-based monitor switching via DDC/CI, you get complete keyboard-video-mouse control on a budget. This software solution automatically switches your monitor’s input source using DDC/CI commands over the I2C bus whenever you toggle the USB switch by responding to USB device connection events. It’s perfect for users with a laptop and desktop sharing one monitor. ...
Migrating the TQdev.com blog to Hugo
In 2016 I wrote “My name is Maurits van der Schee and I love thinking about software architecture and building high traffic web applications” in my first TQdev.com post when I migrated from WordPress to a self-written PHP blog platform. I wrote “I love the idea of gradually (while writing posts) making this blogging software feature complete”. It was an experiment that lasted for 9 years and most of the time everything was working great. I’ve spent a lot of time writing articles and almost no time improving the blogging software. Now, 9 years later, it was time for another migration. ...
Creating 103mail.com - Update 3
I am still building a free email service that respects privacy and prevents profiling on 103mail.com. I started this effort in 2024 and have been building slowly since (because work and life happens). I have reached a new milestone and it is thanks to SDD (Spec Driven Development with SpecKit) and AI (VSCode + Copilot + Claude Sonnet 4.5) that I have made good progress lately. In this post I’ll explain to you a bit about my way of working and about the progress. ...
Mocking static methods and built-in functions in PHP
Testing code that relies on static methods or built-in functions can be challenging in PHP. Traditionally, you’d have to refactor your code to inject dependencies or wrap functions in testable interfaces. To allow you to write clean, maintainable tests without invasive refactors, I created MintyPHP Mocking. It allows you to write things like: $mock = new StaticMethodMock(Adder::class, $this); $mock->expect('add', [1, 2], 3); $result = Adder::add(1, 2); $mock->assertExpectationsMet(); For mocking static methods, and: $mock = new BuiltInFunctionMock('App\Service', $this); $mock->expect('microtime', [true], 1763333612.602); $service = new Service(); $timestamp = $service->getCurrentTime(); $mock->assertExpectationsMet(); For mocking PHP’s built-in functions. ...
Sipeed NanoKVM USB: a security friendly KVM
Openterface, Cytrence and Sipeed make a KVM over USB product. I have bought the cheapest one: the Sipeed NanoKVM-USB at about EUR 60 (available on Amazon) which includes all nessecary cables. I love the product as it allows me to do repairs and upgrades on any laptop or desktop PC I put on my desk, without having to connect a second monitor keyboard and mouse. Data-center usage This device may not be ideal in the data-center as a permanently installed KVM, as it has no network connection. If you would have one management node, you could install a bunch of these in that node to control the other rack-servers (without opening a new attack surface). It may also be of great help when visiting a (private) data-center. I would always want to have this KVM (and a HDMI to VGA adapter) in my laptop bag as it takes barely any space and may avoid the need of a crash cart in the cold aisle. ...
Software engineering generative AI manifesto
We stand at the threshold of a new era in software engineering. We’ve waited decades for intelligent assistants that understand code, context, and intent and now they have finally arrived. Yet too many developers hesitate, bound by outdated notions of what “real” programming means. This manifesto rejects that hesitation. We believe that embracing AI is not about replacing human creativity, but amplifying it. It’s about spending less time on repetitive tasks and more time solving meaningful problems. It’s about delivering better software, faster, while maintaining the highest standards of quality and ethics. The question is no longer whether to use generative AI in software development, but how to use it responsibly and effectively. Here are our principles. ...
Cannot copy Windows 11 "install.wim"?
When you buy a Windows PC it often comes bundled with a lot of software that you do NOT want. To remove this unwanted software it is recommended to do a “clean install” of Windows 11. When copying the install disk (Windows 11 ISO) to a bootable USB drive you may run into the problem that you can’t copy the “install.wim” file. This post has a solution to that problem. ...