19 December 2016

On relicensing etiquette

Almost 10 years ago, I wrote a simple throwaway script to migrate book collections from Anobii to Goodreads. Because I thought others could use it, I slapped a MIT license on it and released it. Back then Github was just a fledging startup (I didn't even open an account there before 2010). Later on, Alper Çugun helpfully updated the script and uploaded it to GH, so that more people could use it. Great! People started forking it and tweaking it, as they should. Except...

Uhm. There is one requirement to abide to MIT terms: keep the original copyright assignment. Apart from that, you can rip the code inside out and nobody will care; you can even relicense it to your heart's content (and someone did exactly that, re-releasing it as GPL - unfortunately, he also dropped the original copyright statement). Just leave the original copyright notice somewhere, and you're golden.

I've kindly let "infringers" know that I'd like them to reinstate the original credits -- it's just polite, and anyway everyone can see from GH commit history that they're being silly. Why do people do this? How hard is it to just add your own © line, or keep the original statement buried somewhere? Sometimes I just don't understand People.

18 December 2016

OWC 12-port Thunderbolt2 dock review

As you probably know, recently the Apple world has been rocked by the release of new MacBookPro models. One of the arguments of contention is the drastic switch to USB-C / Thunderbolt 3. Not by coincidence, I've recently decided to finally splurge for a Thunderbolt dock, although a TB2 one; my 2012 MBPr only supports TB1 (the port that looks like a MiniDisplayPort), so anything more would have been a waste of money. Here is a short review for people who might wonder whether this dock is worth the price.

I've dealt with my fair share of no-name Taiwanese stuff in my life, and I didn't want to risk it this time, so I turned to OWC - a very reliable supplier of Apple accessories. Their 12-port Thunderbolt2 hub got some good press, so I went for that. First impression was slightly disappointing - the unit is well built and feels pretty sturdy, but the one I received was scratched on top, and overall looked a bit like an ex-display or returned model. Let's not be "a typical Apple user", I thought, and see how it works before we knock it.

Sure enough, it works pretty well. I went from having all MBP ports occupied, to using one with even more attached devices than before. This is what I connected:

  • External Thunderbolt drive
  • External USB2 drive
  • 4k display (via HDMI)
  • Ethernet
  • headphones
  • two Amazon Kindle
  • gamepad controller

The hub is independently powered, so it can charge devices even when the laptop is shut down. However, it's not magic; there a few trade-offs you should probably be aware of.

The first is that attached Thunderbolt devices inevitably lose a little bit of performance, since bandwidth is shared. This is probably less noticeable if your laptop supports Thunderbolt2, which supports higher speeds, but it's definitely visible with TB1. My external drive saw a 20% loss of speed, from 360 to 300 MB/sec, which is inevitable: now that we're sharing one TB bus among 8 peripherals, the drive can't max it out on its own. It's still very respectable though, and likely a blip if you use TB2 throughout (i.e. MBPr models from 2013 onwards).

The second issue is more disappointing. Having both an HDMI port and one TB/DisplayPort available (the other is used for the actual connection to the laptop), the hub supposedly supports attaching two screens. I first connected my primary monitor to the hub HDMI port; HDMI is the only way to get 4k on the 2012 MBPr. This worked fine, exactly as it did on the actual laptop port. However, as soon as I attached a second screen to the TB port on the hub, the HDMI connection was downgraded to half the native resolution. This did not happen when I had both screens attached to the laptop, so it doesn't seem to be an issue with OSX; rather, the hub must be doing some internal processing over video streams, and must have some sort of ceiling in the amount of pixels it can push down the wire (or something to that effect). In short, I would recommend to only attach one monitor to the hub, if it is a high-res screen.

A similar behaviour appears if your HDMI screen happens to have speakers. Sound quality degrades so massively, it is simply unusable: lagging, skipping, terrible sound all around. It's weird, because the analog headphone jack works perfectly, so it must have something to do (again) with HDMI stream management.

The fourth issue, and the reason I wouldn't be surprised if it turned out this is indeed a returned model, is that the whole hub suffers something like a crash if you use the "high power USB" ports for more than a couple of hours. All attached devices suddenly stop working, and reconnecting the TB cable makes no difference. The couple of times it happened, I had to power-cycle the unit (which does not have a switch, so I had to unplug the mains cord) after disconnecting all non-essential devices, in order to get it back online. I've isolated the issue to the high-powered USB ports, which I used for two Kindle units: if I detach the cables after 20 or 30 minutes, all is fine, but if I leave them there for a few hours, inevitably I'll get a crash. To be on the safe side, I moved my precious TB drive back to the second TB port on the laptop (I simply cannot afford to corrupt that drive), and mostly stopped used those ports.

The last point is not a real problem, just a little gotcha. The headphone jack is analog, but it's not an automatic passthrough. In order to actually use it, you have to go to System Preferences / Sound / Output, and select "USB audio output" as your output device. Quality seems fine, but I'm not an audiophile so I will refrain from commenting further.

Overall, the hub seems to work more or less fine (bar the power-loss scare), and it's very convenient for my setup. Thunderbolt, even in its first incarnation, is an extremely powerful standard, just on the expensive side. I won't be buying a new MBP anytime soon (new models are just not as powerful as I'd like, the British Pound is moribund, and this 2012 model is still rocking), but if you do, you should find the power of TB3/USB-C outweighs the annoyance of migrating to yet another I/O standard.

08 December 2016

Best way to get locale info and localized strings on Python

One area where Windows often beats the Unix tradition is internationalisation. Traditional POSIX interfaces assume there will be One And Only One set of internationalised conventions (display language, date format etc) at runtime, and are mostly concerned with displaying data formatted for that One True Set. When you want something "international" on POSIX, you switch your locale with setlocale() and do your business. This approach unfortunately percolates in Unix-borne tools and languages, in this case Python. There is no "pure-Python" alternative to good ol' GetLocaleInfo, so there is no way to retrieve, say, the French name for January without switching the whole process locale with setlocale(). This is pretty insane and likely dangerous.

Most libraries hack their way around this by packing an arbitrary subset of i18n strings, or just go full-YOLO by switching process locale back and forth. It's a sad state of affairs.

However, there is a better way. The Unicode Consortium, in its infinite wisdom, maintains a big database of localisation metadata, the CLDR. You can either download the full set yourself and parse a bunch of XML files, or you can use the Babel library which basically does it for you.

$> pip install babel
...
$> python
>>> import babel
>>> locale = babel.Locale('fr')
>>> locale.months['format']['wide'][1]
'janvier'

Et voilà.

30 October 2016

On fixing hardware

There is a certain satisfaction in fixing hardware. It can be pretty trivial at times: unscrew a bunch of pieces, replace the broken bit, screw everything back together. The worst that can happen is to end up with one or two screws that don't seem to go anywhere once you put things back.

I recently fixed a Kindle from a few years ago (model D00901, aka "the one with a little keyboard"), and I had exactly this experience, minus the extra screws. I just opened it all up, disconnected the broken screen, replaced it with a new one from eBay (£16), and put it all back together - done. By then I'd already bought a replacement Voyage, but I can now give this to my kids. I was also pretty happy to get this particular model back, because it's much easier to hack than the Voyage (Amazon, wtf? I still can't change screensaver images, in 2016??)

Moral of the story - always try to fix broken hardware. It might save you a few pennies and, in the age of youtube, you don't even have to be an expert to do it.

04 August 2016

CSL Vertical Mouse Review

A couple of weeks ago, I started experiencing a bit of recurring pain in the right forearm. I put it down to a few heavy sessions of MiniMetro, a game where you have to constantly drag & drop between points on the screen; the Magic Trackpad, even rotated in a negative-slope position, was forcing my arm and wrist to do too much work. After a bit of googling, I decided to try a vertical mouse, which should (in theory) keep your arm in a more natural position, and actually move a lot of work from wrist and forearm muscles towards the shoulder and upper arm muscles.

The market for ergonomic devices has always been small, but there's a surprisingly wide choice of vertical mice out there. Unfortunately, a lot of them don't inspire much confidence; some are sold as vertical but actually end up being just fancy-shaped regular mice. The best in class seem to be Evoluent products, which are really vertical and really ergonomic but also really expensive. I wasn't ready to drop almost £100 on something I might not like, so I steered towards cheaper alternatives.

Some of the best reviews on the net pointed towards this fin-shaped CSL wireless mouse, and it was so inexpensive that it wouldn't feel like a waste if I ended up not liking it. The shape makes a bit more sense when you see the SHARKK-branded version - fins, sharks... I honestly don't know which brand came first or which one is more reliable; SHARKK is a US company whereas CSL seems to be based in Germany, but both have a history of distributing and rebranding products by Asian manufacturers, so the original factory is probably the same Shenzhen hangout.

The most annoying element of this mouse is the fact that it does not use Bluetooth, but rather a bog-standard USB wifi dongle. In recent Macs, USB ports are very few and losing one forever is a Big Deal.

The mouse does not require drivers, which is great news for Mac users. It simply appears as a regular HID with 5 buttons: left, right, middle (under the wheel),  and two near the thumb. A sixth button, on top of the fin, is actually the DPI selector, which allows you to change resolution (and hence sensitivity) between three modes: 800, 1200 and 1600 DPI. The selector works fine (just cycles through modes as you click it, with no feedback on screen) but OSX just doesn't "see it" as a regular button, which means you cannot easily re-purpose it once you've set the DPI mode. How often will you need to change mouse sensitivity? An operation so rarely performed doesn't really deserve a large button in such a prime location, but there you go.

The two thumb buttons are supposed to be for browser Back/Forward, but with Firefox they actually trigger the infamous "hold and scroll" widget, so I used BetterTouchTool to remap them with  trackpad gestures I used the most (Mission Control to switch between windows across all apps, and Application Exposé to switch between application-specific windows). I also set middle-click to Launchpad. A little quirk: the mouse built-in powersave settings will switch off the mouse if you don't use it for a few minutes; often you will have to click it or shake it to wake it up. There is no way to disable this behaviour under Mac.

It obviously takes a bit of time to adapt to the vertical position. Movements that would rely on the wrist with a trackpad or horizontal mouse, now require better coordination further up the arm. Wrist movements are set on a different axis (up-down, rather than sideways), but to be honest it's probably best to keep them at a minimum, relying on your arm instead.

After a few days of use, the pain seems to have gone, which is great news. However, I'm not totally convinced about this mouse. It does take some conscious effort to keep my hand in the vertical position, being way too easy to absent-mindedly slip back into a traditional posture; the fin shape will not stop you from doing it. That's probably the reason Evoluent models have steeper shapes.
WRONG! Might as well get a normal mouse then...
Correct position, with vertical wrist.
My hand as a whole also does not feel more relaxed, and the mouse/keyboard switch now seems a bit more tiring, since I have to actually rotate the forearm; I guess I could address that by sloping my keyboard, something I've resisted until now. Still, it's a bit annoying.

In conclusion, the CSL vertical mouse is great value for money: solid build, works flawlessly, cheap as chips. Is it a great vertical mouse though? I'm not so sure. Will I switch to vertical mice for good? Probably not, at this time and with this mouse, but I will revisit this position in a month or two.