Become a state pooper

/media/images/arizona_state_pooper.jpg

Green lantern cosplay

/media/images/green_lantern_cosplay.jpg

helix the editor

/media/images/helix-128038042.png

I currently use neovim as my editor of choice. It has served me well until the latest release removed cscope support. Apparently I was the only one using cscope to navigate unfamiliar code.

cscope let me do two things: it let me jump to the source of a function with a single keystroke (opening the file and moving my cursor) and it lets me take a function and ask 'where is this function called elsewhere in the code?' Other people dismayed by the loss of cscope asked about plugins to re-enable this feature and the general advice was to use 'universal-ctags' and 'vim-gutentags'. With this I can do the jump to the source of a function but it doesn't let me ask where this function is called. So my editor lost a little utility and I started eyeing helix again.

helix is written in rust. It's a vim variant with a multi-selection process based on an editor called kakoune

I've been keeping a sharp eye on it for a while now. It's written in rust, it's very fast, and it comes with LSP support built in. For a while I've been keeping a list of features I needed to see before I attempted to jump ship and start the tedious process of rebuilding my muscle memory. The list of features I needed looked like this:

They've been releasing every 3-4 months and the last release was in March which brought soft word wrap.

The last thing I need is session support. Being able to close the editor with three hundred open buffers and have them all open again when I start it again is critical.

I'm excited see how quickly I will be able to pick up the editor once it matures. Losing cscope was like the first pebble of an avalanche.

kitty the terminal emulator

/media/images/kitty-terminal-emulator-1792196299.png

I've been keeping an ear open about the terminal program kitty. Most recently a post on hackernews noting the input latency was lowest in this modern terminal emulator made me finally decide to download and check it out.

I currently use alacritty and I'm pretty happy about it. I've settled on a config that works across multiple machines and I generally don't have to think about it. I loaded up the kitty webpage and the introductory video surprised me.

The first surprise is the source code is a mixture of python c and go. This is alarming to someone coming from rust. I don't have anything against these languages but python and c aren't respectively designed for speed or safety.

The demo showed inline graphics which got me excited that this might be a path to a long dream of mine, integrating the browser into a terminal session. As soon as I saw this I paused the video and looked to see if anyone had done something like this but found nothing.

I was also surprised by the integrated terminal multiplexing features. I figured I could ignore these features since I'm a happy tmux user (it's essentially my entire desktop environment these days) but the author of kitty is unusually hostile towards terminal multiplexors. He says they are deficient to kitty in every way except for remote persistence.

Remote persistence is the primary reason I use tmux. Being able to reboot my computer, ssh to another device and connect to the running terminal session is non-negotiable. When someone opened an issue on github about the lack of remote persistence the author closed it as an 'unmitigated waste of my time'.

This user hostile attitude isn't always a sign of eventual project failure (see Theo de Raadt or the asshole that develops tiny tiny rss) but it's enough to tell me kitty is not for me.

Recipes

/media/docs/recipes/english_muffins/20110619_003.jpg

I have a series of notebooks in my kitchen to record recipes and keep track of my cooking experiments. I used to use a small notebook but it was awkward, it wouldn't stay open on the counter and the rubber band holding it closed was starting to fail, so I moved to a new larger book, even transcribing some of my recipes over, but this too had problems. The new notebook was used for both recipes and as an experimental log book and I found it difficult to do both and keep things understandable. I also found myself wanting to reference my recipes when I wasn't at home. For these reasons I decided to move all of my recipes to my website.

The old method of generating static documents on my site was complicated enough to require a checklist:

  • Start the podman container
podman-compose up
  • Create a subdirectory and add images
  • Fix permissions on the subdirectory
  • Build transient text files with:
podman exec -it tr_djangoapp_1 /tr/trousermonkey/trousermonkey/thumbnail.py --doc foo_directory_name
  • Create/rebuild the html with:
podman exec -it tr_djangoapp_1 /tr/trousermonkey/manage.py shell --command="from docs.views import build_doc;build_doc('foo_directory_name')"
  • Resize thumbnails with:
podman exec -it tr_djangoapp_1 /tr/trousermonkey/trousermonkey/thumbnail.py -r foo_directory_name

I used this to generate all my static documents but I had to look up the steps each time and the code to generate thumbnails, resize images, and compile the markup language was old. It used old python idioms and it rebuilt and resized everything from scratch regardless of whether it needed to.

To support a useful index of recipes I needed to make this easier else I'd never find the energy to update pages as they changed.

