Wednesday, September 14, 2016

When The Simulator Doesn't Act Like a Device

I had to pull Signal GH from the App Store two days ago because mach_absolute_time which is based on CPU clock cycles returns quite different values on my Mac Mini than it does on an iPhone 5S, and a quick hack I had done to fix the build for Xcode 8 resulted in a severely degraded user experience.

Well, thanks to the magic of Expedited Review, it's back in the Store. Thanks Apple and my apologies to any customers that had a bad experience.

Thursday, August 25, 2016

Apple Doesn't Make a Mac I Would Eagerly Buy

I've been using Macs pretty much exclusively since I walked into the computer lab at International Falls Senior High and saw one in 1984. I've never not owned one since I bought a Mac Plus at the University of North Dakota bookstore in 1989.  I'm happy with the 2012 Mac Mini I'm writing this with.

And there is not a Mac that Apple sells that isn't so compromised that I would consider it worth its asking price.

The MacBook

Great looking computer, would buy them for my kids or to take on trips, but a single USB-C connector and a 1.2GHz Intel Core m5 do not make for a general purpose computer. At some point, somebody is going to have come with a single cable replacement to Thunderbolt that will drive a 5K monitor. Until then, I'd feel like I was buying a disposable machine. 

MacBook Pro 13-inch

Yes, Apple is still selling the same MacBook they sold me in 2011, more or less. It did manage to pick up USB 3.0 ports. Can put an extra hard drive in it. But 802.11n WiFi? 1280×800 screen? I already have this excellent but out of date machine. 

MacBook Pro Retina

I use one for work, and it is a great machine. Plenty of ports. Beautiful display. Great trackpad. Adequate keyboard. MagSafe connector.  Solid as a rock. I guess I could see getting the 13" model. But to be my main machine it would need a lot more that 1TB of storage and unlike my 2011 MacBook Pro, there's no place to put an extra drive in it. Plus, why is the 15" $700  more than the 13"?

MacBook Air

Who, at this point, is going to buy a MacBook Air, with its ridiculously out of date screen?


The 5K Retina iMac is actually quite a nice looking computer, but I just cannot get around the idea of permanently tying a desktop Mac to such an expensive monitor. Also, a desktop Mac with pretty much zero internal expandability. I used to own a PowerMac 7600, now that was an expandability monster. Maybe if it were cheaper. 

Mac Pro

I could buy one if I needed the performance level, but I'd feel foolish given how it hasn't been refreshed in 3 years and still has an entry level price of $3000.

Mac Mini

The current Mac Mini is a compromised product crippled I would guess to keep it from taking sales from higher margin machines. I feel bad for the engineers tasked with taking the epically nice 2012 design and removing all traces of internal expandability or quad-core processors. I feel bad for Phil Schiller for having to introduce it. I feel bad for anybody who paid full price for it. I feel bad.

The Buying Trigger

I'm happy with my Mac Mini. In order for me to get out my credit card, a Mac would have to do something my current one can't. So, if there was such a thing as an affordable quad core 13" Retina laptop, with 2TB of storage, and it had a single connector that would drive a 5K display, that would be something I would buy on the first day of availability. Until then, I'd only buy a new Mac if an old one broke. 

Sunday, August 21, 2016

The Awesome Responsiveness of

I encounter a bug in Swift 3

I had this cool idea to enhance CGPath, create an extension which would add a convenience init method that would take an SVG formatted path string. How neat would it be to be able to write
  let frogPath = CGPath(svgPath: "M 170 207C139 183 40 199 41 109A18 18 0 1 1 56 75Q67 53 91 45A18 18 0 1 1 127 40C170 29 193 62 212 173L225 110Q241 70 252 120L253 156 C253 180 265 223 235 214Q210 210 215 242 C222 265 161 249 125 248") 
and have a complicated curve available for display. (I should say this all relies on other code in my brand new, and very incomplete Scalar2D project)

So, I opened up a new source code file and tried:

public extension CGPath 
 public convenience init?(svgPath: String)
  guard let mutableSelf = CGPath.pathFromSVGPath(svgPath) else
   return nil
   return mutableSelf.copy()

Now the compiler didn't like this and told me I couldn't assign to self, and I couldn't figure out how to do what I wanted, so I turned to CGMutablePath, which I could mutate in the init method. I therefore tried

public extension CGMutablePath
 public convenience init?(svgPath: String)
   if !self.addSVGPath(svgPath)
   return nil
And the compiler promptly crashed. I had found a bug in the pre-release Swift 3 compiler.

