Strawberry Tree Jam

/media/images/strawberry_tree_img_20240501_110518.jpg

In my perambulations I keep a sharp eye out for fruit and berries growing in public spaces. It's fun to collect blackberries, cherries, lemons, figs, and other fruit that are generally ignored by everyone else. I always veer towards the plants that have provided a pleasant snack in the past. The peninsula fruit currently hanging in ripe clusters of bright red are the fruit of the strawberry tree.

Also known as Arbutus Unedo, the name is attributed to Pliny the Elder who apparently claimed "unum tantum edo" ("I only eat one"). It's unclear if he meant the fruit was so good he only needed to eat one or so bad that he only ate one.

/media/images/strawberry_tree_img_20240504_090405.jpg

The fruit of the strawberry tree is sweet, but you never see them in the supermarket because fruit production is variable, the ripest fruit is soft, the surface is spiky, and the flesh is full of seeds.

The Portuguese ferment the fruit into a spirit called Aguardente de Medronhos and the Albanians use it when they make their Rakia fruit spirits. I'm not setup to make wine, but I can certainly make some Unedo jam.

After a test where I made sure pushing the flesh through mesh screen would filter out the tiny seeds, I biked down to a pair of trees near the aquarium and picked everything I could I could reach, jumping to get the higher fruits, but I was tormented by the perfectly ripe fruit still out of reach.

The Pacific Grove Library lends out infrequently used kitchen equipment. I biked down and borrowed a food processor. The holes in the mesh plates were too large for the tiny seeds, but I knew it would help turn the fruit into pulp.

/media/images/strawberry_tree_img_20240504_112632.jpg /media/images/strawberry_tree_img_20240504_112926.jpg

As soon as I borrowed the food processor I knew I had two weeks to collect enough strawberry tree fruit to make this experiment work. It wouldn't do to spend my time jumping up and down like an ape.

/media/images/strawberry_tree_img_20240502_093030.jpg /media/images/strawberry_tree_img_20240502_093034.jpg /media/images/strawberry_tree_img_20240502_093706.jpg /media/images/strawberry_tree_img_20240502_094731.jpg /media/images/strawberry_tree_img_20240502_094949.jpg /media/images/strawberry_tree_img_20240502_095015.jpg /media/images/strawberry_tree_img_20240502_095054.jpg

This tomato can fruit collector is designed to screw onto the end of my extendible Crappy 300 lizard stick. Strawberry trees aren't very tall, but it's nice to be able to just extend the pole and reach the higher fruit. The tabs hold the fruit in, so I can hold the can over my collection bag and twist it to pour the fruit out.

With this tool in hand I made another foray out to a line of strawberry trees growing beside the golf course and community center near lovers point. The trees were laden with fruit, but I misjudged how many elderly pacific grove residents would be out and about that morning. Still I came home with another bag full of fruit and decided to get started on the jam immediately.

I immediately ran into several issues. In case you want to follow my reckless example, here's what I'm going to do differently next time.

/media/images/strawberry_tree_img_20240506_121015.jpg /media/images/strawberry_tree_img_20240506_121229.jpg /media/images/strawberry_tree_img_20240506_121239.jpg /media/images/strawberry_tree_img_20240506_122948.jpg /media/images/strawberry_tree_img_20240506_130110.jpg /media/images/strawberry_tree_img_20240506_133259.jpg

Cut the firmer fruits into slices first. I had too many fruit rolling around in the food processor. They were too firm to get caught under the sweeping blade.

The holes in the food processor will give you a seed filled mash. Add water and blend this to make something you can put through the processor again. I think I wasted quite a bit of my fruit because everything was too dry.

The seeds don't feel good in your mouth and they have a bitter flavor. After running the fruit through the food processor, add more water until it resembles pea soup and push the mash through a fine mesh. I got the mash wet enough it would pour through the mesh and I used a scraper to stir the seeds until they had separated from the flesh. I still had a few seeds in the final mash, but it wasn't enough to spoil the taste.

Before boiling the mash I added very little sugar, less than a third of a cup. You might be able to get away with not adding any sugar at all. I wanted to make sure the result would turn into a jam and not burned fruit leather.

Whisk the mash as you boil it down. The mash seemed to foam up instead of clarifying like actual strawberries. When it started boiling it had the tendency to leap out of the pot and I have a few burns on my hand.

