Friday, October 9, 2015 [Tweets]

Gatekeeper Exploit

Dan Goodin:

Patrick Wardle, director of research of security firm Synack, said the bypass stems from a key shortcoming in the design of Gatekeeper rather than a defect in the way it operates. Gatekeeper’s sole function is to check the digital certificate of a downloaded app before it’s installed to see if it’s signed by an Apple-recognized developer or originated from the official Apple App Store. It was never set up to prevent apps already trusted by OS X from running in unintended or malicious ways, as the proof-of-concept exploit he developed does.


Wardle has found a widely available binary that’s already signed by Apple. Once executed, the file runs a separate app located in the same folder as the first one. At the request of Apple officials, he and Ars have agreed to withhold the names of the two files, and instead will refer to them only as Binary A and Binary B. His exploit works by renaming Binary A but otherwise making no other changes to it. He then packages it inside an Apple disk image. Because the renamed Binary A is a known file signed by Apple, it will immediately be approved by Gatekeeper and be executed by OS X.

From there, Binary A will look for Binary B located in the same folder, which in this case is the downloaded disk image. Since Gatekeeper checks only the original file an end user clicks on, Wardle’s exploit swaps out the legitimate Binary B with a malicious one and bundles it in the same disk image under the same file name. Binary B needs no digital certificate to run, so it can install anything the attacker wants.

Glenn Fleishman:

This modified Trojan Horse software still needs to be downloaded or copied, and then launched by the user. “This is merely a Gatekeeper bypass,” Wardle notes, although there are many ways in which less-sophisticated users are fooled into running software with uncertain origins. Many free and trial software can be found at download sites, and are repackaged with adware and other unreliable software.

But Wardell also notes that because this affects third-party signed apps, malware could be intercepted over unencrypted downloads by anyone who could insert themselves into a network connection. This could include criminals and governments.

“What do you think?”

Arno Gourdol:

A few weeks later, sitting at the same computer, Steve is leaning in, his face just a few inches from the screen as he studies the pixels. On the screen is a new design for the shape of the Aqua windows. In the previous iterations, the windows had four rounded corners, but now the corners at the bottom are square, to solve a design problem with the placement of the scrollbars.

Historical Photos

Sean O’Kane:

You’ve seen images from the Apollo missions before, but you’ve never seen anything like this. More than 8,400 images from NASA’s Moon missions have been uploaded to Flickr at a resolution of 1800 dpi.

NASA didn’t just send astronauts to the Moon to do scientific exploration, it also sent them equipped with a handful of Hasselblad cameras. The images from these cameras were preserved, and many were digitized. But in recent years the screens we use — the ones in our living rooms, on our desks, and even the ones in our pockets — have seen a drastic increase in quality, leaving these photos looking pixelated and fuzzy. Thanks to some tireless work from a few enthusiasts, every photo taken on the Moon (and many of the ones taken on the way there and back) has been uploaded in high resolution to one massive Flickr gallery.

Jason Kottke:

Yale has made 170,000 Library of Congress photos of the US from 1935 to 1945 available online, searchable and sortable in many different ways.

With the county map, it was easy to find photos of my area from the 1930s.

iOS 9 Universal Links and Forgotten Passwords

Curtis Herbert (via Federico Viticci):

For your first-party iOS client, Universal Links aren't just for your brand or increasing engagement, they can also be used to greatly improve the user experience of previously annoying workflows.


With universal links we can remove Safari from that process entirely. Users can now reset their password in-app, allowing the app to also automatically log them in after the reset. This is all possible while still having the security of the reset password email to confirm identity.

His Slopes app for skiing and snowboarding looks nice (App Store).

Wi-Fi Calling

Dan Moren:

The good news is that AT&T and the FCC seem to have finally finished whatever spat discussions they’ve been having, and iPhone users on the carrier can now enable the Wi-Fi Calling feature added for all in iOS 9. (Previously, it was offered by other carriers, including T-Mobile, but not for AT&T.)

I expect this to work much better than AT&T’s MicroCell, which has limited range and sometimes inexplicably stops working. Unfortunately, Wi-Fi Calling requires an iPhone 6 or 6s.

Overcast 2

Marco Arment:

And with the new storage manager, you can see how much space your downloads are consuming for each show, and optionally delete the downloads and stream the episodes on demand.


Overcast 1.0 locked the best features behind an in-app purchase, which about 20% of customers bought.


With Overcast 2.0, I’ve changed that by unlocking everything, for everyone, for free. I’d rather have you using Overcast for free than not using it at all, and I want everyone to be using the good version of Overcast.

If you can pay, I’m trying to make up the revenue difference by offering a simple $1 monthly patronage. It’s completely optional, it doesn’t get you any additional features, and it doesn’t even auto-renew — it’s just a direct way to support Overcast’s ongoing development and hosting without having to make the app terrible for 80% of its users.

Thursday, October 8, 2015 [Tweets]

Apple and Privacy

Nick Heer:

I noticed this too, yesterday, when I was researching for a forthcoming article. The new privacy page is something only Apple can really do because nobody else is actually doing the things they are. But, as a marketing piece, it isn’t necessarily entirely forthcoming.


When read together — and, particularly, when combined with this support document — this gives the impression that iMessages backed up to iCloud will surely be encrypted, but they’re not.


While we do back up iMessage and SMS messages for your convenience using iCloud Backup, you can turn it off whenever you want.

Although not without disabling iCloud Backup entirely.

Matthew Panzarino (via John Gruber):

Here’s a tidbit with regards to Apple Maps. When you query Maps for a trip, Apple generates a generic device identifier and pulls the info using that, rather than an Apple ID. Halfway through your trip, it generates another random ID and associates the second half with that. Then, for good measure, it truncates the trip data so the information about exact origin and destination are not kept. That data is retained for 2 years to improve Maps and then deleted.

Nick Heer:

While Apple was busy greatly improving their privacy page, Google announced a new advertising product called “Customer Match” that’s pretty creepy. If you aren’t opted out of personalized advertising, you may be familiar with a situation where you visit one site, then visit other sites only to find an ad from that first site tagging along. This is known as “remarketing”, and Google’s new advertising product takes it to the next level[…]

John Gruber:

The bottom line: ever-more-personally-targeted ads, and a growing divide between Google’s and Apple’s approach to privacy.

Tim Cook (comments):

I don’t think you will hear the [National Security Agency] asking for a back door. ... There have been different conversations with the FBI, I think, over time. ... But my own view is everyone’s coming around to some core tenets. And those core tenets are that encryption is a must in today’s world.


We do think that people want us to help them keep their lives private. We see that privacy is a fundamental human right that people have. We are going to do everything that we can to help maintain that trust.

Peter Taylor (comments):

Mr Snowden said GCHQ could gain access to a handset by sending it an encrypted text message and use it for such things as taking pictures and listening in.


“It’s called an ‘exploit’,” he said. “That’s a specially crafted message that’s texted to your number like any other text message but when it arrives at your phone it’s hidden from you. It doesn’t display. You paid for it [the phone] but whoever controls the software owns the phone.”

Amy X. Wang:

Once in, agencies can allegedly access many functions of the phone—reading messages, looking at web history, and even taking secret photos with the camera—without the owner’s knowledge.

That would explain why they don’t need to ask for a back door.


Marcel Weiher (tweet, comments):

With Apple doggedly sticking to Ahead of Time Compilation for Objective-C and now their new Swift, JavaScript is pretty much the last mainstream hold-out for JIT technology. And even in JavaScript, the state-of-the-art for achieving maximum performance appears to be asm.js, which largely eschews JIT techniques by acting as object-code in the browser represented in JavaScript for other languages to be AOT-compiled into.