I report the crash

In the olden days before Swift had been open sourced, if I could find the energy, I would find my way to the Apple Bug Reporter and enter my bug, never knowing if I was the first or the millionth person to encounter my problem. And it would sort of disappear, unless a request would come back sometime later for more information, or it was marked as a duplicate, or whatever vaguely unsatisfying outcomes would manifest.

For example, a bug I reported against Safari 8.0.6 in June of 2015, 21364634 Safari not Rendering SVG Gradients Properly, that has not been commented upon, nor fixed. But at least that is still open, most of my reported bugs have been archived, several with the rather insulting description of Insufficient Information, no they have plenty of information, with steps to reproduce and in one case even an Xcode project I took the trouble to generate. Others were tersely marked as duplicates, and one was operator error on my part when using MKPolygonRenderer.

But, this is the new era of open source Swift so, I made my way to  and discovered not some custom tool, but honest to goodness JIRA, the same tool I've used in many projects over the last several years. Wow, this was new. I could browse through the bugs and see if what I was seeing was already reported. Didn't seem to be. So, I opened up a new issue, simplified my steps to recreate to something you could type into the command line REPL and created my issue: SR-2338 Compiler Crash on Implementing Optional convenience init of CGMutablePath

The Awesomeness of Responsiveness

Within hours, someone with an Apple email address replicated the bug, and commented upon it in the JIRA issue for all to see. And a back and forth ensued amongst team members about what to do, where the bug came from, and possible solutions. My particular bug came from an initiative to give Core Graphics a more Swift-like object interface instead of the traditional C style interface. Nobody had considered the idea of testing if adding a convenience init method would work. Code and test cases were generated and a pull request was offered where anybody could comment on the pull request. When the resulting code wasn't right, an other approach was taken wherein the compiler just wouldn't allow you to extend Core Graphics objects this way, and a better fix would be delayed.

All of this was done in full view of the world, where anybody with an interest could contribute. And the final release of Swift 3, will be more reliable for it.

Saturday, May 21, 2016

Where are All the New CarPlay Receivers?

Back in late February, I was a bit miffed to hear that the JBL Legend CP100 CarPlay receiver was going to be released while I was visiting relatives in China;  I'd have to order one when I got back. But by the time I got back, it had been delayed until late May. So, I pre-ordered one on Crutchfield and went about wishing for time to pass. Then it was delayed till early July according to the JBL website. Then it was delayed till early August.  I became concerned for my own mortality over wishing for so much time to pass. (Could be worse, I could be waiting for Amazon to start showing Grand Tour episodes, oh wait I am. Curse you time for being both slow and fast in the wrong ways.)

I have now started looking for a different receiver. But few of the 2016 CarPlay receivers announced in January have seen the light of day. Crutchfield has a note like the following on several pre-orderable CarPlay receivers:
Crutchfield first offered this item for pre-order in January of 2016 and we regret that we are still awaiting our first shipment. There have been delays getting the necessary certification from Apple for the CarPlay feature. As soon as we have firm shipping information, we will post an official Estimated Time of Arrival (ETA) for this radio. Thank you for your patience and understanding.
The JVC Arsenal KW-V820BT, and a bunch of Kenwoods are also awaiting pre-order. [Update: in early July, the KW-V820BT shipped].

That leaves Pioneers: the AVIC-8200NEX and its siblings (7200, 6200, 5200), which are all navigation/DVD playing receivers, and the AVH-4200NEX which is a DVD receiver. Since this is slated for the front of my Civic and Apple invented a thing called the iPad, I don't have much use for DVD playback. I have a hard time imagining the use case where I'm stopped, with my parking brake engaged, watching DVDs. My kids tend to watch YouTube videos in the back seat over the cell network while I drive.  CDs? What is this 1999? As for navigation, I like the constantly updated Apple maps, so the advantage of a navigation receiver is for when I'm out of range of a T-Mobile tower. This does happen when I take the kids up into the White Mountains north of where I live in New Hampshire. Also, apparently, the external GPS antenna can supplement the GPS in my phone, making location services more accurate while driving.  At the moment, Amazon has the AVIC-5200NEX for $575, and the AVH-4200NEX for $520. The 4200 has more media options: HD Radio, an SD reader, HDMI input, and more important for a lot of people: Android Auto support. To get everything in one package, you have to move all the way up to the AVIC-7200NEX, which Amazon sells for $822.  I tend to think the only feature I'd ever use is the external GPS antenna, and possibly the maps which might be worth the $55 premium.