I followed the standard canning process of boiling my mason jars and sealing the lids. I'll probably still keep the jars in the fridge.

/media/images/strawberry_tree_img_20240508_115423.jpg /media/images/strawberry_tree_img_20240508_120658.jpg

The final result is surprisingly good! The jam is creamy, like apple butter or whipped honey, and the taste is much better than I expected. It's kind of like a creamy mango strawberry mix.

Although the collection and preparation was a pain, I think I will start collecting fruit and freezing them for a future batch. The jam is delicious!

Bready wisdom

/media/images/bread_img_20240501_074729.jpg

I realized that except for when I'm making something specific, I no longer need to follow a recipe when baking bread. This morning I baked a nice loaf of wheatberry fig bread and I thought it might be nice to write about my current process.

I bake with a sourdough starter. I captured my current starter last year (after abandoning my previous 20-year-old starter). I wrote about capturing my starter here but it's basically just feeding a 50:50 mixture of water and wheat flour for a 3-4 days (I use my chlorinated tap water) followed by gradually weening it onto white flour.

/media/images/bread_img_20240504_121003.jpg

I keep the sourdough starter in a small transparent plastic container with straight smooth sides. It's a good idea to keep your starter in a transparent container to see how well it's doing. A living starter will sweat a dark alcoholic water when neglected, and will sit up and blow bubbles when you feed it. Use a container with straight smooth sides, so you can scrape it down with a silicon scraper. A live starter won't grow moldy but if you leave any crust on the sides of the container it will dry out and go bad.

My container isn't perfectly airtight, so I don't have to worry about the jar exploding if I click the lid into place.

I keep my starter in the fridge when I'm not baking. I generally feed it a 50:50 ratio of all-purpose white flour and water. I try to feed it with 10-20g of flour, but it's sometimes hard to give it so little. My old starter was fed with a 50:42 ratio because it made it sit up more, but now I think this was selecting for a dryer yeast, and it made calculating the final dough hydration difficult.

My starter has survived without being fed for 40 days. A neglected starter will look like thick sediment in a pool of black alcohol. Many people throw their starter away when they see it like this, and would be surprised to find it will come to life again with the addition of a little more flour and water.