I think this shift away from JITs is not a fluke but was inevitable, in fact the big question is why it has taken so long (probably industry inertia). The benefits were always less than advertised, the costs higher than anticipated. More importantly though, the inherent performance characteristics of JIT compilers don’t match up well with most real world systems, and the shift to mobile has only made that discrepancy worse. Although JITs are not going to go away completely, they are fading into the sunset of a well-deserved retirement.

The State of Apple Maps

Joe Rosensteel:

Instead, here we are, three years later. Still working around Siri, and working around apps that integrate Apple Maps (like Yelp), and copying and pasting addresses in to Google Maps.


The other location improvements have less significance to me, but I do still miss Google’s Street View. If you tap on an address that has no Yelp data you get a spartan, white page with a slowly rotating satellite view of the street, which is useless.


It’s important to keep your eyes on the road. Glancing at certain elements of your console for vital info is a necessity. Using thin weights for the display of information in a navigation app is just dumb. At a glance, you can see the number of miles to your next turn, or decimal value thereof, and an icon representing the kind of turn you will need to execute. White bars float over streets, but you can’t read them, and the street you’re turning on to is so tiny and waif-like that it might as well not be there. A thicker weight is used for the time, but again, a small size makes it hard to read clearly in a split second. Things also wouldn’t need to be so small if they weren’t all crammed in the top bar.


One of the things I’ve found puzzling about the design of the Apple Maps interface is that you can see traffic, and travel estimates supposedly influenced by traffic, in the route overview, but no traffic information is provided when turn-by-turn is on.


Lane guidance is a feature present in Google Maps, but not found in Apple Maps. I find it invaluable when I am traveling in a congested area and unfamiliar with where turn lanes, or exits, will split and join. Some exit lanes might quickly expand in to three lanes with turns in different directions, and Google Maps will tell you which ones you can be in, or even that you will be fine in the lane you’re already in.

Update (2015-10-09): Ryan Jones notes that in iOS 9 Apple Maps can pause spoken audio (e.g. podcasts and audio books) when giving directions. It works with third-party audio apps, but I don’t think this is something that third-party maps apps can do.

My iPhone 6s and iOS 9 Experience

Restoring from my iTunes backup didn’t work the first time. It didn’t put all the apps back or put them in right places. I wiped the phone, and the second time it worked perfectly.

The iPhone 6s definitely looks larger than my 5s. Within a day or so, the extra row of icons, and having more screen space in general, feels normal. Reading is much better than on the narrower screen. Typing is a bit easier. Going back would feel constricting.

It does not feel normal in my hand, though, and every day I miss the 5s’s size. There are so many times, especially with Safari View Controller, where I need to reach the top of the screen, and this just feels awkward. The Reachability double-touch—which must be very light—feels less convenient than a hand shimmy. Perhaps it would work better with a dedicated hardware button. It’s just not as easy to use one-handed as the 5s.

I have always used my iPhones caseless. For me, at least, this is no longer possible with the iPhone 6s. Improved or not, the metal surface feels slippery. Between that and the thinner, smoother shape, I found myself gripping the phone much more tightly. It’s strange because the 6s looks curved—is actually curved—but it feels almost pointy, digging into in my hand; the 5s has edges that look sharp, but it sits lightly in the hand, the edge feeling more like a texture than a blade. Every other iPhone has felt good in my hand, some better than others, but all good. The 6s was so uncomfortable that I would have returned it if I couldn’t find a case that I liked. Secondarily, the camera bump is unsightly and unpleasant to touch, and having case mitigates that.

I wanted to like the Apple silicone case because it is very grippy and has several great color options. Unfortunately, it is way too grippy for everyday use. It sticks going into my jeans pocket, and pulling out the phone turns my pocket inside-out. The silicone case also collects dust and lint like crazy.

I settled on the Apple leather case. It changes the phone’s shape enough that it feels comfortable in my hand. It’s grippy enough, but it still slides in and out of my pocket easily. With the case, the 6s feels much larger than the 5s. Unlike with the 5s, it sometimes gets situated in my pocket such that it digs in when I bend to sit or stand. (I’m on the slim side but don’t wear skinny jeans.) The lip at the top of the case collects dust, but the rest of it does not. For the first few days, the leather irritated my skin a bit, but now it’s fine. I don’t mind the leather wearing, but I’m slightly worried that it will get smelly or grimy over time. Had I known about the Evutec Karbon before buying the leather case, I might have gone with that instead.

I’m not happy with the buttons compared with previous iPhones. Without a case, the buttons seemed too easy to press. I would power off the phone by accident. With a case, the power button is almost too hard to press if I don’t get the spot exactly right. I also don’t like its position on the side, opposite the volume buttons. Often, I’ll grab the phone to turn it off, bracing against the volume side while pressing the power side, and I’ll accidentally change the volume.

The speaker seems much better. I’ve found myself playing music or podcasts from my pocket if my Bluetooth headset is charging or not handy.

The Touch ID sensor is much faster, not instant, but so much faster that I sometimes unlock the phone by accident. I intend to turn on the screen from the Home button, then swipe up to access the camera. Instead, the phone unlocks, and I end up at the home screen. Now if I want to get to the camera, I tap the Home button with the tip of my finger to prevent it from unlocking.

The battery life definitely seems shorter than on my two-year-old 5s, but this is not a serious problem for me. I’m not sure whether I have the Samsung or TSMC A9, and I’m skeptical that there is much difference in battery life.

Overall, phone reception seems better. I often have two or three bars in locations where I previously had one or two. Unfortunately, I’ve had lots of problems with the phone not ringing. At first I thought this was because I had misconfigured Do Not Disturb. But then it failed to ring when I asked someone in my “Disturb” Contacts group to call. And it has also failed to ring outside of the Do Not Disturb hours.

On the software side, the overall speed is incredible, though it all too soon becomes expected. San Francisco is great. Apps are finally listed alphabetically in the Notifications screen in Settings, so it’s much easier to find them.

I love being able to move the cursor around with 3D Touch and trackpad mode. Unfortunately, this does not work with third-party keyboards. Peek and Pop are useful and reduce the need to reach to go back. I like being able to hard-swipe from the left edge to switch apps. I can finally print to PDF by peeking and popping on the print preview, and there is also a “Save PDF to iBooks” action. Not every app can print, though, so it’s still nice to have PDF Converter (App Store).

“Hey Siri” works again, and it’s surprisingly useful when the iPhone is unplugged. I find myself using it from across the room.

The camera is much improved, although I would say not as big an improvement as with previous two-year periods. The Camera app does seem to open a lot faster, which is great. It’s still infuriating that the camera doesn’t remember that I always want to use HDR.

I like the idea of Live Photos but find myself not using the feature. This is partly because they don’t automatically import well into Lightroom. Lightroom sees that the movie and photo files have the same basename, and it imports the movie file with the photo as an invisible sidecar. To see the movie and photo separately, you have to rename one or the other before importing. That’s easy enough to do with a find and replace, but it can’t be done within Lightroom, which means an extra step or two. The other problem is that Lightroom seems to set the movie’s date to when the movie was imported, rather than when it was recorded, which means that the movie-photo pairs don’t sort together.

There’s an unfortunate bug where the music or podcast stops playing when I open the Camera app. This is related to Live Photos, but it happens even if Live Photos is disabled. Apple told me that a fix is in the works.

