The Stream is where all actions occur, in reverse chronological order. Every thing that I do happens in the Stream, though you can filter the Stream to narrower views by visiting a specific page.

This page serves as the permanent location of the complete unified stream for the website.

/stream Stream

December 6, 2023

/stream /programming /december-adventure

Today's work was thinking work. Part of my goal of putting the /coalescent computer on pause was to start framing coalescent data within existing computing systems instead of a blank slate, and so I wanted this project to reflect that. Today I was thinking about how I would manage the different "resources" (accounts, entries, reports) in a coalescent way, and I think I came up with a plan to achieve that.

Each "agent" (user/node pair) will have its own event log, and each log can only be edited by its owner. A log is just a text file where each line describes some (CRUD) event on a resource. The logs can freely be synced with other agents, and each agent can keep track of how long it thinks each log is so that they know when there are new events to process in a given log. If my state tells me that agent1.log is 40 lines long, but my local copy is now 42 lines long, that means two events have come in for that log since the last time I processed events.

Effectively, this means the CLI will have some commands that write to the local agent's event log, an event log resolver that generates and modifies resources based on all of the event logs as a single logical unit, and then report generating commands that work from the local resources. There can be a little bit of state on an agent that helps it track and cache what it's already computed, but it can also at any point just re-run through all of the event logs again to rebuild the current state. Playing back events means it will also be possible to catch instances where new events are trying to write to "closed" books.

This sounds complicated when writing it all down, but I think with a little more planning it should be possible for this to be implemented pretty quickly (minus syncing, which will just be done with rsync).

December 5, 2023

/stream /programming /hare /december-adventure

Another short December Adventure session today, but I implemented some functionality for creating and listing accounts within a project. For now, this is done by adding files to an 'accounts' directory inside the project, and having each account file be the stringified version of an account struct. I should probably put together some kind of de/serializing functions that make it easier to re-ingest the text file back into program data later on, and also clean up the way I'm creating "resources" since I'll need to do a lot more of that. Honestly, if I have more than a few minutes to work on this tomorrow I should take a step back and do a bit more planning now that I have all of this infrastructure working.

December 4, 2023

/stream /programming /hare /december-adventure

I only had about twenty minutes for my December Adventure today, but managed to implement the books list command using the config work from yesterday. I also refactored those config functions to work as a general key-value store, which made it very easy to then also implement books set project to set the active project. Overall, the work I did yesterday made it so that implementing these other commands was pretty straightforward. I need to come back to this a bit later and think through the error handling a bit better, because for now it just unwraps all the errors with !.

$ ./books list
$ ./books set project home

December 3, 2023

/stream /programming /hare /december-adventure

Had a pretty packed day, but found a few moments to tinker. Spent most of today's time starting to learn about the fs, io, and os modules of the standard library. Wrote a few functions for reading and writing files, and now the CLI for books lets you set a directory where it looks for your projects by default. Trying to lean on the filesystem to do all of the work in this project, so this "setting" is just a file $XDG_CONFIG_HOME/books/root that contains the path.

$ ./books set root ~/books
$ cat ~/.config/books/root

December 2, 2023

/stream /programming /hare /december-adventure

Today's work on the December Adventure was more fleshing out of the command tree as I was thinking about the different types of resources that need to be created and managed. Things like accounts, journal entries, and so on. Fleshing out the tree has been a good test of my cli module, and is also a good way to think through the use of the program as a set of resources being managed.

I also needed to figure out a way to have the user set an active project and let the program know where to find project directories, and this led me to learn about the XDG Base Directory Specification, which is what defines the ~/.local, ~/.config, and ~/.cache directories, and what types of files should go in each. I learned something new, and also figured out how I should handle the default storage of configuration and state data for this program.

December 1, 2023

/stream /programming /hare /december-adventure

I've been cutting my teeth on /hare for a few weeks now, and yesterday I finally got my "learning project" (a CLI argument parsing module) finished. So today, I started work on a CLI double-entry bookkeeping program which I think is going to be my December Adventure for 2023.

Today's work was fleshing out a command tree using my new argument parsing module, and then learning about how the Hare compiler uses multiple source files. I can now compile a binary that executes a few placeholder subcommands.

November 24, 2023

/stream /reading /order-without-design

Through my work on /livable city advocacy in my home city, I've met a lot of people with different lenses on how to look at some of the core issues. One of those people has been one of the most analytical and data driven policy thinkers I've ever met, and while at first the approach came across as cold to me, over the course of a year it became harder and harder for me to deny how well informed his thoughts were and how clearly his approach reflected the reality I was seeing in urban policy every day. The book he would frequently bring up as a primary influence to him was "Order Without Design: How Markets Shape Cities".

As someone who is both highly critical of the economic structure of Capitalism, but simultaneously holding a worldview centered on holarchy and emergent complex systems, there is a deep tension around the notion of "markets". Markets are not strictly tied to Capitalism, but markets are integral to its broader philosohpy. At the same time, markets are the same shape as one of the key information channels in an emergent and distributed complex system. As I solidified my distrust in The Market(tm) and began to cautiously embrace lower-case "m" markets as a social communication channel, I began to finally read this book.

The first chapter begins by outlining the author's experience as an urban planner starting in the 60s, his first experiences that showed him the cracks in traditional planning logic, and his first meaningful encounter with an urban economist that gave him deeper insight as to what actually caused those cracks in planning logic. It immediately touched on concrete examples of issues around /zoning and /land prices, which is something we are dealing with right now, and I think that I'll come out of this book with a much more grounded understanding of urban economies and planning policy.

November 17, 2023

/stream /repair /bicycle /fixie

The intention for the /fixie was always that it would be deeply refurbished and modifed over the winter. After a few months of riding it around and getting a feel for it, it was finally time to take the first step of a full disassembly, followed by a cleaning and a paint job.

