This is my review of the Topre Realforce 88UB mechanical keyboard with evenly weighted 45g switches and UK layout. This is the ISO layout sister model of the Topre Realforce 87U (87UB / 87UW) so everything in this review will apply for that model, except a few layout details regarding the extra keys. Before diving into details, a short background of my previous journey:
Two years ago I got really interested in high quality mechanical keyboards. After all, the keyboard is the instrument I use several hours every day, so if I am spending close to 2000€ on a workstation and display, why should I compromise with a cheap 30€ keyboard, especially since the keyboard will likely last several workstation lifespans?
After heavy research I settled on Happy Hacking Keyboard 2 Professional due to its compact “hacker” layout which seemed great for vim, and Topre key switches, which many consider to have the very best tactile feel. See my review of the HHKB2 keyboard for details.
However, in two years of typing with the HHKB, I never fully learned to use function key bindings for cursor keys and Home/End fluently. Coding with Vim somewhat alleviated the problem, but every time with a command prompt or a shell this nagged me. Also, playing games required a separate keyboard, as most games make use of function keys, and many make use of both WASD and cursor keys. It was time for something else. Something better.
Topre Realforce 88UB – Best of both worlds?
After my experience with HHKB, I had the critical components for my dream keyboard well thought out:
Tenkeyless model with dedicated cursor and function keys. I’ve also used CM Quickfire TK and I can say from experience it is a terrible idea.
ISO layout, so I get the \ and | right next to my right pinky, and an additional key next to z to get < and > in Finnish keyboard layout (it doubles as another \| in US layout)
Topre switches for the ultimate typing comfort. Having used rubber dome, scissor mechanisms and Cherry MX blues, and trying out reds, blacks and browns, there really is no competitor. Buckling spring is just too heavy and noisy for my taste.
The items 1 and 2 are quite easy, but the third one essentially meant that the Topre Realforce line would be the primary candidate to fill all these needs. I’ve used The Keyboard Company before and they have a superb selection of Topre models, so I quickly zoomed in on the black 88-key model with UK layout:
Shut down my Pi today and thought to make a copy of files in its SD card. This is what mount /dev/sdf2 /mnt had to say:
mount: wrong fs type, bad option, bad superblock on /dev/sdf2,
missing codepage or helper program, or other error
In some cases useful info is found in syslog - try
dmesg | tail or so
Great. After trying parted and fsck, it became apparent that for some reason, the root partition is marked as being 1 block longer than the physical card. Must be a bug with Raspbian partition expansion or something.
Thankfully, I found this gold nugget which suggested using resize2fs to fix it. Turns out I had to run e2fsck first (and say “y” a couple of times):
sudo e2fsck /dev/sdf2
sudo resize2fs /dev/sdf2
mount /dev/sdf2 /mnt
The new Raspberry Pi model 2 is out and the Pi world seems more popular than ever. My 2012 benchmark of different RaspPi GPIO access methods has been getting a lot of hits, so I thought to revisit it, and have now updated all the benchmarks with latest versions of firmware and GPIO libraries. I’ve also upgraded my oscilloscope to PicoScope 5444B, so the scope bandwith limitations I had earlier are now gone. :)
Because the benchmark has been linked from many other sites, I’ve just updated the old post to keep links pointing to right places.
Ever had that moment where you started coding X and instead spent four hours doing Y instead? I just had it, and it stemmed from a quite simple idea: let’s do an embedded SVG bar chart with React (nice library by the way)! Because I just started with Bootstrap which makes it really simple to scale your content to the device at hand, I also wanted the diagram to scale. Easy, right? WRONG!!!
<svg version="1.1" width="100%" viewBox="0 0 200 100">
here are some primitives
</svg>
The viewBox attribute defines the internal coordinates for the SVG, and the width attribute should ensure the SVG fills the container. And it does, at least on desktop. And mobile Chrome. But not Android default browser. I tried different settings of preserveAspectratio. I tried CSS tricks that should work but they wouldn’t. After some hours, I gave up and went to sleep. And this morning I found this nugget: WebKit long had a bug, where SVG element is resized to 100% height, which on mobile device was interpreted as screen height (not the parent element)!
So long story short, if I use my S5 in portrait mode, the 1080×1920 screen makes the above SVG element 1920 pixels high, with 1080×540 (2:1) diagram in the middle of huge white area. The bug is reported in 2012: https://bugs.webkit.org/show_bug.cgi?id=82489. This was supposedly already fixed, but seems the new version hasn’t trickled to my mobile OS yet. Thankfully, the fix is quite simple and does seem to work, just add max-height to the element:
<svg version="1.1" style="max-height: 100%" viewBox="0 0 200 100">
here are some primitives
</svg>
I didn’t even need the width=”100%” because that seems to be the default. Doesn’t hurt, though. So, just sharing this for everyone, maybe Google will index this and help others in need.
Another short web coding tidbit for today. I’ve been working on a Bottle.py+SQLAlchemy based backend for a personal project, and found very little information on how to convert a SQLAlchemy Core resultset into JSON.
Here is a glimpse into what was most commonly suggested. Tons of code. But wait, did you know you can cast a row into a dict? No? Well, it makes a world of difference:
import json
# somewhere here, accounts table is defined with SQLAlchemy syntax
def example():
res = conn.execute(select([accounts]))
# return all rows as a JSON array of objects
return json.dumps([dict(r) for r in res])
Now, which do you prefer, the last line or the longer 17-lines in StackOverflow? There is a slight problem though, namely date and numeric(x,y) fields, as they will turn into datetime.date and decimal.Decimal types. Thankfully, Python’s JSON library can be provided with a function to handle classes that the library itself doesn’t handle:
import decimal, datetime
def alchemyencoder(obj):
"""JSON encoder function for SQLAlchemy special classes."""
if isinstance(obj, datetime.date):
return obj.isoformat()
elif isinstance(obj, decimal.Decimal):
return float(obj)
def example():
res = conn.execute(select([accounts]))
# use special handler for dates and decimals
return json.dumps([dict(r) for r in res], default=alchemyencoder)
I’ve had a small problem over a year: I have two headphone amplifiers, a transistor-based O2 headphone amp, and a tube-based Little Dot MKII. I also have two sets of headsets. Because switching the cables all the time is somewhat tedious, I haven’t really used the other amp and headphone set.
There are several Y switches that you can buy, but most seemed either expensive or mostly tailored towards electric guitar enthusiasts. And I would still need to combine two Y switches to toggle between the two amps and headphones. As the construction is really simple, I decided to solder my own. Here’s a short tutorial on how to make one yourself. You’ll need:
4 audio connectors (I chose 3.5mm over RCA), two to each end
2 switches with at least 3 connectors (left, right, ground) – I chose two 4 way switches
A box where you can drill holes for the connectors and switches
Small length of wire, some solder and soldering iron
1. The Schematic
The design of the switch is extremely simple. In both ends, three wires come from each of the two connectors to a switch, and the switches are connected to each other. I chose not to combine any ground lines to avoid ground loops. You need also to select a switch which breaks the connection on one side before connecting the other so the amplifiers will not feed into each other.
2. Soldering the wires
Despite the simple construction, there is a lot of soldering involved. Each of the four connectors will have ground plus left and right channels, and all have the switch on the other end. That makes 24 solder points (4x3x2), and there’s six more between the switches for a total of 30 points. The 3.5mm connectors had small “L” and “R” markings to tell which channel is left and which is right. I used different colors of wires for each type to avoid mixing L, R and ground.