RSSAmplifier

Blog

lo.calho.st

Recent content on lo.calho.st

lo.calho.stRSS feed ↗71 posts

Latest posts

Software is like everything else

The following was originally written in my notes app at 2:00 AM on a sleepless night about a year ago. I have just rediscovered it. It is published here in its original form. – an organism is made of organs which are made of tissues made of cells, powered by organelles, machinery defined by genetic codes behaving according to chemical processes which abide by the basic laws of physics when…

The nature of AI discourse has changed

I recently made a post in which I complained about AI and said I wouldn’t be posting about it again. That was a lie. I’m back. But this time instead of dumping my own thoughts on the subject I’m just going to be linking other blogs and articles. These aren’t all strictly about AI – some related topics are included here. Hopefully you can infer why. Why am I doing…

Homelab updates

It’s been a couple years since my last homelab post and many things have changed. Overview There are more VLANs now. Retained from last time, we have: One for IoT crap. One for surveilance. One for Home Assistant. One for work. One for the Steam Link and gaming VM. The new additions are: One for a media server, and One for WAN. The SSIDs haven’t changed from last time, and it’s…

I tried AI and all I got was disappointed

This is another post that I began a long time ago and never finished: it was originally dated 2024-05-05 but I think I started working on it even earlier. At the time, the GPT hype cycle was already well underway, so I finally gave in and decided to give AI a serious try. Prologue: Setting up a local chatbot I didn’t want to give OpenAI any of my money, so I set up a VM with a GPU passed…

Raptor Lake iGPU SR-IOV

A madman embarks on a quest The first line of this post was originally going to be “Last week I posted about getting my wacky new server working .” It is no longer last week, but rather last year. Yes, I started writing this in June 2024 and it is now July 2025. This server originally had two discrete GPUs for VMs to use, but I also wanted to leverage the i9’s iGPU to handle…

An ultra-low profile Chiffre: Le Oeuf

I recently acquired some Kailh PG1425 (“X Switches”) to experiment with. As my first foray into ultra-low profile, I designed a riff on the popular Le Chiffre design. This keyboard is ridiculously thin, measuring only 1.05 cm at the thickest point, and quite comfortable to type on. The open-source design is available on GitHub . I originally picked up these switches for a different…

My latest ergo design: the Solanum

I haven’t had much time to devote to my hobbies since moving, but I’m quite proud to have finally finished a project that I’ve had in flight for the past several months. This is my latest keyboard design: a 34-key split that I call the Solanum. In some respects, it represents a return to my roots with many familiar features from the egg58 : widened spacing, a Pro Micro, TRRS for…

The server has been brought to life

My last post talked about speccing out a server and buying a bunch of parts . This is a follow up in which I declare success and complain about incompatible parts I had originally selected. When I first got started with the build, I was pretty confident, both that it would work and that I would do a good job with cable management. The good news is that it did eventually work. The bad news is it…

It's time for a new server

Setting out to waste some money It’s only been about two years since I built an atrocity of a VM server in a decade-old workstation box. It still gets the job done, but there is empty space to fill in my homelab cabinet so it’s time for an upgrade. In the interest of killing two birds with one stone, I’d like it to replace my old Synology NAS too, which is also perfectly adequate…

Adapting to just 34 keys

A while back I posted about my 38-key layout , and mentioned that the 34-key form factor is quite a bit more common. As it happens, I’ve been dailying 34-key layouts for the past few months and wanted to share the layout I settled on. There are a lot of hyperoptimized layouts for 34-key boards floating around, but they are not really easy to adapt to when coming from a larger board. My…

Expanding LVM PVs and LVs

I’m writing this down because I keep having to expand disks in PVE, but can’t remember the commands for the guest and keep having to google it. Extend the disk in PVE by however much Use fdisk to expand (really, delete then recreate) the partition # fdisk /dev/vda Command: p Disk /dev/vda: 192 GiB, 206158430208 bytes, 402653184 sectors Units: sectors of 1 * 512 = 512 bytes Sector size…

Stick a trackball on your keyboard

Despite having designed several of my own ergonomic columnar split keyboards, I have been daily driving my Corne (crkbd) for the past several months. I removed the tucked-most thumb keys and outer pinky column and thus am using it with a 34-key layout. I usually set up with my mouse (a Logitech MX Vertical) in between the two halves of the board. Recently, I found that the repetitive motion back…