I’ve heard that even with iOS 9.0.2, there may still be a bug where apps use cellular data when they’re not supposed to. At least judging by iOS’s self-reported statistics, the switch is working for me.

Lastly, it’s frustrating that Contacts groups don’t work better. The groups are not sorted alphabetically, and there is still no way to create a group or assign a contact to a group from the phone (except via the Web interface).

My El Capitan Experience

The Mac App Store promised a “refined experience”; clearly its progress indicator needed some refinement.

I had a bunch of problems installing El Capitan. The installer hung, and I eventually had to hard reboot the Mac. Then I had problems with 2-factor authentication and logging into iCloud. After finally logging in, most things worked.

I got to the Finder and found that in Icons view the icons look awful. It seems to be using blurry scaled down images instead of the ones that are optimized for the size I am viewing. The icons look normal in the Lists and Columns views, though. The Finder still doesn’t remember which windows are open or which view options I’m using. Even just doing a search and then canceling it messes up my column widths. There’s an odd bug where sometimes the “Move to Trash” menu item is disabled, but if I click on another file and then click back to the first file it becomes enabled. The normal interface for restoring from Time Machine doesn’t finish loading for me, and every time I return to the Finder it crashes. Restoring using tmutil works, however.

The best part of El Capitan is the new San Francisco system font. The year of Yosemite was unpleasant for me because of Helvetica Neue. On Retina displays it looked OK, but in my opinion it is not a good choice for a system font. On non-Retina displays it was ugly and hard to read, with letters running into each other. On non-Retina displays San Francisco looks good. It is perhaps not as optimized as Lucida Grande, but I like the character shapes (except for the quotes). I look at the screen, and seeing the letters so clearly again makes me happy. Needless to say, on Retina displays it looks fantastic.

One oddity is that San Francisco does not appear in the system Fonts panel. It’s the default font in Mail, but if you are updating from a previous version of the OS—or if you ever change the font in Mail—there is no obvious way to go back to San Francisco. I found that on different systems the current font was stored in different places. Some combination of these Terminal commands restores the default:

defaults delete MailboxListFont
defaults delete MessageListFont
defaults delete TocFont
defaults delete Font

EagleFiler faces the same issue as Mail, so I added a pop-down menu to its Fonts panel for selecting the system font. The same menu is also available in DropDMG if you want to make a disk image layout that uses San Francisco.

I love the feature to see which Safari tab is playing audio. There’s now a preference in Safari so that the Option-key workaround for Favorites Bar keyboard shortcuts is no longer necessary. Overall, Safari seems more responsive. However, I have run into some situations with a lot of tabs where some tabs die without ever loading. I have mixed feelings about the new on-demand status bar at the bottom of the window. It lets me see more page content most of the time, but depending on the page background it can be hard to read the URL on mouseover. I like the new feature where you can hold down the Option key to “Clear History and Keep Website Data….” The old way of manually clearing the history—via Select All and Delete—is still buggy in that after a few seconds a handful of pages from each day come back.

The location of the LSSharedFileList files that store the per-application lists of recent documents has changed. One EagleFiler customer says that the displayed list of recent documents is not updating for her, even though the file’s modification date is changing.

The create_os_x_vm_install_dmg script did not work for me; the image it created booted to a blue screen in VMware. These methods did work for creating bootable installers, as did selecting the Install OS X El file itself when VMware asked for a disk.

It’s great to have Find My Friends in Notification Center.

The beta problems with Aperture are apparently fixed, but the iCloud features have stopped working for me and there’s a bug with Onscreen Proofing. I think this is my cue to migrate my old photos to Lightroom before it’s too late.

FileMaker is not ready yet. Microsoft just fixed Office 2011. Office 2016 is currently crashy. MacStrategy has a compatibility list, but I don’t think it’s up-to-date. For example, Super Duper has been compatible for a while. I did not have to update to a newer version of LaTeX because the El Capitan installer had automatically moved the files for compliance with System Integrity Protection. I just had to update the path in my Makefile.

I updated my apps to use App Transport Security. My Web server already supported HTTPS, but the software update feature, crash reporter, etc. were not using it. I need to use NSExceptionRequiresForwardSecrecy for now, because the server is currently running Ubuntu 12.04, which doesn’t support doesn’t support ECDHE ciphers. I was hesitant to switch software update over to HTTPS because in the event of a problem with ATS it would then be impossible to automatically deliver bug fixes. But it seems to be working very well except for one customer who is getting a certificate error—unrelated to ATS, since he’s on 10.9.

The biggest El Capitan changes for me are in Apple Mail. The first-run experience was terrible—it took more than 6 hours after the database migration before it would download any new messages in my main account’s inbox. Before that, it was constantly showing that other mailboxes were downloading messages, only at a very slow rate, and with very little bandwidth usage (as reported by iStat Menus).

Since then, it has been working pretty well for me. The frequent crashes and hangs from the Yosemite version seem to be fixed. Smart mailboxes are still slow compared to before they were rewritten to use Spotlight instead of SQLite (10.9?).

I used to run Mail with the Activity window way off in the corner of my second display and the activity pane in the main pane hidden. This way I could see details if I wanted them, but I wasn’t distracted by activity when I was just trying to read my mail. Unfortunately, in El Capitan there seems to be no way to turn off the activity pane below the mailboxes. It is constantly popping up for a second or two and then disappearing. Also, Mail used to only show a number next to the inbox when it actually contained unread messages. Now, it seems to show a number when there is a message that’s downloaded but in the process of being filtered. So I click on the inbox only to find that there’s nothing there. The main Activity window no longer lets you cancel tasks. I haven’t missed this in El Capitan yet, but in previous versions it was often necessary if Mail got wedged—better than force quitting the whole app.

The Page Up and Page Down keys now work in the message list, fixing the odd behavior introduced in 10.9.

I find the in-message banners notifying me about data-detected contacts and events annoying. Unfortunately, there doesn’t seem to be a way to turn them off.

I still have some SpamSieve customers who are seeing the bug, introduced in 10.9, where moving messages to another mailbox via AppleScript takes tens of seconds. The GUI scripting workaround still works.

Mail has long had a feature where you could check its number of background operations via AppleScript. SpamSieve uses this to try to avoid sending Mail commands when it’s busy, because processing AppleScript commands can cause it to deadlock. EagleFiler uses this to avoid reading mailbox data while Mail is busy, because this helps ensure that the messages are completely written to disk first. (If they’re not, EagleFiler will detect this, but it’s better to wait a few seconds and then import successfully than to get an error and have to retry.) Unfortunately, Mail’s background activity count property is broken in El Capitan, so these safety features no longer work.

There’s now an editor for e-mail address aliases, rather than a text field for a comma-separated list.

The strangest El Capitan behavior I’ve seen is that somewhere in the setup process, if you have a POP account, it sometimes creates an IMAP account with the same name but marks it as inactive. This hasn’t happened to me, but I’ve heard from lots of customers who’ve seen this. Since the account is inactive, this wouldn’t seem to be a big deal, however Mail’s own script object specifiers seem to get messed up when there are duplicate accounts, leading to errors that prevent SpamSieve from moving the messages when you train them. The workaround is to rename the inactive account.

See also: my other El Capitan posts, Apple’s list of features, Take Control of Apple Mail, TidBITS, Ars Technica (comments), Jason Snell, Alex Guyot, David Pogue, and MacRumors’ list of reviews.

Wednesday, October 7, 2015 [Tweets]

Apple News

Josh Centers:

Instead of being salvation for publishers, Newsstand quickly became a prison. Publishers had to become (or hire) developers in order to participate in Newsstand — an expensive proposition, and not something most publishers are good at.


