Storing Chess Games
Introduction Chess is an interesting game that has a long and varied history, especially in computer science. Pretty much since computers were invented (and quite a while before), people have been fascinated with making them play chess. One of the most important parts of making a computer play chess is being able to represent the board and the game in a program. After all, if your program can’t store the game, how could it ever hope to play it? In this article, I’ll be discussing an interesting method for storing a chess game, my thought process in coming up with it, and the odd pseudo-data structure that resulted from it. ...
Reverse Engineering a $25 Bluetooth Thermal Printer
Introduction One of the things anybody who knows me can tell you is that I have an unhealthy obsession with clearance aisles. Any time I go to a store, I always spend a while checking out their clearance section, usually to the dismay of whoever I’m with at the time. Most of the time, it ends pretty disappointingly, since most of the stuff ends up there for a reason. However, I happened to stop at the Walmart in Sterling, Colorado while I was passing through a few weeks ago, and had what might have been the best clearance run of my life. ...
Homelab Revamp
Introduction Last summer, I started concocting a plan to revamp my homelab. Those who know me know that I’m pretty resolute about only using services that I host myself. All of my calendars, contacts, passwords, photos, and other innumerable bits of data are stored fully locally on my own hardware. Even services like language translation, speed tests, and search engines can be self-hosted, and I certainly did. This is great, except for one problem: It’s all anywhere from brand new to several years old. In fact, some of my infrastructure has been kicking since I was in high school, and I’m one semester away from finishing my undergrad. That might not seem long in the world of sysadmin, but my skill level has improved leaps and bounds since I started homelabbing. Trying to work with some of my older stuff is like editing something written by a middle schooler into an essay for a Composition II final. As such, I’m planning on rebuilding everything from the ground up, starting with the network. ...
One man's trash is another man's cluster
Introduction There comes a moment in every student’s life when they have to face a choice: “Do I do the bare minimum for this assignment, or do I want to have a bit of fun with it?” Pretty much everyone will answer the former, including me. Every so often, however, the right assignment comes along at the right time and I just can’t help myself. This time, my Linux Administration class has a required discussion post where each person has to review a specific distro. Sounds pretty neat, but there’s a catch: everyone has to review a unique distro, and they’ve all been chosen by the professor. By pure chance (or maybe not?) I was assigned to review Talos Linux. If you’ve ever heard of Talos Linux, you might be starting to realize the path this is going to take. ...
Getting four microphones for the price of one
Introduction A while back, I found a set of two JBL paging stations at a surplus auction for a good price. I was in need of a good desk microphone, and while these are a bit unwieldy, they have excellent sound quality and range. Additionally, because they are paging stations, each one has four built-in toggle buttons on the base for muting different paging zones. Back from the Dead This works really well with a project I had been working on in the past: The ability to join more than one voice call at once. There is an excellent program called qpwgraph for PipeWire which has the ability to independently mix channels together. This allows for individual applications to be locked to either the left or right audio channel of an output device. With headphones, this means I can essentially have one call on my left ear and one call on my right ear. ...
Publishing articles like Google deploys software
Testing and deploying software are probably two of the least liked parts of making a product, right next to coming up with an idea, writing code for it, and making the product. They’re also two of the most easily automatable parts, since you’re almost always doing the same thing. Because of this, Continuous Integration and Continuous Deployment (CI/CD) have become popular in the last few years. CI/CD allows developers to automatically test and deploy code when it’s committed to version control systems. Since I’ve been keeping this website in a Git repository, it’s a pretty good candidate for a simple automated build and deployment. ...
Building a better calendar
The Problem With the fall semester starting again, everyone’s favorite part of school is back: homework. More specifically, keeping track of when things are due so I can do all my assignments at the last minute. In the past, we would simply have to write everything down when it’s assigned. Unlike the days of yore, however, we have technology now. The South Dakota Board of Regents requires all classes to use the online learning management platform Brightspace. Because of this, we have an easy way to see all the assignments via the website. But using the website is a bit clunky, and it doesn’t stop showing the assignments after they’ve been submitted. ...
PAM Backdoors and Cyber Conquest
Background Earlier this year, I helped put together a competition called Cyber Conquest. It’s a purple teaming competition, so it involves both offensive and defensive security. Each team is given an identical environment, and are expected to hack into other teams while at the same time preventing other teams from hacking them. Tristan, another team member, wrote a great retrospective over on his website if you want to know more. Additionally, a much more animated version of me did a presentation covering what happened, so feel free to check that out if reading an article isn’t really your speed. With all that out of the way, we can get into the the story. ...
Privilege escalation in the most convoluted way possible
Background Recently, I ran into an issue where I needed to update one of my servers. Specifically, this one is running OpenSUSE Tumbleweed, and it has been for about 4 years. Because of that age, however, it isn’t in the most stable of states. I’ve had multiple times where I would have had to reinstall the OS if I hadn’t had snapshots. Of course, this is mostly because it was one of the first Linux installations I ever had, and my lack of experience shows in quite a few places. It also used to be my main desktop, so it has quite a bit of software that you wouldn’t normally see on a server, such as Steam. ...
Putting a 2" Ball on a Horse: Using CGI in 2025
Not Computer Graphics! CGI, or the Common Gateway Interface, was one of the earliest ways to make an interactive website. First developed in 1993, it allowed HTTP servers to call user-defined executables in response to a resource query, as opposed to returning the resource verbatim. Despite its simple nature, CGI is an incredibly powerful tool for creating web applications, and because of its simple nature, it’s also incredibly easy to use. Any executable, in any programming language, can be used as long as it has the ability to read stdin, write stdout, and get environment variables. In fact, the original implementation of PHP was written in C for use via CGI. ...