a blog about research communication & higher education & open culture & technology & making & librarianship & stuff

Ultimate Hacking Keyboard: first thoughts

Ultimate Hacking Keyboard in blue

Following on from the excitement of having built a functioning keyboard myself, I got a parcel on Monday. Inside was something that I’ve been waiting for since September: an Ultimate Hacking Keyboard! Where the custom-built Laplace is small and quiet for travelling, the UHK is to be my main workhorse in the study at home.

Here are my first impressions:

Key switches
I went with Kailh blue switches from the available options. In stark contrast to the quiet blacks on the Laplace, blues are NOISY! They have an extra piece of plastic inside the switch that causes an audible and tactile click when the switch activates. This makes them very satisfying to type on and should help as I train my fingers not to bottom out while typing, but does make them unsuitable for use in a shared office! Here are some animations showing how the main types of key switch vary.
Layout
This keyboard has what’s known as a 60% layout: no number pad, arrows or function keys. As with the more spartan Laplace, these “missing” keys are made up for with programmable layers. For example, the arrow keys are on the Mod layer on the I/J/K/L keys, so I can access them without moving from the home row. I actually find this preferable to having to move my hand to the right to reach them, and I really never used the number pad in any case.
Split
This is a split keyboard, which means that the left and right halves can be separated to place the hands further apart which eases strain across the shoulders. The UHK has a neat coiled cable joining the two which doesn’t get in the way. A cool design feature is that the two halves can be slotted back together and function perfectly well as a non-split keyboard too, held together by magnets. There are even electrical contacts so that when the two are joined you don’t need the linking cable.
Programming
The board is fully programmable, and this is achieved via a custom (open source) GUI tool which talks to the (open source) firmware on the board. You can have multiple keymaps, each of which has a separate Base, Mod, Fn and Mouse layer, and there’s an LED display that shows a short mnemonic for the currently active map. I already have a customised Dvorak layout for day-to-day use, plus a standard QWERTY for not-me to use and an alternative QWERTY which will be slowly tweaked for games that don’t work well with Dvorak.
Mouse keys
One cool feature that the designers have included in the firmware is the ability to emulate a mouse. There’s a separate layer that allows me to move the cursor, scroll and click without moving my hands from the keyboard.
Palm rests
Not much to say about the palm rests, other than they are solid wood, and chunky, and really add a little something.

I have to say, I really like it so far! Overall it feels really well designed, with every little detail carefully thought out and excellent build quality and a really solid feeling.

Read more...

Custom-built keyboard

Keyboard

I’m typing this post on a keyboard I made myself, and I’m rather excited about it!

Why make my own keyboard?

  1. I wanted to learn a little bit about practical electronics, and I like to learn by doing
  2. I wanted to have the feeling of making something useful with my own hands
  3. I actually need a small, keyboard with good-quality switches now that I travel a fair bit for work and this lets me completely customise it to my needs
  4. Just because!

While it is possible to make a keyboard completely from scratch, it makes much more sense to put together some premade parts. The parts you need are:

Read more...

Less, but better

“Wenniger aber besser”
Dieter Rams {:.big-quote}

I can barely believe it’s a full year since I published my intentions for 2018. A lot has happened since then. Principally: in November I started a new job as Data Services Lead at The British Library. One thing that hasn’t changed is my tendency to try to do too much, so this year I’m going to try and focus on a single intention, a translation of designer Dieter Rams’ famous quote above: Less, but better.

Read more...

How to extend Python with Rust: part 1

Python is great, but I find it useful to have an alternative language under my belt for occasions when no amount of Pythonic cleverness will make some bit of code run fast enough. One of my main reasons for wanting to learn Rust was to have something better than C for that.

Not only does Rust have all sorts of advantages that make it a good choice for code that needs to run fast and correctly, it’s also got a couple of rather nice crates (libraries) that make interfacing with Python a lot nicer.

Read more...

New Years's irresolution

Cloudy lakeside

Photo by Andrew Hughes on Unsplash

I’ve chosen not to make any specific resolutions this year; I’ve found that they just don’t work for me. Like many people, all I get is a sense of guilt when I inevitably fail to live up to the expectations I set myself at the start of the year. However, I have set a couple of what I’m referring to as “themes” for the year: touchstones that I’ll aim to refer to when setting priorities or just feeling a bit overwhelmed or lacking in direction.

Read more...

Build documents from code and data with Saga

!!! tldr “TL;DR” I’ve made Saga, a thing for compiling documents by combining code and data with templates.

What is it?

Saga is a very simple command-line tool that reads in one or more data files, runs one or more scripts, then passes the results into a template to produce a final output document. It enables you to maintain a clean separation between data, logic and presentation and produce data-based documents that can easily be updated. That allows the flow of data through the document to be easily understood, a cornerstone of reproducible analysis.

Read more...

Why try Rust for scientific computing?

When you’re writing analysis code, Python (or R, or JavaScript, or …) is usually the right choice. These high-level languages are set up to make you as productive as possible, and common tasks like array manipulation have been well optimised. However, sometimes you just can’t get enough speed and need to turn to a lower-level compiled language. Often that will be C, C++ or Fortran, but I thought I’d do a short post on why I think you should consider Rust.

Read more...

Reflections on #aoc2017

Trees reflected in a lake

Trees reflected in a lake Joshua Reddekopp on Unsplash

It seems like ages ago, but way back in November I committed to completing Advent of Code. I managed it all, and it was fun!

All of my code is available on GitHub if you’re interested in seeing what I did, and I managed to get out a blog post for every one with a bit more commentary, which you can see in the series list above.

Read more...

Series: Advent of Code 2017

The Halting Problem — Python — #adventofcode Day 25

Today’s challenge, takes us back to a bit of computing history: a good old-fashioned Turing Machine.

→ Full code on GitHub

!!! commentary Today’s challenge was a nice bit of nostalgia, taking me back to my university days learning about the theory of computing. Turing Machines are a classic bit of computing theory, and are provably able to compute any value that is possible to compute: a value is computable if and only if a Turing Machine can be written that computes it (though in practice anything non-trivial is mind-bendingly hard to write as a TM).

Read more...

Series: Advent of Code 2017

Electromagnetic Moat — Rust — #adventofcode Day 24

Today’s challenge, the penultimate, requires us to build a bridge capable of reaching across to the CPU, our final destination.

→ Full code on GitHub

!!! commentary We have a finite number of components that fit together in a restricted way from which to build a bridge, and we have to work out both the strongest and the longest bridge we can build. The most obvious way to do this is to recursively build every possible bridge and select the best, but that’s an O(n!) algorithm that could blow up quickly, so might as well go with a nice fast language! Might have to try this in Haskell too, because it’s the type of algorithm that lends itself naturally to a pure functional approach.

Read more...

Series: Advent of Code 2017