I currently use about 20-40g of starter in my breads (and sometimes up to 80g when I'm trying to reduce the amount in the container). 20g is about a spoon full. I think I could probably get away with less. I used to bake with 200-400g of starter, but this doesn't help the bread, and keeping that much starter makes feeding it more expensive and means you're more likely to have to throw out the excess. If you only use a spoonful of starter when you bake, you can keep it in a small jar, and when you feed it, it requires only a little flour.

Some recipe books suggest you feed your yeast several times over the course of a day or two before baking to make sure you get the best rise. I bake with unfed yeast or yeast that's been fed a few hours before. I haven't noticed enough of a difference to go to the extra effort.

I use all-purpose flour. Other flours have their uses, but plain all-purpose flour without additives makes the best bread. Acidic dough won't rise well so if I'm baking with pickled ginger or sour fruit I'll use some baking soda cut the acidity.

Basic bread requires just four ingredients: flour, water, starter, and salt. The starter is made with flour and water and the yeast comes for free.

I use a variant of my high-hydration dough recipe for all my breads. That recipe is for an 80% hydration loaf. Going any higher is not worth the effort because 80% hydration dough already needs special care. I usually save the full 80% hydration for simple white breads and I scale it back depending on what I'm making and how much I want to fuss over shaping the loaf. An 80% hydration dough is made from 500g of flour and 400g of water. To reduce the hydration I add more flour, but I don't go above 580g (69% hydration). A dryer dough will rise higher and hold its shape a little better.

I don't spend much time kneading the dough, you can't really with a high hydration mixture, the best you can do is to stretch a bit away from the puddle and let it plop back down again. When you stretch the dough like this you can feel the gluten grow firm. The dough will tighten up, turning from a jelly to a jello. Stretch the dough until it's just about to break and then fold the strand back into the puddle. Turn the bowl to do this to all four sides. Use a dry scraper and make sure your hands are dry. You will be tempted to work the dough with wet or oily hands, but this is a mistake. I stretch the dough three times with 15-minute intervals, and then I cover it with some plastic and let it sit out on the counter all day to develop a nice sourdough flavor.

/media/images/bread_img_20240504_123331.jpg /media/images/bread_img_20240508_104802.jpg

After resting all day, gather the dough into a ball, while preserving as much air as possible, and move it to a heavily floured couche or proofing basket. I use more flour in the proofing container when the dough is wet because it's heartbreaking when a beautifully risen dough sticks to your proofing container. Sprinkle the top of the dough with semolina flour or corn meal. The top will be the bottom of the loaf when you put it into your pan and the heavier flour will give the bottom a nice crust. Put the entire proofing container into a trash bag for the final proof.

Leave the bagged loaf on the counter for another hour or so before putting it in the fridge for another 12 hours.

I bake the loaf right out of the fridge. A cold dough will hold its shape and will let you slash the surface easier. I slash the surface with a lame. The thin curved blade slices better than a sharp knife. After 24 hours your loaf will have a nice sour flavor.

I've been baking my ~500g loaves in a 9-inch cast iron skillet. I bake with my oven's 'roast' setting (where both the top and bottom heating elements are engaged) and I preheat the oven to 450F (232C) with the skillet inside. When the oven is up to heat, I remove the pan, plop the cold dough into it, cut it with my lame, brush hot water over the surface (this gives it a nice brown crust), and then put it back in the oven.

/media/images/bread_img_20240508_105621.jpg /media/images/bread_img_20240508_112435.jpg

I bake at 450F for 29 minutes, but I'll remove it early if I think it's done or leave it in longer if it still feels dense. You can check if a loaf is done by popping it out of the pan and knocking on the bottom. Finished bread will sound hollow. I usually bake until the top is a dark chocolate brown (almost burnt) because this brings out some of the caramelized flavors. Baking until the top is nicely brown is enough for most breads, but I'm still experimenting on how to bake bread with lots of chocolate or other heavy wet fruit.

Additions are fun, but keep in mind the more you add, the worse your dough will rise.

  • Dried fruit of all kinds is good (avoid wet fruit). I just eyeball the amount, but add no more than 200g.
  • All nuts and seeds are good, but I like walnuts because they're cheap, and the bitterness goes away when you bake them.
  • Wheatberries are good and cheap if you can find them, and they add a nice texture to the bread. I don't bother cooking them beforehand even though this means they're drier than you'd get in a loaf of store bought wheat flour. Incidentally Bulger wheat is just expensive pre-cracked wheatberries.
  • Sunflower and Sesame seeds can be stuck to the top of the crust after you brush it with water. I usually don't bother because it makes a mess incommensurate with the additional flavor.

After writing this out it seems like a lot, but it's really pretty simple. Here's a recipe. Start this in the morning, and you will have delicious bread for breakfast the next day.

  • 500-580g flour
  • 400g water
  • A spoonful of salt (about 10g)
  • A spoonful or two of starter (fed or unfed)
  • Other additions like nuts, seeds, berries, or dried fruit
  • Mix until it comes together and move it to a bowl
  • Stretch and fold 3 times with 15 minute intervals
  • Let sit covered all day
  • Before bed move the dough to a couche/proofing basket/towel lined colander, cover this with plastic, and put it into the fridge
  • Put a cast iron skillet into the oven and preheat to 450F (230C)
  • Put the loaf into the pan, slash the top, brush with water, and bake for a half hour (or until the bottom sounds hollow).

Baking on a 24-hour schedule like this is more convenient than preparing a loaf of bread with bakers yeast over 4-6 hours in the middle of the day. Waking up knowing you will have a fresh loaf of baked bread for breakfast is nice.

Finally, homemade bread will go stale faster than store bought bread. As soon as it's cool, cut your loaf and freeze the bits you don't intend on finishing in the next few days. Freshly baked bread will be almost as good right out of the freezer as it was when it came out of the oven. Don't keep your bread in the fridge, this can make it go stale faster.

/media/images/bread_img_20240504_123732.jpg

Prime partitions

/media/images/bread_cut.jpg

I bake a lot of bread, 2-8 loaves a week, and I'm cutting bread a lot. I usually freeze freshly baked bread to keep it from going immediately stale, and I cut the bread before I freeze it because it's impossible to cut frozen bread.

One of the loaves I like to make is my cranberry pumpkin seed bread. I eat a bit of this bread every day for lunch, and I've been doing this for a decade. In an effort to cut down on (or at least measure) the amount of carbs I'm consuming I've started cutting smaller slices from my baguettes.

The recipe uses 1200g of flour and produces 4 loaves. I cut each of these loaves into 10 pieces which gives me a small (30g of flour) hunk of bread for my lunch each day.

I've noticed when cutting bread that it's more difficult to cut into larger prime partitions:

  • Cutting a piece in 2 is easy, just cut down the center.
  • Cutting a piece into 3 can be measured by eye
  • Cutting a piece into 4 is easy, cut it in half and cut each piece in half again. This is essentially factoring the bread. (2 * 2)
  • Cutting into 5 is getting hard.
  • Cutting into 6 is relatively easy - cut in half and then each piece into thirds. (2 * 3)
  • Cutting into 7 is pretty difficult.
  • Cutting into 8 is easy (2* 2 * 2).
  • Cutting into 9 is relatively easy (3 * 3).
  • Cutting into 10 is as difficult as cutting it into 5 pieces (2 * 5).
  • Cutting into 11 is impossible.
  • Cutting into 12 is easy (2 * 2 * 3)
  • Cutting into 13 is impossible.

Incidentally the multiplicative property of this bread factorization is commutative (2 * 5) = (5 * 2). To cut my loaf into 10 pieces I cut it in half first and then cut each piece into 5, generally cutting out a slice in the center and then cutting the two remaining ends in half. I could cut the large loaf into 5 pieces and then cut each of these into half but for some reason it seems more difficult to do it this way.

I accidentally left my bread proofing overnight and the baguettes were like deflated tires in their couches when I checked on it in the morning, but I baked them anyway, and they turned out alright. While the freshly baked loaves were still cooling on the counter, Amanda asked if she could have a slice and I had to run in to slice it for her because she hadn't read this post, and it was too hard to explain all this from the other room.

Boomer Brain

/media/images/boomer_brain0.jpg

Apparently there is an endless scroll of AI generated pictures on facebook and the boomers are eating it up. I've read that the accounts posting these things are bots so it's possible the likes are also coming from bots, but it still suggests something horrible.

During elsagate youtube had a abundance of strange cartoons and live action plays targeting children featuring elsa and spiderman. Each video was receiving millions of views. The screenplays were procedurally generated using all the keywords young kids were searching for on youtube. They contained things like "Frozen Elsa Dates Spiderman", "Supderman saves Frozen Anna!", "Spiderman & Frozen Elsa vs Joker!", and "Joker Kidnap Frozen Elsa baby e/ Police Baby vs Spiderman Baby Rescue Elsa".

/media/images/elsagate.jpg

The facebook bots are producing things based on what is typically liked on facebook; jesus, veterans, babies, dogs, and nature, and it's like shining a mirror into their brains.

/media/images/boomer_brain8.jpg /media/images/boomer_brain4.jpg /media/images/boomer_brain6.jpg /media/images/boomer_brain5.jpg /media/images/boomer_brain2.jpg /media/images/boomer_brain1.jpg

I never heard what happened to all those young children manipulated by the capitalism driven ai, and I'm not sure what will happen with our older (voting age) generation, but I know as the AI gets better it will begin to creep in from both sides, targeting older children and younger old people.

What happens when the internet is completely full of AI generated content tailored towards your specific interests? Will we crave authenticity, or will we be content?


Update 240503:

/media/images/crab_jesus.jpg

I'm including one more picture I originally left out because it was too creepy. I didn't realize if you squinted you could make out the outline of jesus among the creepy malformed underwater children and chitinous sealife.

linux permissions

/media/images/linux_parent_directories.jpg

I don't have a good image for this subject.


I learned something new about linux permissions. As long as the immediate parent directory is user writable you can write to it, even if that parent directory lives in a non user-writable directory.

For example:

/usr/                # drwxr-xr-x root:root
  /share/            # drwxr-xr-x root:root
    /nas_folder      # drwxr-xr-x na:na    <-free to read and and write by na

All these years I've assumed you needed writeable parents all the way down. This changes how I would organize my web service directories.

Maybe when my sbc explodes and I have to rebuild everything I'll organize things better.

Gitea, TinyTinyRSS, and FreshRSS

/media/images/freshrss2.png

While pushing code to my git server yesterday I realized I wasn't running the latest version and I decided to update.

I was a little nervous about breaking things, but I use a sqlite backing store so I don't have to worry about schema migrations, I can just back up the directory. The upgrade went fine. Apparently the program checks and migrates the schema automatically on boot so I didn't even have to worry about that going wrong. Gitea is pleasant. It's a single binary, comes already cross-compiled for my arm64 sbc, and to setup a reverse proxy you just send it through:

location /git/ {
    proxy_pass http://localhost:3940/;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
}

I wish all my network apps were as easy.

After the upgrade I started thinking about my feedreader server. My hosted tiny tiny rss feed reader isn't public and hasn't been updated in a while. As a hosted feed reader, ttrss is sufficient. It seems to handle my giant list of feeds without a problem, but it has some irritating rough edges.

The last time I installed it from scratch I discovered they'd deprecated the extension that allowed me to hit a button to advance to the next feed. TTRSS has its own built in shortcuts, but they conflict with my tridactyl settings, and you can't change them. I could use the arrow keys to advance to the next article in the list, but this was super irritating. Stepping through the list with the arrow keys would open each article, but it would continue to show the closed entries in the list above. Eventually the top of the opened article in the list would be a few steps above the bottom of the view and I would have to either refresh the feed (with the mouse), or I would have to use the page down key. As I read a feed, the articles would gradually open lower and lower in the window. Because of the gradual way it degraded I often didn't notice I was missing the bottom of images or the end of paragraphs until I ran into something I really wanted to see, and then I would have to interrupt my train of thought to fix the article position in the window. It made just using the software annoying like having a low grade headache.

It's possible this functionality has been fixed in the latest version of tiny tiny rss, but I don't know because the developer is an asshole. Rather than offering official releases he advises people to just use master HEAD. He tells you you're stupid if you try to run it in anything other than a docker container (which won't run on my arm64 sbc not to mention play nice with all my other nginx reverse proxy settings). Also he requires postgresql as a back end because he considers sqlite a toy database.