It seems like every receiver has 1.0A USB charging. It'd be nice if it had 2A charging for an iPad or to fast charge an iPhone 6 Plus.

I'm not looking at older CarPlay receivers because I'm hopeful the newer models will be zippier and have the earlier generation kinks fixed. The reason I waited so long on the JBL was because their demonstration videos showed it to be quite fast and allow for pinch to zoom on maps instead of pressing zoom in-zoom out buttons.  So, I'm ignoring older models like the Alpine iLX-007 or the Pioneer AppRadio series.

There is the whole resistive versus capacitive screen debate, and given my druthers, I'd prefer capacitive for its responsiveness, but I don't want to pay a premium for it. And I'd prefer a big volume knob and an easy to hit Siri button, but that doesn't appear to be a choice. Therefore, if I were to buy a receiver today based on specs, price, and availability, I'd buy the AVIC-5200NEX. But I'd be really unhappy about paying about $120 extra for a DVD player I literally will never use after reviewing it. 

I wonder why Apple is delaying so many of the other receivers, they don't seem to have appreciably different specs from the Pioneers they approved. It has the same USB amperage and screen resolutions. In the hopes that something they announce at WWDC in a few weeks will make this make sense, I'm going to hold off ordering the AVIC, but it is weird.

[Update: Crutchfield support tells me:
That receiver has become more delayed than we anticipated. You will probably getting a letter from us soon. The receiver now may not be here until January of next year.

Sunday, May 08, 2016

Note to self, UINavigationController's setToolbarHidden does something different than setNavigationBarHidden

I spent a very long time thinking that I could somehow not put a UINavigationController in a container view (despite having done so before) because I was autocompleting to setToolbarHidden instead of setNavigationBarHidden. A very, very long time. guard let myNavController = self.navigationController else { return } myNavController.setToolbarHidden(true, animated: true) // is different than myNavController.setNavigationBarHidden(true, animated: true)

Friday, April 01, 2016

Mazda Had Best Start Supporting CarPlay

Recently, I've had two passions in my life as a consumer. I've been dreaming of finally moving on from my 2003 Honda Civic, and buying the hatchback version of the Mazda 3. And, I've been eagerly awaiting delivery of a pre-ordered JBL Legend CP100 CarPlay aftermarket stereo for my Civic; a wait that keeps on getting stretched.

The air conditioning might not work, but my old Civic is going to have a nice looking dash (in early June).

You might ask what's keeping me from just buying the lovely and fun to drive 2016 Mazda 3. One, I've been listening to a lot of Dave Ramsey, so I'm intending to do the mature thing and save cash to buy a used one coming off a lease (or a flease as Dave would call it). And two, the current firmware for the infotainment system in Mazdas doesn't support CarPlay. Worse, unlike my Civic, my wife's 2009 Civic, and even the 2012 Mazda 3 my little sister just bought, you can't just pop the factory one out and put in a standard double-DIN receiver along with some cheaply bought custom trim. Crutchfield doesn't list any CarPlay receivers that fit and if there was such a receiver, what would you do with the screen bolted to the top of the dash? Putting CarPlay into a modern Mazda 3 without Mazda's help would take some doing.  

If this situation doesn't change in the next couple years, I'll be happily purchasing the well reviewed 2016 Civic, which does support CarPlay.  

[Update: I noticed in this ride along review (8:22 in) of the new Mazda CX-9, that the Mazda engineer says when asked when CarPlay and Android Auto are coming:
We don't know exactly when yet. Not at launch, unfortunately. As soon as we possibly can. We're working on it. It's really tricky with those guys, they've got their own requirements, our system has its own requirements. You think you've got it lined up—it seems like it should be so simple, and every time we think we've got it so simple they pull another thing out and change something on us.

Wednesday, February 10, 2016

My 2003 Civic Fuel Door Stopped Opening

So, one day, out of the blue, I could not open the little hatch to get gas into my 2003 Honda Civic. Going online, I found this is a fairly common problem wherein part of the cable just rusts out so that the trunk will open (a pull) but the fuel door will not (a push). I also found some guy in Canada who sells a $20 bit of plastic that snaps over the existing cable and makes it work again without ripping out half  your car. Instead you have to rip up only the trim in the driver side door bottom—which is tough enough and I don't want to do that again. Seems to work, I'll edit this post if it fails anytime soon.

Anyway, this seems like exactly the sort of thing that could be a plan you download and make yourself in 5 minutes on a 3D printer. It would certainly save on the first class mail from Canada.