dinosaurs eat everybody

for all your Dave Schwantes related needs

Playing With Linux

This year I’ve been thinking more about making computers/the internet fun again. Part of this was trying to use more technology without an “agenda”. And that has led me into the arms of Linux.

Last year I picked up a Framework 13 laptop so I’d have a Windows machine to play Minecraft on with my kid. It’s been useful to have around, but Windows 11 was just glaringly aggressive with how much it wanted me to sign up for various Microsoft services. I probably hadn’t used a Windows computer for anything non-trivial since Windows 7 and the change was striking.

I got the urge to try dual booting Linux on my Framework so I installed Ubuntu and used DHH’s Omakub to get it set up quickly. It was kind of fun and I’ve been using as my primary dev machine for working on Lox. Having a project has been helpful for just exploring the system a bit and I found myself switching back and forth between Windows and Ubuntu pretty often on that computer. Omakub really did a good job of making things look nice and providing some good defaults so I didn’t spend a ton of time getting things set up and usable. I dug in to using Neovim as my editor and Alacritty as my terminal.

It’s nice to have things both configured AND configurable.

When I saw DHH posting about Omarchy I was interested. Arch always seemed a little intimidating and I wanted to spend my time using my computer, not fixing/configuring it so having some good defaults and a little hand-holding on the install seemed nice. Due to some disk encryption requirements you’re not able to (easily) dual boot Omarchy right now, so I didn’t think I could replace my Ubuntu setup but my curiosity got the best of me. I found an old 2012 MacBook Air, bought a USB-Ethernet adapter (so I could run the install without wifi working), and put the ISO on a thumb drive.

The installation was surprisingly easy. I expected to run into some wifi issues but everything worked out of the box. Having played around with the Omakub setup on my Ubuntu install, I felt pretty comfortable with a lot of the default applications like neovim and Alacritty as well as some shortcuts like Super-space for the app launcher so that helped a lot.

Hyprland felt like more of an adjustment. This was my first time really using a tiling window manager. I use Rectangle on my Macs for some basic window resizing and positioning but this was the first time I’d really working in a purely tiled desktop. I tend to have a chaotic pile of windows on my screen most of the time so in some ways using a tiled window manager helped me avoid that because if I kept too many things open, the new windows were uselessly small. If I needed more space I used additional desktops or even just closed windows.

The focus on using built in (and configurable) keyboard shortcuts for launching common programs really helped (Super-Return for a terminal, Super-B for a browser, etc.). It made it feel more natural to quickly open things when I needed them and close them when I was done. I also really like the use of “web app windows”, these are basically keyboard shortcuts to open up web apps (like email, Twitter, etc.) in chromeless browser windows via keyboard shortcut. Super-C to open a quick Google Calendar window is really nice and I’ve created and customized a few new shortcuts for myself.

So what about really hacking around with Arch? Well, I haven’t done a bunch of power user stuff yet and honestly I don’t plan on spending a lot of time futzing around with things. I still want to spend most of my time using my computer, not fixing/configuring it. I did put in a little time getting the display to rescale nicely when I plugged into a large monitor and closed the laptop to work in clamshell mode. It was fun to see how much control I had over things, if I wanted it. I might also look into some fun widgets that work with Waybar and Hyprland to display some useful into if I have the time and inclination.

It’s nice to have things both configured and REALLY configurable.

So, am I going to cast off the oppressive shackles of MacOS and Windows so I can live exclusively in the land of the Free and Open Source? Eh, probably not. There are a few reasons I’ll keep using my Mac and have at least a Windows partition somewhere:

  • My M1 MacBook Pro is one of the nicest feeling laptops I’ve ever used. It’s fast, it feels solid, and everything just works.
  • Logic I use Logic for all my music recording. A lot of the people I make music with use Logic. I’m not going to switch.
  • I use iMessage on a laptop a lot. I don’t like typing long text messages on my phone, so I often switch to my laptop to send non-trivial things.
  • Occasionally I’ll find a game I want to play that’s only on Windows (and/or Mac). I’m not a big gamer, and gaming on Linux seems to be getting better, but there are certainly some interesting things that come out that just don’t work in Linux.
  • Sometimes I want things to just work. Maybe that’s a fingerprint reader or my Plex server, but I don’t have as much time to fiddle with things anymore so there are many situations where I’m going to use the tools that get (and keep) me up and running with the least amount of effort.

