For the last ten years or so of working on Bundler, I’ve had a wish rattling around: I want a better dependency manager. It doesn’t just manage your gems, it manages your ruby versions, too. It doesn’t just manage your ruby versions, it installs pre-compiled rubies so you don’t have to wait for ruby to compile from source every time. And more than all of that, it makes it completely trivial to run any script or tool written in ruby, even if that script or tool needs a different ruby t...| André.Arko.net
I’ve been working on a CLI tool recently, and one of the things it does is manage files on disk. I have written a lot of file management tests for Bundler, and the two biggest reasons that the Bundler test suite is slow are exec and fstat. Knowing that, I thought I would try to get out ahead of the slow file stat problem by using an in-memory filesystem for testing.| André.Arko.net
Today I stumbled across a jj cheat sheet and it contained an absolute gem of a command that I had somehow completely avoided knowing about this entire time: jj config edit --user. You can just run a jj command to open the config file in your editor! You don’t have to remember whether you put it in ~/.jjconfig.toml, or ~/.config/jj/config.toml, or whatever, you can just edit it! Super great.| André Arko
Today I was trying to figure out how to parse a string into an array in zsh, and eventually found the zsh cheat sheet. This should definitely be posted somewhere much easier to find, or maybe should just be the beginning of the zsh man page.| André Arko
Today I stumbled across a neat tool (written by my Bundler and RubyGems co-maintainer @hsbt) that makes it super easy to get a copy of a gem’s source repo: gem-clone. gem install gem-clone && gem clone GEM. That’s it! Pretty good.| André Arko
I’m a longtime user of jq, but its language is… not intuitive to me. I spent a lot of time searching for prewritten jq programs I can use, or reading the docs trying to figure out the exact thing that I want to do. Mostly, I think to myself “why do I have to learn a new language to manipulate JSON” every time I use it, even if my use is successful and does the thing I want.| André Arko
One of the sillier things I do with my computer is print a horse fortune every time I open a new shell, printed by the even sillier CLI tool ponysay. A long time ago, I downloaded a fortune database from horsefortun.es (RIP), a website full of posts by the Twitter (RIP) account @horseebooks (RIP). More recently, I added a fortune file of posts from “weird twitter”, which added a lot of excellent variety. Most recently, I added one more, of posts by the excellent @utilitylimb. Most famous ...| André Arko
Apple released developer beta versions of all their OSes this week, and in the past I’ve sometimes upgraded my laptop to the developer betas while reserving my desktop/server to run the final releases. The problem with that plan is if there’s a bad bug in the beta, your laptop doesn’t work anymore. 🥲| André Arko
Today I ran hugo new to create a file, and then wanted to edit it. I have fzf set up to let me open files in Vim, but suddenly realized… why doesn’t the file I just created show up as the first option in fzf? Apparently the answer is that it’s really annoying to get a recursive list of files and then sort them by creation date, to the point where [a Reddit post asking my exact question] had no answers.| André Arko
For some recent client work, I needed to create a PDF out of a webpage. I already had CSS to create the underlying design, so all I really needed to do was set the page size, and add some header and footer images to each page.| André Arko
I stumbled across neal.fun’s Internet Artifacts site today and immediately spent an hour interacting with the artifacts. The biggest standouts for me weren’t the websites I remembered from back then, but instead the ones that I don’t remember at all. Even though I was theoretically there at the time, I never really interacted with Ishkur’s guide to electronic music, Club Penguin, or The Impossible Quiz. Making historical websites partly alive again is a great framing.| André Arko
This week I re-encountered a problem that has been plaguing me for months, but I never took the time to try to debug it before now. The problem came with a really specific and confusing symptom: any time I installed a newer version of Ruby on my machine, a daily cronjob running a Ruby script would start failing. The specific error was always an FFI exception, with the exact error message FFI::DynamicLibrary.load_library: Could not open library.| André.Arko.net
I’m in the process of switching from git to jj right now. That switch is another post of its own, which I am still working on, but in the meantime I wanted to write up the way that I’ve set up my shell prompt to include information about the current jj repo. If you’re not already familiar with jj, you might find the ways jj is different from git helpful background reading for the rest of this post.| André Arko
While working on my shell prompt for jj, which will get a much longer post on its own shortly, I ran into a fascinating mismatch between different programs’ ideas of “empty”.| André Arko
A few years ago, I wrote about parsing logs 230x faster with Rust, and then followed up with some improvements. Then computers got a lot faster.| André Arko
Hey, nice, my blog has a navbar now! In addition to the (previously hidden) pages for Conference Talks and Personal Projects, there is a completely new page for my Professional Resumé, which I have updated for the first time in uh… probably 12 years. So that’s good.| André Arko
Moving from my usual niche interests to a niche so small that I have only seen two people on the internet who care about this: I have some really great news if you still want to manage metadata tags like it’s 2010 and you’re ripping CDs into iTunes. I’ve updated the most useful iTunes track naming script to ever exist, so you can use it in Music.app on macOS 15.1 Sequoia in the year 2024.| André Arko
I try to use my dotfiles to install software for myself, mainly via Homebrew. This week, I ran into a new automation problem: I wanted to start using a program only available from a private GitHub repo, which requires authentication for downloads. To make things worse, new versions release frequently, so I can’t use a static link to the GitHub Release entry’s asset download link.| André Arko
Last time, we talked about setting up Caddy as a reverse-proxy to puma-dev, providing automatically-managed local development Rails apps on their own dedicated .test domains. Either I missed this back then, or something inside puma-dev or Caddy changed in the meantime, but SSL requests stopped working inside Rails apps today, and it took me a while to figure out what was happening.| André Arko
tl;dr if you boot Mastodon without LOCAL_DOMAIN once, you might be unable to fetch posts from some other instances. If searching for a post URL returns nothing, try running bin/rails r 'Account.representative.update!(username: ENV["LOCAL_DOMAIN"])'. That fixed things for me. So. Four hours of debugging missing posts later, here we are. The symptoms I noticed were: some posts were mysteriously missing on my server, even though they clearly existed on other servers posts that did appear were so...| André.Arko.net
2025| André.Arko.net
We’ve had decades of thought leadership around testing, especially coming from wholistic development philosophies like Agile, TDD, and BDD. After all that time and several supposedly superseding movements, the developers I talk to seem to have developed a folk wisdom around tests. That consensus seems to boil down to simple but mostly helpful axioms, like “include tests for your changes” and “write a new test when you fix a bug to prevent regressions”. Unfortunately, one of those co...| André.Arko.net
This post is a part news, part technical documentation, and part request for comment. I’m going to explain the technical nitty-gritty details of the planned next generation index that allows Bundler and Rubygems to know what gems exist and how to install them.| andre.arko.net