HELLO · QUEENSLAND, AU · SINCE APRIL 2006

I'm Wayne, a software engineer who fell in love with Ruby on Rails in August 2005 and never quite recovered.

My name is Wayne Robinson and I'm a software engineer from Queensland, Australia. I've worked primarily in Ruby on Rails since 2005 and continue to ship products with it today.

Recent entries

The Honey Bee Blanket Hexagon Problem

Listen
0:00
Audio generated automatically with ElevenLabs.

This is a piece at the intersection of programming and my new favourite hobby, crochet. The two have more in common than I expected. Both make something out of a small set of repeating elements. Both reward planning. Both punish you for not planning enough. This particular project sits squarely in the middle of that Venn diagram.

A bit of context first. A few months ago my husband bought me the Honey Bee Blanket pattern by Gaynor Edwards, and the materials to make it. I had just picked up crochet again after a long pause, and it was a generous, thoughtful gift. I love him very much. The pattern is also, separately, kind of overwhelming. Both things are true. What follows is the story of how I found a way into the project that felt like mine.

The shape of the problem

The Scheepjes (which I always pronounce “Sheepies”, even though that’s not correct) Honey Bee Blanket is a hexagonal-motif throw with little crocheted bees scattered across the surface. It’s a quietly clever design: the hexagons and the bee detailing land in a way that feels intentional without being twee.

The booklet specifies a lot. It tells you to make 200 hexagons, how to construct each one, how to join them, what border to work around the edge, and how to make the bees (though, charmingly, not how many bees to make). It’s specific about the materials. Where it gets interesting is colour: some hexes are pinned to a specific colour, others come with a combination to choose from, and the rest are entirely up to you. Which means you have to design those hexes’ colour schemes yourself, and you have to do it before you make them, because you can’t lay out a hex you haven’t crocheted. And you have to do all of that within the fixed materials list. Pick combinations that lean too heavily on Boulder Opal and you’ll run out three balls in. Pick combinations that ignore Moonstone and you’ll have a ball left over.

So there are three nested problems before the blanket exists. First: which colour combinations to invent for the unspecified hexes. Second: where to place each hex once it’s made. Third: making sure the answers to the first two stay inside the materials budget. The pattern walks you up to the door of all three and trusts you to walk through. You make the 200 hexagons, lay them out on the floor, and arrange them. This is, depending on your temperament, either liberating or terrifying. For me it sits firmly at the terrifying end.

So I built a tool. It’s a drag-and-drop SVG editor, runs entirely in the browser, and the entire layout lives in the URL so you can bookmark and share it. But the interactive part of the tool only handles one of the three problems. The other two I solved upstream, by hand, before I shipped it.

Weighing hexes against skeins

The yarn budget came first, and it came from a kitchen scale.

There was no good public source for per-round metre estimates. Pattern designers don’t generally publish that data, and the Honey Bee booklet certainly doesn’t. The only honest way to find the numbers was to measure. I crocheted a sample of each round of a hex, weighed it, and worked back from the skein’s known weight and length to a per-round metre figure. Same for the joining stitches, the border, and a sample bee. It feels too unscientific to bother with until you realise nobody else has done it, and that ten minutes with a scale gives you numbers good to within a few percent.

What came out the other end:

Each hexagon is three rounds. Round 1 (centre) uses about 1.7m of yarn. Round 2 (middle) about 2.6m. Round 3 (outer) about 2.5m. Joining yarn between hexes runs about 116m for the whole blanket. The border adds about 120m over six rounds. Each bee is about 1.1m. Tails for colour changes are roughly 12cm each, distributed by usage. The total comes to several hundred metres per colour, and Stone Washed comes in 50g balls of 130m.

Which means: a colour scheme you find aesthetically perfect can be impossible to produce with the materials you have. Or, much more frustratingly, it can be possible only if you buy one extra ball of a colour you’d otherwise use 60m of, leaving 70m of waste.

Designing within the budget

With the numbers in hand, the colour-design problem became a constraint problem. I had a fixed materials list, a partial colour specification from the pattern, and a set of unspecified hexes whose colour combinations I had to invent in a way that totalled up correctly across the whole blanket.

The way through was a spreadsheet and a list of design principles I worked out before assigning a single hex its colour:

  • 49 solid hexes in the dominant colour form the perimeter. A blanket without a clear edge colour drifts visually.
  • Exactly two hexes each in the two rarest colours, never adjacent to another of the same. I wanted them as deliberate accents, not clusters.
  • The middle colour pairs with the transition colour in most of the transition hexes, producing a natural-looking gradient without anything that’s literally a gradient.
  • The darkest hexes cluster the way real brood-comb cells cluster in a hive, rather than distributing uniformly. That gives the blanket a story.