The frame and fork of a sky blue bicycle, with the headset and drop areas accented with silver. It is sitting on sunlit pavement, surrounded by sandpaper and many of the parts that were removed.

When I bought the bike, it already had a pretty poorly applied two-tone spray-paint job, so I had always intended to sand it down and repaint it properly. I removed everything except the headset and bottom bracket, masked those off, and painted the bike a "British Racing Green" using spray.bike.

A bicycle frame and fork freshly painted british racing green, resting against a cinder block on top of long grass and fallen leaves.

Since it's already mid-November here in Vermont, I was racing against the clock to get the bike painted before the temperature got too cold for the paint to be effective. I wish I had taken a bit more time to be more detailed in my sanding work and take the painting process slowly, but it was looking like I only had one last chance for the weather to cooperate the day I painted. Overall, it came out nicely, with only a few minor patches where previous paint/rust spots had not been fully smoothed out.

November 14, 2023

/stream /technology /programming /hare

Over the past few days, I've been starting to get acquainted with the Hare programming language. Someone on Merveilles mentioned something about it, and after looking it up something really clicked about it for me. I'd been really starting to sour a bit on Rust, especially the complexity of the ecosystem, and was thinking that I should start to learn 'C'. So finding the Hare language, which is an opinionated 'C' replacement whose opinions heavily match my own, has been a joy.

From what I can tell so far, the core idea behind Hare is that "Understandability of the Toolchain" should be the highest goal. You can bootstrap the compiler with gcc in about 30 seconds, with about 30k lines of source code. That's faster than building most simple Rust binaries with an empty cache. In terms of language features, it is focused on proven ideas implemented well, and consistency over syntactic sugar. As an example of its philosophy, its implementation of tagged unions turn a very basic type system into something that punches way above its weight class in terms of capabilities and program correctness. It makes a big leap from something like C towards something like Rust, but with an order of magnitude less complexity.

So far, the only things close to a "dealbreaker" is the limited editor integrations, like in-editor compiler warnings, and autocomplete/autoformatting. Perhaps I can try my hand at an LSP implementation...

November 11, 2023

/stream /technology /imac-2013

Acquired another new computer today, a 21.5" /iMac (2013). I'm writing this update from that computer, having moved over all of my tools and configuration. I'm not sure it's really a useful skill to be able to configure an old mac as a personal linux machine, but I'm getting pretty good at it. I appreciate the smaller footprint and lower power consumption than the 27" /iMac (2020) that it replaces. All of my transition towards linux as my daily driver operating system has occured on laptops so far, so this is the first time bringing my work to my desk on a (slightly) bigger screen.

A 21.5-inch iMac sitting on top of a desk riser, with a light bar above it, and two keyboards on the desk in front of it.

It's nice to finally have a linux desktop, though I'm bummed that my layout on my split keyboard does not translate at all from macOS to Linux. There are way too many hot-key changes, and so many programs implicitly rely on the QWERTY layout, that my custom configuration and ColemakDH layout were painful, and I've temporarily reverted back to a standard-issue Apple keyboard. I'll have to slowly redesign and (readjust to) the layout as I continue using my environment at a desktop setting.

November 8, 2023

/stream /technology /permacomputing /repair /macbook-2007

Disassembled the /MacBook (2007) today to give a proper internal dusting and a fresh application of thermal paste. Even after all the work done on the /MacBook Pro (2006), I still find myself using the /MacBook (2007) as my daily driver now, because it's smaller, lighter, and the plastic doesn't burn my legs as much as the metal case on the Pro. However, I've noticed that the CPU still seems to get quite hot, and I figured the 16 year old thermal paste wasn't helping much.

After the application, I noticed that peak thermals were much lower: ~68C as opposed to the ~80C I was seeing before when doing something like compiling a rust binary. The stable idle temperature during a work session hasn't changed much (~58C), but it takes much longer to reach that temperature (about 20 minutes of working), and temperature recovery back to baseline after a spike is also noticably better.

Hopefully this preventative maintenance extends the life of this computer even further than it was on track to go.

October 25, 2023

/stream /linux

A few days ago, I finally took a stab at a multi-machine "dotfiles" system. To get a feel for the challenges presented by a highly portable software environment, I've been jumping around between three different laptops, /MacBook (2007), /MacBook Pro (2006), and /MacBook Pro (2015). Keeping all of the distinct physical environments in sync as a single logical environment has been a huge, manual pain. The machines had slightly different configuration needs, so it took me a while to sit down and think about a solution. The approach I decided on was this: a "dotfiles" repo that holds the common configuration without any sensitive data (like user or server names in aliases), and then each machine assigns values to the secret environment variables, sources the common config root, and then adds any machine specific config in its local .zshrc.

One of the interesting parts that took some thinking was how to handle my shell script "micro apps", like my journaling utility. I used to just throw all the journal shell scripts in ~/bin and then define aliases to those scripts in .zshrc file, but with this new setup it ended up coupling machine configuration with "app" installation. Instead, I created a new repo just for the "journal app", which is composed of its original scripts and a new api.sh script, which exports a necessary environment variable and defines the aliases to its functional scripts. So now, on each computer that I want to "install" the journal on, I just clone the journal repo and then source the api.sh code from my local .zshrc.

All said and done, a local .zshrc file now looks roughly something like this on all of my different machines:

export SYNCUSER=## omitted ##
export SYNCSERVER=## omitted ##
export SYNCDIR=## omitted ##
source ~/tools/dotfiles/.zshrc
source ~/tools/journal/bin/api.sh

October 22, 2023

/stream /now

As per usual, the past six weeks have been incredibly busy. A large chunk of September was dedicated to organizing a downtown block party for World Car Free Day, which was a big success. I built some diy street barricades to help close the street, and we had a ton of neighbors turn out to celebrate.

Much of my time also continues to be dominated by the same /livable cities advocacy group, as we have become the primary group leading the grassroots conversation around policy changes needed to alleviate our city's housing crisis. With a comprehensive residential zoning overhaul in the works right now, there's not much time for other things.