Audio controls in Home Assistant using MQTT

In a previous post , I shared some software I wrote to get my amp to listen to power and volume commands from my TV. Now, I’ve added the ability to control it from MQTT as well. It integrates with Home Assistant, so I can have a nice view that essentially serves as a remote control. It’s quite handy for adjusting volume if I’ve put some music on then walked away. It’s a bit…

It's really easy to make a bike electric

Over the weekend, I converted my seldom-used mountain bike to an e-bike. I never used my MTB much to begin with, but since moving it is even harder to find the time (or a place) for a ride. However, the hills here are pretty steep and this city’s roads seem adversarial to cars. It’s a great use case for a utilitarian e-bike, but I didn’t want to let my old frame go to waste. I…

Introducing another split keyboard: the Chicklet

It’s time for another keyboard post! My latest creation is a 38-key split and today we’ll be talking about its design and development. Layout Key counts for split keyboards are essentially bimodal - there many around 60%, and again many with just 34 keys. A 60%ish split presents ease of use, as it can quickly be adapted to from a standard keyboard. The 34-key split meanwhile begins to…

Blue tape or Kapton? Why not both?

In the 3D printing community, there is endless debate about the best bed surface. In any case, blue (painter’s) tape and Kapton (polyimide) tape are two top contenders for many materials. In my laziness, I have discovered that the best bed surface is, indeed, both. How it works is quite simple: you put the blue tape on the bed, then you put the Kap tape over it. The painter’s tape…

A 60% ortho keyboard with a trackpad: tamago v2

It’s been about five months since I released the tamago60 . In this dramatically delayed follow-up, I’ve made a few improvements. It’s not 100% done yet, but here’s a preview. We’ve got an aluminum switchplate, a 40mm Cirque trackpad, and 58 hotswap sockets. All on a board that fits in a standard 60% tray-mount case. There’s a KB2040 module stuck in the middle…

Streaming QR code detection in Home Assistant

A while back, I set up keyfob access using Home Assistant and ESPHome. It required bodging an RFID reader onto my doorbell, and after some time its 3D printed enclosure has yellowed. Today, out of the blue, an idea: ditch the keyfobs and scanner for QR codes. Important: Ignore the configuration suggested in this post if you’re trying to install this add-on in Home Assistant itself. This is…

It's always DNS; or: why I closed my Comcast Business account

Warning: this post consists of a lot of grumbling and not much technical merit. I don’t usually make blog posts just to complain. However today is different. I’m getting a new roof installed and this means I had to temporarily disconnect the coax that brings internet service into my house, due to the way the cable is routed across it. I was hoping this would be minimally disruptive,…

Geocircles

It’s time to write a post about Geocircles. According to whois, I registered the domain over a year ago, in July 2022. The first commit was made even earlier, in February of that year. History If you haven’t seen it before, Geocircles is a game where you try to place a Street View location on the map. It was originally born as a two-player, turn based game. One player would pick a…

Moving to Hugo and Cloudflare Pages

tl;dr: I migrated my blog from Jekyll to Hugo. It seems more better. I did my best to fix everything, but you find something broken, do let me know. Previously, I had set my blog up on Github Pages with Jekyll as the SSG. I found Jekyll increasingly difficult to work with since then, so decided it was time to modernize by switching to Hugo. The directory structure makes a lot more sense with Hugo,…

The homelab post

It’s finally time for a post about my homelab. Yes, it’s overly complicated. No, it’s not the most extensive. I had planned this post months ago (maybe a year ago) and never got around to writing it. I even made a diagram. Overview We have five (5!) VLANs on our home network. One for random IoT crap, restricted from talking to the rest of the LAN. One for the surveilance system.…

I designed another weird keyboard: tamago60

The original egg58 prototype used Choc V2 switches, which have MX-style stems and therefore support a wide selection of keycaps. However, it turned out that DSA, the shortest keycap profile widely available, would still bottom out if the switches were plate-mounted. The egg58 layout was not really conducive to PCB mounting, so I switched to original Choc switches. This left me with a supply of…

I made my custom keyboard wireless