A close-up of the finished blanket showing the hexagon stitches and bee detailing.

Some of these are hard rules. Some are soft preferences. Some, like the brood-comb clustering, are aesthetic instincts I can recognise but struggle to specify in code. The temptation when you have a list like this is to encode everything as a logic problem and throw it at a constraint solver to compute the “optimal” answer. I tried it. It produces layouts that are technically valid and aesthetically dead. The “feel right” criterion isn’t capturable in clauses.

So I worked through dozens of candidate assignments in a spreadsheet, totalling them up against the materials list until the design fit. The colour scheme that ships with the tool is the answer to that constraint problem. The budget panel you see in the sidebar is the working that produced it, left visible so that when you go to your stash or the yarn shop you know exactly what to buy.

The placement problem, which is yours

What’s left for the user, and what the tool actually lets you do, is decide where each pre-coloured hex goes.

That’s not a small problem. With the colour scheme fixed, frequency distribution is already taken care of: there are exactly as many of each colour as the design calls for, no matter how you arrange them. What you’re balancing instead is everything else. Spatial distribution, so each colour is spread across the blanket rather than pooled in one quadrant. Local contrast, so no region reads as a tonal blob. Repetition rhythm, so the eye doesn’t pick up accidental lines of identical hexes. Weight, so the dark hexes don’t all collect in one half and make the blanket feel like it’s about to topple over.

Some of these can be measured. Spatial distribution is the variance of each colour’s positions. Local contrast can be approximated by perceptual distance between neighbouring hexes. Weight balance is the centroid of the darkness-weighted positions. The tool surfaces a few of these in the sidebar, but it doesn’t try to score the layout, because scoring would imply there’s a single correct answer, and there isn’t. The tool’s job is to give you fast feedback as you swap hexes around. The eye’s job is to know when it’s done.

A note on the simplest backend

One thing worth saying about how the tool works behind the scenes, because the choice was deliberate. The entire layout state is 600 colour-index letters — three per hex, one per round, written as A, B, C and so on — concatenated into a single string and dropped straight into the query string as ?d=…. The whole design fits comfortably in a URL bar. Every swap rewrites the parameter. Bookmarking saves your design. Copy-pasting the URL shares it with someone else. There is no server, no database, no account, no expiry.

Most personal tools shouldn’t have a backend, and this one definitely doesn’t. The downside is real (no “my designs” page, no recovery if you forget to bookmark), but for a tool one person uses to plan one blanket, none of that matters. Match the architecture to the problem.

The actual blanket

In the spirit of full disclosure: I am, of course, still crocheting the actual thing. So far I’ve made all of the plain hexes, which is roughly the most procrastinatable subset of the project. I’ve been avoiding the hexes with colour swaps with some determination. Cutting yarn, weaving in tails, switching colours partway through a round: I find every part of it tedious in a way that makes me want to put the project down and start a new one.

It’s a background WIP. I pick it up when I want something simple to do with my hands while reading or watching something. At my current pace it’ll be a few months before there’s a finished blanket to show, and when there is I’ll post an update with photos. The interesting test will be whether the layout I planned in the tool actually looks the way I imagined once it’s joined and bordered, or whether I’ve discovered some new failure mode of digital-to-physical translation. I’m braced for either outcome.

The bigger point

The Honey Bee Blanket booklet specifies the parts and is partially prescriptive about colour, then hands the rest to the crafter as if it were trivial: invent the missing colour combinations, arrange the hexes, stay inside the materials budget. None of that is trivial. The tool I built tackles two of those problems upstream, baking the answers into the design that ships, and hands the third to the user as a thing to play with. That split between designer-baked decisions and user-interactive ones is the move that printed patterns can’t make, and the part I’d most like other digital pattern companions to copy.

The Honey Bee Blanket is a beautiful pattern. Gaynor Edwards’ design is a thing of charm and craft, and the bees are genuinely delightful. The work the pattern hands to the crafter isn’t a flaw. It’s a problem the pattern format itself can’t solve. The proper response is not to complain about it, but to build a tool that lets someone solve it for themselves. That’s what this is, and what it lets you do is the part of the design my husband couldn’t have known to give me when he gave me the rest.

Drag a few hexes around. The URL is the design. If you make one you like, send it to me. I’d love to see it.


The original Honey Bee Blanket pattern by Gaynor Edwards is published by Scheepjes as YARN: The After Party No. 08 and is widely available from Scheepjes retailers. If you’re going to make the blanket, buy the pattern. The booklet is the design; this tool is just a way of arranging the pieces it gives you.

PERMALINK →

Xeorizer Updated to Xero API V2.06

Well, that was quicker than I expected.