I had some quiet time on a train recently, which I used to begin chipping away at a bare-minimum operating system for the coalescent computer, which I've nicknamed "lesceOS". It's been a good exercise to push the co assembler and toolchain a bit further, and get more practice writing my own language.

The art co-op is continuing to find its footing, and has not disappeared yet. We're starting to find some ways to bring in money to pay for rent, and I'm also learning about some of the types of situations that work better with delegated decision makers, vs needing consensus from 10 people.

/stream /tactical-urbanism /woodworking /diy-pallet-barricades

Wrote out the bulk of what I learned from building street barricades out of reclaimed pallets last month, in an effort to get it in writing before I forget. Still need to revisit later to add images, and perhaps some 3D illustrations/animations for maximum impact.

October 21, 2023

/stream /linux /games

With October in full swing, I've been in the mood to replay Space Funeral, a bizarre and spooky RPG Maker 2003 game by thecatamites with one of the best soundtracks in anything, ever. It's an old school windows EXE, and so I figured it would be a prime candidate to be run via Wine on Arch Linux. To make a long story short, I got it working. I imagine you can follow these instructions to get this game (and other similar RPG Maker games) working for yourself.

First, we need to make the lib32 packages available in pacman by enabling the multilib repo. We do this by uncommenting the [multilib] section near the bottom of /etc/pacman.conf.

Include = /etc/pacman.d/mirrorlist

Then we can install Wine and the other necessary components:

sudo pacman -S wine \
	lib32-mesa \
	lib32-gst-plugins-good \
WINEARCH=win32 winecfg

This installs Wine along with the 32bit dependencies for OpenGL and audio playback, and then configures Wine into win32 mode. I use X + DWM for my graphical environment, and Pipewire/Wireplumber for audio. From here, in my environment, the game ran without issue on the /MacBook Pro (2006).

If you don't want to keep all the junk you have to install once done playing the game (it's a bit much), you can remove it all like so:

sudo pacman -Rns wine \
	lib32-mesa \
	lib32-gst-plugins-good \
rm -rf ~/.wine

October 6, 2023

/stream /woodworking

Last Fall I discovered that our in-window air conditioning unit was about a half an inch taller than its product page claimed, because it didn't fit under the bed frame that I built specifically for that purpose. This year, in order to make sure we could fit the AC under the bed, I built some leg risers for the bed that match the design.

The rectangular leg of an oiled maple bed frame sitting inside of a chamfered, unfinished block of wood acting as a riser.

I used the same construction technique as the legs themselves: I cut a bunch of 1" x 1" strips, glued them up into 3" x 1" boards, and then glued those boards together to create a 3" x 3" post. Instead of 15" long posts like the original legs, these were cut into four 1" tall "pucks" that the legs would sit on.

Four freshly oiled identical square blocks of wood resting an inch above a concrete floor.

In order to keep the legs from sliding off the pucks, I also made some 4" x 1" boards and the resawed and planed those into something closer to 3.5" x 0.5". Those were then cut down to 1.5" tall and "wrapped" around the puck, creating a lip for the legs to slide into. I added a simple chamfer both to remove sharp edges and for aesthetics, and then sanded them and finished with hemp oil.

September 25, 2023

/stream /bicycle /repair /rad-runner

Last night I went to install a front rack on the /RadRunner Plus and had to reroute my front brake cable. By taking it out, it loosened a frayed part of the cable which then got jammed inside the cable housing, rendering the brake useless. I had never replaced a brake cable before, but a quick search told me it should be pretty straightforward. Today I was able to get a replacement cable from a local bike shop for $3 and swap it out in about 5 minutes.

The special notes were that brake cables are pretty standardized but are different than shifting cables, and that you have to match the "head" of the new brake cable with the one used in the brake lever. I was able to remove (and replace) my cable from the brake lever without tools by just aligning the slots in the barrel adjusters and pulling the cable through. I reused the existing rigid cable housing, and threaded the new cable through it. I was also able to re-use the cable-end cap from the old brake cable by sliding it off with needle-nose pliers, and then crimping it back onto the new cable. Finally, I used those same pliers to cut the new cable to length.

September 15, 2023

/stream /technology /permacomputing /repair /macbook-pro-2006

After coming to the conclusion that GRUB2 was the only way to boot, my only remaining option to get the GPU working on /MacBook Pro (2006) was to go through the process of extracting the firmware from a BIOS boot, and then patching the radeon kernel module to manually load that firmware from a file. I tried for a long time to make a BIOS-bootable USB drive of an old Ubuntu 10 live CD, but the computer refused to boot from it. From what others had written online, it seemed like booting from a DVD was the easiest path forward, so I hunted down a blank DVD and burned that 32bit Ubuntu 10 image to it.

Unfortunately, when trying to boot from the DVD I came to the conclusion that the DVD drive was broken. My /MacBook (2007) easily booted from the DVD, but the /MacBook Pro (2006) did not. My solution: open up both machines, hook up the working drive from the MacBook to the MacBook Pro, boot into Ubuntu and extract the firmware, and put everything back together. To make a long story short: it worked, miraculously. After a long morning of open-heart surgery, I still had two working laptops and a "vbios.bin" file that would be the key to a working GPU.

I spent a little time after the firmware extraction looking into patching the kernel, but didn't make it too far.

September 8, 2023

/stream /technology /permacomputing /repair /macbook-pro-2006

After a bit of a break, I came back to the project of getting the /MacBook Pro (2006) GPU functional in arch linux again. With the time away, I'd had more time to think about what the problem was, and to come up with new approaches. Essentially, I understood that the GPU driver needed to be able to see the GPU firmware, which was only exposed during certain boot conditions. I came to the conclusion that if I could boot directly into an EFISTUB that the firmware would be visible, and so I made it my goal to try and do that.