I don’t have a particular need for a wireless keyboard. I’m usually planted at my desk, with my laptop plugged into a dock and a wired keyboard readily available. But, I thought it would be cool to make a Bluetooth version of the egg58. It turns out, making a keyboard you’ve already designed wireless is pretty straightforward these days. Using a nice!nano microcontroller and ZMK…

The intransmissible packet

In any network, it is a given that there will be loss. We’ve been making computers talk to each other for decades now, and that whole time scientists and engineers have been searching for better ways to compensate for weird things the network does to data in flight. DALL-E, prompted “a lost packet in a computer network. minimal illustration, contemporary style, no text." It’s…

Keycard door access in Home Assistant

I first started fantasizing about keycard access to my home when Ubiquiti announced the G4 Doorbell Pro. I’ve had the original G4 Doorbell for a few years now, and it’s been great. However, when the G4 Doorbell Pro finally came out of Early Access, it lacked the RFID feature that was originally advertised. Based on community consensus, it doesn’t seem like we’ll be getting…

Typing on a weird keyboard: a retrospective

It has been just over a year since I finished assembling the first version of the egg58 , my custom split keyboard. Thus, it seems like an appropriate time to make note of how it has treated me. To recap, I once doubted the idea of a split or ortho keyboard. Eventually, I tried out an Ergodox and came to realize it really does offer increased comfort. However, eternally picky, I decided I needed…

Adapting CEC controls to RS-232

In this article, we will instill a Raspberry Pi with some magic in order for a TV to talk to a hifi amplifier. By the end of the journey, we’ll have the Pi pretending to be an AV receiver, intercepting commands from the HDMI CEC bus, and relaying them to the amp via a combination of serial and IR control outputs. Don’t feel like reading? Here’s the GitHub link. I have always been…

Zip tie to smartify: the dumbest way to upgrade your appliance

Any owners of Samsung laundry appliances out there will know they play a distinctive jingle when finishing a job. I find it incredibly annoying (mostly because it becomes stuck in my head for at least two days after hearing it), however disabling the chime causes me to forget to unload my clothes until I run out of boxers. I’m not a fan of most smart home products, because I distrust the…

Scraping wildfire timeseries data with NLP

New Mexico is facing a severe fire season, and I wanted to visualize the progression of the major fires that are currently ongoing. However, I could not find a usable source of data on daily size and containment statistics. A repository of daily updates exists, however as articles rather than structured data. I ended up scraping the website and applying natural language processing to extract the…

Designing a split keyboard: the egg58

Late last year, I was finally exposed to the comfort of the Ergodox – a staggered-column, split keyboard. However, having been using 60% keyboards for the previous decade, I felt like it had too many keys. While some minimalist split ortho options did exist, I found many of them too minimal or too diverged from the Ergodox design, which I did like in theory. Like any sane person, I proceeded…

A demonstration of TDOA multilateration

Yesterday, a thread popped up on r/Albuquerque where users attempted to identify the source of a loud explosion in the early morning. A few individuals provided their locations and timestamps at which their surveillance cameras detected the sound. I thought I could use this information to pinpoint its source using multilateration. What is multilateration? Multilateration is the process by which an…

How not to build a gaming PC

Over the past month and a half, I’ve been battling the various ghosts and demons that have apparently taken residence in the ancient server chassis that I am now using as a backend for a Steam Link. Since I doubt anyone else on the Internet is insane enough to do this, I suppose I am mostly making this post for myself to refer back to when it inevitably breaks. If, by chance, you do find…

Revised smart doorbell adapter circuit

In a previous post , I described issues encountered when integrating the Unifi G4 Doorbell with a digital chimebox. I designed an adapter circuit, and it worked for a few months; however, eventually I started encountering problems and upon further investigation discovered that some of the assumptions I made about the behavior of the Unifi chime adapter module were incorrect. With this new…

Pulseaudio configuration for soundboard routing

Pulseaudio has been the default audio engine in Ubuntu for several years now, and fortunately it has a very flexible module system that lets you route and mix audio. Today, we’ll be looking at how we can set it up to mix mic and soundboard inputs into a virtual source. I recently wrote a simple soundboard app in Python that uses a MIDI controller to trigger clips, and relied on the fact that…

