Amazon’s customer service was really great to me! My wife and I had bought a nice christmas present for my father, a book he’d long wanted, printed in 1976. We couldn’t find it half-decently priced new copy in Europe, but we found one through Amazon in the US. Order placed, postage charges being as much as the book, we waited for it to arrive. But when it did, it was clearly used. Not badly used at all, but a couple of ear marks, pencil lines in the book and… sigarette marks on the cover. Disappointed we took pictures of it, and contacted Amazon.

Against my fears, they didn’t object to our description at all, and didn’t even want to see the photos I’d taken. They told me I should return it, they’d refund the shipping charges for me sending it back to the US. They refunded the book and since it was through a 3rd party, we could opt to buy a new copy, which they’d then refund 1-day shipping for. That’s an awful lot of shipping! Much more than the price of the book, even though the replacement we got was a bit more expensive. Also, the amount of communication that went back and forth, where they were very clear but where there were some minor complications since it was sold by a 3rd party, absolutely has taken a bit of their time. It leaves me wondering how much this eats into their margins. But, this experience made me realize how happy I am as an Amazon customer, this being the first time anything unexpected had happened since I started shopping there in 1998. And when something unexpected happened, how quickly and nicely they solved it for me, even though it cost them in the short run. In the long run it must be worth it for them, because I became even more confident buying through them, and even felt like writing their praises here. :-)


Following up on my little SSD series, today I finally got my Seagate GoFlex thunderbolt enclosure from customs. The SSD arrived around two weeks ago, and I had already done a SuperDuper copy of my home-made Fusion drive to the SSD via USB 2.0. Three days later, I could start using it, via USB. First I preferred the extra speed from my Fusion drive, but pretty soon I took the quiet of the SSD over those extra MB/sec.

Speed-wise I was surprised to find I would get about 34 MB/sec via USB 2.0. I guess I under-estimated USB 2.0 a little bit, assuming I would get ~20 MB/sec. The Fusion drive solution would give me bursts of 114 MB/sec write and 180 MB/sec read, but over time I would often get around ~30 MB/sec. I must admit I had forgotten exactly how slow magnetic disks can be, I assumed I would get around ~80 MB/sec from it, but I was wrong. So resolving my over-estimating magnetic disk speeds and under-estimating USB 2.0 speed and enjoying the quiet, the last week was spent running of the SSD via USB. That meant that taking it out of the USB dock and into the GoFlex thunderbolt adapter took a few seconds and I could boot.

I’m sure you guessed it, as had I, but wow! Thunderbolt is fast! Even though I knew it only performed a bit more than half as quick as what the disk is capable of, starting up Photoshop was 7 seconds (vs 23 seconds before) and other apps are similarly responsive. Using Lightroom is soo much smoother. :-)

The final result was that I’m getting a pretty consistent 355 MB/sec write and 383 MB/sec read of the disk, which is better than the 330 MB/sec I was expecting, but far from the 550 MB/sec the disk can deliver. I still have found no answer to why all those enclosures won’t push the disk speed further, even Thunderbolt 1 has bandwidth to spare at this speed. But since I knew that going in, all in all I’m very happy. :-) And hopefully, this is where my SSD story ends, until I’ll transition to my next iMac in two CPU generations time.


Yesterday, WatchKit became available for us developers, and as far I can tell, open for the entire world to see, which is a first for Apple at least since the iPhone introduction. I thought it’d be good to share my first impressions.

I remember the second day the first official iPhone SDK had entered beta. It was new. It was fresh. At the same time it seemed well thought out. It was opinionated. It laid a path of where we would go. And it was a very nice framework on top of BSD. I was thrilled!

WatchKit doesn’t quite feel this way. The first thing I noticed that “the way it’s done” in iOS is not the same on WatchKit. For instance, there is no autolayout. Autolayout is THE way to do dynamic layout, Apple has been pushing it hard. Yet it’s nowhere to be found on WatchKit. It’s older brother, springs and struts, is also missing in action. Instead we have a swing-like layout system of stacked elements, either stacked horizontally or vertically. Heights and widths are explicit, yet the watch comes right of the bat in two screen resolutions. So there’s the interface dynamicism out the window.

Despite Apple pushing Swift heavily, the first examples they choose to show, being the examples in the demo video at http://developer.apple.com/watchkit, are all Objective C. Sure, they provide demos in both Objective C and Swift, but I’m surprised they’re not keeping the message focussed.