Apple hasn’t given up on periodicals, though, and is taking a different approach in iOS 9 with News, which acts more like a traditional RSS reader, pulling articles directly from publisher feeds (which are far easier to maintain than entire apps) and displaying them in a consistent format (while still allowing some large publishers to tweak the look slightly). With potentially hundreds of millions of users, News could have a significant impact on the world of online journalism. To start, Apple is testing a proprietary Apple News Format with select publishers, and Wired is experimenting with publishing articles to Apple News first. Apple is also hiring journalists to edit Apple News, pointing at bigger things ahead.

John Gordon notes that when you share a link, it gets redirected through, Apple’s version of Twitter’s

So, despite my dire expectations, Apple, for now, is providing redirects to the web source. This doesn’t mean Apple will never interfere with the distribution of information that would hurt Apple’s business or offend its executives, and my confusion between NYT and Apple content is a bit weird (user error?), but for now isn’t necessarily evil.

Tom Harrington:

Apple News consistently lags Flipboard for updating sources, sometimes by days. Doesn’t reload the sites on demand either…

As I write this, Apple News is not showing my blog post from two hours ago. Indeed, for weeks it didn’t show my C-Command Blog at all, even though Apple had e-mailed to say that it was in Apple News. And it’s slow in another way: the app itself is not as responsive as browsing the same site in Safari.

The other thing that bothers me is the machine-generated tags. For my EagleFiler 1.6.6 post, which is mainly about updates for El Capitan, it shows “Mac OS X Snow Leopard.” For my SpamSieve 2.9.21 post, it shows “Operating Systems.” For my in-progress hiking blog, it tags a hike in Lebanon, New Hampshire as “Meriden, Connecticut.”

Core Data in El Capitan

There are again no Core Data release notes this year, but there is WWDC 2015 Session 220 (video, PDF):

Previously you may have used -hasChanges, this was a rather basic dirty flag, if you touch the object, we would mark it dirty. But with -hasPersistentChangedValues we’ll ensure that the properties on the object are different than what’s in the persistent store ensuring you don’t have any false positives.

Also new on NSManagedObject is -objectIDsForRelationsipNamed: for relationship named. This is ideal for working with large relationships mainly because we won’t materialize the entire relationship in memory rather we’ll return to typed array of object IDs to you. This allows you to go through these object IDs and work with your objects in smaller sizes.


Well Core Data has you covered this year, simply tell us which attributes should be unique across any entity and we’ll make sure all instances of that entity keep that unique attribute, be it email addresses, part numbers, UPC, you name it, we’ll make sure it is unique across all instances.


NSBatchDeleteRequest works like NSBatchUpdateRequest in that it acts directly in the persistent store without loading any objects into memory.


Whenever you have a store that’s created or migrated or just opened on the new iOS from an older version the managed object model used to create it is cached into the store and it is used by lightweight migrations when they fail to find appropriate source model as sort of a last-ditch effort.

Zachary Orr:

And there you have it! That’s all you need to get unique constraints working in Core Data. In my demo project, I’ve used a NSFetchedResultsController to show where unique constraints will not work well. If you’re displaying data using a fetched results controller, you’ll still see entities with non-unique properties, since conflict resolution only happens when saving our managed object context, and fetched results controllers work with in-memory objects.

Jeremiah Jessel:

refreshAllObjects This refreshes all the objects in the context while preserving the unsaved changes. The references will remain valid and it will break any retain cycles that may have been inadvertently created.

Florian Kugler and Daniel Eggert:

When using multiple managed object contexts concurrently, you also have to handle race conditions when deleting objects. iOS 9 and OS X 10.11 have a convenient solution for this problem in the form of the context’s shouldDeleteInaccessibleFaults property. However, this convenience comes with tradeoffs. Alternatively you can implement robust deletion using a two-step deletion process.

Despite all the talk about how Core Data is not a database, it seems to be continually growing database-type features. And that’s a good thing. Why not use the power of the underlying SQLite engine?

LZFSE Disk Images in El Capitan

One of my favorite improvements in El Capitan is the new LZFSE compression algorithm, which is available directly to apps as well as via a new disk image format. The new .dmg format is not accessible in Disk Utility, but I’ve added support for it in DropDMG 3.2.8. Here are some benchmarks I made imaging a 11.28 GB boot partition on a MacBook Air.

zlib (10.10)8.86 GB21.4%63.5 MB/sec
zlib (10.11)8.75 GB22.3%36.8 MB/sec
LZFSE (10.11)8.60 GB23.8%107.7 MB/sec
bzip2 (10.11)7.03 GB*23.2%11.7 MB/sec
none (10.11)9.15 GB*0%114.4 MB/sec

The source and destination partitions were on the same SSD, and both were encrypted with FileVault 2. I’m impressed that the Air can decrypt, compress, and encrypt to the same drive at more than 100 MB/sec. In 1996, I measured copy throughput at just 43K/sec.

The bottom line is that LZFSE is both faster than zlib and compresses more tightly. (It is supposed to decompress faster as well.) Apple has also tweaked the way zlib is used so that disk images created on 10.11 are smaller than those created on 10.10 (but are slower to create). The smaller zlib disk images are still backwards compatible with previous OS versions, whereas the LZFSE disk images can only be opened on 10.11 or later.

Lastly, the redesigned Disk Utility has removed the feature for burning disk images. The help claims that you can do this with the Finder, but I think that feature has also been removed. You can still burn files and disk images with DropDMG.

Update (2015-10-07): The Burn command is still in the Finder, but now it’s only shown if a burner is connected.

I added results for bzip2 and none (no compression). The destination sizes say * because I no longer have the exact same volume (an El Capitan beta) to test with; I instead imaged a fresh El Capitan installation, which had a different source size (9.15 GB) but should be a similar mix of files. These new results show that bzip2 is really slow, which was common knowledge. More interestingly, no compression was not much faster than LZFSE (which makes sense given LZFSE’s goals), and bzip2 was actually worse at compressing than LZFSE (unexpected).

Tweetbot 4 for iOS and Tweetbot 2.1 for Mac

Federico Viticci:

Largely because of the economic realities of Twitter clients, few developers ever invested in a Twitter app for iPad that wasn’t a cost-effective adaptation of its iPhone counterpart. Many took the easy route, scaling up their iPhone interfaces to fit a larger screen with no meaningful alteration to take advantage of new possibilities.


In the process, Tweetbot 4 offers a dramatic overhaul of the iPad app, bringing a new vision for a Twitter client that’s unlike anything I’ve tried on the iPad before.


The most notable change in Tweetbot 4 for iPad is a new column view that puts a second column on the right side of the screen in landscape mode. Based on Tapbots’ previous work on OS X, the second column allows you to pin views, lists, and searches for the current account to the right. The column is fully interactive and it lets you move across different sections at any time with one tap.


This won’t come as a surprise, but Tweetbot 4 adds support for iOS 9’s Safari View Controller to open links inside the app with an in-app browser based on Safari. Safari View Controller can be enabled by going to Settings > Browser and toggling ‘Open in Tweetbot’.

Dr. Drang:

This is not a review. There are several other places you can go for that. What I want to talk about are the little charts it provides in the Stats view. They’re fun without being obsessive the way Twitter’s own analytics charts are.

Dan Edwards (via Dave Mark):

Recently Tweetbot 4 was released as a cross-platform update that’ll work on iPad & iPhone. Right now (at 50% off), it’s a $4.99/£3.99 app. Regardless of whether you bought the old Tweetbot recently, or at all.