Adapting a smart doorbell to an incompatible digital chime

Update (2021-12-11): It turns out some of the assumptions I initially made were incorrect, and the adapter circuit described within eventually stopped working. After further investigation, I have made a revised circuit. Refer to the new post For a few months, I’ve been using an Ubiquiti G4 Doorbell , but recently chose to upgrade my mechanical chimebox to a digital one. Though The Ubiquiti…

Dependency and build management for sourcemod with sourceknight

Though I haven’t been playing with it for long, I’ve found that compiling plugins for sourcemod is a huge hassle, mostly due to how dependencies are managed – that is, they really aren’t. For those who don’t know what sourcemod is, you probably have no interest in reading this article. But, if for whatever reason you want to read it anyway, sourcemod is a mod for…

Tools to check for compromised Keepass passwords

It’s 2020, and by now everyone should know the basics of password hygiene: use strong passwords, don’t reuse them across sites, etc. A password manager such as Keepass is an essential tool for keeping track of all the passwords you inevitably end up with under this set of rules. Unfortunately, no matter how good your passwords are, there’s always a chance that they’ll get…

A highly customizable RGB controller implementation for Arduino

I recently decided that I needed to add some color to my workspace, but didn’t want to just use any off-the-shelf RGB controller. My first thought was to use an Arduino to control some RGB strips, but I didn’t want to have to to open the Arduino IDE and modify the firmware every time I wanted to change the program. This desire eventually escalated to implementing a virtual machine on…

Timelapses from Landsat data

I thought it would be cool to extend the scripts I posted about yesterday with the ability to create a timelapse. The above video shows all of the Landsat 8 scenes of WRS cell 33/36 over the course of 2019. The repository has been updated with the code to generate this: http://github.com/tmick0/landsat_fetch

An automated workflow for fetching and mosaicing Landsat imagery

One extension I had been planning for my previous project involving terrain meshes was the addition of satellite imagery to add color to the models. Landsat , in addition to enabling important climatology research and other science missions, turned out to be a great source of open data to use for this. As a step toward integrating this data with my terrain mesh generator, I’ve implemented an…

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. Most 3D printers expect STL models, which define a solid in terms of vertices in 3D Cartesian space and faces (triangles) which connect them. However, terrain…

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. The entirety of this work was done over the past two days, so it likely contains some hidden bugs, but as far as I can tell it is entirely usable. Unfortunately, this is my first…

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.…

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…

Proving a mathematical curiosity.

Today, a thread full of cool math facts appeared on Reddit. As usual, someone mentioned the fact that 111111111 * 111111111 = 12345678987654321 . In another reply, someone pointed out that this also works in other bases. For some reason, I decided that I needed to prove that it works in all bases. To begin, I needed a general formula for values of the 111… terms. This was fairly…

Generating spectrograms the hard way with numpy.

A spectrogram is a convenient visualization of the frequencies present in an audio clip. Generating one involves obtaining the frequency components of each window of the audio via a Discrete Fourier Transform (DFT) of its waveform. While tools are available to both generate spectrograms and compute DFTs, I thought it would be fun to implement both myself in my language of choice, Python. In the…

Integrating GitLab and Google Calendar.

Zeall, like many other software startups, uses GitLab for version control and issue management. We also use the ever-popular Google Calendar to handle meetings, reminders, and deadlines. For several months, we’ve been looking for a way to automatically push GitLab issue deadlines into Google Calendar, and until now it seemed impossible. Only after a recent migration from our own private…

Adding custom fields to packets in ndnSIM 2.3 without forking the entire repository.

The recommended way to build something on top of ndnSIM is to fork its scenario template repository and work inside there. You still need to download and compile the actual framework, however you will simply install it into /usr/local and link to it instead of actually working inside the main repository. It turns out that this workflow actually makes certain tasks a lot more difficult. You might…

An idiot's guide to fulltext search in PostgreSQL.

I love PostgreSQL. It’s probably the most powerful open-source database system out there. Recent features to handle JSON and geospatial data are allowing it to supplant specialized database systems and become closer to a one-DB-fits-all solution. One feature that I’ve recently been able to exploit is its fulltext search engine. It allowed me to easily move from a terrible search…