I transcribed the 47 recipes from my notebook to restructured text in a standard format and yesterday I finished the new static document generation routines. I rewrote the thumbnail generation scripts (although as separate functions until I could get all the static page generation switched over) and now they're easier to reason about and test. After all this work I can now add or modify any recipe with:

podman-compose up
build_recipes

The new script will only rebuild files that have changed or images that need a resize and it generates better markup template files than the old method.

This morning I deleted the existing recipes from the documents page (because they were redundant, too verbose, and in a non-standard format) and added a new link to my recipe collection.

Most of the recipes are lacking pictures and there could be lingering formatting errors but these will be easy to fix and I intend on getting into the habit taking pictures and updating the recipes as I make them.

Holy Bread

/media/images/img_20230429_073420.jpg /media/images/img_20230429_101451.jpg /media/images/img_20230429_101600.jpg

The last few months I've been developing a high-hydration sourdough bread recipe and after my 10th loaf I thought I had it dialed in. I was going to post my results but then my mom sent me a recipe out of the blue and it was even better.

/media/images/2023-05-20_16-30.png

I've been looking for a recipe that would produce bread with a good crumb. To develop a good crumb you can make your dough extra wet but wet dough is difficult to handle or form into anything other than a puddle. Bread baking enthusiasts compete for who can work with the wettest dough and they show off pictures of slices containing holes so large it's practically just crust. I wasn't aiming for anything so dramatic or labor intensive but I wanted to have a recipe for holy bread.

Another goal of this experimentation was to figure out a good set of ingredient ratios: percentages which could be used to make any amount of bread. Here's what I settled on after 10 loaves:

  • 100% flour
  • 63% water
  • 25% sourdough
  • 2% salt
  • (optionally 10-30% nuts)

To use this start by weighing your flour and multiply by the percentage for the other ingredients. I made loaves with 400g of flour. This works out to:

  • 400g flour (400 * 1.00)
  • 252g water (400 * 0.63)
  • 100g 100% hydration starter* (400 * 0.25)
  • 8g salt (400 * 0.02)

100% hydration starter just means starter that's fed with a 50/50 ratio of flour and water (100g flour with 100g water).

Using percentages you can scale up your breadmaking to any size and I've used this successfully to make a nut bread that had ingredients but no measurements.

My first few loaves were too wet to hold any shape in the oven and filled the bottom of my dutch oven like a pool of liquid. I started with 70% water and gradually worked my way down to 63% as I looked for a dough that was semi-wet and still strong enough to hold it's shape.

There's some technique to developing the gluten. With really wet dough you're working with a bowl of sticky soup. My technique has been to use a silicon scraper and to avoid touching it with my bare skin. A few experiments suggested you shouldn't use oil or water on your hands because it only makes the surface stickier.

I use the stretch and fold method; lifting the dough, stretching it and then plopping it back down on the heap. I settled on stretching and folding it from four sides four times with a 45min rest in (but keep reading - this is probably overkill).

After several stretch and folds the dough starts to inflate and take on a plastic sheen and stretching it causes it to tighten up, turning from soup to something you can form into a gelatinous loaf. The problem is if you let it sit it will return to soup so I settled on baking it shortly after one last gentle stretch and fold meant to preserve as much captured air as possible.

You need to bake on a pizza stone at high heat. I'm baking these 400g loaves at 450 for 26min on a pre-heated cast iron pizza 'stone'.

You also want to add steam to your oven to make the crust turn brown and get crunchy. I usually brush water onto the loaf before putting it into the oven and squirt water onto the stone a few times during the bake. Some bakers use a dutch oven or a contraption with upside down cookie pans and trays of water.

You can tell when it's getting close to being finished when the edges along the bottom begin to lift a few millimeters as it inflates like a balloon.

Incidentally, during this research I found a nice ebook on sour dough. found on github

The results, even the failures, are delicious so there's no harm trying it in your own kitchen. I thought I had the technique down and was going to end this post here but then sent me a recipe in the mail.


Mom's recipe

My mom mailed me a recipe printed from the king arthur flour website which was sent in to them by bread enthusiast Maura Brickman called Pain de Campagne I was intrigued when I saw it made use of a miniscule amount of unfed sourdough but it was only after I started assembling ingredients that I realized it was 80% water and the recipe was written to minimize the amount of fuss.

Here is the recipe (modified slightly by me) for a simple loaf of white bread:

Ingredients

  • 500g all purpose flour (100%)
  • 400g tepid water (80%)
  • 10g salt (2%)
  • 20g unfed starter (4%)

