Archive for September 3, 2015

Thursday, September 3, 2015

NetNewsWire 4.0

NetNewsWire 4.0 is finally available (via @iconmaster, tweet). The main change since the beta is that it now has its own cloud syncing service, instead of iCloud Core Data. There is also a traditional three-pane view instead of just the widescreen view.

It still has the “lite” feature set, nothing like my beloved NetNewsWire 3. There are no smart folders. There’s no meaningful AppleScript support. It doesn’t support the system share menu.

There’s also a bug where permalinks containing # don’t open properly in a Web browser.

Update (2015-09-04): John Gruber:

Second, Black Pixel has simplified so much, they’ve removed a lot of what made NetNewsWire NetNewsWire. Let Apple News and Flipboard be the simple news readers — I think the opportunity in today’s world for a non-free Mac RSS reader is at the high-end.

Nick Heer:

I’ve only had the chance to play around with the iPhone version, but it does feel awfully light. That’s not to discredit what I’m sure is a significant modernization of the Mac app underneath and, presumably, code compatibility with the iPhone app, but I can’t help but ache for more.

NetNewsWire has a very specific audience, and I don’t think this new version really appeals to them on either iOS or the Mac. In that sense, it comes across as confused. Both are adequate RSS readers, but I don’t think the word “adequate” is how NetNewsWire has ever been described.


But I also don’t want one of the five most important apps in my life to fade into something dumbed down. One interpretation of this post’s title is of course “who is NetNewsWire 4, who stands behind NetNewsWire?”. It used to be Brent and Sheila. It now is Black Pixel. Black Pixel has a more Apple-like approach and it’s not the way they work to think aloud, to eagerly solicit feedback, to herd cats and cat-like ideas of what should be for dinner tonight. I can deal with all of this. But I have to see progress.

Update (2015-09-11): Black Pixel (tweet):

At the present time, we’re not going to offer support for third-party sync systems, because we intend to offer something much better for the customers that use our products.


We knew we could offer improved, targeted performance if we controlled both sides of the sync equation. Instead of a generic service meant to meet a specific set of functions we may not even expose in the app, we were able to define a customized, optimized protocol to ensure the best possible performance we could provide our customers.

On the other hand, you have to switch to their entire stack, are then fully dependent on their apps, and have no Web version.

Migrating to a New Mac in the Real World

Michael E. Cohen:

Pack-rat that I am, I keep an Ethernet cable in my Cupboard of Arcane Connectors: I strung that between my new iMac and the Time Capsule before I started the migration. I could have used the Time Capsule’s Wi-Fi connection instead, but restoring a backup that way would have taken considerably more time — the last time I did a migration over Wi-Fi, it consumed a full weekend.


The first obstacle was the appearance of a dialog that told me the Mac was “preparing” to transfer my backup: it had no progress indicator and, as minute after minute passed, it gave no impression that any progress actually was being made. In my younger, more impatient days, I would have forced a reboot and tried again, but that night I told myself to wait an hour before giving up. After “only” 30 minutes, though, the “preparing” dialog was replaced by one with a progress gauge, and, what’s more, a time estimate!


Before I could even get to that, though, I had to deal with a flurry of requests for my iCloud password. Dialog after dialog came up requesting it, four or five in a row. This flurry was finally followed by an alert telling me that some of my apps required app-specific passwords, and the alert offered to help me create them. The alert didn’t tell me which apps needed those passwords, but I noticed that it sported a Messages icon.


Since I couldn’t deauthorize my old Mac (no hard drive, remember), I deauthorized all the computers using my account, and then authorized my new one. My media was once again accessible.


The moral of this episode: It’s not over until it’s over. Even if you get your Mac successfully migrated, you will likely find a few things that need tweaking and readjusting in the days and weeks ahead.

Adam Engst:

I always have a nightly duplicate of my boot drive, but in a case like Michael’s where it died late in the day, even a nightly bootable duplicate wouldn’t have been enough because he would have had to try to figure out what had changed during the day. In that kind of a situation, something like Time Machine or CrashPlan that runs all the time is more likely to be up to date.

AWS Device Farm

Amazon (via Cabel Sasser):

Device Farm is an app testing service that enables you to test your Android, iOS, and Fire OS apps on real, physical phones and tablets that are hosted by Amazon Web Services (AWS). A test report containing high-level results, low-level logs, pixel-to-pixel screenshots, and performance data is updated as tests are completed.