Controls are not UIViews, and they don’t seem to be layer backed. This means no Core Animation, and the result is that all animations have to be a series of pre-rendered images, rather than smooth images set up to be run on the fly. And yes, that means pre-rendered animations in two sizes, for 38mm and 42mm.

Is it running BSD? No idea. This is probably only important to my nostalgia as I can’t remember having dived directly to the BSD layer the last year. So it’s probably just my security blanket, but I like it being there and being available to my native app. But the WatchKit apps are not native. They are resources pushed on the phone and managed by the phone. All the logic is on the phone, the watch will only show resources already there, plus a tiny little bit of content generated on the fly by the phone and pushed over via what I expect is Bluetooth. So it’s not native, it’s more like a puppet theatre. That’s why map components in our apps cannot be dynamic. I’m sure Apple’s apps are native, so we’re really back to the iPhoneOS 1.1 situation where we were only allowed to make webapps. I hope Apples apps have the BSD layer available. But I would very much like to have that too. Perhaps with version 2.0?

But yes, we got a lot more than we expected. What I and many with me expected was the ability to make “glances”, but we also got notifications and we got these puppet-theatre apps. That gives us an awful lot of tools to begin with. Truth be told I can probably implement all the ideas I had so far with this. It’s going to need more work than I expected with the resolution-dependent layout, but much can still be done and I expect we’ll see a bunch of awesome apps.

The limitations, though, make me even more curious as to what kind of computer the S1 chip really is.

One thing I found really interesting is the UITableView replacement. UITableView is an old beast that’s been our bread and butter for a very long time. I look forward to giving it a run and see what kind of abuse it can withstand. With no scroll views, this one looks to be a target for an awful lot of experimentation in the months to come.


I decided on what to do about the iMac harddrive situation mentioned in Finding a good Thunderbolt disk: I ordered a Seagate GoFlex thunderbolt adapter and caddy, containing a 1TB drive, which I’m going to replace with a 1TB Samsung 840 EVO drive.

That means that I’m not going to get the 550 MB/sec of the Samsung drive, but about 330 MB/sec where the SATA/Thunderbolt adapter caps out. I’m sad about that, and I’m also sad that I couldn’t find a SATA/Thunderbolt 2 adapter at any half-decent price (not that anything Thunderbolt is decently priced, but I mean not ridiculously stupidly priced)

It was a toss-up between the Lacie and this one, but believe it or not, the built-in Thunderbolt cable came in as a minus for the Lacie, as I don’t know how I’d go further if it would break. Also, the Lacie didn’t disclaim what disk was in there. With my combination, at least I know I can move the disk into the computer or into another enclosure if it turns out I am really sad about the performance drop. I expect to keep the disk around longer than the enclosure.

So, waiting for the mailman to come, and dreading the stupid US/EU import-tax (I expect to be writing about that later) and taxing charges.


Dear John,

thanks for the great show (ATP), I look forward to every episode the three of you do. In the episode I listened to today (#53) you guys talked about ObjC moving forward, and you mentioned Erlang a few times.

Two small disclaimers first, (1) I’m very new in the world of Erlang, and (2) the company I work for has subsidiaries that only focus on Erlang, and shares in companies whose products are built on top of Erlang. I like to believe I’m not influenced by this, but I am influenced, amongst others, by my CTOs passion for the ecosystem.

Erlang is two things: a VM called BEAM, and a language. The language is not to my taste, but I really like the VM. Lucky for me, there is a new language called Elixir that runs on the Erlang VM as a first class citizen.

What I really like with writing for this ecosystem is that it launches a ton of green threads instead of GCD threads, and these processes do true (shared nothing) message sending between them. The actor model is back!

Elixir has other fun stuff too, such as piping function calls as if they were commands in the terminal. So far, I find myself writing a bunch of pattern matching for the work I want it to do, in a more terse yet easy-to-read way than I’m used to coming from ObjC and the usual suspects of languages before that.

I think you’d find it interesting diving into the Elixir and Erlang VM combination. The take-away I’ve got that I’d love to bring back to ObjC would to be (1) even tighter on making everything immutable, (2) introduce green threads where for instance singletons can live, and (3) make a objc_msgSend that sends messages between threads not containing pointers to data, but an actual message, and having the sending process being able to continue with its logic until it needs the answer back where it can block and wait if there is no reply yet.

This was a bit longer than a 140 character tweet, but there you go. Oh, and to tie this together with the news, I only noticed Whatsapp because they sponsor conferences and give talks on how they built their backend in Erlang.