Some people were pretty angry about this[…]

I like the new iOS version (App Store). It is frustrating, though, that this update again fits less on screen at once than the previous version:

Tweetbot 3

Tweetbot 3

Tweetbot 4

Tweetbot 4

The other problem, not Tapbots’ fault, is that to get out of Safari View Controller, you have to scroll to the top and then reach to tap the Done button at the top right of the screen.

The new Mac version (App Store) uses San Francisco, which looks great, and adds a useful Scroll to Last Read feature. There’s a bug with the global hotkey, which I’ve worked around with a script. There is still no way to select text in the main view.

Update (2015-10-08): Dr. Drang:

According to Paul, the next revision to Tweetbot will use monospaced numerals in the countdown, which will eliminate the jumpiness except when the number of digits changes. This’ll be much better, although personally I’d prefer either a right margin with a fixed width large enough to accommodate a three-digit count or to have the counter moved from the right margin to the otherwise unused space under the user’s avatar.

Nick Heer:

Despite this, the view I’m most interested in is not the Stats tab, but the Activity tab, which shows a real-time view of favourites, retweets, and replies. The latter is especially nice because it functions kind of like a conversation view or inbox; tapping on one of the cells will take you to the tweet. But tapping on a favourite or retweet will take you to the user profile of the person who performed that action, rather than the tweet to which it applies. That makes for an inconsistent and rather strange experience, for me at least.

Tuesday, October 6, 2015 [Tweets]

Developing With 3D Touch

Nick Keppol:

3D Touch also grew from constraints. Since it only works on the iPhone 6s and 6s Plus, Apple had to implement the feature in a way that adds value for those with the new devices, while not denying important actions from everyone else. This result is shortcuts—a new layer on top of an existing UI.


3D Touch on iOS 9 is well thought out and makes sense. For me, it takes this hardware feature from being a bit of a frustrating gimmick to something that has a great potential to provide a richer experience with well designed software. If Apple sticks with this shortcut layered approach I think 3D Touch with likely become one of those invisible features you’ll wonder how you ever lived without.

Ryan Nystrom:

Along with the new hardware, Apple added three APIs that let developers add another dimension of interaction to their apps. Quick Actions let you select up to four context menu items from your app’s icon. Another feature lets you “Peek” into content and then “Pop” deeper into it. The last API gives developers details about the depth of a UITouch with force and maximumPossibleForce.


The activity feed in Instagram contains both username tags and thumbnails that we wanted to peek. Each of the UIViewControllerPreviewingDelegate objects we built for profiles and media were built specifically for those views. We had to somehow combine the work being done in both delegates.


In some cases, when displaying a profile peek, we don’t have all the data we need in order to show latests photos or follower counts in the peek. Peek view controllers still receive viewDidLoad, viewWillAppear:, and other UIViewController events that we use to fetch network resources and update the view.

Dal Rupnik:

We’ve known about AVFoundation vibrate API’s for a while and they are still valid, but they do not interact with the Taptic Engine directly and only allow you to “play” vibrations. As Apple has demonstrated on iPhone 6s presentation, the Taptic Engine can create a much more subtle and elegant vibration, so we are mostly looking to reproduce that behaviour instead of using the normal vibrations.

Sadly, as it turns out that there is no public API to do this in iOS 9 and iOS 9.1 (but never say never).


Using private API’s may cause your application to be rejected on the App Store and should not be used in production, as it might change in the future. This post is a small research, because I am interested in how things work, not to get around Apple’s rules.

Monday, October 5, 2015 [Tweets]

What the Heck Is a Monad

Soroush Khanlou:

This is the first important part of a monad. You have to have a way to create one. In this case, the constructor, Maybe.Something, fills that role. In other languages, this is known as unit or the inconveniently-named function return. It’s a function that takes one parameter, and returns a monad that wraps that parameter.


It’s important that the block returns an already-wrapped monad, so that we can chain these calls. This is a big part of why monads are useful.


Functional programmers took a great name like ifSomething and made it totally inscrutable by calling it flatMap. (In some of the literature, it’s also known as bind. In Haskell, aka peak inscrutability, it’s invoked with the operator >>=.)


To build map, we wrap the result of the map block with the constructor and send that to flatMap:


For something to be monad, in addition to implementing bind and unit, it has to follow some special rules.

Previously: Functor and Monad in Swift, Higher Order Functions in Swift 2.

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

Re: monads, I point people at this article when they want to tackle the hilariously compact yet accurate “monoid in the category of endofunctors” definition. Unpacks the jargon, but does use Haskell syntax.

Sunday, October 4, 2015 [Tweets]

Apps Removed From the App Store’s “Purchased” Tab

Peter Cohen:

iPhoto and Aperture were both discontinued earlier this year when Apple released Photos for OS X Yosemite. While Apple no longer sells the apps, it continued to make them available for download for users who had bought them. At some recent point, those links — in Mac App Store users’ Purchased list — disappeared.

Husain Sumra:

The disappearance of the ability to re-download older software irked users, with some calling the action “user hostile.” It’s unclear if Apple pulled the software intentionally or whether the Mac App Store experienced a temporary bug in advance of the availability of OS X El Capitan. However, the software was unavailable for several days before returning tonight.


As noted by several readers, some discontinued software including Logic Pro 9 and older versions of OS X Server remain unavailable for re-download from the Purchased tab.

This was not limited to Apple apps. Panic’s Coda, as well as their Prompt app for iOS, were also removed (but now seem to be back).

Update (2015-10-07): Eli Hodapp (via Paul Haddad):

If you’ve been following the drama over the last week or so surrounding classic premium games vanishing from App Store purchase histories, strap in for the equally disappointing and baffling conclusion to it all: According to Apple, apps that are no longer for sale on the App Store also will not be available to download again in your App Store purchase history. I’m really just sort of at a loss as to what to even say about all this anymore. Originally it seemed like it was easy to assume big publishers were pulling things they didn’t want to support, particularly with the erie silence from them. When those same developers finally formulated a response and were just as confused as we were, things got interesting. Never in a million years would I ever have thought this was an unannounced policy change direct from Apple, but, here we are.

It’s particularly puzzling, as for years now Apple has been championing the wonders of iCloud backups. I’d go as far as to say most iOS users, at least the ones I know, don’t sync anything to iTunes anymore, as there hasn’t been any real reason to since iOS 5. […] With this recent Apple policy change, you can no longer trust iCloud as a backup method as your apps will only exist for re-download as long as they’re available for sale on the App Store. If an app gets removed now, and also purged from your purchase history, if you’re not backing up locally via iTunes you’re out of luck and Apple’s response is to go pound sand.

Update (2015-10-07): Eli Hodapp:

We fired off a cursory email to Apple, but felt confident publishing this as both historically Pocket Gamer writes stories based on good sources and in nearly a decade of working with Apple, everyone gets the same response. Apple’s PR is a well oiled machine with two settings: No response (or a “No comment”) or the response. I just got off the phone with Apple’s US PR who have assured me there has been no policy change, and they’re in the process of getting an official statement approved which will be released today.

Update (2015-10-08): Rene Ritchie:

It was a bug, Apple fixed it, and purchase histories were restored. Now a similar bug has been fixed on the iOS App Store, and purchase histories there are also being restored.

Safari’s Responsive Design Mode

Kirk McElhearn:

You can view the web page easily as it displays on a range of iOS devices, as well as other browser resolutions, by clicking the icons above the page display. You can also choose the user agent (which web browser is being emulated), and choose to view your assets in 1x, 2x, or 3x.