Unfortunately, the main problem with this machine is that it has two oddities with its EFI: it uses 32bit EFI hardware to boot into a 64bit CPU, and it is also an Apple-specific EFI 1.10 implementation and not a modern UEFI standard implementation. I think I ended up believing that there have been advances in both the linux kernel and also things like systemd-boot that would have overcome the 32bit -> 64bit mismatch, but I kept running into boot errors anyway. My final takeaway is that it was the custom EFI 1.10 implementation that was breaking the boot process due to missing hooks. If you're reading this in the future, I don't think that this machine will ever get any better boot options due to its proprietary and opaque EFI 1.10 implementation, unless someone takes the time to reverse-engineer Apple's implementation.

This means that I'm left relying on GRUB2 and its EFI Handover Protocol method of booting "mixed-mode" on this particular hardware. I also discovered that newer versions of GRUB2 (starting at r566 I believe) have issues with this boot mode, so I ended up pinning grub to an older version (2.04) in pacman and now booting works every time. By adding "reboot=pci" to the kernel parameters, rebooting also works every time, and the laptop never has any strange boot issues. All that's left now is to figure out how to get the GPU firmware loaded manually.

September 5, 2023

/stream /now

The summer has been incredibly busy. My /livable city advocacy group has had a lot of both engagement and disengagement, with city initiatives asking for our input and members being generally unavailable due to summer holidays. It continues to be a difficult line to walk as a volunteer based organization, where nobody is getting paid but success requires people to keep showing up.

Over the course of August, my partner and I stumbled into an opportunity to take over a large commercial space in the center of our Downtown as part of a collective of artists. There is huge potential for the space to be a much needed non-commercial hub of arts and activism, but organizing a bunch of strangers into creating a financially solvent space in such a short time frame is also a difficult task. We're hoping to establish a legal Co-op, and we'll see how it plays out.

Progress on the /coalescent computer moves in small bursts, though my time is increasingly dedicated to scheduling meetings and running agendas for volunteer and activist groups. It's hard to get a concrete feeling of forward movement, but it does generally feel like things are happening. I'd be lying if I didn't mention how frequently I wonder if I shouldn't move out to the country and focus my time on /farming, land stewardship, writing about /philosophy, and /programming, but that feels like giving up and running away.

Finally, we are not in imminent financial danger, but our lack of household income is becoming increasingly difficult to ignore. I have been hoping to serendipitously find a way to generate a bare minimum of income while working on all of these projects towards a better world, but it doesn't seem to be happening. It's frustrating to feel like I need to pause one or more of my many important initiatives so that I can extract money from the economy, but sooner or later something is going to have to give.

I'll try to post smaller and more frequent updates in the future.

September 3, 2023

/stream /collapse /complex-systems

Spent a big chunk of time today writing out my thoughts on /collapse, descent, and contingency, spurred by a couple of posts I saw floating around Merveilles today. While there's a lot written out here now, I'm thinking about how I can better explain some of the intuitions I've developed around the nature of life and complex systems. I have so many long posts written out and unpublished on my philosophical explorations into metaphysics, abstractions, /complex systems, and so on, and I should really get them out into the world in some form.

September 2, 2023

/stream /colophon /programming /linux

After spending a few hours this week trying to build a CLI that replaces my jnl shell-alias tool and allowed it to publish my website, I spent a few more hours today really thinking about the difference between a shell script and a program binary, and if I wasn't creating unecessary complications. This project of porting a shell script to a Rust binary taught me a lot of things about the nature of the shell as a computing environment, and pushed me to try to keep these tools as shell scripts for now.

I ultimately don't feel like the scripts I have now are the best version of this tool, but I also don't think that the compiled binary I was building was any better... and it was going to take an order of magnitude longer. I'm going to sit in the discomfort of these unfinished tools for a while as I continue to shape the /coalescent computer environment, and at least enjoy the fact that it's much faster to add entries to my website logs now.

August 23, 2023

/stream /repair /bicycle /fixie

After riding around town on my new /fixie for the last week, I got tired of the seized rear brake and was itching to try and repair it. From what I could tell, it seemed to be a Bridgestone "Self Centering" side pull rim-brake, or at least something that was attempting to look like one. I removed the brake and disassembled it, cleaning all of the parts with soapy water and then soaking everything in distilled white vinegar over night. Afterwards, I brushed the rust off with a toothbrush, reasssembled, lubricated the pivots, and everything was working well.

August 12, 2023

/stream /bicycle /fixie

Today I bought a new (to me) /bicycle. A few weeks ago I tried riding a friend of a friend's beater fixie, and immediately fell in love. Since then, I've been on the hunt for a small, beat-up old bike that I could turn into my own nimble little /fixie, and today I found it.

It's a franken-bike with a seized rear brake, two different tires on two different wheels, and a spray paint job that looks like it was done by a teenager about 10 years ago. Most importantly, it's ridable and has a flip-flop rear hub with a single-speed freewheel and the fixed cog I was looking for. It needs a lot of work, but I'm excited to dive in.

July 20, 2023

/stream /reading /mutual-aid /mutual-aid-spade

Finished reading Mutual Aid by Dean Spade. The last chapter was two thirds of the book, and full of specific plans and examples for how to deal with common issues in mutual aid groups. I found it quite helpful in framing my thinking about the real-world bumpy patches I encounter in my activism and movement building, and I'll be reflecting on it for a while I think. I'll continue reviewing my highlights and notes, and put together a synthesis on the book to share with others, since I think it is a hugely important topic.

July 19, 2023

/stream /reading /mutual-aid /mutual-aid-spade

Continued reading through Mutual Aid by Dean Spade, from the second through the fourth chapters. He outlined the shortcomings of the charity model of nonprofits, the necessity of asking for the entire world, and some of the dangers and pitfalls of mutual aid projects. The second and third chapters maintained the punchiness of the first, but the fourth chapter (in the second "part" of the book) fell apart a little bit. Still useful information, but less refined and impactful.