That said, I do think I’ll use this Omarchy set up a fair amount. I replaced the battery in my Omarchy computer and it’s turned this 15 year old laptop into a very usable machine. I like that my computing environment doesn’t feel like it has an “agenda”. It’s not trying to sell me on any services, just “here’s an OS, try not to get yourself killed.” It feels more like a powerful tool than a product, which is nice these days. Also, it’s just fun to learn something different.

I’m enjoying using Linux and that kinda matters.

Another And Or Not Record

Nobody asked for it, but it got made.

Earlier this month I put out a new EP from my solo project, And Or Not. If you want to skip the self indulgent dive into making this recording and just go listen to it, you can just go check it out.

And Or Not is an exercise in simplistic instrumentation. It’s only bass, drums, vocals, and some keys for a little added texture. It’s a nice balance to the more complex arrangements of things like Grave Danger. Like last time I started by just writing a bunch of bass riffs, recording them into one big project, and then coming back later to pick out ones I liked to build songs around.

Once I’d massaged those riffs into basic song structures I started putting some lyrics together. I’ve given myself a lot of leeway to write about whatever pops into my mind so I ended up writing about my disappointment around the current state of the internet (Let’s Get Weird Again), Minecraft (Bedrock), and coffee (Top Me Off).

For the recording process, I took the demos I made for writing, mapped it to a click and started by laying down the drums. I think I’m a better drummer than I was when I did the first record but it still took a while to get everything down since I was sort of writing parts while I was trying to record them. I think I’ve gotten a little better at recording drums, too.

The bass parts were pretty straightforward to lay down, but I spent a little more time layering my tone. After seeing ‘68 live I got inspired to lean into a noisier, fuzzier sound and not be afraid to build up a more complex tone. I’m using bass amp models from Logic for my tone so I ended up taking the raw tracks and running them through three different amp setups (resulting in 3 tracks for all the bass parts). One track had a really fuzzy tone, one beefed up the low end, and a third focused on brightening the attack. Mixed together I got a really full sound, which was pretty important when there isn’t much else in terms of instrumentation.

I did add some keys, mainly B3 organ, to thicken things up and add a bit of counter melody in a few parts, but it was pretty minimal. Mainly just to add some more texture to the songs.

Finally, vocals.

I’m still not very confident about my vocals, but doing a solo project means that it can just be whatever I put down so I’ve been digging into it. I had a lot of fun layering and doing harmonies on these songs. I also tried to put in a few more “character” elements (“wooo”s, “let’s go!”s, etc.) to help combat the very “studio only” nature of these recordings (since I’m the band, these songs have never been played live). Doing vocals for this project has very much been an exercise in just laying stuff down and putting it out there with as much confidence as I can.

Even though this is my solo project I always love getting my kids in on songs so I had Elliot come in and record some extra vocals on Bedrock. We’ve been playing a lot of Minecraft lately and it seemed appropriate to get him in that song somewhere.

My favorite little easter egg on this record came from Max. If you listen really carefully at the end of the last song (Top Me Off), you can hear him say “Ok, can we play cars now?”. I had been recording drums when he came down and wanted to play. He let me do one more take, waited very patiently, and after the last hit excitedly asked if we could play now. I thought it was a great little incidental moment so I left it in, isolated it, and turned it up.

The cover art was, somewhat begrudgingly, done with ChatGPT. I knew kind of how I wanted it to look and managed to get a full cover together in only a few minutes. Part of me wishes I had made it from scratch, just out of principle, but I got something I’m happy with and that’s what matters.

