Joey git-annex devblog
day 207 at last

It took 9 hours, but I finally got to make c0dc134cded6078bb2e5fa2d4420b9cc09a292f7, which both removes 35 lines of code, and adds chunking support to all external special remotes!

The groundwork for that commit involved taking the type scheme I sketched out yesterday, completely failing to make it work with such high-ranked types, and falling back to a simpler set of types that both I and GHC seem better at getting our heads around.

Then I also had more fun with types, when it turned out I needed to run encryption in the Annex monad. So I had to go convert several parts of the utility libraries to use MonadIO and exception lifting. Yurk.

The final and most fun stumbling block caused git-annex to crash when retriving a file from an external special remote that had neither encryption not chunking. Amusingly it was because I had not put in an optimation (namely, just renaming the file that was retrieved in this case, rather than unnecessarily reading it in and writing it back out). It's not often that a lack of an optimisation causes code to crash!

So, fun day, great result, and it should now be very simple to convert the bup, ddar, gcrypt, glacier, rsync, S3, and WebDAV special remotes to the new system. Fingers crossed.

But first, I will probably take half a day or so and write a git annex testremote that can be run in a repository and does live testing of a special remote including uploading and downloading files. There are quite a lot of cases to test now, and it seems best to get that in place before I start changing a lot of remotes without a way to test everything.

Today's work was sponsored by Daniel Callahan.

Anna (Anna and Mark: Waldeneffect)
Supering vs. nadiring a Warre hive
One week of bee work

I've come to understand that a natural beekeeper's primary job is to make sure the bees have just enough space to continue working without wearing themselves out patrolling large expanses of empty hive.  So, when the third box of our mother hive went from looking like the top photo to looking like the bottom photo in a mere seven days, I figured I'd better give them some room to grow.

Opening up a warre hive

The question was --- should I add the extra box to the top or to the bottom of the hive?  In general, Warre beekeepers nadir instead of super, meaning that empty boxes are added to the bottom rather than to the top of a hive.  The theory is that keeping the lid on the hive and simply hoisting the whole thing up to put a new box underneath causes less disruption to the critical heat and scent within the brood chamber.  In the past, I have only nadired Warre hives, and last week I added the third box to our daughter hive at the bottom, as usual.

Supering a warre hive

However, once a Warre hive has more than two boxes mostly full of brood and honey, it becomes much less feasible to nadir the hive without rigging a lift (or roping two more people into helping you).  In addition, this excellent page suggests that supering is really the best way to add extra boxes onto a booming Warre hive during a heavy summer nectar flow.  In case you don't want to read the long version, the gist is that bees only build down as quickly as they need the space for brood, adding honey into cells above the brood chamber as young bees vacate that space.  So during heavy nectar flows, nadiring simply doesn't give the bees enough room to store the sweet liquid as quickly as it comes in.

Weeding around the hieve

With that data in mind, I opted to super the mother hive (and then to clean up the weeds around the hive entrance, a task that was long overdue).  Before supering, a quick peek down into the top box proved that the upper chamber was full of capped honey, so hopefully that buffer will mean taking the top off the hive had less impact on that all-important brood chamber.  And if this flow keeps up, we might get a box or two of honey this fall despite slowing our mother hive down by splitting her in half this spring!

Joey git-annex devblog
day 206 zap

Zap! ... My internet gateway was destroyed by lightning. Limping along regardless, and replacement ordered.

Got resuming of uploads to chunked remotes working. Easy!

Next I want to convert the external special remotes to have these nice new features. But there is a wrinkle: The new chunking interface works entirely on ByteStrings containing the content, but the external special remote interface passes content around in files.

I could just make it write the ByteString to a temp file, and pass the temp file to the external special remote to store. But then, when chunking is not being used, it would pointlessly read a file's content, only to write it back out to a temp file.

Similarly, when retrieving a key, the external special remote saves it to a file. But we want a ByteString. Except, when not doing chunking or encryption, letting the external special remote save the content directly to a file is optimal.

One approach would be to change the protocol for external special remotes, so that the content is sent over the protocol rather than in temp files. But I think this would not be ideal for some kinds of external special remotes, and it would probably be quite a lot slower and more complicated.

Instead, I am playing around with some type class trickery:

{-# LANGUAGE Rank2Types TypeSynonymInstances FlexibleInstances MultiParamTypeClasses #-}

type Storer p = Key -> p -> MeterUpdate -> IO Bool

-- For Storers that want to be provided with a file to store.
type FileStorer a = Storer (ContentPipe a FilePath)

-- For Storers that want to be provided with a ByteString to store
type ByteStringStorer a = Storer (ContentPipe a L.ByteString)

class ContentPipe src dest where
        contentPipe :: src -> (dest -> IO a) -> IO a

instance ContentPipe L.ByteString L.ByteString where
        contentPipe b a = a b

-- This feels a lot like I could perhaps use pipes or conduit...
instance ContentPipe FilePath FilePath where
        contentPipe f a = a f

instance ContentPipe L.ByteString FilePath where
        contentPipe b a = withTmpFile "tmpXXXXXX" $ \f h -> do
                L.hPut h b
                hClose h
                a f

instance ContentPipe FilePath L.ByteString where
        contentPipe f a = a =<< L.readFile f

The external special remote would be a FileStorer, so when a non-chunked, non-encrypted file is provided, it just runs on the FilePath with no extra work. While when a ByteString is provided, it's swapped out to a temp file and the temp file provided. And many other special remotes are ByteStorers, so they will just pass the provided ByteStream through, or read in the content of a file.

I think that would work. Thoigh it is not optimal for external special remotes that are chunked but not encrypted. For that case, it might be worth extending the special remote protocol with a way to say "store a chunk of this file from byte N to byte M".

Also, talked with ion about what would be involved in using rolling checksum based chunks. That would allow for rsync or zsync like behavior, where when a file changed, git-annex uploads only the chunks that changed, and the unchanged chunks are reused.

I am not ready to work on that yet, but I made some changes to the parsing of the chunk log, so that additional chunking schemes like this can be added to git-annex later without breaking backwards compatability.

Anna (Anna and Mark: Waldeneffect)
Keeping semi-dwarf apples small
Starplate pasture

I'd been planning on setting out our newly grafted apple trees into the tree alleys in the starplate pasture this winter, but my gut says the soil there isn't ready to support tree growth.  Sure, the texture looked great when I dug into it last winter --- well-drained and loose --- but plants have been slow to colonize the bare soil.  In our climate, all I should have to do is avert my eyes if I want weeds to grow over my head, and instead, the ground is still spottily covered with bits of grass and white clover despite the copious addition of chicken manure from our pastured flock and the last mowing over a month ago.  As a result, I figure those tree alleys need another year or two of TLC before I put beloved perennials in place. 

First-year apple trees

So...what am I to do with 11 beautiful apple trees?  Even though a late frost kept our two-year-old high-density apples from fruiting this year, I've been very happy with the vibrant growth resulting from the training method.  So I decided to keep this new round of apples small and closer to home using similar high-density methods.  Sure, if I train the trees to stay diminutive, I'll probably end up getting fewer apples from each plant, but I suspect I'll get the same or more total apples since close-to-home trees are more likely to survive and thrive.

Time to find gaps to fill!  I have five trees on M7 rootstock (usual spacing 12-15 feet) and six trees on MM111 rootstock (usual spacing 15 to 20 feet) to play with, so if I planted them traditionally, they would take up most of our garden.  However, the M7s should make good espaliers along the front of the trailer and the MM111s can be trained to the high-density method if I space them at least five feet apart (based on this handy calculator).  I'm curious to hear from folks who have played with espaliering --- do you think a six-foot spacing for apples on M7 rootstock will work?  And, given that I'm most interested in productivity over beauty, which shape would you recommend?

Joey git-annex devblog
day 205 incremental

Last night, went over the new chunking interface, tightened up exception handling, and improved the API so that things like WebDAV will be able to reuse a single connection while all of a key's chunks are being downloaded. I am pretty happy with the interface now, and except to convert more special remotes to use it soon.

Just finished adding a killer feature: Automatic resuming of interrupted downloads from chunked remotes. Sort of a poor man's rsync, that while less efficient and awesome, is going to work on every remote that gets the new chunking interface, from S3 to WebDAV, to all of Tobias's external special remotes! Even allows for things like starting a download from one remote, interrupting, and resuming from another one, and so on.

I had forgotten about resuming while designing the chunking API. Luckily, I got the design right anyway. Implementation was almost trivial, and only took about 2 hours! (See 9d4a766cd7b8e8b0fc7cd27b08249e4161b5380a)

I'll later add resuming of interrupted uploads. It's not hard to detect such uploads with only one extra query of the remote, but in principle, it should be possible to do it with no extra overhead, since git-annex already checks if all the chunks are there before starting an upload.

Naming Notable Trees Again

I tell myself I need to build back strength. So I went to the source of strength, the gurgling creek. After a night of rain (that I had not even noticed) I am glad to go somewhere where consequences are visible and tangible, where waters rise over the banks and cascade with white water. I am happy to see little "wet weather streams" crop up. The dogs can run free here. No one is here but me and my dear mother and the perros, the waggly pups. We stop for the trees we know, the wet pawpaw we are thinking we identified this year, though it might be a buckeye. Its leaves are like glossy paper on both sides. Shimmering like mirrors to our eyes. We don't notice animals. We don't even point out insects, our usual. The fish are somewhere under the murky surface of the water that has just been doubled. Imagined if your mass doubled overnight. Where would your fish be? Well the water doesn't know either. The plants though are no different from the rainforest in the most beautiful mysterious secret parts of Costa Rica. I know that, unless if they got more magnificent in 10 years. And the whole stream had a life of its own. Often I see a great blue heron, surprisingly large, mighty, not timid at all, passing over. Or a bit startled by us, but slowly getting out of our way, just for tradition, as if it knows no threat. Yet.
I do know in the car on the way back home, bumping over potholes and casting thoughts of hydrofracking out of my mind, I see one bird of note, a kingfisher gliding over the creek in his usual place. We all are touched by one another.

Anna (Anna and Mark: Waldeneffect)
Reinvisioning the forest garden (again)
Weedy forest garden

It seems like I reinvision the forest garden every couple of years, always thinking this new plan is going to turn a problem zone into an area of bountiful harvest.  So take what I write here with a grain of salt.  But, really, I think I've got it this time!

This year's reinvision is the result of rain and rodents.  When voles girdled the three apple trees that were supposed to grow into the canopy of the forest garden, I finally had to admit that those trees had been ailing for quite some time.  The issue in the forest garden is the same as in the neighboring back garden --- high groundwater drowns anything with roots more than two or three inches below the surface in the winter.  I've worked hard to build tree mounds up out of the wet using copious organic matter (logs, branches, leaves, weeds, manure, etc.), but as the plant materials inevitably break down, my trees' roots end up right back down in the submerged zone.  As of this year, the only perennials that are thriving in the so-called forest garden are a hazel bush and tons of comfrey.  Time to change gears.

Flower bed

The first thing I'm admitting is that high groundwater probably does mean a poor place for trees.  All of my soil amendments have created a rich layer of topsoil, but the quality dirt soon gives way to waterlogged clay that kills deep-rooted plants in the winter.  While I could keep working to make the forest garden a tree habitat, chances are I'd be better off using my efforts to turn it into a shrub and herb (in the botanical, not the culinary, sense) playground.

Forest garden swales
However, raising the planting zone up out of the groundwater enough to keep a foot or so of soil dryish does seem feasible now that I've experimented with a sky pond and chinampas.  Both have worked quite well, with Mark's only complaint being loud toads singing on spring nights (requiring him to turn on a fan before bed).  Why not combine the two winning strategies, using dug-out aisles to raise the planting surface while gently sloping excess water toward a sky pond at the lowest point?  As a bonus, I'll get to discover whether a sky pond with no gleying will hold water as well as the experimental one I semi-gleyed last year.  And, as Mark said tongue in cheek, we really need more toads.  Right?  Who doesn't!?

Joey git-annex devblog
day 204 mowing

Remained frustratingly stuck until 3 pm on the same stuff that puzzled me yesterday. However, 6 hours later, I have the directory special remote 100% working with both new chunk= and legacy chunksize= configuration, both with and without encryption.

So, the root of why this is was hard, since I thought about it a lot today in between beating my head into the wall: git-annex's internal API for remotes is really, really simple. It basically comes down to:

        { storeKey :: Key -> AssociatedFile -> MeterUpdate -> Annex Bool
        , retrieveKeyFile :: Key -> AssociatedFile -> FilePath -> MeterUpdate -> Annex Bool
        , removeKey :: Key -> Annex Bool
        , hasKey :: Key -> Annex (Either String Bool)

This simplicity is a Good Thing, because it maps very well to REST-type services. And it allows for quite a lot of variety in implementations of remotes. Ranging from reguar git remotes, that rsync files around without git-annex ever loading them itself, to remotes like webdav that load and store files themselves, to remotes like tahoe that intentionally do not support git-annex's built-in encryption methods.

However, the simplicity of that API means that lots of complicated stuff, like handling chunking, encryption, etc, has to be handled on a per-remote basis. Or, more generally, by Remote -> Remote transformers that take a remote and add some useful feature to it.

One problem is that the API is so simple that a remote transformer that adds encryption is not feasible. In fact, every encryptable remote has had its own code that loads a file from local disk, encrypts it, and sends it to the remote. Because there's no way to make a remote transformer that converts a storeKey into an encrypted storeKey. (Ditto for retrieving keys.)

I almost made the API more complicated today. Twice. But both times I ended up not, and I think that was the right choice, even though it meant I had to write some quite painful code.

In the end, I instead wrote a little module that pulls together supporting both encryption and chunking. I'm not completely happy because those two things should be independent, and so separate. But, 120 lines of code that don't keep them separate is not the end of the world.

That module also contains some more powerful, less general APIs, that will work well with the kinds of remotes that will use it.

The really nice result, is that the implementation of the directory special remote melts down from 267 lines of code to just 172! (Plus some legacy code for the old style chunking, refactored out into a file I can delete one day.) It's a lot cleaner too.

With all this done, I expect I can pretty easily add the new style chunking to most git-annex remotes, and remove code from them while doing it!

Today's work was sponsored by Mark Hepburn.

Anna (Anna and Mark: Waldeneffect)
Freezin' season
Cooking soup

It's now officially freezin' season!  The tomato crop is far smaller than I'd hoped for, but enough fruits are coming in to produce one or two big pots of soup per week, most of which ends up as winter meals.  And, as if to make up for the moderate tomato harvest, the green beans are extremely prolific this year, allowing me to freeze half a gallon at a time once or twice a week.  Add that on top of this spring's bountiful broccoli, plus the stir fry I'm experimentally freezing, and we've already got 8.5 gallons of winter vegetables socked away in the deep freeze (along with a bunch of homegrown and purchased meat).

Freezing green beans

Whenever I write about our winter stores, commenters always ask about our frozen-food goal for the year.  I'd post a link to my previously written answer, but we're constantly tweaking our diet to include more fresh produce even in the winter months, and are also streamlining non-fresh winter stores to include only the foods that taste best frozen and rethawed.  Last year, we had barely enough winter stores from 6.75 gallons of green beans, 11.25 gallons of vegetable soup, 0.6 gallons of sweet corn, and 0.25 gallons of tomatoes --- just shy of 19 gallons of vegetables total.  Since we plan to stock up on the same amount of storage vegetables (onions, garlic, sweet potatoes, carrots, cabbages, and butternut squash) and to continue pushing the weather boundaries with brussels sprouts, kale, and lettuce under quick hoops, twenty gallons in the freezer should do us this year as well.

Joey git-annex devblog
day 203 in the weeds

A lil bit in the weeds on the chunking rewrite right now. I did succeed in writing the core chunk generation code, which can be used for every special remote. It was pretty hairy (needs to stream large files in constant memory, separating into chunks, and get the progress display right across operations on chunks, etc). That took most of the day.

Ended up getting stuck in integrating the encryptable remote code, and had to revert changes that could have led to rewriting (or perhaps eliminating?) most of the per-remote encryption specific code.

Up till now, this has supported both encrypted and non-encrypted remotes; it was simply passed encrypted keys for an encrypted remote:

remove :: Key -> Annex Bool

But with chunked encrypted keys, it seems it needs to be more complicated:

remove' :: Maybe (Key -> Key) -> ChunkConfig -> Key -> Annex Bool

So that when the remote is configured to use chunking, it can look up the chunk keys, and then encrypt them, in order to remove all the encrypted chunk keys.

I don't like that complication, so want to find a cleaner abstraction. Will sleep on it.

While I was looking at the encryptable remote generator, I realized the remote cost was being calculated wrongly for special remotes that are not encrypted. Fixed that bug.

Today's work was sponsored by bak.

Anna (Anna and Mark: Waldeneffect)
Using humanure in the garden
Mulching high density apples

"Guess what this is?" I said to Mark yesterday morning as he walked past.  My voice was full of the excitement of finding a new source of organic matter to mulch with, so he hit the nail on the head with his first try.  "Humanure," my long-suffering husband answered, a distinct lack of enthusiasm coloring his voice.

Cleaning out the composting toilet

We closed off the first bin of our composting toilet last November, and I wrote that I planned to wait a year...or maybe two...before breaking into the stash.  However, my standards always start slipping when I clean out the deep bedding in the chicken coops and still need more high-carbon materials to mulch the perennials.  I figured, as long as no chunks of poo were visible in last year's humanure bin, I could use it beneath plants that wouldn't be producing until this time next year.  Really, that gives the material almost 24 months between excretion and eating, right?

Mulching with humanure

HumanureWhen I opened up the composting toilet bin, I was surprised to see that the contents really just looked like slightly aged sawdust.  There were some chunks of toilet paper around the edges, where the contents were too dry for decomposition, but all other signs of human waste were gone.  I set aside most of the residual toilet paper as we went along and used the four wheelbarrows of organic matter that remained beneath our high-density apples, our hardy kiwis, and our black raspberries.

In the interest of full disclosure, I will admit that despite a lack of odor in the composted humanure, it slightly grossed me out, especially early in my cleanout efforts.  As with slaughtering chickens, I immediately went and took a shower after finishing the cleanout, even though the biologist in me knows that nine-month-old humanure is probably less likely to make me sick than relatively fresh chicken manure and horse manure are.  I handle the latter with barely a sniff, but I definitely still have a hint of the fecophobia that made Mark lack his usual enthusiasm about my crazy experiments.

Berry patch

Mental issues aside, Mark and I have some thoughts for improving our composting-toilet before changing back over to the now-emptied bin this fall, but I'm pretty happy with version 1.0 as-is.  Human "waste" has become an asset to the farm rather than a hindrance --- just what I was looking for!

Deep Breaths

You will change, Maggie.

You will lose traits you loved, dear.

Get used to losing.

Your life is just breath.

So concentrate on breathing,

Die and gasp again.

Surface now, fishy.

If you love your little deaths.  

Or just stay deep, swim.

Joey git-annex devblog
day 202 new chunk groundwork

The design for new style chunks seems done, and I laid the groundwork for it today. Added chunk metadata to keys, reorganized the legacy chunking code for directory and webdav so it won't get (too badly) in the way, and implemented the chunk logs in the git-annex branch.

Today's work was sponsored by

Anna (Anna and Mark: Waldeneffect)
Hatching braconid wasps
Parasitized hornworm

In addition to watching a bush katydid top my grapevine, I've been enjoying a closeup view of life on the tomato plant right outside our front window.  Two weeks ago, a hornworm caterpillar showed up, and I left it alone, knowing that the leaf muncher would soon be munched in turn.  Hornworms are never a problem on our farm because parasitoid wasps kill them in short order, and this caterpillar was no exception.

Hatching parasitoid waspWhat was unique about this hornworm is that I noticed when the adult braconid wasps were ready to hatch from their cocoons.  Tiny black fliers on the immobilized caterpillar alerted me to the hatch, and I was able to watch as wasp after wasp pushed its way out of the top of each cocoon.

Just a few minutes later, I was treated to a viewing of a tiny gray treefrog on our hazel bush, and that afternoon, a female goldfinch visited our greywater wetland to gather cattail fluff for her nest.  When my eyes are open, I know that's a normal day in the life of our diverse homestead.

Rare Motion

When the hummingbird flies north to nurse on bee balm morsels, 

the flower does not sing hallelujah;

the forests do not salute;

the dew does not stop to cry.

The red blossom stays mute;

the trees are still;

the water forming on the mint stem stays put.

Except for you.


do you remember that book 

that first grown up experience 

when the print felt like a sermon?

Jack London maybe

brought you a healthy nervousness 

around the teenagers

who swaggered and laughed

as if they knew when you observed them?

how have the pages of literature

shaped your life?

Joey git-annex devblog
day 201 chunky

Working on designs for better chunking. Having a hard time finding a way to totally obscure file sizes, but otherwise a good design seems to be coming together. I particularly like that the new design puts the chunk count in the Key (which is then encrypted for special remotes, rather than having it be some special extension.

While thinking through chunking, I realized that the current chunking method can fail if two repositories have different chunksize settings for the same special remote and both upload the same key at the same time. Arn't races fun? The new design will eliminate this problem; in the meantime updated the docs to recommend never changing a remote's chunksize setting.

Anna (Anna and Mark: Waldeneffect)
Writer's remorse
Potter wasp

Cannibal flySome of you may experience buyer's remorse.  I don't buy much, so I rarely feel that pang, but I do experience what I've come to call writer's remorse.  What am I talking about?  Imagine you polish a book to within an inch of its life, send it off to your publisher...and then a reader shares these astonishing pictures of beneficial insects from his yard.

The solution?  Posting those awesome images here on the blog so at least some of you will get to enjoy them.  The top photo shows a potter wasp storing a caterpillar to feed her young while the second photo is a cannibal fly getting ready to suck the juices out of a wasp.  Both are taken by Brian Cooper --- thank you so much for sharing, Brian!

Anna (Anna and Mark: Waldeneffect)
A katydid, a grape, and a piece of baling twine

Grape and tomato raceWhen I strung up a simple piece of baling twine to guide our young grape vine to its trellis, Mark rolled his eyes.  Did I have to relentlessly reuse found material?, I could see him thinking.  What if the twine rotted out before the grape hit the wire?

Luckily for me, the grape vine took to its job with gusto.  Despite having been a mere unrooted twig only a little over a year ago, the plant settled in to grow like nuts.  I could watch the plant out the trailer window, and I just knew it was going to reach the trellis wire 7.5 feet above the ground in early July.

Then, one day, a bush katydid that I had written about in The Naturally Bug-Free Garden as mostly harmless nibbled the growing tip right off my grape vine!  I had warning too, having watched the same insect bite the end off a tendril just a few minutes before, but I wouldn't quite believe my eyes.  Could that sweet little insect have derailed my baling-twine experiment so quickly?

Bush katydidI snagged the katydid and fed it to our tractored hens (so there!), but the damage was done.  As with any plant that loses its top, apical dominance had fled and the vine began to branch out from lower buds rather than continuing its race for the sky.  But soon enough one shoot took the lead, and this weekend that grape finally reached the wire, proving my crazy reusing ways weren't flawed.

So much drama!  This is my favorite part about the growing area in front of the trailer --- since I can watch it out the window, I see every little bit of life that occurs, both good and bad.  I can hardly wait to discover whether, next year, I might get to watch grape fruits develop from tiny blooms right in front of my eyes.

Joey git-annex devblog
day 200 one year along

Updated the Debian backport. (Also the git-remote-gcrypt backport.)

Made the assistant install a desktop file to integrate with Konqueror.

Improved git annex repair, fixing a bug that could cause it to leave broken branch refs and yet think that the repair was successful.

A bit surprised to see that now been a full year since I started doing development funded by my campaign. Not done yet!

Update on campaign rewards:

Today's work was sponsored by Douglas Butts.

mark (Anna and Mark: Waldeneffect)
Three stories high
Warre hive

Both of our hives are now three stories high, with an additional uninhabited attic.

This hive doesn't seem to mind being lost in the weeds on a seldom-visited part of the farm.  But we pulled a few of the larger plants in front of their runway while we were nadiring.

Anna (Anna and Mark: Waldeneffect)
Sourwood and basswood flow
Partially drawn comb

Despite a week that felt more like September than July, our bees have been working astonishingly hard.  Every time I pass by both hives, workers are flying in and out like crazy.  In fact, the colonies have been so busy, they didn't even mind me weeding nearly on their doorstep last week, a sure sign a nectar flow is under way.

Sourwood has been blooming for a few weeks, and even though the trees I can see from my window seem to be nearly done, I'm still noticing new blossoms littering the forest floor in the woods.  But my movie-star neighbor tells me his bees are probably working basswood, which would explain the hive traffic jams even better.  Even though the lofty basswood at the edge of our yard isn't blooming this year, there are probably many more trees in the woods dripping with sweet nectar for our bees to partake of.

Honeybee hive

The last few times I've taken photos up underneath our hives, I haven't seen much new activity.  In fact, if anything, it seemed like the mother hive had eaten through some of their stores last time I checked, and the top photo in this post shows that they haven't made much headway since last month.  But on Sunday evening, I struggled to take a photo under the daughter hive and eventually realized the problem was that the bees had drawn comb nearly to the screened bottom board, and that the camera simply couldn't focus so close to the lens.  Looks like the feedings I've been giving that hive have paid off.  Time to add another box and proclaim our split a glowing success.  Maybe now I can take them off the dole...again?

Anna (Anna and Mark: Waldeneffect)
Edible Landscaping With a Permaculture Twist

Edible Landscaping with a Permaculture TwistMichael Judd sent me a copy of his Edible Landscaping With a Permaculture Twist to review, and I gulped the book down the same day it arrived.  Too bad I couldn't taste the berries in those beautiful pictures!  More seriously, Judd's book is a fast and fun read, mostly geared toward newbie suburban homesteaders, but with tidbits that will suit even the established farmer on forty acres.

I'll discuss the one negative right away.  Most of the book's projects are clearly based on plantings Judd made as part of his edible landscaping business, so they focus on initial aesthetics and don't necessarily have the multi-year followup to see what does and doesn't work.  As a result, there are a few things included that I've seen in other books, but that have failed when I tried them on the ground.  For example, I wouldn't recommend planting comfrey right up to the base of young fruit trees (especially if your soil is poor), and I think it would be handy to note which of the unusual fruit species profiled are invasive in the U.S.  On the other hand, by keeping each section simple, Judd will probably inspire many more readers to take the plunge and try something, which is how we truly learn what suits our site.

Rain garden

That caveat aside, I found a lot to pique my interest in Edible Landscaping With a Permaculture Twist.  First, there's the story of the book itself, which is self-published based on a kickstarter campaign, but is distributed by Chelsea Green --- I wanted to hear more about how that came about!  Next, mixed amidst the most-popular permaculture techniques (hugelkultur, herb spirals, earthen ovens), Judd includes a fascinating section on rain gardens, which sound very much like my sky pond but for soil that actually drains.  In the same chapter, the author also explains how to make an A-frame level for easy keyline marking, a tool I definitely plan to try out.  Finally, those of you who imbibe will likely get a kick out of the various alcoholic recipes scattered throughout the text.

In the end, though, my favorite part of Judd's book was the photos and diagrams.  If you're a magazine reader, you should track down a copy of his book just for the eye candy, and I guarantee you'll end up inspired to try at least one of project on your own homestead.  Judd's beautiful and inspiring read is just the nudge you might need to stop dreaming and start doing.

Anna (Anna and Mark: Waldeneffect)
Mid-July 2014 in the garden
Collecting seeds

The last vestiges of spring are coming out of the garden this week and next.  A few small cabbages are lingering in unneeded corners, and I just pulled out the kale, arugula, and poppy plants after harvesting their seeds.  I probably should harvest all of the spring carrots, too, but there's not really room for them in the fridge due to the dozen cabbages currently chilling and waiting to be souped, so I've just been pulling orange roots as needed for the last few weeks.

Summer garden

Of course, the summer crops fill most of my attention at this time of year, both in the garden and in the kitchen.  But we've already started on fall crops, too, setting out broccoli, cabbage, and brussels sprouts and direct-seeding carrots and peas.  Since fall crops often germinate poorly during hot, dry weather, one of my most important tasks at this time of year is remembering to drop back by the fall beds a week or two after planting, reseeding as necessary.

Basket of cucumbers

The other thing I try (and often fail) to remember in the height of summer is to make notes on my gardening spreadsheet about what we planted too much of.  For example, we've had so many excess cucumbers and summer squash for the last few years that I've had to give them away by the basketload, and yet I keep planting the same amount.  Maybe I'll remember to only plant half as many cucurbits in 2015?

Joey chatter

Different power failures in the UK keep setting my work back this week. Just lost 5 days of trying to build ghc on arm.

Particularly "special" because I'm not in the UK, nor on the grid for that matter.

Letter Song

I want to write a letter to yesterday

that says to express my wants and needs

that "no's" alright and waiting is fine

that I don't have to try so hard all the time

to be gay or to walk straight 

down the main beaten road

Just to lighten my load

That society's burden

and society's pains 

are grim but its ok to swim

Just to float or sink into a boat

it's ok to kiss on destiny's child

to be proud of the way she walks in the light

and even to gloat

but regrets will come

and we must think them through

they will happen to you 

oh society's child

you can take it more mild

if you don;t think it's a beautiful web

than you gt washed with the eb

and the flow

so oh no

oh no baby girl don't go

just keep taking it slow.

I got your words in my inbox

and I can just speak for today

that it's ok to say no way today

but yesterday's stab

and yesterday's show 

it wasn't that bad

you had been so sad

and now your released

ok?  into today

baby girl you've still got your baby face

and anuone who shows disgrace

can just walk away 

and leave you along

or I'll unplug their phone

and lock them away

one broken system 

can replace another

pop culture isn't a letter frm Gad

if he or she or they was here

there would be no place for this fear

you've done nothing wrong.

I wrote you this song

to show you you're strong.

Anna (Anna and Mark: Waldeneffect)
In memory of Onie Clark, a colorful woman

Onie Clark"Onie Mae Cresong Clark, age 79, of Bristol, VA, went to be with the Lord on Tuesday, July 15, 2014 at the NHC Healthcare of Bristol.  Onie was born April 8, 1935 in Washington County, Virginia, a daughter of the late Ward Christopher Cresong and Elvie Smith Cresong.  She was a lifelong resident of Scott County and Washington County, Virginia, where she was a homemaker and was of the Baptist faith.  She was preceded in death by her husband, Silas Clark..."

Back when I was knee high to a grasshopper, Onie and Silas lived up the creek from my childhood farm.  I would run down to visit, barefoot and clad only in underpants, until Onie finally put her foot down and required me to don a shirt.  Despite that one act of tough love, our neighbor was always ready to enfold me in her arms, where I was riveted by her neon orange chewing gum, a color I'd never seen before in my life, and by her southern makeup, so different from the appearance of my clean-faced Yankee mother.

Graduation photoBut appearances weren't important to me at that age.  I was on a mission, and once inside, I headed straight for the bathroom.  No, I didn't need to go, but our family's farm only boasted an outhouse, so the concept of peeing in a toilet was remarkable to my young mind.  Plus, Onie's bathroom had real green carpeting on top of the closed toilet lid, so soft I wanted to run my hands through the pile.  In fact, I probably hid out there for several minutes, drawing pictures in the deep yarn.

Onie with pot-bellied stoveBack in the kitchen, I entered Onie's domain, decorated with big ceramic bins in the shape of mushrooms.  Our country neighbor was most likely cooking soup beans and biscuits, but hers was a version remarkably dissimilar to the type my health-conscious parents set out on our table.  Grownup Anna knows that the difference was copious butter and salt, plus a healthy hunk of bacon in the beans, but child-Anna only knew that Onie could cook like no one else.  There would be yellow tomatoes with red centers, so juicy they oozed across the plate, and perhaps an ear of sweet corn on the side.  I definitely wanted to be invited to dinner.

At the time when Onie was part of my village, my nuclear family was so dirt poor that all of us were fed free lunches at school.  In fact, I remember my kindergarten teacher giving me a red, hooded cape that I cherished, not realizing she felt me a charity case.  And I remember how much I yearned for the big, beautiful boxes of crayons that the other kids brought out to color with, complete with metallic hues and a sharpener in the back.

Me dreamingLater, I would become saddened by Christmases where the presents were never quite what I asked for.  One year, I yearned for Archie Carr's Handbook of Turtles, and was instead gifted with the larger and more colorful (but harder to read) Encyclopedia of Turtles.  I'm not even sure the issue was so much money as a difficulty deciphering the dreams of a complicated child, but to Onie, I wasn't so complex.  My neighbor saw the silver and gold crayons dancing through my dreams and she gave me the best gift I'd ever received in my young life --- a box of crayons so big the sticks were arranged in stadium seating.  My brother Joey and I would later melt a few crayons on our tin roof, molding them into shapes as glorious as the drawings I made when the crayons were first sharp and new.  That gift may well be the reason I majored in art (as well as biology) when the time came to go to college.


As with her husband, I never really knew Onie as an adult.  When she passed away this week, I hadn't truly visited with her in years.  But my memories of sitting on the ground by her porch and gently massaging sedum leaves into balloons while Onie and Mom visited together will last forever.  And whenever I walk by my touch-me-not flowers that descended from Onie's seeds, I'll think of the colorful woman who once made my dreams come true.  Thank you for the crayons, Onie, and for spreading color and love through my young world.

Joey chatter

Doing a from-scratch rebuild of my mail server this evening. These 90 lines of haskell code set everything up.

A little OTT perhaps, but I think I understand my setup better now, and can find it all in one place when I need to refresh. Also, I'll never forget to run postmap or newaliases when changing a file, since that's automated too.

Also, I'll probably refactor this initial code dump into something less horrrible later.

kiteMailServer :: Property
kiteMailServer = propertyList " mail server"
    [ Postfix.installed
    , Apt.installed ["postfix-pcre"]
    , Apt.serviceInstalledRunning "postgrey"

    , Apt.serviceInstalledRunning "spamassassin"
    , "/etc/default/spamassassin" `File.containsLines`
        [ "ENABLED=1"
        , "OPTIONS=\"--create-prefs --max-children 5 --helper-home-dir\""
        , "CRON=1"
        , "NICE=\"--nicelevel 15\""
        ] `onChange` Service.restarted "spamassassin"
        `describe` "spamd enabled"

    , Apt.serviceInstalledRunning "spamass-milter"
    -- Add -m to prevent modifying messages Subject or body.
    , "/etc/default/spamass-milter" `File.containsLine`
        "OPTIONS=\"-m -u spamass-milter -i\""
        `onChange` Service.restarted "spamass-milter"
        `describe` "spamass-milter configured"

    , Apt.installed ["maildrop"]
    , "/etc/maildroprc" `File.hasContent`
        [ "# Global maildrop filter file (deployed with propellor)"
        , "DEFAULT=\"$HOME/Maildir\""
        , "MAILBOX=\"$DEFAULT/.\""
        , "# Filter spam to a spam folder, unless .keepspam exists"
        , "if (/^X-Spam-Status: Yes/)"
        , "{"
        , "  `test -e \"$HOME/.keepspam\"`"
        , "  if ( $RETURNCODE != 0 )"
        , "  to ${MAILBOX}spam"
        , "}"
        `describe` "maildrop configured"

    , "/etc/aliases" `File.hasPrivContentExposed` ctx
        `onChange` cmdProperty "newaliases" ["newaliases"]
    , hasJoeyCAChain
    , "/etc/ssl/certs/postfix.pem" `File.hasPrivContentExposed` ctx
    , "/etc/ssl/private/postfix.pem" `File.hasPrivContent` ctx

    , "/etc/postfix/mydomain" `File.containsLines`
        [ "/.*\\.kitenet\\.net/\tOK"
        , "/ikiwiki\\.info/\tOK"
        , "/joeyh\\.name/\tOK"
        `onChange` Service.restarted "postfix"
        `describe` "postfix mydomain file configured"
    , "/etc/postfix/obscure_client_relay.pcre" `File.containsLine`
        "/^Received: from ([^.]+)\\.kitenet\\.net.*using TLS.*by kitenet\\.net \\(([^)]+)\\) with (E?SMTPS?A?) id ([A-F[:digit:]]+)(.*)/ IGNORE"
        `onChange` Service.restarted "postfix"
        `describe` "postfix obscure_client_relay file configured"
    , Postfix.mappedFile "/etc/postfix/virtual"
        (flip File.containsLines
            [ "# * to joey"
            , "\tjoey"
        ) `describe` "postfix virtual file configured"
    , Postfix.mappedFile "/etc/postfix/relay_clientcerts" $
        flip File.hasPrivContentExposed ctx
    , Postfix.mainCf `File.containsLines`
        [ "myhostname ="
        , "mydomain = $myhostname"
        , "append_dot_mydomain = no"
        , "myorigin ="
        , "mydestination = $myhostname, localhost.$mydomain, $mydomain, kite.$mydomain., localhost, regexp:$config_directory/mydomain"
        , "mailbox_command = maildrop"
        , "virtual_alias_maps = hash:/etc/postfix/virtual"

        , "# Allow clients with trusted certs to relay mail through."
        , "relay_clientcerts = hash:/etc/postfix/relay_clientcerts"
        , "smtpd_relay_restrictions = permit_mynetworks,permit_tls_clientcerts,permit_sasl_authenticated,reject_unauth_destination"

        , "# Filter out client relay lines from headers."
        , "header_checks = pcre:$config_directory/obscure_client_relay.pcre"

        , "# Enable postgrey."
        , "smtpd_recipient_restrictions = permit_mynetworks,reject_unauth_destination,check_policy_service inet:"

        , "# Enable spamass-milter."
        , "smtpd_milters = unix:/spamass/spamass.sock"
        , "milter_connect_macros = j {daemon_name} v {if_name} _"

        , "# TLS setup -- server"
        , "smtpd_tls_CAfile = /etc/ssl/certs/joeyca.pem"
        , "smtpd_tls_cert_file = /etc/ssl/certs/postfix.pem"
        , "smtpd_tls_key_file = /etc/ssl/private/postfix.pem"
        , "smtpd_tls_loglevel = 1"
        , "smtpd_tls_received_header = yes"
        , "smtpd_use_tls = yes"
        , "smtpd_tls_ask_ccert = yes"
        , "smtpd_tls_session_cache_database = sdbm:/etc/postfix/smtpd_scache"

        , "# TLS setup -- client"
        , "smtp_tls_CAfile = /etc/ssl/certs/joeyca.pem"
        , "smtp_tls_cert_file = /etc/ssl/certs/postfix.pem"
        , "smtp_tls_key_file = /etc/ssl/private/postfix.pem"
        , "smtp_tls_loglevel = 1"
        , "smtp_use_tls = yes"
        , "smtp_tls_session_cache_database = sdbm:/etc/postfix/smtp_scache"
        `onChange` Postfix.dedupMainCf
        `onChange` Service.restarted "postfix"
        `describe` "postfix configured"

    , Apt.serviceInstalledRunning "dovecot-imapd"
    , Apt.serviceInstalledRunning "dovecot-pop3d"

    , Apt.serviceInstalledRunning "cron"
    , Apt.installed ["bsd-mailx"]
    ctx = Context ""
Beauty Itself is a Purposeful Direction

Beauty was the first meaningful thing I sought out.  Hiking or being carried with my finger pointing ahead as if I had been there.  The beautiful place, a pinnacle of winter landscape, had beconed me.  Children are gurus of the spirit.  They cry and scrape their knees and should be protected but they will teach you things about God.  

For so long I doubted God but I am remembering to love the spirit again. Someday my blood will water and iron again.  Right now it is my beat and source.  I have very little more than the bottom of my feet.  I am still a child of God.  My soul is all that I have.

Joey chatter

Fuming at the horribleness of If you ever find yourself reading an obit of anyone you care about, you should save as pdf.

Anna (Anna and Mark: Waldeneffect)
I Am Hutterite

I Am HutteriteI Am Hutterite by Mary-Ann Kirkby is an intriguing glimpse into Hutterite culture, a sister religion to the Amish and Mennonites, but one that is centered in Canada instead of in the U.S.  Although none of these religions are technically homesteading-related topics, I suspect many of you are as intrigued as I am by their farm-based communities, so I thought I'd share some tidbits from this interesting memoir.

The author was raised by Hutterite parents who chose to leave the community when Mary-Ann was nearly ten years old.  So the reader sees the Hutterite community primarily through a child's rose-tinted glasses, but also comes to understand why Mary-Ann's parents chose to "run away" after a power struggle resulted in the death of Mary-Ann's young brother.

Although it's easy to understand how inter-personal politics can go wrong in this type of situation, Mary-Ann also shares how safe and accepted members felt as part of the Hutterite community.  The 15-acre vegetable garden, milk cows, and geese fed everyone sumptuous meals, which led to a striking comparison with the moldy bologna, stale bread, and rotting produce that the children ate soon after the split.  On the other hand, the story also served as a cautionary tale for non-Hutterites interested in forming communist communities --- while everything can be wonderful as long as the community stays together, it can be very tough for a family to get their feet back under them after a split.

Mary-Ann was in for other surprises, too, as her family slowly integrated themselves into the outside world.  As you might expect, the author and her siblings had trouble blending in with kids in their classes at school, but there were also troubles at home.  Since Hutterite children start kindergarten at 2.5 years of age and then spend the rest of their lives eating most meals with the community and working designated jobs, the concept of being around her nuclear family all day was a surprise.

In fact, if she had remained Hutterite, Mary-Ann would have had her life planned out for her.  She would have begun alternating between weeks spent baking, washing dishes, and cooking at the age of 17, she would gotten married and then have taken several long breaks to bear children, and finally she would have retired from her work career at the age of 45.  Instead, Mary-Ann and her family were spat out into the "English" world that most of us live in, where great freedom means great responsibility.

I Am Hutterite is first and foremost a glimpse into Hutterite culture, written in an engaging, fiction-like manner.  Whether you'd like to know more about an Anabaptist community or simply want want a light summer read, Mary-Ann Kirkby's book is bound to hit the spot.

Joey git-annex devblog
day 199 ten minute cycle

Spent hours today in a 10-minute build/test cycle, tracking down a bug that caused the assistant to crash on Windows after exactly 10 minutes uptime. Eventually found the cause; this is fallout from last month's work that got it logging to the debug.log on Windows.

There was more, but that was the interesting one..

mark (Anna and Mark: Waldeneffect)
ill gotten cardboard
stove box in back of truck

The county started posting a guard at each dump site to prevent people from taking valuable garbage and scrap metal.

I was dropping off some trash the other day when I noticed this stove box sitting on the ground next to a dumpster.

The guard was distracted doing something in their little shack which made me think I could take the cardboard and run if I acted quick enough. I made a clean getaway. No sirens or admonishing statement from the guard. The box will live on as a layer of kill mulch for the garden.

Anna (Anna and Mark: Waldeneffect)
Another Egyptian onion giveaway (and selling off Daddy's patch)
Egyptian onion patch

All of our excess Egyptian onions for the year are long gone, but Daddy has quite a few top and bottom bulbs he's willing to sell.  I asked him why he planted so many onions and he shrugged.  "I had the bulbs and I had the room," he explained.  I understand --- that's the danger of the gardening bug!

Luckily, you get to benefit from my father's poor judgment.  Daddy's selling small flat-rate boxes of top bulbs (at least 100 per box) for $25 with free shipping, and sets of 20 bottom bulbs (and a few top bulb bonuses) for $25 with free shipping.

Egyptian onion bottom bulbs
20 Egyptian onion bottom bulbs
Free shipping within the U.S.
(Sorry, we are unable to ship live plants internationally)

Egyptian onion top bulbs
100 Egyptian onion top bulbs (various sizes)
Free shipping within the U.S.
(Sorry, we are unable to ship live plants internationally)

Trying to decide which starter pack will fit your garden?  If you've got lots of time and room, I'd go for the top bulbs --- you'll need to give them a bit more time before harvesting, but will end up with many more onions by this time next year.  On the other hand, if you want to start eating nearly right away (or don't have much room), the bottom bulbs are a great value (plus, next year you'll have top bulbs to give away or to expand your planting).

To read more about growing and eating Egyptian onions, click here.  And to celebrate excess onions, Daddy is also giving away two boxes, winner's choice (top or bottom bulbs).  Click on the widget below to enter!  (If you live outside the U.S., you can still enter, but if you win, I'll send you a non-perishable replacement prize like a t-shirt or book.)
a Rafflecopter giveaway

Thanks go to Barbara Ervin for taking the top photo in this post!


List of feeds:

  • Anna: last checked (25 posts)
  • Anna and Mark: Waldeneffect: last checked (1929 posts)
  • Anna and Mark: Clinch Trails: last checked (10 posts)
  • Joey: Can't connect to (Connection timed out) (66 posts)
  • Joey chatter: Can't connect to (certificate verify failed) (554 posts)
  • Joey git-annex devblog: last checked (196 posts)
  • Joey: blog: last checked (11 posts)
  • Jay: last checked (25 posts)
  • Dani: last checked (21 posts)
  • Errol: last checked (28 posts)
  • Adrianne: feed not found (1 posts)
  • Maggie: last checked (758 posts)
  • Tomoko: last checked (69 posts)
  • Jerry: last checked (28 posts)