/stream /mutual-aid /ollas-comunes

After discussing the Ollas Comunes paper with my friend who linked me to it and then sleeping on my notes, I came back this morning and wrote a clearer synthesis on the topic. The notion of co-production stood out to me much more today, especially in the context of the other conversations I've been having with friends around the /climate crisis and the recent catastrophic floods in Vermont.

July 18, 2023

/stream /reading /mutual-aid /mutual-aid-spade

In preparation for an upcoming book club, I read through the first chapter of Mutual Aid, by Dean Spade. In this chapter, Dean lays out the three elements of mutual aid centered around meeting survival needs, educating people why needs are not met, expanding solidarity, and active participation. Spade writes extremely clearly, and this book so far feels very impactful and concise.

/stream /reading /mutual-aid /ollas-comunes

Read Collective Infrastructures of Care after being linked to it by a friend from Peru, which was a great review and anlysis of some of the history of community kitchens in Lima. It was a great example of Mutual Aid in South America, and formally introduced me to a concept I had been thinking about called "Co-Production", where communites are directly involved in the decision making and design of their collective infrastructure. I read through the paper and took a lot of notes and highlights, and will come back later to finish a synthesis after sleeping on it a bit.

/stream /recipes

I've recently moved away from making bagels as my daily breakfast, and have been experimenting with a shift to pancakes. To make them a bit healthier, I'm expermenting with sourdough starter and whole wheat flour (and topping with home ground peanut butter instead of syrup), which should also have the benefit of staying "frothy" in the fridge for an extra day or two. The goal is to be able to prepare a batch of batter once every three days or so, pour it into the skillet for a round of pancakes in the morning, and put the batter back in the fridge. This morning was my first go at it, and fermenting the starter sponge in the fridge overnight worked well, though the recipe is a little too "wet", yielding flatter pancakes. Overall though, it seems promising.

July 17, 2023

/stream /recipes

With a ton of leftover scallions in the fridge from yesterday's blanched asparagus, I went looking for another recipe to use that up and found a few scallion oil noodle recipes that seemed easy and delicious. I ultimately ended up following J. Kenji Lopez-Alt's Scallion Oil Noodles recipe, and it was incredible. Easy, fast, vegan, and definitely in the "comfort food" category. The main component is the scallion oil itself, which is easy to batch and store in the fridge, making a bowl of hot, fresh noodles only take a few minutes once you've made the oil. This will definitely be sticking around in my weekly rotation, especially as a lunch.

July 16, 2023

/stream /recipes

Tried some new recipes today from a vegan chinese cookbook. One was a blanched asparagus topped with shreds of chili, ginger, and scallion, and the other was a basil-garlic tofu. Both of them were very quick to prepare, and had very few ingredients. I was honestly not expecting to like either of them, but was very surprised to have liked both of them quite a lot. I thought the textures would be hard for me, but I went back for seconds. I'm excited to try more out of this book, and I'm hopeful that I'll get some new ideas for preparing simple dishes that feature vegetables as the star ingredient.

July 15, 2023

/stream /bicycle /repair /rad-runner

Performed some light maintenance and repairs on my /RadRunner Plus. I have never done much bike maintenance, but I've been slowly adjusting the brake tension as the pads wore down over the last 18 months. Recently however, my small tweaks stopped making an impact and braking power has reduced, and I needed to actually learn what I was doing. Turns out there is an adjustment screw on the brake calipers that nudges the brake pads in or out, and I needed to nudge the pads closer to the disc a bit as it wore out. I removed and cleaned both calipers with a damp rag (avoiding the pads), made adjustments, and reattached them with the correct alignment by squeezing the brake cable while tightening. Braking power is back to 100%, and the slight rub and squeak I occasionally got is gone now too.

July 10, 2023

/stream /technology /programming

A few days ago I watched this video about the performance differences between stack machine VMs and register machine VMs (when running on a physical register machine). The takeaway was that due to pipelining, a stack machine VM runs slower since it is always reusing the top of the stack, and none of the work can be done in parallel. For example, the equation ( 1 + 2 ) * ( 3 + 4 ) on a stack machine could be 1 2 + 3 4 + *, but all 7 instructions have to be run sequentially; on a register machine ( 1 + 2 ) and ( 3 + 4 ) can be decoded and prepped at the same time, since there is no dependency on those calculations (only the '*' must wait).

This, for some reason, made something click about Interaction Nets, in a way that didn't resonate with me the first time I started reading about them. It might have just been because lambda-calculus feels so opaque to me and I didn't have a good visual model in my head, and that this concept of dependencies in calculations gave me that visual. From there, I revisited HVM's github and Devine's interaction net page (linked above), and found myself thinking about rewriting rules again too.

Either way, this all got me thinking about how you might be able to declare "dependencies" for calculations in a stack machine. Could you maybe "branch" a stack into parallel computations with different memory addresses? Could you use that for SIMD operations? Would this be a great way to increase real world performance, or would it make writing code unecessarily complex? Am I just reinventing an obvious idea from a part of computer science that I don't know about?

July 2, 2023

/stream /technology /programming /collect

Spent a good chunk of time today revamping a community website to add a blog, and part of that meant figuring out how to implement a "dynamic root path" for URLs. I had to make some changes to 'collect' for it to work, but I think it's more robust now: it should more fully be able to recurse through contexts looking for objects of a certain name (which in this case is the "root-override").

Adding this feature has made me feel a little bad about 'collect', since with only four months having passed it feels quite sloppy and difficult to reason about the source code. It's definitely not worth rewriting again any time soon, but it's worth keeping in mind as my web projects that rely on it continue to grow.

June 25, 2023

/stream /technology /linux /macbook-pro-2015

After running out of "time budget" to get /MacBook Pro (2006) up and running, I installed Arch Linux on my daily driver laptop, which is a /MacBook Pro (2015). Being somewhat recent, but not too new, the install was quick and painless and has had very few problems.