Tiny Tiny RSS was my only option when google shut down google reader, but I'm sick of its ethos, so I initiated yet another search of self-hosted feed readers. Unfortunately there arent many options. There is a go-powered hosted RSS reader called yarr but it seems too simplistic for my needs. FreshRSS was another promising option, but it uses a strange reverse proxy layout where you put some of the application in /usr/share, mark it as web readable, and then symlink a subdirectory in this filetree into your hosted directory. The reverse proxy settings also make the assumption you're not acting as a reverse proxy for anything else, and I couldn't get it running the last three times I tried it.

Energized by the asshole energy emanating from the ttrss guys I tackled FreshRSS again and finally got the service running through my reverse proxy only to discover it only gave me the choice of postgresql as a backing store (the docs say sqlite3 is the built-in default). This led to hours of trying to understand how php works. Apparently you can have the php sqlite3 module installed but not enabled. I eventually discovered that my package manager provided the sqlite module for php8.2 but not for 8.1 or 7.4. I don't know why it thinks I need three versions of php installed on my system when two of them are crippled, but the distribution is based on ubuntu, so maybe they just want to charge me for the missing debian packages.

I set it up last night and in the morning when I saw it had pulled down 6600 articles I killed the ttrss updater and replaced the ttrss tab that had been open for more than a decade with freshrss. I'm subscribed to ~300 feeds and I get 500-700 new articles every night. The sqlite database file is 45MB. There is no way in hell this needs postgresql.

/media/images/freshrss_shortcuts.png /media/images/freshrss_sticky_articles.png

FreshRSS encourages you to use sqlite. FreshRSS gives you an option to make your opened articles stick to the top of the window. FreshRSS lets you set different shortcuts. FreshRSS will let you automatically advance to the next unread feed when you exhaust the current one. FreshRSS doesn't tell you you're stupid for trying to install outside of docker. FreshRSS has actual releases and a changelog you can read on it's github page.. These things are a low bar to hit for a hosted service but rss readers never really recovered after google stabbed us in the back to promote its social network. I honestly can't recall the name of that social network now. It was killed a few years later like most google services.

I'm happy with FreshRSS, but I'm still on the market for a hosted feed reader written in go or rust, or anything really, as long as it will run on various architectures, consists of a single binary, and supports a range of databases.