Xeroizer has now been updated to support the Xero API V2.06 including:

  • Manual journal create/update/view (can only create draft invoices for now)
  • Inventory items create/update/view
  • Invoice line items can now be specified with the item_code which uses defaults for the item from Xero
  • PDF versions of invoices and credit notes can be retrieved with the Invoice#pdf([filename]) method
  • Payments can now have a reference specified on creation.

As always, remember this library is still only alpha-quality, so please make sure to test, test, test.

PERMALINK →

Xero API Release V2.06

Today Xero released some extra functionality to their API including JSON responses, manual journal entry, items and PDF invoices.

Of great interest to me is the ability to download PDF invoices directly from Xero which are formatted according to the chosen branding theme. This functionality will greatly decrease the time to market of my new application (still in stealth) by a few weeks and has me very excited.

My ruby library (Xeroizer) will be updated to work with these new features within the next week or so. Keep a watch on the project to keep up-to-date as changes are made and feel free to submit pull-requests for desired functionality. I usually respond within 24 hours.

PERMALINK →

Sport - what are we doing to our children?

I was recently going through some of my old paperwork and I pulled out my copies of the QCS tests I took to assist in classifying my overall position when graduating high school back in 1999. I read through these tests I came across my final draft for the Writing Task.

For this task I was presented with a three-page spread of stimulus material and in two hours I had to write a 600 word document in almost any form. In this stimulus material I saw some sporting activities and some comments on tribal societies (if I ever set up my scanner I may add a copy of this stimulus material here in the future).

During school I was always the math and computer guy and writing was definitely not my strong suit. However, I feel I managed to put together a fairly decent argumentative magazine article on the topic of sport and it’s relevance in today’s society in this pressure-packed two hours of exam fun! It’s a topic I still mostly believe in, although I intentionally made this article inflammatory to attempt to polarise and entertain the marker enough so that they may overlook the odd grammatical or spelling error.

So, without further ado, I give you the two-hour ramblings of a 17 year old some 12 years ago (with all original spelling and grammatical errors included as faithfully as possible, although I hope I made some more corrections when transcribing the final version). Oh I wish I got to come back to this a couple of days later an edit it before handing it in however, I guess everyone was in the same situation.

Sport - what are we doing to our children?

Sport, oh what an incredibly productive activity. From birth we teach our children that the only true heroes in our society are those who participate in sport. It is the sporting events that bring the crowds, sporting heroes who gain incredible amounts of money in sponsorship and children who are forced to believe that to be famous and well-liked they must be good at sport.

What is this fascination we have about sport? Most people argue that we participate in these activities to stay fit and healthy. This is a long way from the truth. Take Gridiron for example. This game consists of very big, heavily padded men who run around a field for three hours (remembering this is a sixty minute game) tackling other men. Is this what we call keeping fit? Is this really what we want to be teaching our children? Aparently so, as parents are usually the ones who push their children into playing these sports.

From birth, the male child is continuously pressed into participating in some for of team sport. This decision is usually made by the child’s father and is usually in the form of a sport the father enjoys watching. The parents often take a more active roll in the game than the children themselves: screaming from the sidelines, arguing with the referees and generally pushing their children until they have nothing more to give. This ritual of making a child do something the parent wants them to do is very damaging for the child’s developing personality. Rebellious behaviour only occurs because the children finally realise that they don’t have to do everything their parents want them to do anymore. They gain control over their own life.

However, this is not where this cycle ends. The rebellious child turns into an adult and, after a few short years, they have a child. Because these new parents choose to forget the reasons for their rebellious stage, the cycle of pressuring their children into playing sport continues.

This ritual like behaviour of parents pressuring their children into believing sport is the only way to win their love stems from tribal times. Earlier in history men, predominately, were the group responsible for catching the meat. They had to be fit, just in order to survive so, they made sure their children were fit also. They made them participate in ‘manly’ activities to build muscle and fitness so some day they could be the hunters. As humans found less and less need for hunting our food, sport became a popular past-time. Instead of hunting, games were created to expel the extra energy no longer used in hunting and thus leisure-time sport was invented.

Now, in the present, even though we know it is based on stupid ideas, sport is more popular than it ever was before. Almost every weekend, parents all over the world are forcing their children to arise early to go off and participate in contact sports, that have the potential to cause permanent injuries. that affect a person for life [ed: wow… what a long and convoluted start of a paragraph]. These ideas can’t possibly be what we want for our future leaders to have. Surely the cycle has to be broken sometime. Why can’t that time be now? Sport is destroying the ability of our society to live in peace and harmony together by keeping the aggressive behaviour of tribal men alive in present day children.

PERMALINK →
Search the journal
47 entries · full-text · keyboard-first