For a mess of reasons too boring to get into, I wanted to get a Bluetooth keyboard for my iPad Mini. After poking around for a bit I found some good candidates, but holy hell is the market for BT keyboards crap right now.
The Apple Wireless Keyboard is pretty much a desk keyboard. While I really hate wires, I hate replacing batteries for needlessly portable devices more, so I always go wired at desks when I can (my love for the Magic Touchpad is an exception to the rule). There are a dozen clones of that keyboard out there (whose manufacturers are both named and unnamed) but the design is very much for the desktop.
I did a search and found a long list of keyboards that would possibly work for me and settled on three to seriously consider: the solar-powered Logitech K470, the Logitech K480, and the Microsoft Universal Mobile keyboard. I chose these because they looked well-designed, supported multiple devices (once I learned this was A Thing™ I realized I wanted it for my Apple TV), and were available for purchase locally so returns would be easier.
Well, after going to a few places that listed the K470 as being in stock, it never was. Popular belief has it that it's been discontinued and that's kind of restricting supply. Oh well. I did find the other two locally and brought them home for some testing.
The Microsoft one is just lovely. It's very Surface-like, small, can pair with three devices, includes a cover that doubles as a detachable device stand, and is rechargable over USB (and a charge lasts six months, supposedly). I love this thing so much. I'm rather sad it didn't work out because so much attention to detail has clearly gone into this product that I was almost unashamed to carry around a MS keyboard with my iPad.
Alas, there are two flaws with this keyboard, and one is fatal with zero recourse. The first flaw is that I have man hands and this was apparently made for small children. Every key I hit was wrong. Even when I got used to it, I found myself smacking something random every 20 characters or so. Livable flaw, especially given how much I liked the thing, but annoying.
The big flaw, however, is a rather unforgivable oversight. The keyboard supports three devices: a PC, an Android device, and an iOS device. I mean that literally. You must have those exact devices for the different positions on the device switch are associated with keymaps for those platforms and there is no way to change that. If you have three PCs, you're boned. If you have three of anything, or even two of anything, you're boned. I have three Apple devices. I was boned. The modifier keys change for each expected platform and on anything other than the iOS mode the Command key is mapped to Control.
Think about that. That means to get Command back I have to remap Control to Command, thus losing Control (which I use in the shell -- a lot). I could switch Caps Lock to Control like a Proper Neckbeard but I never learned to care for that layout so it'd be a frustrating change.
Also, there aren't real function keys; they broke out the actual media keys and mapped them to their F-key for each expected platform. That kills a lot of CLI work as well.
So, I returned it. Sadly. I really liked it outside of that. The cover stand even held my Smart Case-wrapped iPad correctly without taking it off.
Next came the Logitech K480. This thing is big. It's about the size of a MacBook Air 11", but it's light enough that's not a big deal. While that initially gave me much pause, I realized that meant that they keys would feel properly spaced-out, and they do. I can type on this like any other keyboard without any issues at all. There are F-keys, and other than fn and Control being swapped it feels great. Best of all, it solves the keymap problem very well. The knob at the side lets you pick which pairing slot to use at the moment and when you want to pair a device you press either the pc or i buttons which establishes the keymap for that pairing slot at the time of pairing. Whenever you go back to it, the right keymap is used. It works great on the desktop, iPad, Apple TV, and my Linux server as a result. The battery is not rechargable, however. It uses two standard AAA cells, though they claim it'll last a couple of years on one set. We'll see. It wont be the end of the world if not.
Overall, though, what I discovered is that there are a lot of crap options out there and relatively few well-designed ones (at any price). I had hoped that by now there'd be some nice things out there but I guess everyone's making crap hardware to go with the crap freemium apps. At least I found a couple of options that show that some folks are still thinking about usability.
I Can Text You A Pile of Poo, But I Can’t Write My Name by Aditya Mukerjee | Model View Culture:
We have an unambiguous, cross-platform way to represent “PILE OF POO” (💩), while we’re still debating which of the 1.2 billion native Chinese speakers deserve to spell their own names correctly.
If you're having trouble getting Doxygen to parse
NS_ENUM statements, here's the config file magic:
ENABLE_PREPROCESSING = YES MACRO_EXPANSION = YES PREDEFINED = "NS_ENUM(_type, _name)=enum _name : _type"
You may or may not want to enable
EXPAND_ONLY_PREDEF to only expand that one macro.
The Design Philosophy of the DARPA Internet Protocols | the morning paper:
Understanding the underlying principles behind something can turn what might on the surface seem to be simply a collection of facts into a chain of causes and consequences that makes it much easier to see how those parts fit together. Clark provides us with some of those insights for the design of the Internet Protocols, working from the goals towards the implementation consequences.
Hacker Mythologies and Mismanagement by Betsy Haibel | Model View Culture:
But these beliefs about who we are are actually about what makes us feel special.
In other words, software engineers are humans.
As humans, we lie to ourselves. We lie to ourselves about who we are. (We’re smarter than you.) We lie to ourselves about what we do. (We are changing the world, one photo-sharing app at a time.) We lie to ourselves about how best to do it. (In caves.)
These lies pile atop each other and twine into intractable knots. At best, this hampers our ability to do work well. At worst, it creates destructive or abusive work environments.
Swift & the Objective-C Runtime:
Even when written without a single line of Objective-C code, every Swift app executes inside the Objective-C runtime, opening up a world of dynamic dispatch and associated runtime manipulation
With an opener like that, how can you not read (and be both slightly horrified and optimistic)?
High Caffeine Content — MPW, Carbon and building Classic Mac OS apps in OS...:
What interested me the most is how so much of the API remained identical - I was still using only functions that existed on System 1.0 in my app, but they were working just the same as ever in a Carbonized version. The single built binary ran on OS 8.1 all the way to 10.6 (care of Rosetta).
My mind wandered to Carbon as it exists in 10.10. While Apple decided not to port it to 64-bit (for all the right reasons), the 32-bit version of Carbon is still here in the latest release of OS X - I wondered how much of it was intact.
Turns out the answer is: all of it.
Developing iOS 8 Apps with Swift - Download Free Content from Stanford on iTunes:
Updated for iOS 8 and Swift. Tools and APIs required to build applications for the iPhone and iPad platforms using the iOS SDK. User interface design for mobile devices and unique user interactions using multi-touch technologies. Object-oriented design using model-view-controller paradigm, memory management, Swift programming language. Other topics include: animation, mobile device power management, multi-threading, networking and performance considerations.