Process

  • Mix it until it just comes together, then let it sit 15min, stretch and fold, rest 15min, and do this twice more over the next 45min.
  • Then cover and let it sit on your counter for 12 hours or overnight.
  • Gather it up and put it into a towel lined bowl or banneton, wrap the whole thing in a plastic bag, and put it in the fridge for another 12 hours.
  • Take it out and bake (still cold) on a 450F stone for 30min or so.

Sure it takes 24hours before you can bake it but you only have to fuss over the dough for a few minutes. Doing the second rise in the fridge keeps the dough firm and makes it hold it's shape better when you transfer it to the pizza stone. I suspect the cold surface also helps it form a better crust and preserves the shape until the outer crust has baked.

My first loaf had a fantastic crumb, better than all of my ten careful experiments before, and it was noticeably heavy with moisture. That night I wondered if the quality of that first loaf had been a fluke. When baking bread you sometimes get lucky and a fantastic loaf appears and I was itching to bake another but we already had enough bread in the house and so it had to wait.

The second loaf turned out just as good and now I think I'm going to adopt this method for most of my sourdough. I moved my starter from the gigantic glass jar in my fridge to a much smaller plastic container and I've started to adapt my recipes to use a little more water and a little less starter.

Here's a recipe that uses this technique. I followed the percentages and process from my mom's discovered recipe but used it to make medieval walnut bread.


Medieval walnut bread

This recipe was found in a 14th century Venetian cookbook called the Anonimo Veneziano. It's a savory bread recipe which uses herbs I happen to have growing on our patio and in my cupboard. The recipe didn't have any measurements but it doesn't matter. We have the percentages to make as much as we want. I documented the process as I went.

Ingredients

  • 500g all purpose flour (100%)
  • 400g tepid water (80%)
  • 10g salt (2%)
  • 20g unfed starter (4%)
  • 100g coarsely chopped walnuts
  • ~40g minced onion (about 1/4 onion)
  • ~20g minced ginger (about a tablespoon - I like ginger)
  • 10g sugar
  • 3/4 tsp cinnnamon
  • 1/4 tsp nutmeg
  • 1/4 tsp cloves
  • 1/4 tsp pepper
  • mint
  • rosemary
  • thyme
/media/images/img_20230517_065602.jpg /media/images/img_20230517_070801.jpg

Process

Mix everything together until it just starts to come together. Don't bother trying to condition the gluten. Cover and set aside.

  • After 15min, stretch and fold, cover and set aside.
  • After 15min, stretch and fold, cover and set aside.
  • After 15min, stretch and fold, cover and set aside.

The dough will get noticeably tighter with each stretch and fold.


/media/images/img_20230517_071110.jpg /media/images/img_20230517_071629.jpg /media/images/img_20230517_071655.jpg /media/images/img_20230517_073250.jpg

Finally cover and let sit for 12 hours or overnight. I started this early in the morning so that the next long rest would happen overnight and I could bake the following morning.

After 12 hours turn the soupy dough out onto a floured surface and gather it into a boule for the second rise. Put this seam side up into a banneton, sprinkle with flour in case it rises out of the bowl, put the banneton into a plastic bag, and put everything into the fridge for 12+ hours.

I'd meant to bake in the morning but I was unusually busy with work and it didn't happen until 4 in the afternoon. This is fine. By the time I got to it the dough hadn't risen as much as the other two times but I hadn't expected much because of all the nuts.

/media/images/img_20230518_161328.jpg /media/images/img_20230518_162525.jpg

It's a lot easier to score the surface of the dough straight out the fridge. I wasn't sure this was going to accomplish anything because it was still pretty dense but it sort of worked out.

I brushed the loaf with water and slid it onto the pre-heated stone.

The loaf didn't inflate as much as I'd have liked but the crumb was pretty good for a dense nut bread and it was delicious. This is the second time time I've made this recipe and I think it's going into my little book. We ate half of the loaf in a couple days and the only reason we didn't continue was because I put the other half in the back of the freezer for later.

/media/images/img_20230518_165849.jpg /media/images/img_20230518_165855.jpg /media/images/img_20230518_184353.jpg /media/images/img_20230518_193815.jpg

The loaf smells fantastic when rising, baking, and baked, and it tastes pretty good too. If you've got the ingredients give it a shot. Otherwise if you've got some flour and can raise or borrow some sour dough starter, try the plain white bread. It's works well and isn't labor intensive.