The idea that my blog has been running on Wordpress for all these years has been haunting me. In the back of my head, I’ve been thinking about how not only is the CMS itself known for being full of vulnerabilities, but it’s also built with PHP, which itself isn’t really the most secure. The platform also has too many moving parts for me to be comfortable with – maintaining a VPS with Apache, PHP, and MySQL installations is relatively straightforward, but still has its moments of suffering. [Read More]
Generating terrain meshes for 3D printing
A while back, I thought 3D printed models of the local terrain might be a cool gift idea. To make this a reality, I have implemented a simple Python utility to convert publicly-available terrain data into a format suitable for 3D printing. [Read More]
A graphical tool for configuring Alesis V-Series MIDI controllers on Linux.
In my last post, I explained how I reverse-engineered the Alesis SysEx protocol and detailed my findings. Now, two months later, I’ve finally decided to implement a tool for configuring these controllers on Linux. [Read More]
Reverse engineering the Alesis V-series SysEx protocol.
I recently got back into music production and decided to order myself a MIDI controller. I got a few recommendations for the the Alesis V25, so I went ahead and ordered it. However, I was less than pleased to find that its configuration software wouldn’t run on Linux, even under Wine. Of course, this prompted me to reverse engineer the protocol that lets the software talk to the keyboard. [Read More]
Using black magic to make a fast circular buffer.
Yesterday, I took a glance at the Wikipedia page for the circular buffer and was intrigued by an alleged optimization technique that I was not familiar with: A circular-buffer implementation may be optimized by mapping the underlying buffer to two contiguous regions of virtual memory. (Naturally, the underlying buffer‘s length must then equal some multiple of the system’s page size.) Reading from and writing to the circular buffer may then be carried out with greater efficiency by means of direct memory access; those accesses which fall beyond the end of the first virtual-memory region will automatically wrap around to the beginning of the underlying buffer. When the read offset is advanced into the second virtual-memory region, both offsets—read and write—are decremented by the length of the underlying buffer [Read More]