Getting into crochet 2026-04-01 As of today, we re completely rebranding dogeystamp.com as an arts and crafts website! A few months ago, I remembered that joke about how senior software engineers invariably retire to tend to crops and a chicken farm, or to do woodworking. I wanted be ahead of the curve, so I too decided to get a hobby that involved tangible things: I learned crochet , which a way…
Note-taking with Typst and Neovim in 2026 2026-01-01 More than two years ago, I wrote an article about the process of taking notes with Typst in Neovim ; soon after, it became the most popular post on this blog. 1 Since then, however, the contents of that article have become outdated, so I m writing this as an updated version of that post. The goal of this article is to again document how I write…
Chess engine, pt. 6: Neural-net evaluation 2025-05-28 This post is part of a series about building a chess-playing engine. Introduction (0) | ← Last part (5) The engine we built in this blog post series is now capable of playing chess, and it understands the game decently on a tactical basis. However, a common comment from human players was that the engine plays weird . This unnatural-ness is a…
Chess engine, pt. 5: Quiescence search, endgames, repetition avoidance 2025-04-26 This post is part of a series about building a chess-playing engine. Introduction (0) | ← Last part (4) | Next part (6) → At this point in the series, our DIY chess engine has an okay skill level, but it actually has a few major flaws. If you observe the games it plays, it occasionally makes really obvious (to a…
Chess engine, pt. 4: α-β pruning and better search 2025-04-18 This post is part of a series about building a chess-playing engine. Introduction (0) | ← Last part (3) | Next part (5) → In the part 2 of this series, I discussed how the negamax algorithm can be used to construct a chess-playing program. We saw that as negamax thinks more and more moves ahead, it increases exponentially in runtime.…
Chess engine, pt. 3: Elo, and rigorous SPRT testing 2025-03-15 This post is part of a series about building a chess-playing engine. Introduction (0) | ← Last part (2) | Next part (4) → In the last part, we went over the negamax algorithm, which is the core of how a chess engine can play good chess. Honestly though, I think the content in this post is the most important part of the series, in terms…
Chess engine, pt. 2: Negamax search 2025-03-07 This post is part of a series about building a chess-playing engine. Introduction (0) | ← Last part (1) | Next part (3) → In the last post, I covered the UCI protocol, and move generation. Implementing these, it s possible to create a chess playing engine that plays random legal moves. Though it does play chess, this engine is very bad, and it loses…
Chess engine, pt. 1: Getting started 2025-03-06 This post is part of a series about building a chess-playing engine. Introduction (0) | Next part (2) → In this part of the series, I go over all the information you need to write a basic chess engine, one that plays random moves. Such an engine is the hello world of chess; once you get it to run, adding more features is simple. If you follow along…
Chess engine, pt. 0: Index 2025-03-05 Building chess engines, that is, making computers play chess, is seemingly a common pastime of programmers. Of course, I had to try it too, so I created my own engine, chess-inator , from scratch. As it turns out, chess engine development is incredibly addicting (I say this from experience), because there is always more room for improvement in your engine. Now…
WireGuard VPN server setup guide for Linux 2024-06-17 Recently, I decided to set up a WireGuard VPN server for personal use. I found that existing guides about this subject are all lacking in some way. The server setup tutorials I found all go through the commands and configurations needed very throughly, but don t explain why things work. Meanwhile, WireGuard s Conceptual Overview focuses on the…
Reviving a digital piano with new brains 2024-05-17 One day, I was playing my Roland HP-1500 digital piano, which is an incredibly old model. It suddenly started making weird electrical noises, and then it died. I opened the piano up, and looked at the circuit board, but my efforts to figure out what went wrong were ultimately futile. At this point, I had a thought: maybe I could build a brand new…
Lower bound, upper bound in C++, visually explained 2024-04-02 One of the most common problems programmers have to solve is retrieving specific data — finding the needle in the haystack. To make this simpler, languages provide standard tools to perform this task: in particular, this post focuses on C++ s lower_bound and upper_bound . Personally, I find that the documentation for these functions is…
Box-drawing test 2024-02-03 In my last blog post about the LC-3 virtual machine, I made a few diagrams with ASCII art. I found out recently that I didn t have to use + and - and | symbols to make boxes; Unicode has symbols specifically for that. So I m going to use this blog post as a playground for box-drawing. The symbols used here are all copied directly from this Wikipedia article . boxdraw…
Making a virtual machine from scratch (in Rust) 2024-01-20 Computers are wonderful machines that can do many things. However, even though they are very complex, at their core they are surprisingly simple. In fact, with only basic programming knowledge, it is possible to simulate a fully-functioning computer akin to modern ones. In this post, I document how I built a virtual machine for Little…
Contributing to Zathura as a novice 2023-10-24 Earlier this year I made a patch for Zathura, the open-source PDF reader. In this post, I ll document the journey of how I diagnosed the root cause of a bug in Zathura, then wrote a bugfix for it. As this is my first real patch that got accepted, the most important take-away for me is that it s actually not that hard to contribute to open-source. The…
Note-taking with Typst and Neovim 2023-08-14 Warning: This post is outdated! Please see the updated 2026 version , which is a complete rewrite of this article with updated information. A while back, I saw Gilles Castel s series of blog posts about his note-taking setup with LaTeX and Vim. I was quite inspired by the idea, and I even tried it for a while, but gave up in the end. It was less effort…
Using the shell as a file picker for Qutebrowser 2023-06-28 Qutebrowser is pretty great (thanks The-Compiler 3). For those who don t know about it, it s essentially a Vim-like browser: there s a bunch of cryptic shortcuts, but they maximize your efficiency. The best part of Vim, which is replicated in Qutebrowser, is the ability to do everything without taking your hands off the keyboard. Anyways,…
Making custom Arch Linux live ISOs without Arch Linux 2023-06-07 If you ve ever installed any Linux distro, you probably had to do it using a live install environment. Once you flashed the USB drive, you could boot off it and you d be greeted with a Linux system. I ve always found it fascinating that you could pack the entire OS onto a stick and bring it around with you. However, something even…
MinRSS, a lightweight feed reader 2023-05-14 Purpose If you want to read content online from many different websites, the best way is to subscribe to RSS or Atom feeds. It s a simple, universal format for getting content onto your screen. I personally enjoy living in the terminal. One of the more popular RSS readers for this environment is Newsboat . Newsboat has tons of useful features and a…
Hello World (from barf.sh) 2023-05-14 Another year, another static site generator. This time, for the 5th iteration of the website, I m using barf to generate it. Personally, I think the old script I was using, ssg , was really hacky in comparison to barf. One of my biggest grudges is how there was no post list on the front page by default. Most of the people using ssg (including me) had to write…