Overall, I’m really proud of this EP. It took WAY longer than it should have to complete because I could only work on it in fits and bursts when I had free time (and could be loud at home). It feels like good progress for the previous record and, honestly, I just love putting out music.

Enjoy!

Building A Programming Language In Crystal

After doing a rotation on GitHub’s “Ruby Architecture” team a few years ago and learning more about how programming languages really work (and getting a few commits into the Ruby language myself) I’ve been trying to learn more about building languages. For the last year or so I’ve been very slowly working my way through the first half of Crafting Interpreters by Robert Nystrom, which has been a fantastic book on the topic. It starts by walking you step by step through the implementation of a language designed for the book called Lox. The book builds the language in Java, but I chose to implement it in Crystal.

Why Crystal? I like it. It’s syntax looks very Ruby-like but it has static (and sometimes explicit) typing. It’s reasonably fast when compiled. Plus, by implementing all the examples in a different language it forced me to understand what I was doing enough to translate from Java to Crystal. I’m not the first person to implement a Lox interpreter in Crystal, but it is a less common project.

For a “toy” language built as a learning tool, Lox implements some nontrivial things. A simple “Hello world” looks as expected:

print "Hello world!";

It has loops! While loops and for loops (which are turned into while loops by the interpreter):

var k = 30;
while(k < 40) {
  print k;
  k = k + 1;
}

for(var j = 30; j < 40; j = j + 1) {
    print j;
}

And it has objects and inheritance!

class Animal {
  init(name) {
    this.name = name;
  }
}

class Cat < Animal {
  meow() {
    print "meow";
  }
}

var kitten = Cat("Mochi");
kitten.meow();

While this all feels like pretty standard stuff for any programming language you might use, it was really cool to build everything up from scratch. The parser was written from scratch in less than 500 lines of code, no using any big libraries like Bison or Yacc. The scanner handles a little over 40 tokens in less than 200 lines of code. It has a resolver to handle some scope ambiguities and static analysis. This is just been a really cool project.

In addition to all the cool programming language stuff I learned working on this I also used this project as an excuse to develop in Neovim on the Ubuntu laptop I set up a while ago (using DHH’s Omakub).

Despite the code being a little messy in parts (sometimes I got impatient trying to handle Nils in Crystal) and containing some bugs, I’m sure, it’s still really cool have this project in a “done” state. I might come back later and clean up the code or add some features (this implementation of Lox lacks a way to take user input…) but for now I’m going to move on to the next section of the book where I’ll build Lox again, this time as a more optimized, compiled language implemented in C (I probably haven’t touched C since college…).

If you’re interested, check out my implementation of crlox.

Making Pizza

I like making pizza.

When I first started it was pretty arduous. I actually had to grind the wheat to make flour for the dough. Making the cheese took forever. Toppings were a luxury unless I could find someone else who was making them and even then they could be really expensive.

As time went on, things got easier, though. I was able to buy bags of nice flour. Cheese was easy to get and a wide range of toppings became available. If I was really in a hurry, I could even find pre-made sauces that were pretty good.

More and more people got into making pizza so there were lots of new recipes out there to try, which was fun too.

Eventually I started seeing pre-made dough and even full kits with dough sauce and toppings ready to assemble and bake, which was pretty nice when I was in a hurry and just wanted something basic.

Then pizza delivery services popped up. I could just order whatever kind of pizza I wanted and it would show up at my door, faster than I could make one myself! Some of them were pretty good and it’s a really easy way to get dinner when you’re too busy to cook.

So now I have pizza whenever I want, which is pretty cool. I probably eat pizza more often now than I ever have.

I guess I don’t really make pizza anymore, though.

🍕

Pragmatic Divesting From Enshitifcation

There’s been a lot of people noticing that the internet isn’t as fun as it used to be. Not that it was perfect in the past, but there’s a sense that what was once weird and quirky and full of potential (while still having a number of rough edges) is now mean and manipulative and controlled by a small number of large companies.