Device Farm allows you to upload your own tests or use built-in, script-free compatibility tests. Because testing is automatically performed in parallel, tests on multiple devices begin in minutes.


On iOS, we replace the embedded provisioning profile with a wildcard profile and resign the app. If you provide it, we will add auxiliary data to the application package before installation so the data will be present in your app’s sandbox. Resigning the iOS app results in the removal of certain entitlements. This includes App Group, Associated Domains, Game Center, HealthKit, HomeKit, Wireless Accessory Configuration, In-App Purchase, Inter-App Audio, Apple Pay, Push Notifications, and VPN Configuration & Control.

Frederic Lardinois:

Just like other AWS services, Device Farm will offer a free tier. In this case, you get 250 device minutes for free. After that, you will pay $0.17 per device minute or you can opt for paying a flat fee of $250 per device per month.

There are many supported devices, including ones with previous OS versions.

Apple Loses German Top Court Case on Swipe-to-Unlock Patent

Karin Matussek (via Hacker News):

Judges on Tuesday said that the iPhone maker’s method didn’t reach a level of sophistication needed to award patent protection -- backing an earlier patent tribunal ruling in favor of Lenovo Group Ltd.’s Motorola Mobility Holdings Inc.

“This user-friendly display was already suggested by the state of the art,” the Karlsruhe-based court wrote. “The contested patent thus isn’t based on an invention.”


I have been involved with several patent suits (on both litigant side and defendant side) and as an engineer, I have to admit that there has never been a time when I haven’t read the statement of the problem the patent says its going to solve, and not thought of the solution myself, way before the patent presents the same solution. In other words, every single litigated software patent I’ve been asked to review has been BLATANTLY obvious. And I’m no genius. I’ve talked to other engineers and they’ve all said the same thing. I just explain a problem domain, and they usually give a solution that comes under the claims of the litigated patent.

This is not to say that there aren’t non-obvious software patents. Its just that those never seem to get litigated, because they aren’t some obvious concept sitting at the nexus of a well-trodden path the industry is following.

Why Dependent Types Matter

Jeremy W. Sherman:

A dependent type is a type that depends, not just on other types, but on terms. This means you can have values – plain old data – in your types. A common example is that of length-indexed lists.

You likely caught on that that code is Swift-ish but not actually Swift. That’s DTSwift, where I pretend that Swift is dependently typed.


This means that dependent types give us pay-as-you-go provable correctness. You can require proof of the most critical properties in your program in the form of very specific types that ensure those invariants, while handwaving about components that are either less important or just more readily shown correct by test or inspection.


Dependent types let you replace a Boolean that throws away the knowledge gained from a test by a type that represents the outcome of that test.

Update (2015-09-04): Joe Groff recommends Certified Programming with Dependent Types.

David Owens II:

This is the part I don’t get: we allow for incorrect code to be written in the non-dependent-typed case, but we assume that we can’t do the same with depedently-typed code? Why? What’s preventing me from swapping left and right in the Order type that is returned?

Update (2015-10-04): Jeremy W. Sherman:

Unlike in the evidence-less case, though, consumers of instances of this type can work out that it’s the wrong way around based on the because evidence: an instance like lessThanOrEqual(zeroLEQEverything: LEQ(0, 1)): OrderFlippedInstances(1, 0) hands the consumer a proof that LEQ(0, 1), and if they pattern-match that out and use it – as they likely would while producing evidence for the correctness of whatever they’re building atop this data – it’s merely frustrating that our documentation is backwards.

This “solves” the flipped Boolean problem, but no tool can solve the problem of misleading names. Misleading names provide bad input into our informal reasoning processes, and we’re likely to write bogus code as a result. If we’re programming with evidence, as dependent types let us do, we’ll catch this while interacting with the compiler; if we’re trusting the names, and ignoring the evidence, as dependent types also let us do (and non-dependent types force us to do), we likely won’t, absent testing.

Jeremy W. Sherman:

David’s concern is that, “It’s up to the programmer to realize that we have actually not created all of the proofs required to prove correctness.” This concern arises from his thinking that the proof for negb_inverse goes through even if you alter negb so it always returns true.

The version of negb he defines that always returns true actually already fails at the negb_inverse theorem, without need to proceed to trying to prove negb_ineq.


David’s core concern about knowing you’ve proved what you want to prove is a real problem.