Keyball44 Viz

The keyball44 is a 40% split keyboard with a built-in trackball. It supports custom keymaps through QMK firmware. As a first step to programming the board, you modify a keymap.c file. It’s easy to make mistakes when editing the keymap.c file, especially when dealing with multiple layers and complex keycodes. That’s where keyball44-viz comes in. keyball44-viz is a command-line tool written in Rust that parses a keymap.c file and generates an SVG visualization of the keyboard layout. ...

November 3, 2025 · 5 min

Busy

Workplace monitoring is a practice that has seen a significant rise since 2020 (a totally anecdotal claim). Maybe you’ve worked with one of these managers that constantly checks if you’re active on Discord, Teams, insert other company chat app. A lot of people work from home these days. It’s not uncommon for folks to want to get out of their chair and stretch their legs, grab a coffee, or just take a quick break from the screen. That break often means an idle system. If you got a whacko boss that monitors status, you might find yourself in hot water for being “inactive” for a few minutes. ...

October 30, 2025 · 4 min

Chip8

A classic weekend programming project is to write a Chip8 emulator. Chip8 refers to an interpreter for a simple instruction set architecture (ISA) that saw use in the 1970s COMSAC VIP microcomputer. You could program the VIP’s CDP1802 processor by writing Chip8 instructions: hexadecimal opcodes that resemble machine code but are more high-level. This article will discuss a number of sticking points you might encounter when implementing your own Chip8 emulator. Note, the issues discussed here are language agnostic. At the end of the article, you’ll find a link to a Rust implementation of a Chip8 emulator that can serve as a more complete reference. ...

July 27, 2025 · 8 min

Setting Up a Local LLM

This is a quick and dirty guide to setting up a local LLM. You’ll see how to run the Qwen2.5-Code-3B-Instruct model on your local machine using vllm. You’ll then setup the CodeCompanion plugin in NeoVim for interacting with the model directly from your editor. vllm Installation and Server Setup Step one is to install the vllm CLI utility: python -m venv local-llm source local-llm/bin/activate pip install vllm The vllm tool will download and standup a local server for the model. Take note of what hardware you have available (RAM, CPU, GPU/VRAM) and then browse models at hugginface.co. This example kicks off a Qwen2.5-Code-3B-Instruct model server: ...

June 13, 2025 · 2 min

keyball44

The world of keyboards is vast. It’s easy to get lost in the sea of options and opinions. That said, it’s worth searching through the noise to find a keyboard that works for you. This is especially true if you’re a programmer or work a desk job. A good keyboard can not only affect your productivity but also your health. This article will discuss the keyball44, a 40% split keyboard design originally produced by Shirogane Labs. ...

May 13, 2025 · 7 min

Plasma

If you’re familiar with the demo-scene, you’ve probably seen the plasma effect: In this article, you’ll learn how to implement plasma effects of your own. The Algorithm To generate a plasma effect, you iterate the pixels in the screen buffer. For each pixel: Apply a function to the pixel’s coordinate producing some value \(v\). Use \(v\) to calculate the new RGB value of the pixel. Update the pixel’s RGB value in the screen buffer. Repeat steps (1)-(3) until you have processed the entire image frame. Display the updated frame. Applying these steps at a high frequency creates the plasma animation. As you’ll see, the choice of function determines the shape and scale of the output image. ...

February 13, 2025 · 3 min

Port Scanning

Port scanning is the name given to the process of discovering open ports on a remote host. In this article, you’ll explore the design and implementation of a basic port scanner written in Rust. Starting with a Ping Utilities with port scanning capabilities often start by sending a ping to the target. For example, nmap pings the target before scanning. This ensures the target is reachable. To send a ping or an ICMP packet, you need to create a raw socket which requires the CAP_NET_RAW capability. A regular user doesn’t have CAP_NET_RAW capability meaning a ping requires sudo or elevated privileges. Luckily, modern Linux provides unpriviledged ping. The unpriviledged ping uses a dgram socket rather than a raw socket. ...

January 21, 2025 · 7 min

colorbot

A previous article explored writing rsbot, a scriptable auto clicker meant to automate training the most repetitive skills in RuneScape. As a recap, that bot would take as input a script defining click events where each click event includes an ID, click box, and delay range. The bot would continuously execute each event. Executing an event means randomly clicking within the click box and waiting a random amount of time within the delay range. Bonus points, rsbot mouse movements look human. ...

January 15, 2025 · 8 min

androidVNC and Linux

Have you been away from your PC and wished you could login and start a job or view a file? Do you run Linux on your PC and use an Android phone? If you answered yes to these questions, you came to the right place. In this article, you’ll see how to connect to and control your Linux PC from anywhere in the world using your Android phone. Required Software On your Linux PC, install the following packages using your distro’s package manager: ...

October 12, 2024 · 6 min

TigerVNC on Linux

Virtual Network Computing or VNC makes it possible to remotely access the graphical desktop environment of another machine. There are a number of projects out there that implement the VNC protocol. Typically, these projects provide two applications: a VNC server and a VNC client. The remote target machine runs the VNC server program. A VNC client instance connects to the target’s VNC server. The client application is a GUI application that renders the graphical display of the remote target. The image below illustrates the concept: ...

October 10, 2024 · 4 min