For many of the more tech savvy people who are feeling this, there’s a lot of push to leave all of these unpleasant places behind and live entirely in alternative spaces. This might mean getting Google out of your life, leaving Twitter or Facebook or whatever major platform. But that’s hard if you want to interact with people who don’t think about tech all the time. It’s the digital equivalent of homesteading.

I’ve been trying to be more conscious about trying to make my online life more pleasant in pragmatic ways. Ways that make me happier without feeling isolated from my less tech focused friends. More “growing some of my own food at home” and less “moving into a cabin in the woods”.

Actual Social Networks I’ve never found Twitter or Instagram to be particularly toxic places and I think that’s because I’ve used them in an odd way. I only really follow people I know personally and I try my best to avoid algorithmically suggested posts. I will sometimes manually visit the profiles of interesting accounts, but the extra friction prevents me from passively consuming everything they post in perpetuity. This means my feeds on these sites are mainly friends and old coworkers who I actually like. I’m sure I’m missing a lot of funny videos and maybe some interesting content, but I think I’m happier this way.

Tending My Own Garden That said, I’ve been less inclined to engage on other people’s platforms lately. The internet was weirder and more fun when it wasn’t just people posting to handful of huge sites. I’ve been writing more on Don’t Break Prod and doing more little updates to this site, with the plan to share more things here. Again I haven’t deactivated my accounts on any major sites, I’m just not really interested in building my castle in other people’s kingdoms (even if that costs me priceless things like “engagement”).

Let’s Get Weird Again Finally, I’m looking around more for weird fun things on the internet. People just building stuff because they wanted to see it exist. While a lot of the internet feels mean or angry or hustle focused or just un-fun in a lot of ways, there are still lots of people who just want to make cool stuff and share it. It’s out there if you just poke around a little bit. I’m hoping the stuff I put out there contributes just a little to making the internet a bit weirder.

I don’t think it’s just rose colored glasses that make me think that the internet was more fun in the past. While many things have gotten better, something valuable has been lost. You can’t go back, but you can focus on the things that make you happy and minimize the things that don’t. It’s not as bold a statement as dramatically quitting Facebook only talking to your friends who use Signal, but the internet can still be fun if you just don’t wallow in the worst parts of it.

Don't Break Prod

This all started with my irrational desire to build yet another blogging engine. The world doesn’t have enough of those right?

I’ll go into more detail about the software I built in a future post, but long story short I built a little blogging tool called Postwave and I needed a site to put it through its paces. I needed something that I could make frequent posts to and see what it was like to really use what I had built. So I created Don’t Break Prod, a collection of bite sized pieces of career advice for software engineers.

I’ve been thinking about mentorship and ways to have a good life as a software engineer for a long time. I have a bunch of notes and a decent outline for a book of engineering mentorship that I started and lost steam on a few years ago as well as insights gained from being both a mentor and mentee. Eileen and I have had great conversations about career stuff that I often walk away from with good insights. So I started writing down a list of ideas about how to make your life better as a software engineer. These range from simple technical ideas like, embracing linters to broader ideas about avoiding burnout.

The idea behind Don’t Break Prod is to do short form posts, something longer than a tweet but shorter than a full blog post. The title should give you the basic advice, the content should provide some food for thought around it. This has also lowered the activation energy for me to write new posts regularly, which helps a lot. I’ve deliberately avoided having a comment section because while I want people to read these and engage with them, I really didn’t feel like managing a community.

I’m not really sure what my big picture goals are for Don’t Break Prod. It’s doing a good job as a testing ground for Postwave and in a time where it feels like most content just exists on a few social networks it feels good to be writing directly on a site run myself. As for the content of the site, I think that having a career tha makes you happy and fits into your life the way you want is important. Thinking about these posts has helped me articulate ideas that are useful for me and I hope other people find them valuable.

While I’ve been sporadically posting to the site for a few years now, I’ve recently been getting a little more serious about making regular posts and trying to share them more broadly. I’d love to reach as many people as possible, as long as I can keep writing posts and promoting them in my own weird way.