This sounded great, but I thought it would actually preview what the page looks like on the various devices, and it doesn’t do that. Rather than show the page as the selected device would display it, it seems to just force the page to the given device width, ignoring any viewport that you’ve set. In other words, it’s like it always uses width=device-width even if that’s not what your HTML says.

Even then, the display doesn’t always match what I see on my iPhone. For example, on the September archive page the Mac shows the gray box for the date at full width (with a slight margin on either side), but the actual iPhone 6s shows a large (and undesirable) margin on the right side of the entire page.

See also WWDC 2015 session 505 (video, PDF).

Update (2015-10-04): @chucker pointed out the source of the margin problem, and I fixed it by setting code and heading tags to word-wrap: break-word when the width is narrow. The iOS simulator is more accurate at previewing.

Update (2015-10-06): Casey Liss notes that you can click on the iOS device icons to preview different rotations and multitasking modes.

Update (2015-10-08): Dr. Drang:

Not exactly a faithful representation. And it’s no better in landscape.

Apple’s 30% App Store Fee on Refunds

Johannes Erschbamer:

Nice, Apple now subtracts only the developer proceeds on refunds. Previously this included Apple’s cut, which meant a loss on every refund!

Johannes Erschbamer:

Previously I made a small loss on every refund. The one from yesterday was exactly the amount I got before.

It sounds like Apple still reserves the right to keep all of its fee, but that it is no longer actually doing so. In 2009, Rene Ritchie was unable to find any cases where Apple wasn’t eating the fee. But I’ve definitely heard of developers saying that they’ve had to pay it.

Deprecating Instapaper Mobilizer


Instapaper Mobilizer has been a popular way for individuals and third-party applications to use the Instapaper parser without needing API access or an Instapaper account. However, since the mobilizer is completely separate from the core Instapaper service, does not add any value for our customers, and costs money to operate, the team feels it is best to discontinue the service after December 1st.

That’s certainly understandable, but it’s too bad because I haven’t seen anything else that was as good. It would be nice if paying customers could still use it. Looks like I’ll need to find another processing tool to offer in EagleFiler.

Alex King, RIP

I was saddened to hear of the passing of longtime WordPress developer and blog friend Alex King.

Matt Mullenweg:

Alex had a background as a designer before he learned development, and I think that really came through as he was one of those rare people who thought about the design and usability of his code, the opposite of most development that drifts toward entropy and complexity. One of my favorite things about Alex was how darn tasteful he was. He would think about every aspect of something he built, every place someone could click, every path they could go down, and gave a thoughtfulness to these paths that I still admire and envy today.


Alex believed so deeply in open source, and was one of the few people from a design background who did. (Every time you see the share icon on the web or in Android you should think of him.) I like the idea that part of his work will continue in software for decades to come, but I’d rather have him here, thinking outside the box and challenging us to do better, to be more obvious, and work harder for our users.

See also:

Friday, September 25, 2015 [Tweets]


Facebook (via Peter Steinberger):

The original use-case for FBSimulatorControl was to boot Simulators to run End-to-End tests with WebDriverAgent. As FBSimulatorControl is a Mac OS X framework, it can be linked to from inside any Mac OS Library, Application, or xctest target. There may be additional use-cases that you may find beyond UI Test Automation.

FBSimulatorControl works by linking with the private DVTFoundation, CoreSimulator and DVTiPhoneSimulatorRemoteClient frameworks that are present inside the Xcode bundle. Doing this allows FBSimulatorControl to talk directly to the same APIs that Xcode and simctl do. This, combined with launching the Simulator binaries directly, means that multiple Simulators can be launched simultaneously. Test targets can be made that don’t depend on any Application targets, or that launch multiple Application targets. This enables running against pre-built and archived Application binaries, rather than a binary that is built by a Test Target.

Swizzling With Swift

Sash Zats:

Another issue I’ve yet to mention is how to call the original implementation. In this case, I had no desire to figure out how to re-implement the function, so we have to call the original implementation, and retain the returning object on top. This is a problem with Swift 1.2: you cannot call C functions just through their pointer. To be clear, you can call C functions from Swift, but you cannot obtain pointers to functions using other tools and call the function through its pointer like you would do in Objective-C.

As a result, this part has to be implemented in Objective-C. I am not proud about it, but that’s what we have to do for now.

Swift 2 does support calling C function pointers.

DirectLinks Safari Extension

John Gruber (tweet):

If you’ve ever tried dragging-and-dropping a URL from Google search results and getting a Google redirection URL instead of the actual URL you wanted (and Google’s JavaScript will show the actual URL in the status field if you hover over the link, so it’s impossible to tell that’s what’s going to happen), this extension is for you. There are obvious privacy benefits as well.

Using Xcode Targets

Sam Marshall:

Source files must be added to all the framework targets by hand, same goes for any new files you add. Since this is very easy to miss doing from the new file dialog, it is generally discouraged to add the same file to multiple targets (if what the targets are building are not significantly different). You not only have to maintain the code for the frameworks individually, but also all the build settings for them. This plus adding tests for all the targets quickly becomes an unreasonable goal to set for any development team without breaking all the frameworks into separate entities -- and away from a singular code-base.


While changing anything in a working build system is a risk, there are some big benefits you get for using xcconfig files instead of build settings stored on the project file.


A scheme can specify a single build configuration to be used for multiple targets. This means that instead of having schemes for each framework and then each application target, you can have a single scheme that tells a single framework target to be built using a specific configuration and associated xcconfig file (you can set this up to be able to change the requirements of building based on target OS, so a single target could build for iOS, Mac, watchOS, and tvOS) before building the application target. Doing this means cutting the footprint of your code down significantly as well as removing the complexity of managing multiple targets.

Which iOS Content Blocker is the Fastest?

Ben Brooks:

When I tried with all blockers on, I did not get the performance of the fastest blocker, and instead got performance on the slower side of the blockers tested. It is my recommendation that you only use one blocker at a time.


As you can see, 1Blocker is the winner. It was (on average) 61.83% faster than having nothing turned on at all. That’s staggering. The worst of the lot seems to be Vivio, which was marginally faster than simply just turning on ‘Do Not Track’ in your browser settings.

1Blocker is also highly configurable as well. If you want something on the simple end of things, which makes decisions for you to unblock ads from places like The Deck, Adamant is a great option. It was the third fastest overall, and is trying to support the indie sites ad revenue the best it can.

iOS 9 Adds Wi-Fi Assist

Casey Liss:

Wi-Fi Assist allows for your phone to more aggressively fall back to using its onboard cellular connection in case the Wi-Fi it is connected to doesn’t respond in a timely fashion. While dangerous for some with small data plans, for those with some breathing room, this is a fantastic addition.

Update (2015-10-04): Mark Pygas:

If you’re on a limited data plan, that’s bad news.


That's helpful if you're in the middle of watching a video or some other task on the internet that you don't want interrupted by spotty Wi-Fi service. Unfortunately, Wi-Fi Assist is enabled by default, which means that users may exceed their data cap without knowing it because their phone is silently switching their data connection from Wi-Fi to cellular.

Thursday, September 24, 2015 [Tweets]

Rosyna Needs Help

Rosyna Keller:

I’ve only got a total of $0.06 left to my name and I only have a room here until 11am (Phoenix) on Thursday, September 24th, 2015. I have no idea what to do, I’m broke, and I’m hiding from extremely abusive family.

Dave DeLong:

If you can spare anything, @rosyna’s PayPal is

Brent Simmons:

A necessary mark of a good community is that we help people who need help. Rosyna needs help.


Rosyna Keller, this guy I’ve seen around for years, from back in the day where Unsanity and Haxies and the Cocoa-Carbon wars were a thing, uses [a pseudonym] of necessity. He’s on the run and the subject of extreme misfortune and hardship that makes me feel really titchy about my own problems.

Rosyna is an enigma. I don’t really know who he is or what he’s been up to since the haxie days. But I do know that he’s long been a important part of our community, figuring out how things work, locating bugs, and making insightful comments.

Update (2015-09-24): Edward Marczak:

Know it or not, you’ve used @rosyna’s software in some form.

Gwynne Raskind (tweet):

In short, while Rosyna can’t be said to be solely responsible for my career, his work was a major factor in making what I’ve accomplished so far possible.


I learned in that time that it wasn’t just Unsanity that Rosyna was known for. He is a diligent researcher, a person of great insight into the workings of these machines. He has solved problems no one else could. He has helped any number of fellow developers and fellow people when he could, and with more patience and compassion than some of the most famous minds of our generation.

Swift 2.1

Russ Bishop:

If you thought Apple was slowing down with Swift, think again. Xcode 7.1 Beta 2 includes Swift 2.1. As always you can check the release notes for yourself because I don’t necessarily address everything here.


If only private things are modified in a file then it does not trigger recompilation of all files that depend on it. In some cases this can have a huge performance benefit


Function/closure types now have covariance and contravariance.

Swift 2 Bloat in the Twitter App

Nolan O’Brien:

Twitter app sizes:
w/ Swift 1.2 = 65MB
w/ Swift 2.0 = 125 MB
Thinned w/ Swift 2 = 77 MB

Epiphany: App thinning counters Swift 2.0 bloat

It’s not clear to me why this is happening, but it sounds like both the Swift libraries and the compiled code for the app itself are larger than before.

It seems entirely possible that overall system performance would decrease if more apps used Swift. The binaries are larger, so they’ll take up more storage space and RAM. They’re calling back and forth to Objective-C a lot, so they won’t see many benefits from pure Swift not doing message sending, and they may incur extra overhead due to bridging. Writing the code may be faster, though.

Update (2015-09-24): Apple:

App slicing is currently unavailable for iOS 9 apps due to an issue affecting iCloud backups created from iOS 9 where some apps from the App Store would only restore to the same model of iOS device.

When a customer downloads your iOS 9 app, they will get the Universal version of your app, rather than the variant specific for their device type.

The iOS Status Bar

The Status Bar is a Tumblr blog of screenshots showing buggy iOS status bars (via Cédric Luthi). An iOS app should properly handle different sizes, rotation, transparency, and more.

Custom Swift Pattern Matching Operators

Ole Begemann:

We know that greaterThan(0) must produce a function that takes a value and returns Bool. So in turn, greaterThan must be a function that takes another value and returns the first function.


Swift provides a special syntax for the definition of curried functions that mimics how they are called.


It’s impossible with this solution to give the compiler any hints for exhaustiveness checking, so it will always force us to provide a default case. If you are certain that your patterns cover every possible value, it is a good idea to put a fatalError() call into the default case to document your expectation that this code path should never get hit.


Again, note that the missing whitespace between operators and operands is significant.


As a more practical example, suppose you want to check a string against several prefixes and suffixes.

Counting Git Objects With Bitmap Indexes

Vicent Martí:

The result is a highly dense forest of interlinked nodes stored in the shape of a graph, but essentially accessed as a key-value store (each object in the database is only indexed by the SHA1 of its contents).


Git doesn’t keep a definite list of all objects reachable from the graph, and it cannot send every single object in its database as a whole, because it could very well be that some of those objects are not reachable at all in the repository and should be thrown away instead of sent to the client. The only thing Git knows are the tips of all branches, so its only option is to walk down the graph, all the way to the beginning of the history, listing every single object that needs to be sent.


Generally speaking, caching specific results to queries is a weak approach to performance in complex systems. What you want to do instead is caching intermediate steps of the computation, to be able to efficiently answer any kind of query.


For any given commit, its bitmap index marks all the objects that can be reached from it. To find the objects that can be reached from a commit, we simply look up its bitmap and check the marked bits on it; the graph doesn’t need to be traversed anymore, and an operation that used to take several minutes of CPU time (loading and traversing every single object in the graph) now takes less than 3ms.


When Git noticed that none of the objects on the list could be sent because they were delta’ed against other objects that were not in the list, it was forced to re-delta these objects. […] This is how we were losing all the benefits of our optimization, and in fact making the process of generating a packfile 40% slower than it was before, despite the fact that the most expensive phase of the process was essentially optimized away.

Apple Music for Android

Russell Ivanovic:

Remember back in June when Apple promised to bring their music app to Android in September? No? I do, because I was sitting in the keynote room at the time. My prevailing thought at the time was a simple one: “This is going to be fascinating. Will Apple try to clone their iOS app, or embrace Material Design, rise above pettiness and make something amazing?”.


I don’t know how much of an indication it gives you, but here’s their first ever Android app, released today […] It’s a poor attempt at making an Android app look like an iOS app. If you’re being generous, you might think Apple did this to make you more comfortable about moving to iOS.

Russell Ivanovic:

Apple Music on Android has the potential to be the best music app Apple has ever made.


They won’t be burdened by any legacy implementation: they could literally build it from scratch, with all the lessons they’ve learnt to date.

They don’t have the burden of having to play your local music like the iOS app, it could be a dedicated app for Apple sourced music only.

They can update the app as often as they want, iterating on things fast, since unlike iOS it’s not tied to OS releases.

Wednesday, September 23, 2015 [Tweets]

iPhones 6s Reviews

John Gruber:

For a typical iPhone user on a two-year upgrade cycle, I think the S years are the better phones, historically.


In terms of single-core performance, there isn’t a single Android phone that beats the two-year-old iPhone 5S. Android devices fare better in multi-core benchmarks, because they have more cores (some have eight, many have four — the iPhones 6S still have only two cores), but single-core performance is a better measure for the sort of things you can feel while using a device. Apple is literally years ahead of the industry.


The new iPhone 6S beats the new MacBook in single-core performance on Geekbench, and is within spitting distance in multi-core. That’s astounding.


Press on the keyboard and it turns into a trackpad. iPads running iOS 9 can trigger this trackpad mode, too, with a two-finger swipe on the keyboard. Doing it with a single finger on the iPhone, though, is a tremendous boon to text editing. This might be the single best new feature for text editing on the iPhone since the addition of selection and Copy/Paste in iOS 3 in 2009. In addition to moving the insertion point around, you can press again and switch to selection mode — like double-clicking the mouse button on a Mac. Trackpad mode is a once-you’ve-used-it-you-can’t-go-back addition to iOS.


The new taptic engine in the 6S feels as good or better than the old iPhone 4S vibrator. It’s just stronger and more pleasing.


Technically, the way it seems to work is that the iPhone creates two files: a 12 MP JPEG (exactly the same as when you shoot a still image with Live Photo disabled), and a three-second-long MOV file. When looked at through Image Capture on a Mac running OS X 10.10.x, you see both files in the iPhone camera roll: “IMG_1234.JPG” and “IMG_1234.MOV”. Both files have same numeric index after the “IMG_” prefix, and both files have the same creation date. The MOV file is 1440 × 1080 pixels, at 12.77 frames-per-second.


