Maintaining Git History when Spinning Out a Subdirectory
A quick summary of how to maintain git history when moving a subdirectory of a larger project out into its own repository, e.g. when open sourcing a monorepo component.
A quick summary of how to maintain git history when moving a subdirectory of a larger project out into its own repository, e.g. when open sourcing a monorepo component.
Another quick pattern overview and/or reminder for those of us like myself who sometimes miss the obvious: if you need to get a message from some background task, to which you already have the Sender side of a Sender/Receiver pair, rather than creating a new inverse Sender/Receiver pair and dealing with the hassle of storing them, you can just make a quick Sender and send that through the existing…
What use is a dynamic résumé generator if you aren't doing A/B testing? Here, we'll discuss the (theoretical) dividends that my previous unhinged experiments with literate programming, LaTeX, and PDF generation are already (theoretically) paying.
(Or, Maximalist PDF generation with Nix, Make, Emacs, and LaTeX) — I realized recently that it had been five years since I updated my résumé. Because I am totally normal and reasonable utterly deranged, I decided to do a reasonable amount of work create an org-mode to LaTeX to PDF pipeline, and then to use nix to reproducibly build my résumé into this very website. Follow along, and I'll try…
TIL that the tree utility on most (all?) unixes can, instead of printing your directory tree to stdout, make a nice little HTML doc for you instead.
A quick summary of a neat pattern I have found myself falling back on again and again in async Rust programming, in which a struct wrapping an owned Receiver provides one pure method that takes ownership and converts the object into a stream, and another that consumes the stream forever, making for easy testing and easy configuration of concurrent/parallel processing.
Setting up a local NixOS headless server to route all traffic through a VPN via WireGuard, while still allowing local traffic on specific ports for SSH et al.
The state of tech blogging is abysmal. Even posts I suspect of being human-authored are acquiring an style reminiscent of generative AI. I suspect this is because people read so much LLM-produced drivel that they subconsciously mimic it. As someone who is offended by the very idea of content presented as being human-authored that is in fact written by a machine, this is a plea to please read…
UPDATE is a dangerous operation in a high-throughput postgres database, and so it is often best to prefer an insert-only schema. But of course there is no free lunch, and an insert-only schema comes with drawbacks of its own. In this post, we talk about a simple mechanism for manually sharding rows in order to enable high-frequency updates for certain kinds of data. This method is especially…
A crosspost from our engineering blog at work, in which I describe how we managed to migrate databases receiving millions of writes per day to time-partitioned tables without incurring any downtime or performance degradations.
A collection of tips and tricks for riding Amtrak
Today I learned this one weird trick to download a single subdirectory from a github repo, without needing to add the repo as a remote, do a spare checkout, or any of the other typical workarounds.
A quick story of how NixOS saved Christmas
A common question when starting out with nix is "how do I install some particular version of some package?" This is not only a surprisingly complicated problem to solve for new nix users, but also a surprisingly difficult question to find answers to on your search engine of choice. Here, I'm going to cover a few different ways of installing a particular package version using nix, highlighting the…
Looking back on over a year of writing Rust professionally. What were my early concerns, and how did they play out? How do I feel about the language now? What do I like and dislike about it?
One of the great things about Magit is that, through using it, I wind up learning new things about git itself. One of those things is the capacity of git to work with two remote targets, the upstream and the push target. Using separate targets is easy and natural in Magit, but it's also not difficult to bring this workflow into your command-line-driven git experience.
As your emacs configuration gets more and more complicated, it can be non-obvious which of many installed packages (or even built-in emacs functionality) is being called at any given time. Here, we discuss some ways of figuring that out, with a mildly deep dive into exploring which functions are called via the profiler. Somebody on the Internet asked how to figure out which functionality is coming…
2021 was quite a year. From a global perspective it was difficult, to say the least. For me personally, it was a year of significant change, with much of that change being positive, thankfully. In this post, I'll take a look back at the major developments in my life over the course of 2021.
An overview of lessons learned from my time at Bestow, both technical and cultural.
A friend sent me Hickey's talk, "Maybe Not," which discusses some of the design constraints and decisions around optionality in ClojureSpec. Like pretty much all of his talks, it was really thought provoking. Here I discuss my thoughts on it, including whether and how it applies to types in systems programming languages like Rust, how it relates to higher-kinded types in languages like TypeScript…
I added nix support for the blog's development environment, including support for both the upcoming flakes feature and current/legacy nix. Here we dive into why it's neat and how it was done.
I decided to move my blog to GitLab, both for the source and for hosting (via GitLab pages). This post goes into the rationale and process behind that decision.
Cross-posting a post I did for our blog at work walking through the process of compiling a Rust project to webassembly such that it can be made available in a variety of JavaScript contexts, including both node and the browser, with an associated example repository.
It’s been a minute since I put out a list of selected reads, which means we’ve got quite a few today. Lots of Rust, as usual, but also some politics, an article on VSCode, and another Bret Devereux post on academics.
Rust has been the world's most-loved programming language for five years running. That's a remarkable feat, especially for a language that, particularly back in 2015, was barely even a blip on the list of most-used languages. That fact that so many people who used Rust wanted to keep working with it was one of the main things that made me want to try it out, leading it to become my most-loved…
Rust's trait system makes it easy to add functionality to existing types. Here we explore extending Iterators with a new method, so that we can use our new method in Iterator chains just like .filter(), .map(), or .take().
From fancy Rust libraries and applications for working with the command line to deep dives into the role of Greek tragedy in driving psychological catharsis to meditations on the relationship between chess and philosophy, this selection of reads covers a pretty broad range of topics.
It’s been a wild ride this week, with RustConf and the Democratic National Convention generating a significant amount of interesting content to digest, along with the usual steady trickle of interesting reads.
An exploration of some of the ways we intentionally or unintentionally make extra work and churn for our colleagues, how we justify it to ourselves, and how we can avoid it.
Communication is fundamental to the success of an engineering organization, and communication as a core value must be actively promoted in order for the organization to be successful. Most of our necessary communication is either for purposes of learning or education, and it should be expected that leadership roles involve a substantial amount of educational communication. We must therefore be…
Make and its associated Makefiles have been around forever, and have gotten a bit of a bad rap due to people encountering and writing arcane, poorly documented examples. However, learning to use Make effectively can provide a significant benefit to modern software projects, enabling intelligent ordering and dependency management for common tasks that would be a nightmare to implement from scratch.…
creating an RSS (Atom) feed from scratch
actually generating tag content
finishing up refactoring
collecting tags and posts into a nice HashMap
refactoring header parsing in preparation for tag support
Why bother having a custom blog at all?
lessons from growing up on the Gulf Coast
how to compose parametrizations for combinatoric testing
getting a compiler to run on a very old system