Homeboard

I always forget to move my car on street cleaning day.

On the 1st Wednesday of the month I was always scrambling to move my street-parked car in the hopes of avoiding a ticket. Often too late. So I wanted something I looked at every day to remind me of things like this, just a little dashboard in my kitchen to let me know what was going on during the day.

While this isn’t a particularly novel idea and I’m sure there are a few out of the box products that will do this, I just though it would be fun to build something custom for what I wanted. It ended up being a small Sinatra app and I decided to play around with htmx for most of the dynamic frontend stuff. The basic features I wanted were:

  • a big clock (date and time)
  • local weather
  • a QR code to log on to our local wifi network
  • events for today and tomorrow:
    • city events (street cleaning, garbage day, snow plowing, etc.)
    • birthdays (I don’t look at Facebook enough anymore for it to be a reliable reminder)
    • our shared Google calendar

This is what it ended up looking like:

Some of these were pretty simple. The clock is just some plain old Javascript running client side. Birthdays come from a big hardcoded Hash that just looks up date. The city events came from some hardcoded logic based on the date, things like:

# first Wednesday of the month
applicable = STREET_CLEANING_MONTH_RANGE.include?(timestamp.month) 
&& (timestamp.wednesday? || timestamp.tuesday?) && timestamp.mday <= 7

The QR code just seemed like a neat little feature. You can create QR codes that when scanned will allow you to join a local wifi network without manually entering the password. I just generated my code from something like this site.

For local weather I ended up making use of the OpenWeather API. It refreshes infrequently enough that I can use it for free.

The Google Calendar integration gave me the most trouble. For some reason it was WAY more of a pain in the ass to authenticate with Google and use the provided library to pull a list of calendar events than I figured it would be. It involved a lot of creating and refreshing access tokens and is still a little janky (but it work!).

While I started doing the dynamic front end stuff with vanilla Javascript I ended up rewriting almost everything in Htmx, mainly because it seemed interesting and I wanted to play around with it. For the VERY simple stuff I was doing (mainly periodically refreshing parts of the dashboard to get updated content) it was very clean.

For example, I want my weather to reload every hour so on the main dashboard page (the page that stays up all the time) there’s a div that looks like this:

<div class="content_box weather_box" hx-get="../api/weather_htmx" 
  hx-trigger="load, every 3600s">
</div>

It just pulls the contents of /api/weather_htmx (which is just some html, rendered with the updated weather info from an API call to OpenWeather) and puts it inside that div. Magic!

I bought a cheap refurbished tablet to use as a display and it’s been a great addition to our kitchen!

Now

So I added a Now page to this site.

The purpose of a now page to write up what you’re doing right now. Basically what you’d tell someone if you were catching up and they asked “So what have you been up to lately?”. The idea has been attributed to Derek Sivers (who apparently is the guy who created CD Baby!).

Why did I add one? Do people really care what I’m up to now? I don’t know. But I’ve been growing a bit disenchanted with the state of the internet lately. It feels like a lot of people trying to squeeze posts in between ads on a handful of social networks. I miss when the internet was more distributed and a bit more personal and weird. This felt like a little push in that direction.

For more about now pages check out nownownow.com

And Or Not

tldr: I wrote and recorded a noisy, bass driven solo record. You should check it out!

Earlier this year I was listening to a lot of Death From Above 1979 and just got the urge to write some fast, high energy song with just bass, keys, drums and vocals. Sort of a cursed jazz trio. I was also looking to push my drumming, which has been a focus this year.

I started just writing and recording a bunch of bass riffs when I had random nights free and then I’d come back later, narrowing down which riffs I liked the best. Because I was just writing on bass I felt like I ended up writing riffs differently than I would if I were writing on guitar. I felt more free to wander out of keys and write more chromatically, since I wouldn’t have to fit things in a larger chord structure. It was really a fun way to write.

