Oops I Did It Again

2 May 2022

Manta keyboard with various objects for scale

To make one weird custom split keyboard may be considered unfortunate. To make two starts to look like a rabbit hole. Nevertheless, that’s where we are.

Even before I’d completely finished my first keyboard build, I was already looking for ideas for the next. Out of several contenders, the one that caught my eye was the Manta kit. This is a very compact single-piece split keyboard kit that takes the de facto standard Pro Micro controller board. It occurred to me that pairing it with the pin-compatible nice!nano would result in a neat and very compact wireless keyboard to complement my Corne. After vacillating a little about whether I could commit to such a restricted layout, I ordered the bits as a birthday present to myself.

As it happened, I should probably done a bit more research. Once I came to put things together, I realised that the Manta wasn’t actually on the list of supported hardware in ZMK, the preferred firmware for the nice!nano. A little searching suggests that I was the first person to try this particular combination1. This was more ambitious that I was aiming for on my second build. I felt like a challenge, though, so I pressed ahead.

The Manta doesn’t have the wealth of easily available resources as more popular kits like the Corne, but I did manage to track down a schematic showing how the pins are wired up (in particular, the rows and columns of the matrix). In combination with ZMK’s excellent new shield documentation2, this was enough to get the hardware up and running.

(One aspect worth mentioning is ZMK’s interesting tooling approach; while you can download a tool chain and build locally, this isn’t necessary if all you’re doing is adding new configurations. Instead, they have a very straightforward setup based on GitHub Actions. This builds the desired firmware on each change pushed to GitHub, and you just download the resulting artefact to flash to the controller. This sounds baroque on paper, but works really well on practice and removes a significant barrier to getting started.)

Manta keyboard with an iPad Mini

So far, I’m pretty pleased with the result. I’m using essentially the same layout as for my Corne, so the main differences are physical — the proximity of the two halves, and in particular the higher position of the thumb keys. The latter took a bit of getting used to, and isn’t quite as comfortable for me as the Corne’s more spacious arrangement, but it seems workable and a reasonable trade-off to reduce the overall footprint.

I wanted to try a tactile switch this time around, and went with Durock Tactile 67g Teal. I’ve not installed a heavier switch for the P key yet; I thought that the reasonably high activation force combined with the perceptible bump would mean it wasn’t necessary. So far this seems to be the case, but I’ll need to use it more to be sure.

The feel of the switches is great, and I think I prefer them over linear. I’m definitely noticing the noise, though — while not too obnoxious, it’s certainly a lot louder than the Silent Ink Blacks in my Corne. For my next build, I’ll be looking for something in between the two.

Yes; “next build”. The Corne is a good home keyboard, and the Manta joins it as a fine portable one, but there are more things I want to try, both for the pleasure of making them and the pursuit of elusive perfection. The rabbit hole goes on for while longer yet.

Manta keyboard with various unhelpful objects for scale

I may write up a build guide in due course, but if you want to try the Manta with a nice!nano my shield configuration is here.

  1. If you know differently, please let me know. [back]

  2. “Shield” is a term originating in the Arduino ecosystem; in ZMK, it specifically means a the board that carries the actual switches, and connects to a daughterboard containing the controller (the “board”) as opposed to having a controller built in. In this case, the Manta is the shield and the nice!nano is the board. [back]

There's No Place Like Home-Row

31 Mar 2022

My last post describe the process of figuring out how to lay out the letters on the Corne in a way that will work with my fingers. This works fine for MonkeyType, but isn’t quite sufficient for using the keyboard day to day. There are a few other things you need to cover. Before diving into the details, here’s the layout:

My full Corne keyboard layout (at time of writing)

The first thing that leaps out at you is the keys that aren’t used — along with the keys above and below the repositioned P, I’ve not assigned anything to the outermost (“pinky”) columns on both sides, or the outermost thumb keys.