As I've been shifting my daily computing to Linux, one of the biggest gaps in my daily computer usage was a "stream of thought" note taking tool, which I usually use the Apple Notes.app for. I spent an hour trying to figure out how to write a zsh alias to create a "journal" command, and it turned out really well. `jrnl` creates a temp file, opens $EDITOR, then appends a timestamp and the contents to a file named with the date in the ~/.journal folder.

After that win, I also finally learned how to set up screenshots with the `scrot` tool, mapped it to an unused media key, and send them to ~/.screenshot.

Finally, I decided to learn how rsync works and set up a few more aliases for syncing the journals and screenshots to my home server; now I can replicate the files across all of my machines, and I'm one step closer to a personal "cloud". Most importantly, I can access screenshots on my phone, though I can't yet easily integrate my phone with my new "journal" set up.

June 12, 2023

/stream /technology /permacomputing /repair /macbook-pro-2006

After finally getting Arch installed, booting into it also had many challenges. I have not been able to get a consistent boot, and in fact have only been able to get all the way through to login once. Just like the /MacBook (2007), it frequently immediately hangs from grub on “Loading initial ramdisk”, but the success rate seems far lower than the MacBook. I’ll need to dig much deeper into the boot process to see if this isn’t fixable, but at the moment, /MacBook Pro (2006) does not have a usable linux partition. Hopefully I can get this sorted out, because these old machines are great, and having a reliable arch install would give these machines life for many more years to come.

June 11, 2023

/stream /technology /permacomputing /repair /macbook-pro-2006

Working through trying to completely restore this /MacBook Pro (2006) to a fresh copy of OS X Lion was hell. There was nowhere to download a disk image from, and the machine I was on was missing its Recovery HD partition. I jumped through so many different hoops trying to get figure out how to get things to clean install, but eventually I was able to generate a Lion Bootable USB, change the clock back to 2013, and then boot (and install) from the USB.

Unfortunately, the complete formatting of the drive and fresh install of OS X didn’t make the Arch install go any smoother. I had to mess with kernel parameters to get the arch iso USB to boot, and was eventually able to get the OS installed.

June 10, 2023

/stream /technology /permacomputing /repair /macbook-pro-2006

The last part for my /MacBook Pro (2006) came in today, which was the lower case. Unfortunately, while I’m sure it was a relatively “New OEM” part at one point, its years in storage left it a little bent in places, most notably the slot for the disc drive was collapsed. I looked through the internet and decided there were probably no more “new” parts like this easily purchasable online, and that this part was better than the one I had, so I did my best to bend it back in place and moved on with reassembly.

I never know if I’m doing a good job reapplying thermal paste, but otherwise reassembly went smoothly. My first attempt to boot failed, but it turned out to be from the RAM not being fully seated; I thought it was funny that after completely disassembling the entire laptop and transplanting it into a new case, the final step, and the only one that doesn’t require disassembly was the part that went wrong. After reseating the RAM, the computer booted normally into OSX.

Arch was a different story. I ran into a ton of problems, and ultimately decided that my “clone from a different machine” idea was a bad one. I’ll have to wipe this machine clean and start from scratch.

/stream /technology /coalescence /coalescent-computer

I fleshed out the /coalescent computer page pretty significantly, intending to have a deep enough overview on this site to make it worth linking to internally. For the moment, it still suggest readers check out the external Coalescent Computer site, but as the project matures in the future I'll add more information here on this site.

June 9, 2023

/stream /coalescence

Took a moment to remove the low-effort text and write a bit more about coalescence. I also split out the subsections to their own pages. I still need to find a big chunk of writing time to really bring over a lot of the larger and deeper essays I've written.

/stream /technology /permacomputing /repair /macbook-2006

Stopped in our local reuse shop today hoping that an old Apple Thunderbolt Display that I had seen earlier in the week would still be there, but as I was walking in, someone was walking out with it. As a consolation prize, there was a G4 iBook and a Matte Black /MacBook (2006) in stock. The MacBook was $10 and in need of a battery, but it came with an original MagSafe charger which would be useful for the /MacBook Pro (2006), and my /MacBook (2007) battery could be swapped in for testing and set up.

A matte black mackbook sitting on a walnut coffee table, booted to the default geometric blue wallpaper of MacOSX 10.4.

I took it home and checked it out, and it ended up being in great condition. It turned out to be the original Core Duo revision (MacBook 1,1) and not the Core 2 Duo revision from later in 2006, making it my first and only 32 bit computer. It should eventually be a great 32 bit test platform for the /coalescent computer. I luckily had 2GB of RAM sitting around from the /MacBook (2007) before it was upgraded to 3GB, which meant I was able to max out its RAM capacity without any new parts.

/stream /technology /permacomputing /repair /linux /macbook-pro-2006

Set up the SSD for the /MacBook Pro (2006). My current /MacBook (2007) has both Mac OS X Snow Leopard and Arch Linux installed, and uses the native Apple bootloader system to choose between operating systems; it was a pain to set up, especially because that specific chipset uses a 64bit CPU with a 32bit EFI. I decided that the easiest way to set up the new drive would be to clone the SSD from the /MacBook (2007), since it uses the exact same CPU and EFI system as the /MacBook Pro (2006). I booted the /MacBook (2007) from an Arch Linux Live USB, connected the new SSD via USB, and then used dd if=/dev/sdX of=/dev/sdY bs=256K conv=noerror,sync status=progress to clone between the drives.