From there I started piecing together some basic song structure and trying to figure out what to write lyrics about. I tired to let the topics of these songs be a bit more “whatever popped into my head”, worrying less about having central, cohesive ideas. I ended up writing about social media (Black Box), people reminding me to eat well (Eat This, You’ll Live Forever), and our cat, who likes to hunt our children (Natural Predator).

Once I had the song structures down I recorded bass (DIed into Logic with a fuzzy amp model) and then started really working on writing/recording drums. This project ended up being a good excuse to dive a little deeper into recording drums at home. I picked up a kick drum mic off of Craigslist, gathered a bunch of 57s to mike the snare and both toms, and used one of my condenser mics as an overhead. It had fun playing around with getting a decent sound and learned a bit about recording drums. My basement is not the best space to record, but I made due.

The drums took me a long time to record. Part of this was nailing down exactly what the drum part should be and part of this was playing it right. I’m really glad I did all the tracks to a grid. It helped to be able to follow a click and punch in where I needed to.

After the drums were finished I worked on vocals. I was probably most nervous about this part since vocals have never really been a strength of mine. I tried to just let go, project, be loud where it made sense, be a little screamy where it worked, and just commit. I also leaned into using a bit of fuzz on the vocals, which fit nicely with the aesthetic of these songs. All in all it turned out well. It’s certainly not the greatest vocal performance, but there isn’t much that feels bad or like the vocals detract too much from the songs.

While recording “Eat This, You’ll Live Forever” I had the kids come in and sing “Eat this!” and used their takes to build gang vocals in the outro. I’m really glad I got them involved and they seemed to really like hearing their vocals as I was mixing things.

I finished up by adding some keys. Mainly synth or organ parts doing some countermelody or beefing up some parts. After that, a bit of mixing. I ended up doubling all the bass parts, one track with some fuzz/overdrive and another with a lower, cleaner sound to beef things up.

In the end I came out with something that I was really proud of. This is the first time I’ve done a true solo record where I’ve played every instrument and done all the vocals (apart from some gang vocals by my kinds). I didn’t really know what to do with it so I just put it up on Bandcamp and sent the link around. I’d love for more people to listen to it, but honestly, I’m just happy I made it. And Or Not is a fun format, bass driven, high energy, so maybe I’ll do some more of these songs soon!

Trackstar

Many good projects come from scratching your own itch. I like to track thing.

Over the past few years I’ve had on and off bursts of focus on practicing. Practicing guitar, drawing, chess, things like that. And I always find value in quantifying how often I’m practicing. I like to know how many hours per month, week, year, etc. I’ve spent on that skill. I feel like, as long as I’m practicing the right things, I can feel good about the progress if I can see a history of it. Plus wanting to see the numbers can help make sure I stick with things.

In the past I was just writing simple Markdown docs and then ran a small Sinatra app that pulled metadata out of that directory and gave me some historical stats. I called that system Input Coffee.

I figured I could automate things a bit more and build something a bit more reusable, so I decided to build a small command line based tracking app, Trackstar. I recognize that this type of interface only appeals to a very select group of people, but that group includes me, so I built it.

It’s a pretty simple idea. You use the trackstar -n program to create a log directory, then (when you’re in that directory) just use the trackstar command to make a new entry. It will prompt you for a few things; title, time, and some notes, then turn it into a Markdown file. You can get some basic stats by running trackstar -s (again, in the log directory).

It’s pretty bare bones right now and I’d like to iterate a bit on the interface (I do thing command line apps can have nice interfaces). I’d also like to do a lot more around the stats, maybe even pull in the Sinatra app/web based visualizations of the data to get a better history, we’ll see. For now it’s kind of fun to keep it as a purely terminal interface.

The whole thing is just built in Ruby and could probably stand to be optimized a bit, but it was fun to build a gem that was a pure executable thing, rather than a library. You can check out the code and full instructions for how to use it on the GitHub repo.

I’m currently dog fooding it by tracking my guitar practice. So far it’s working pretty well and I’m making tweaks as needed. If this scratches a specific itch you have, try it!