This may seem like an odd choice, given that the keyboard doesn’t have that many keys to start off with. However, my experiments with the letters convinced me that reducing finger movement is a good thing to prioritise, even at the cost of some complexity.

Speaking of complexity, an explanation is in order for anyone not familiar with layered layouts. This basically means that additional modifiers (beyond the usual shift, control and so on) are used to pack multiple logical keys on to the same physical one. The blue legend shows what you get when you press a key on its own (almost exclusively letters in this case), the green when you hold the “raise” modifier, and the red when you hold the “lower” one. As a concrete example, to type an opening parenthesis “(“ you hold down “lower” and press the key that would usually type a “G”. This all sounds convoluted, but you get used to it surprisingly quickly1.

For everything down to a 60% keyboard2, layers alone are sufficient. However, when you get down to 40% (then reduce that to effectively 30% by ignoring ten of the keys), you run into a problem. Where do you put the modifier keys? There are various options, but the one that appealed to me was home row mods.

This approach takes advantage of the tap-and-hold functionality available in QMK and other firmware, which lets you double up the functionality of a key. There’s a lot of subtlety in the details, but basically a short tap has one function (e.g., typing an “F”) while holding the key down has another (e.g. the shift modifier). Home row mods puts the usual modifiers (shift, control, opt/alt and command/win) on to the home keys. This has the major benefit of placing them in the most accessible positions on the keyboard.

The main cost of home row mods, and layers in general, is cognitive load. Rather than just having to move your fingers to the required position, you need to figure out the combination (and, in some cases, temporal sequence) to get the effect you want. This can, of course, be learnt — people learn to play the piano, fly jet fighters, and use Emacs, after all — but it implies a significant learning curve. For something that has, for many of us, has been effortless for years or decades, it can be a bitter pill to swallow.

Nevertheless, the layout is now complete, which means I can use it for day-to-day work, and I’ve been doing so on-and-off for a couple of weeks now. Over the course of that time, I’ve made a couple of minor adjustments — most notably adding the extra Cmd key on the right to make one-handed use of the CUA keyboard shortcuts easier — but I’m generally pretty happy with it. I’m still climbing that ferocious learning curve, but it’s getting easier and I feel like it’ll be worth it in the long run.

This is definitely not the final endpoint for this layout. I’m sure there will be plenty of further tweaks and changes as I use it more. The basics are solid, though, and I expect to steadily approach and then surpass my proficiency with a standard keyboard. Moreover, I’ll have fun doing it. Learning a new skill is always stimulating, and I’m enjoying the mental gymnastics.

The QMK implementation of this layout is available on my GitHub account, if you want to look into more details.

  1. As is often pointed out, this isn’t a million miles away from how the soft keyboards on modern smartphones work, and plenty of people adapt to those just fine. [back]

  2. In the custom keyboard world, sizes are described as the rough number of keys expressed as a percentage, as a full keyboard layout has about 100 keys. So, 60%, a common choice for compact keyboards that takes that standard layout and drops the numpad, F keys, navigation cluster and arrows, has around 60 keys. [back]

This Little Finger On My Right

27 Feb 2022

Having built my keyboard, the next step was to start using it. Naively, I expected the learning curve would be pretty small, as I’ve been using a split keyboard for decades, and (I thought) touch type with a reasonable approximation of proper technique. This did not turn out to be the case.

Using MonkeyType, which seems to be the typing tester of choice for r/MechanicalKeyboards, I get around 60wpm (words per minute) on both the Microsoft Sculpt and my MacBook’s built in keyboard without any particular effort. While this won’t win any prizes, it’s perfectly respectable and certainly fast enough that I don’t feel it’s holding me back.

When I first tried the Corne, I was lucky to hit 20wpm, and more worryingly the accuracy was rarely above 80%. I was expecting a little difference, but not this kind of gulf. On closer examination, I noticed a clue that both pointed towards the root cause, and lead me down a bit of a rabbit hole. When typing on the Corne, I kept inserting spurious semicolons.

To take a step back, the idea behind staggered ortholinear keyboards like the Corne is to minimise lateral finger movements. To this end, each column of keys has a dedicated finger. This corresponds well to to touch typing on a normal keyboard, which is why I thought the transition would be a simple matter of getting used to the different offsets. However, in my case there’s a complication. One of my fingers doesn’t entirely work.

Specifically, it’s the little finger on my right hand. While I can grip with it fine, I can’t extend it properly, or lift it off a flat table, as demonstrated in this entirely convincing video:

I first noticed this in my early twenties; I asked my GP about it, and they basically shrugged and said it was just one of those things. Given that it wasn’t particularly bothering me, I put it to the back of my mind.

The link to the semicolons is obvious; that’s the home key for that finger, and I was clearly resting the finger on the key with just enough pressure to occasionally activate it. Simple enough, but you’d expect that to happen on all keyboards, not just ortholinear ones.

Paying closer attention to my typing, I was surprised to see that I wasn’t following standard touch typing technique nearly as closely as I thought. My left hand was pretty well behaved, but my right darted all over the place. I instinctively held my little finger curled in to my palm, and my ring finger did double duty for the keys it would normally press (much like the index fingers do in the middle).

On the Corne I was consciously trying to type properly, resulting in the extra semicolons. Having discovered this, I could have just shrugged and adopted the same curled-finger technique, but that would dilute some of the benefits of the new layout. Instead, I wanted to try and do something to improve the situation.

To solve the resting problem, I took advantage of the hardware flexibility the DIY approach gives me. I removed the Gateron Ink Silent Black and replaced it with a Kailh Box Chinese Style Ancient Grey:

Right hand side of a Corne keyboard with the switches expose. One switch is of a different type.

Both are linear switches (so no noticeable bump on the activation point), but the activation force of the Kailh is significantly higher than the Gateron (95g vs 60g). As hoped, this means that I don’t accidentally activate the key while resting on it, but can still press intentionally without issue.

The spurious semicolons were gone, which brought a big improvement in accuracy but only a mild one in speed. Some more mindful typing later, I figured out another, more subtle issue caused by my dicky finger. Because I can’t lift my finger on its own, I have to lift my entire hand to position that finger on another key. This, and the need to return the home position afterwards, has a significant impact on speed (and accuracy, if I’m not careful in getting back).

At this point, it occurred to me that I not only have flexibility in hardware, but in software too. I can put keys wherever I like. Specifically, if I move P down to the home row, I can type every letter without the gross hand movement.

QWERTY layout with the P dropped down

Sure enough, with this change, both speed and accuracy immediately got far closer to acceptable levels. I still need a lot of practice to reach and then surpass those I get with a standard keyboard, but I can now see a clear path to get there.

This raises a dangerous question: why stop there? If I’m deviating from QWERTY, there are plenty of other layouts out there to pick from, most of which optimise for reducing finger motion. Workman even specifically cites “Reduced load on the right pinky compared to Dvorak and Colemak” as an advantage. Perhaps it’s time to see how deep the rabbit hole goes.

Infrastructure As Intent

12 Feb 2022

Following on from my previous post, I saw a subsequent article on the same site looking at the problem from a different angle. The part that most interested me was the preservation of intent across multiple languages, in this case the programmatic AWS CDK used to define a resource graph in the abstract, and the representation you send to the cloud to turn the definition into (virtual) reality.

This is closely related to a central issue I found when working on this problem; secondary notation. This is all the bits of the program that are ignored when it is executed, but provide vital information to help a human reader understand it1. It can take various forms, not all of which make sense in a particular context. Things like variable names and comments make sense in most (but not all) languages. In contrast, a textual language can convey secondary information by the choice of (non-significant) whitespace and parentheses, whereas a visual language might do so with the shape, colour and position of the corresponding element. Both are valuable forms of secondary notation, yet there isn’t a good way to represent them in the other context.

The solution I explored revolved around ensuring that secondary notation was preserved across translations between languages (even when it isn’t visible), and crucially across modifications to the program. This is essentially the same problem that Kehoe describes in relation to CDK and Cloud Formation — how to avoid the author’s intent being lost in translation between forms. The concrete example he mentions, InGraph, takes this idea and purports to provide a rich, high level language environment where intent (or secondary notation) is preserved in the move to and from AWS’s services. I’ll need to dig deeper to determine how successful it is in this regard, but regardless it’s a powerful approach to this problem and many others.

  1. As always, things are never this clear-cut; there isn’t necessarily one single way to “execute” a program. But you get the idea. [back]

No Twitter Challenge — Done

31 Jan 2022

It’s the end of January, and hence the end of the No Twitter Challenge. How did it go?

The first thing to say is that I did indeed stick to it (my version of it) for the entire month. After having removed the app from the suggestions on my iPhone home screen, I was quickly fell out of the habit of reaching for it whenever I had a moment. The nearest I came to cracking was notifications; I’d left this on so I could still see DMs and replies, but if you don’t look at it for a while Twitter gets needy. It starts popping up notifications about posts it thinks you’d like in order to tempt you back. Tellingly, none of the ones it tried even came close to doing so.

The thing that surprised me was how little I missed it. I did miss the personal interactions with people, usually those I know in real life, that happen from time to time, but a bit of distance made me realise that these are relatively rare sunbeams through a massive cloud of passive, low-value background noise. There’s certainly value to be had on Twitter, but the amount of effort it takes to extract it has become onerous. It no longer seems like a good way to spend time, at least in the way I was using it.

So what did I do with all the time freed up by taking a break? Sadly, there’s not much to tell on this front — for various reasons, the Twitter fast coincided with a particularly busy time both at home and at work, so even with less time on social media I didn’t have an opportunity to take up cabinetmaking or learn the oboe. I’ve managed to post on here a little more than I would otherwise have (although this may have been due to the twentieth anniversary putting it into my mind), and I’ve read more. Instead of dropping into Twitter, I’d open the Kindle app and read a page or two, or catch up on my RSS feeds.

I’ve also, like it seems everyone else, started playing Wordle. That game is notable for how little it demands your time — one brief puzzle and then it’s No Wordle For You until the next day. This is the complete antithesis of Twitter, and indeed most of the modern app and media landscape, which are consciously and insidiously designed to monopolise a much of your attention as possible, whether you want them to or not. Wordle, being simple and not requiring much in the way of resources to run, has the luxury of not needing to make money1, but it offers an interesting contrast to the business model that seems to dominate technology at the moment.

In conclusion, I’m glad I did the challenge. It allowed me some space to reconsider my use of, and relationship to, the main social media platform that I use, both what I get out of it and what that costs. I’m not going to start preaching about any particular approach to this or any other service on the basis of my experience, but I am going to make some more permanent changes to my own behaviour. While I’m not going to make my absence from Twitter permanent, I am going to vastly reduce the time I devote to it. Hopefully this will force me to become more efficient at finding the good stuff, but at the very least it will limit the down side. The key thing is to be mindful of my time, and how I choose to spend it. Twitter is only one facet of this, but it’s a start.

  1. Update: Mere hours after I posted this, Wordle was acquired by the New York Times for a “seven-figure sum”. They’ve yet to say anything about changes to the gane, but they’ll presumably be looking to recoup their investement somehow. [back]

This site is maintained by me, Rob Hague. The opinions here are my own, and not those of my employer or anyone else. You can mail me at rob@rho.org.uk, and I'm robhague on Twitter. The site has a full-text RSS feed if you're so inclined.

Body text is set in Georgia or the nearest equivalent. Headings and other non-body text is set in Cooper Hewitt Light. The latter is © 2014 Cooper Hewitt Smithsonian Design Museum, and used under the SIL Open Font License.

All content © Rob Hague 2002-2019, except where otherwise noted.