I understand the physics and optics involved, but it bothers me every single day that I can feel that nubbin. The best argument for forgiving the camera bump is that a vast majority of iPhone owners use a case of some sort, and with a case, the camera bump is a non-issue. But for those of us who don’t use cases, and who appreciate Apple’s general attention to every little detail, it’s a very minor but daily irritation.


The biggest thing keeping me from using this case for real, going forward, is that the raised edge along the side of the display gets in the way of performing edge-based gestures, primarily swiping to go back, and the new press-and-swipe to switch between apps with 3D Touch.

David Pogue:

There’s a new processor in the iPhone 6s family; Apple says it’s “up to 70 percent” faster. If you operate an iPhone 6 side-by-side with an iPhone 6s, the difference hits you between the eyes. Opening apps, switching apps, processing things—it all happens faster on the 6s. (You can see this side-by-side comparison in my video, above.)

The fingerprint reader is twice as fast now, too. If you’ve set up your phone to require unlocking every time you use it, you may come to cherish this feature most of all. When you press the Home button, the screen lights up so fast, you wonder if any authentication process took place at all. (It did.)

Apple also says that it has tuned both its Wi-Fi and its cellular (LTE) antennas to make them faster. This, too, is screamingly obvious when you call up Web sites side-by-side on the old and new phones. Who doesn’t like faster Internet?


At the outset, you’ll probably get tripped up when you try to rearrange icons on your Home screens. To do that, you may recall, you’re supposed to long-press an icon; for most people, that’s too similar to hard-pressing one. At first, you’ll keep getting the shortcut menu when you meant to enter icon-rearranging mode.


Ordinarily, you switch apps by double-pressing your Home button. But 3D Touch also offers a second way: Swipe in from the left edge of the screen while pressing hard.

At that point, you actually have three features at your disposal[…]


I’ve been taking lots of pictures in lots of lighting situations with the iPhone 6 and 6s side-by-side, and I can’t tell any difference. Can you?


This whole 3-second video business isn’t new. HTC’s version, back in 2013, was called Zoe; Nokia’s, last year, was called Living Images. Pocket cameras like the Nikon One have a dedicated button just for capturing them.

Matthew Panzarino:

Pressing lightly to ‘peek’ and pushing hard to ‘pop’ it into existence provides an escape hatch that eases your mind, and a new iOS 9 affordance injects a ‘back’ button at the top-left corner of any screen you jump to. iOS 9’s new task manager, accessed by a firm press on the edge of the screen (or the standard double-tap of the home button) is also arranged in a much more contextually rich card format — a timeline of your jumping around through apps.


As a tip, there is a setting inside Settings>General>Accessibility that will allow you to adjust the sensitivity thresholds of 3D Touch. This was doubtless to help people with motor skills or grip-strength issues use the feature. But I found that because I jump between apps and use my iPhone pretty ferociously, I wanted the actions to happen quicker (with a lighter press), so I turned it all the way up to its ‘most sensitive’ setting. Play with this if you have trouble triggering it or do it too much.


Live Photos are not really a new format. The images, which are accompanied by 3 seconds of video (split before and after your shot) are stored as a .jpg file on your iPhone. The video is a .mov file containing 45 frames that play back at around 15fps when you press and hold on an image. The whole package takes up roughly the space of two regular 12 megapixel images.


I was incredibly impressed by the differences in camera quality between the iPhone 6 Plus and the iPhone 6s Plus. It’s very, very noticeable and very welcome. The images aren’t over-sharpened because they don’t need to be — the detail is already there. The shots I took at night are pleasantly grainy, not so noise-reduced that they’re muddy blobby messes. The stabilization in the iPhone 6s Plus is still a very good reason for iPhone photographers to upgrade over the iPhone 6s — though both have ‘cinematic’ stabilization done in software.


Apple says its new Touch ID sensor is twice the speed of the one in the iPhone 6/6 Plus. I’m sure someone will try to measure it, but I think this one metric is enough: The new fingerprint sensor is so fast that you can no longer tap the home button to wake your screen, because it will unlock instantly.

See also: see the lists from iMore and Jason Snell.


Zoltan Szabadka:

While Zopfli is Deflate-compatible, Brotli is a whole new data format. This new format allows us to get 20–26% higher compression ratios over Zopfli. In our study ‘Comparison of Brotli, Deflate, Zopfli, LZMA, LZHAM and Bzip2 Compression Algorithms’ we show that Brotli is roughly as fast as zlib’s Deflate implementation. At the same time, it compresses slightly more densely than LZMA and bzip2 on the Canterbury corpus. The higher data density is achieved by a 2nd order context modeling, re-use of entropy codes, larger memory window of past data and joint distribution codes. Just like Zopfli, the new algorithm is named after Swiss bakery products. Brötli means ‘small bread’ in Swiss German.

Previously: Zopfli, Apple’s new Compression library and LZFSE.

San Francisco Quotation Marks

Dr. Drang:

Given the overall look of San Francisco—and especially its commas—Gruber thought Verdana-style block quotation marks looked better. By the Apple Event on September 9, it was apparent that Apple agreed with him: San Francisco’s quotes are right again in the build of iOS 9 on the hands-on demo units.

A significant difference, though, is that while the early versions of San Francisco’s opening quotes were slanted down and to the right (like Verdana’s), the final versions are slanted down and to the left, just like its closing quotes. The only difference now between San Francisco’s opening and closing quotation marks is the tapering. The ticks of the opening quotes are fatter on the bottom, while the closing ticks are fatter on the top.

Update (2015-10-04): Khoi Vinh:

Of course, having such similar shapes for these glyphs can be a valid aesthetic choice for certain typefaces intended for certain kinds of usages. It just seems odd to me that San Francisco, which was custom designed for maximum legibility on digital devices, made this particular choice.

Akinori Machino (comments):

You can see the low legibility of Helvetica if you type texts in a small size and make them blur. Some texts become blended and hard to decipher.


This difference gives texts in SF Compact more margins between letters, resulting in high legibility in small devices like Apple Watch.

In addition, SF and SF Compact fonts are divided into two sub font families named “Text” and “Display”. This is what Apple calls “Optical Sizes”. The Text fonts are for smaller texts, and the Display fonts for bigger.

The Big Nerd Ranch Core Data Stack

Robert Edwards notes that the Nested Managed Object Context Pattern has some cons:

  • Slower than Shared Persistent Store Coordinator Pattern when inserting large data sets
  • awakeFromInsert being called on NSManagedObject subclasses for each context in the parent chain
  • Merge policies only apply to a context saving to a store and not to its parent context


Since saving an NSManagedObjectContext will only propagate changes up a single level to the parentContext, the Big Nerd Ranch Core Data Stack listens for save notifications and ensures that the changes get persisted all the way up the chain to your store.

You may sometimes need to perform large import operations where the nested context performance would be the bottleneck. For that, we’ve included a function to vend you a managed object context with its own stack newBatchOperationContext(setupCallback: CoreDataStackBatchMOCCallback). This follows the pattern outlined in Shared Store Stack Pattern.

Tuesday, September 22, 2015 [Tweets]

The Lost Apple Logos You’ve Never Seen

TheBrainFever (via John Gruber):

The way to tell it from other rainbow Apple logos is that the green top is a little thinner than it should be, and the “chin” (if you imagine the apple bite as a mouth) is a little fat.


From what I can tell, this was the first “public” version of the logo, used on initial print materials. The next version of the logo, the classic rainbow logo, was used for the computer badges, but remained in some print production materials.


I always called that typeface the “stormtrooper” font when I was a kid. I was bit deflated later on when I learned it’s real name was Motter Tektura.