Unfortunately, though they were both nominally 256GB, the new drive was about 0.1GB smaller than the existing drive so dd failed right at the end. Since I knew that all the data was there, and that the main issues were around the missing backup partition table and the truncated final partition, I manually reconstructed the partition table with gdisk by choosing the same block offset and length as the original disk for all partitions, letting the last one automatically go to the end instead of overflowing. By writing the modified table, the backup partition table was correctly rewritten to the end. gdisk v and fsck let me know that there were no remaining problems. Finally, I used resize2fs to also make sure the filesystem (ext4) in that partition knew that the size had changed, and e2fsck to verify it was clean. For sanity, I also regenerated all of the GPT UUIDs for the disk and partition, and then regenerated the fstab file for linux. I mounted that disk and arch-chrooted to make sure all was well, and then successfully rebooted directly from the drive.

Now, hopefully, it will be ready to drop right in to its new home when the final component arrives.

June 8, 2023

/stream /film /anime

Watched The White Snake Enchantress (1958). My partner and I have started going through a new film guide to try to find some new corners of /anime, and this was the first one on the list. It was really interesting to see an obvious connection to early Disney, but that is also still distinctly anime, even if you can tell that it was 65 years old. It was hard to find a good copy of the film, but the art direction and sound design still came through the lo-fi recording. It's difficult to watch something so old without spending most of the time focused on the historical relevance, but the story touched on themes that are still explored in anime today, like the boundary between the spirit world and humanity, and overcoming taboo.

/stream /technology /permacomputing /repair /macbook-pro-2006

Several of the parts that I ordered for the /MacBook Pro (2006) came in today, including the Rear Bezel (the top of the "lid"), the Upper Case (where the keyboard and trackpad are), and the replacement 250GB SSD.

An old macbook pro disassembled in pieces on a coffee table; its guts exposed in the bottom case, with the keyboard and upper bezel sitting seperately next to it.

I removed and cleaned the keyboard from the original upper case along with the bluetooth module, and then reinstalled them on the the new case. It also came with a fresh set of insulation and spacers, which I also installed. I had already removed the rear bezel from the old LCD assembly, so snapping that on and replacing the two screws only took a minute. After about an hour and a half of work, those two parts were fully cleaned and transitioned, and looked good as new.

/stream /degrowth /benign-computing /complex-systems /climate-crisis

When reading about /benign computing, there was a point where it was explaining the way natural systems are more resilient to failure compared to the fragility of human-made complex systems. This reminded me of the fact that our poorly designed systems are stabilized by the resilience of nature, like how the global ecosystem was able to absorb and handle a huge amount of carbon emissions before deteriorating. This makes it very difficult for humans to see, since our time scales are so short.

/stream /reading /technology /permacomputing /degrowth /benign-computing /complex-systems

Read Abstraction, indirection, and Sevareid's Law: Towards benign computing after seeing it mentioned on Damaged Earth Catalog. It provides background on the idea that computing may, in general, be creating more problems than solutions, and proposes a design framework for computing that minimizes that outcome. The core principles are “scale out”, “fail well”, “open design”, and “fractal”. In essence, it promotes small nodes speaking open protocols that are individually resilient, creating an emergent larger network that also exhibits these properties. It prioritizes long term resiliency and harm mitigation over short term costs and maximum availability.

I like the idea of benign computing aiming to mimic how nature *fails*, instead of how it *succeeds*. Placing the emphasis on resilience as opposed to solutions naturally puts you in a defensive and critical position during system design. I think that this framework lends itself well to an analysis of the Coalescent Computer which shares many of these goals, and would benefit from a deeper analysis through this lens.

June 4, 2023

/stream /technology /permacomputing /repair /macbook-pro-2006

Today I completely disassembled the junk shop /MacBook Pro (2006) to inspect for any internal damage before buying a few replacement parts. Everything seemed to be in great shape, so I ordered a replacement top and bottom case from eBay, and a 2.5" SSD to replace the 17 year old spinning hard drive it still had. I had enough old RAM sticks lying around to max out its capacity (3GB), and the battery is actually in pretty good condition.

The CPUs and GPU on the motherboard of the 2006 macbook pro, freshly cleaned of thermal paste and setting on a clean walnut coffee table.

At some point in the next few weeks after cleaning and installing the guts in a new case, reapplying thermal paste, upgrading to an SSD, and setting up Arch Linux, this laptop will be a high performance work machine again, hopefully saved from a landful for another long while.

June 2, 2023

/stream /reading /technology /permacomputing /degrowth /collapse

Following some links led me to The Monster Footprint of Digital Technology on Low Tech Magazine. While the concept of embodied energy (in microchips, or in general) was not new to me, this article did a great job of describing the scale and trends in energy and resource consumption in the manufacturing of modern digital technology.

One aspect in particular stood out to me, which was the claim that "digital technology is a product of cheap energy". I think about this idea from many angles, that there are many aspects of our modern society that have expanded to consume all of the "infinite energy" we've had access to during the fossil fuel era. The proliferation of cars, processed foods, and microchips are all goods that have fundamentally changed the way we have lived, but are (and have always been) unsustainable to produce in the long term since they are fundeamentally born out of an environment with very cheap, portable, and dense energy sources. Trying to maintain that lifestyle without fossil fuels will be nearly impossible due to "Energy Return on Investment" (EROI) calculations and the laws of physics. And yet, at the same time, many people (and our economic system more broadly) have become completely dependent on these goods and this lifestyle, with a looming threat of /collapse if they were to suddenly disappear.

And so I wonder about what computing might look like in a world with more restricted and balanced energy use, if we managed to actually ramp down our energy and resource consumption to a truly sustainable level. Will computing still exist? How accessible would it be?

June 1, 2023

/stream /now

I left my most recent salaried job in the Fall, and have been living off of savings while I put together plans for the next major phase of my life. I had saved a good amount of money in my 20s that I intended to use to put a down payment on a house, but the world (and the housing market) had other plans. I decided to "be the change", and dedicate my life completely to bringing about the economic and social shifts that the planet desperately needs.

From one angle, I've been building up a local grassroots advocacy group that focuses on the holistic thinking needed for livable, resilient, people-oriented cities. We've built up a distributed group of people who show up to city council meetings, meet with neighbors, and talk to reporters. We've pushed for parking reforms and have shaped local narrative around density and transit. In the future we hope to continue to organize and educate our neighborhoods on the need for intentional, dynamic, and fearlessly compassionate community, that welcomes new neighbors and lives within our "ecological means". Hopefully, we are just getting started.

At the same time, I am building real, practical skills for the future I want to live in. I have been developing my skills as a woodworker, doing my best to learn how to repurpose old materials, to favor hand tools, and to build for longevity. I am in my second year of volunteering at a local community farm which provides a no cost CSA to low-income or food-insecure folks. I aim to continue developing these skills and communicate them, to better distribute the knowledge of buiding and food production among my community.

Finally, I am working on a /permacomputing system inspired by natural complex systems called the Coalescent Computer. My hope is to develop a platform for social computing that allows communities to "fork and evolve" economic processes and knowledge systems for their local needs, while still gaining the computational benefit of code and data reuse.

I turn 30 this summer, and I think that I'm actually ready for it.

May 31, 2023

/stream /film /anime /ghibli

Watched Whisper of the Heart, directed by Yoshifumi Kondō, written by Hayao Miyazaki, and based on a manga by Aoi Hiiragi. This was the second time I've seen it, the first time being while watching every Studio Ghibli film in order two years ago. I rated it highly after my first watch, and I enjoyed it just as much the second time.

The story follows a 14 year old girl as she navigates the people around her growing up, moving on, and taking risks, and then choosing to take her future into her own hands as well. I think it does a great job of capturing the combined emotional rollercoaster of both being a 14 year old navigating new social situations and trying to push yourself creatively for the first time. While Ghibli movies are more widely known for their fantasy elements, their films about normal people living normal lives are just as beautiful and engrossing

May 30, 2023

/stream /reading /merveilles /programming

I read Situated Software, by Clay Shirky which seemed to be bubbling up in conversation around Merveilles today. It elaborated on some of the ideas I've been playing with lately, specifically around offloading the social aspect of computing networks to the humans in the loop instead of strict algorithms. This note on payment in small scale networks was particularly in line with that:

The possibility of being shamed in front of the community became part of the application design, even though the community and the putative shame were outside the framework of the application itself.

May 29, 2023

/stream /merveilles

I joined in on the #theLogo community art project at Merveilles, where everyone was riffing on the logo.

I spent a few hours in Blender trying to bring my animated idea to life, and was able to get it to a really appealing place by leaning into some things that were beyond my skill set. Small adjustments to the model, framerate, and render settings let me find an aesthetic that fit my goal without having to push way beyond what I was actually capable of doing.

May 28, 2023

/stream /reading /philosophy

Read Superintelligence: The Idea that Eats Smart People. It helped me develop my own thoughts on intelligence and sentience, and connect some of my "emergent, complex systems" model of human cognition with my gut-level distrust in the hype narratives around "AI".

Specifically, as someone who grew up in an environment where religious beliefs were facilitated, and as someone who subsequently exited that faith, it helped show me that my distrust may have been stemming from the fact that the aura around AI is rooted in many of those same faith based arguments that I've learned to escape from. This quote sums it up pretty well:

It's a clever hack, because instead of believing in God at the outset, you imagine yourself building an entity that is functionally identical with God. This way even committed atheists can rationalize their way into the comforts of faith.

The AI has all the attributes of God: it's omnipotent, omniscient, and either benevolent (if you did your array bounds-checking right), or it is the Devil and you are at its mercy.

Like in any religion, there's even a feeling of urgency. You have to act now! The fate of the world is in the balance!

May 25, 2023

/stream /coalescence

Moved some writing from my old website to the new page for /coalescence. Re-reading it now, I think a lot of it will have to be rewritten, but I think it's a good idea to have a starting point that matches the old site.

May 24, 2023

/stream /technology /programming /collect /colophon

As I started fleshing out components of this site, I wanted to add some new features to /collect. I added the ability to reuse the name of a @map as a value using "$NAME", and it can also be interpolated in strings with "@name". I also exposed a list of the @group objects on a @map using the value "@groups" on a @map. The first change reduced redundancies when writing new stream events, and the second made it possible to render all of the groups for each stream event.

May 23, 2023

/stream /reading /colophon

Read The Garden and The Stream, by Mike Caulfield after seeing it linked in Maggie Appleton's digital garden post, and seeing it use the same metaphor I stumbled on for this site.

I appreciated the interpretation of the history of the "personal web" through the lense of "streams and gardens", with the early web going for a garden metaphor (open wikis), and getting eaten by the stream metaphor (blogs, RSS, social media). Mike suggested that the time may be right for the garden to return (this is from 2015), and this tracks for me with the rise of Roam, Obsidian, and the general movement around the smallweb and permacomputing.

/stream /reading /colophon

While trying to read more about digital gardens, I checked out this piece on the history of digital gardens by Maggie Appleton. It was in this piece that I saw the link to "The Garden and The Stream" by Mike Caulfield, and found some gems around thinking about "topologies", as well as providing "epistemic transparency".

/stream /technology /programming /colophon

Built out the rough framework for this website, settling on the complimentary "garden" and "stream" metaphors.

May 20, 2023

/stream /technology /permacomputing /repair /macbook-pro-2006

While helping my partner set up her work for a DIY art festival, I found a /MacBook Pro (2006) in a junk shop for $25. It was a 2006 2.16GHz Core 2 Duo model. I took it home and was surprised to find that it worked great after plugging it into an old MagSafe charger I had lying around. The case was a little bent as if someone had sat on it, and consequently the trackpad was a little wonky; otherwise, it seemed like a great machine. I'll need to tear it down at some point to look for any other internal damage before spending more time or money on it.

/stream /philosophy /coalescence /information

Explored the ideas of "pattern, information, and concepts" through drafting an essay. After some good conversations, I feel like I've developed some really strong connections between my definition of abstract concepts and the nature of information as "embodied" concepts.