Archive for October 2015

Wednesday, October 28, 2015

When Open Does Not Return an Object Reference

Mark Alldritt:

The code below shows one way of working around the problem of the Open command not returning a reference to the newly opened document. I use the Preview application in my code, but this technique works equally well with other application which fail to return a document reference from their Open commands. This technique fails if the file is already open.

One of the main frustrations with AppleScript is that sometimes things like this that should be easy end up requiring a big chunk of copy and pasted code.

When Is Zip Not Zip?

Scott Gruby:

There are various flavors of zip, libraries that do zip, and other tools that zip. In one of our tools, we were using a zip library. It appears that Apple made a change in iOS 9.0.2 or 9.1 that caused applications created by our tool to not install on devices. However, the problem was only present if the app was installed over the air or through iTunes; installed through Xcode’s Devices window succeeded. After an arduous day of debugging trying to determine the failure point (provisioning is usually to blame for failures and they can be super frustrating), I switched our tool to use the command line zip (/usr/bin/zip) and amazingly the problem went away.

Inside Apple’s Perfectionism Machine

Lance Ulanoff interviews Phil Schiller:

Some like to call it the “Speaktenna.” The black strip along the back edge of the MacBook speakers is a never-before-tried combination of speakers and antennas for Wi-Fi and Bluetooth. It’s a fairly ingenious bit of space-saving technology that teardown artists ignored.

[…]

“The most common scenario is simply that what we got from a supplier basically has been created so uniquely for Apple that implying it’s an off-the-shelf part like others may get would be really misleading,” Schiller said. “So it’s best not to even talk about the source because that implies things that aren’t true.”

[…]

This battery design, spread over six separate pieces connected by flexible wire, is all Apple. Each module has layers of varying sizes, so as the space narrows in the chassis, the battery shape can, too.

[…]

“There are endless numbers of stats out there, you can quote any of them to tell any story, but the number that closest reflects what we all experience and see as we travel around is actually a U.S. market share approaching 25 percent,” he said. “That closer reflects what we see when we go to the airport, when we go to the coffee shop, when we go to schools. You increasingly are seeing more Macs than PCs.”

[…]

He also rejects the idea that there’s a growing market for hybrids, or, to be more specific, laptops with touch screens that also happen to be tablets.

Tuesday, October 27, 2015

Blind Camera Shootout

Nirave Gondhia (via John Gruber):

If you’ve been following the homepage over the past week, you’ll have seen we published a big blind smartphone camera shootout to find out how the new Sony Xperia Z5 camera compares to the iPhone 6S, Galaxy Note 5 and the LG G4.

[…]

It turned out to be quite a close-run race between the iPhone 6S and the Galaxy Note 5 for the title but Apple’s latest just beat Samsung’s latest with 38.2 and 34.1 percent of the 7810 votes respectively.

It’s more fair to test the automatic modes, but it looks like some of these photos would have been improved if the photographer had touched to adjust the lighting based on a certain part of the image.

Unicode Date Formats, YYYY?!

Peter Hosey (comments):

YYYY and yyyy are Unicode date format patterns. These offer quite a bit more flexibility than the old str[fp]time(3) formats, particularly in choosing different representations of the same value (e.g., “September” vs “Sep” vs “09” vs “9”).

  • YYYY is defined as the “year for week-of-year”: that is, the year for ISO week dates.
  • yyyy is defined as the calendar year.

You probably want the latter.

Update (2018-12-27): See also: Dave DeLong and Erica Sadun.

Reactions to the First iPod

This 2001 MacRumors thread from Apple’s original iPod announcement has been making the rounds.

elitemacor:

I’d call it the Cube 2.0 as it wont sell, and be killed off in a short time…and it’s not really functional.

Uuhh Steve, can I have a PDA now?

sjestus:

I think it’s revolutionary.

Come on everyone, y’all are saying it sucks before you have even held it in your hand. I mean 5GB in a little tiny thing like that, it’s amazing. I don’t see anyone else making something like that. Do you?

See also: Macworld.

Siri and Content Reminders in iOS 9

Josh Centers:

But you may not have known that in iOS 9, Siri can remind you to act upon content in certain apps, if you use the magic word “this” to indicate “what I’m looking at right now.” I wrote about this capability in “iOS 9: A Take Control Crash Course,” but it wasn’t until I went on vacation recently that I appreciated just how helpful this feature is.

[…]

Note that Siri can’t create reminders for Web pages viewed in a Safari View Controller, such as the one in Tweetbot. You’ll have to tap the Safari button to open the Web page in Safari, and then bring up Siri. However, Siri can remind you of Web pages viewed in Safari in Slide Over on an iPad.

Riccardo Mori:

Siri’s fuzziness, as an interface, is unacceptable. Siri’s raison d’être is assisting, is being helpful. And indeed, Siri is the kind of interface where, when everything works, there’s a complete lack of friction. But when it does not work, the amount of friction involved rapidly increases: you have to repeat or rephrase the whole request (sometimes more than once), or take the device and correct the written transcription. Both actions are tedious — and defeat the purpose. It’s like having a flesh-and-bone assistant with hearing problems. Furthermore, whatever you do to correct Siri, you’re never quite sure whether your correcting action will have an impact on similar interactions in the future (it doesn’t seem to have one, from my experience). Then, there’s always what I usually consider the crux of the matter when interacting with Siri: the moment my voice request is misunderstood, it’s typically faster for me to carry out the action myself via the device’s Multi-touch interface, rather than repeat or rephrase the request and hope for the best.

The iPhone 6s Plus and 3D Touch

Federico Viticci:

Peek and pop have turned out to be another argument in favor of the 6s Plus for me. With a bigger phone, peek previews are also bigger, allowing me to preview content at a larger size while avoiding the need for Reachability to navigate with ‘back’ buttons at the top of the screen. Before getting the 6s Plus, I used the 6s for a week, and the difference between peeks on the two is noticeable. Peeks on the 6s Plus are comparable in size to an iPhone 6 screen inside the device, which is a comfortable size for a preview; on the 6s, a peek feels like an iPhone 5s-like card – too tiny for my taste.

[…]

I can’t help but wonder what happens when app content becomes previewable with 3D Touch even if that app isn’t in the foreground. When you’re in Messages and you preview a link, an instance of Safari is called by 3D Touch to preview a webpage inside Messages. With iOS 9, Apple has introduced a new deep-linking framework to match web links with native app content, which is already supported by apps like Twitter and Dropbox. What if an app’s native view could be summoned with 3D Touch by peeking at a Universal Link? What if you could, say, peek at a tweet with the native Twitter app when in Safari, or peek and pop a Dropbox file from Slack? If you consider all the pieces that Apple has laid out over the years (the secure app sandbox, Universal Links, extensions, the back button), iOS’ deep-linking puzzle could come together quite nicely under 3D Touch.

He says last year’s iPhone 6 Plus speed problems have been fixed.

Monday, October 26, 2015

The Best Underutilized and Poorly Implemented Accessibility Feature

Scott Gruby:

iOS 7 brought a feature called dynamic type which moves away from developers specifying exact point sizes for text and instead uses a number of descriptions for fonts.

[…]

The next example is in Calendar. This one is worse than the first because the row is a fixed height and it looks like each row of text is also a fixed height so that when a larger font is used, it looks awful.

For a company that pays so much attention to accessibility, these examples show that individual teams making the apps aren’t doing enough to look at their apps. Maybe all the engineers have great eyes and can see the text, but this does need to get fixed.

Dynamic Frameworks and App Launch Times

Peter Steinberger links to this discussion started by Eloy Durán. This gist of it is that dynamic linking can really slow down launches, especially before the cache is filled.

Apple DTS:

Beyond that, there is nothing more I can do for you at this time to make framework loading go faster. You can follow up on your bug report on bugreport.apple.com if you wish to know its status.

Javier Soto:

An app I’m working on has no more than 10 frameworks, and I’m also seeing >3s launch time slow-downs caused by this, and I hoped that the DTS would result in some workaround.

Eloy Durán:

So it seems that static linkage is going to be the only pragmatic solution for the foreseeable future (dyld optimisations, if any, would probably take a while to make its way to us) and has been proven to work/allowed.

Sam Marshall:

Due to having no guaranteed stable ABI, it seems extremely unwise to even think of using static libraries for swift.

Perviously: iOS Needs Frameworks.

BookmarkData Exposed

Michael Lynn:

To wit: What are the .sfl files that are appearing in OS X 10.11 El Capitan? There sure are a lot of them!

[…]

But suddenly - more horrible implementation details: You can’t get the list of available keys!

Everywhere you search, everyone just recommends “try all the keys” or “try the keys you want values for”.

… But none of the keys Apple has documented return just the simple share URL. They apparently want you to only use URLByResolvingBookmarkData for that.

[…]

With the information this undocumented debug output provides, I was able to determine the entire structure of the BookmarkData format, which I’ll now document here.

Swift’s @noescape Attribute

Mateusz Matoszko:

While digging into release notes we can see a bunch of clever words:

A new @noescape attribute may be used on closure parameters to functions. This indicates that the parameter is only ever called (or passed as an @noescape parameter in a call), which means that it cannot outlive the lifetime of the call. This enables some minor performance optimizations, but more importantly disables the self. requirement in closure arguments.

Lets analyze those smart statements and put it into code so everyone can enjoy it[…]

The Story of NetNewsWire

Rebekah Wolf:

Still feeling that iCloud would be the best fit once it was fully functional, the product team shifted their focus to developing Kaleidoscope 2 while they waited for Apple to work out the issues.

“By the time we shipped Kaleidoscope 2, we had internal discord around whether or not it was worth working on NetNewsWire anymore,” says Pasco, detailing the ill-fated turn of events. “Bil [Moorehead, CTO], George [Dick, COO], and I were for it, and most of the business management team was strongly against it. This, with some major internal problems, resulted in us focusing on client work and shelving product for a while.”

It’s a shame that the whole product was put on hold for a feature that some of us don’t care that much about.

Previously: NetNewsWire 4.0.

Friday, October 23, 2015

Dark Corners of Unicode

Lexy Munroe (via Ole Begemann):

This is a particularly aggravating problem because most programming languages have facilities for comparing and changing the case of text built in, and most of them are extremely naïve about it. You can’t even correctly change the case of English-looking text without knowing what locale it came from — the title-case of “istanbul” may actually be “İstanbul” depending on language, because of Turkish’s dotted “i”.

[…]

There’s a character called U+200D ZERO WIDTH JOINER, which is used to combine otherwise distinct characters in some languages (but has fairly general semantics). Apple has made creative use of this character to compose emoji together. The report on emoji has some examples. So now the length of some text is completely arbitrary, based on whatever arbitrary ligatures the font includes.

[…]

Arguably, 16-bit faux strings are worse than 8-bit faux strings. It becomes pretty obvious pretty quickly that 8 bits is not enough to fit more than some European alphabets, and anyone but the most sheltered programmer is forced to deal with it the first time they encounter an em dash. But 16 bits covers the entire BMP, which contains all current languages, some ancient languages, dingbats, mathematical symbols, and tons of punctuation. So if you have 16-bit faux strings, it’s very easy to think you have all of Unicode automatically handled and then be sorely mistaken.

See also Nicolas Seriot’s Unicode Hacks (via Cédric Luthi).

Clang Is the Next WebKit

Guy English:

Clang appears to be following the same path that WebKit has. Apple switched over to Clang years ago and the pace of development of Objective-C accelerated immediately. A few years ago Clang became the default compiler for FreeBSD, displacing GCC. In early May Microsoft announced that they’re Bringing Clang to Windows. According to The Register, Microsoft will have a release of Visual Studio that uses Clang as the front-end to their compiler in November.

So then the next question is whether Microsoft will feel the need to fork Clang, as Google did with WebKit.

Lisp Implemented in sed and Make

SedLisp (via Matthew Kane Parker, comments):

Though this Lisp implementation does not support eval function, we can implement eval on top of this interpreter - eval.l is the implementation.

MakeLisp (comments):

GNU make has two builtin functions, $(shell) and $(guile), which make the implementation less interesting. For example, GNU make lacks arithmetic operations, but you can easily add two numbers by $(shell expr 3 + 4) or $(guile (+ 3 4)). So, makelisp does not use either of them, except a single $(shell cat /dev/stdin) function call to make it easier for users to pass Lisp programs to makelisp.

Sorkin and Boyle’s “Steve Jobs”

John Gruber:

If you want to see a movie where Steve Wozniak is begging Steve Jobs to thank the Apple II engineering team on stage in 1998’s iMac introduction, and in which Jobs blames Woz for the Newton, go buy a ticket.

See also: Rick Tetzeli.

arqfs

Russ Cox (via Arq Backup):

This software reads backups written by Arq. It is not affiliated with or connected to Haystack Software.

[…]

Arqfs creates a virtual file system using the FUSE file system layer. On OS X, it requires OSXFUSE.

Here’s the archived code repository.

Thursday, October 22, 2015

Real-time Resizing of Flickr Images Using GPUs

Archie Russell:

The selection of sizes has grown semi-organically over the years, and all told, we serve eleven different resizes per photo which, in sum, use nearly as much storage as the original photo. Almost 90% of this storage is held in the handful of resizes 640px and larger, so we targeted our efforts at eliminating some of these sizes.

[…]

Instead we took on a pretty ambitious goal: maintain our largest resize, usually 2048px wide, as a source image and create any other moderate or large-sized resizes on-the-fly from this source, without sacrificing image quality or significantly affecting performance. Using the original uploaded photo as a resize source image was impractical, as these can be very large and exist in a variety of formats.

[…]

Our resize daemons transfer JPEGs from shared memory to GPU device memory. Once here, the real image processing takes place. The JPEGs are decoded, cropped, sharpened, resized, re-sharpened as needed, re-encoded as JPEGs, and finally transferred back to shared memory. From shared memory, our Apache module returns the resized JPEG to the caller.

[…]

With significant optimization, this code is able to resize our 2048px JPEGs to 1600px in under 16ms. This is more than 15x faster than GraphicsMagick and nearly 10x faster than Ymagine.

The 10 Best Feed Readers

Vicky Cassidy:

At their core, RSS reader apps let you subscribe to content from your favorite sites. Typically, they’ll download images and text from articles so you can read them offline, and will list all of the stories in chronological order. Many RSS apps then include tools to discover sites based on your favorite topics, and let you save favorite articles to reference later.

[…]

The beauty of hosted applications is that they’re easy to set up and use—simply sign up for the app and you’re ready to get started. The bad news is that you don’t own your data, and if the company decides to close up shop (like Google Reader did in 2013) you’ll have to start over again.

Currently, I’m using ReadKit and am happy with it except for the lack of AppleScript and share extension support—a common problem. I find that iOS is better for reading longer articles, and the Mac is much better for skimming and processing RSS feeds, so I haven’t used any of these iOS apps in years.

MVVM in Swift

Ash Furrow:

View models don’t have any access to the user interface. You should not even import UIKit in a view model. Typically, a view controller observes the view model somehow to know when there’s new data to display. This can be done through KVO or FRP.

[…]

My solution was to put the enum in the view model, and have the view model expose a signal defining which of the two layouts should be used. Based on the selected segment index, the view model decides which layout should be used and sends that value on a signal. The view controller is responsible for mapping that signal into a configured layout, then setting that layout on the collection view.

[…]

Defining these signals on a view model can be tricky. Swift initializers have strict rules around when properties are assigned. The signals need access to the internal state of the view model, so they need to be created after calling super.init(). However, we can’t call super.init() until all our properties have been assigned to, including the signal properties.

[…]

While writing tests, I found it difficult to subclass the existing view model (for stubbing purposes). Since the view model’s initializer has side-effects (starting recurring network requests), I can’t call super.init(). Instead, I made a ListingsViewModelType protocol. The view controller only interacts with the view model through this protocol – it has no reference to the class itself. Now creating a stubbed view model is as easy as conforming to a protocol.

GCD Sugar for Swift

Tobias Due Munk’s Async (via Swift Sandbox):

Async sugar looks like this:

Async.background {
    println("This is run on the background queue")
}.main {
    println("This is run on the main queue, after the previous block")
}

Instead of the familiar syntax for GCD:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), {
    println("This is run on the background queue")

    dispatch_async(dispatch_get_main_queue(), {
        println("This is run on the main queue, after the previous block")
    })
})

The way it work is by using the new notification API for GCD introduced in OS X 10.10 and iOS 8. Each chaining block is called when the previous queue has finished.

Update (2015-10-23): See also Run.

Searching Apple’s Stores With Google

Kirk McElhearn:

iTunes used to have a Power Search feature, but it has been removed from the iTunes app (though you can still access it this way). Power searching is really useful when you want to home in on something in the iTunes Store, App Store, or Mac App Store.

In the absence of a real power search, you can search another way: with Google. A Google search works because Apple has Web pages for all its iTunes Store content. With Google, you can search for more specific keywords and use quotes to search for specific phrases.

Wednesday, October 21, 2015

Turning Off iCloud Photo Library

I had thought I would leave iCloud Photo Library on, even though I use Lightroom rather than Photos. But there were several problems with that approach. Importing photos becomes confusing because Image Capture loses the ability to delete photos. There is a way to delete them from the phone, but freeing up space is a multi-step process. You can’t Select All and Delete in the Camera Roll, and even then the photos first move into Recently Deleted.

Another issue is that, although I like having recent photos in the cloud, there’s no way to prevent uploading them when I don’t have a good Internet connection. So it’s much simpler to just turn off iCloud Photo Library, foregoing the automatic cloud backup.

B2 Cloud Storage

Backblaze (comments):

Backblaze B2 Cloud Storage works similar to Amazon S3 or Microsoft Azure, allowing you to store unlimited data in the cloud. But does it for 1/4th the cost.

No word yet on whether Arq will work with it.

Venice (a.k.a. SwiftGo)

Paulo Faria (via iOS Dev Weekly):

Venice is a pure Swift/C library that provides CSP for Swift 2.

[…]

Venice is fast because the coroutines are light coroutines managed by libmill instead of threads managed by the OS. The Chinese Whispers example in the command line application shows how you can create up to 100.000 concurrent coroutines (tested in a 8 GB MacBook Pro early 2015).

That’s Communicating Sequential Processes (CSP), like in Go, rather than Continuation-Passing Style (CPS).

No Longer Good, Better, Best

Ben Lovejoy:

Many of us have expressed dismay at the fact that Apple still, in 2015, sells an iPhone with just 16GB of storage. Apple would, of course, argue its corner. […] I could go on, but the simple reality is that most of us need local storage, and trying to palm people off with 16GB is simply unreasonable. Apple is offering an iPhone which pretty much guarantees frustration down the line, and there’s absolutely no reason to do so when it could offer a 64GB starting point at the cost of a few bucks less profit.

[…]

And then we have the latest Retina iMacs, where Apple reduced the SSD component of the 1TB Fusion Drive from 128GB to a miserly 24GB. That’s less than the RAM available in some configurations. Effectively, Apple has swapped out a genuine fusion drive – one that really did combine the responsiveness of an SSD with the affordability of a hard drive – for one that is, at the very least, severely compromised. One that is unlikely to deliver the snappiness expected of SSD storage. One which, we might even say, can still be marketed as a fusion drive without genuinely delivering on the promise of the technology.

The 16 GB iPhone 6s is probably the best example. That’s just ridiculous for a new model of Apple’s flagship phone. A lot of people will buy it, not realizing the decision they’re making, and be unhappy down the road. It’s probably a lot more than a few bucks of extra profit, though, because a lot of other people will pay $100 to get the 64 GB iPhone, whereas they would have been happy with a 32 GB base model.

With the iMac, more surprising than the smaller Fusion Drive is that the base model doesn’t have any sort of Fusion Drive. It has a 5400 RPM notebook drive. I don’t think that offers a “Good” experience in 2015. That brand-new iMac is going to feel slow compared with an iOS device or even an old MacBook Air. And it’s likely that many customers won’t realize there’s a huge performance difference, so this won’t work as a tactic for upselling. They’ll just buy the base model.

Apple is currently celebrating all the advances since the original iMac, which retired the floppy drive. How many years until it retires the standalone spinning hard drive?

Prioritizing profits over product quality is short-term thinking. Will Apple keep doing things like this until there’s a decline in measured Customer Sat?

Previously: 16 GB.

Update (2015-10-21): Riccardo Mori:

I’ll reiterate: in a ‘base model’ iMac that costs €1,729 without any add-on, I’d expect at least the low-price 1 TB Fusion Drive option as the default, not old hard drive technology.

See also: Accidental Tech Podcast.

Benjamin Esham:

Apple’s iMac comparison didn’t mention that the first-generation one also came with a 5400 RPM drive.

That was a 3.5-inch drive, albeit one with higher data density.

Update (2015-10-26): See Accidental Tech Podcast.

When Businesses Grow to Become Dysfunctional

Matt Henderson:

It was at this point that it occurred to me how dysfunctional large organizations like Bank of America really are. I was thinking, “If anyone’s thinking about disrupting the finance industry, it’s definitely ripe!”

At the end of the call, when Bob asked if there were any other comments I’d like to provide, I mentioned that of all the financial institutions I deal with, Bank of America is one of the very few that have not implemented standard two-factor authentication, using apps like Google Authenticator or Authy.

Bob had never heard of two-factor authentication, and asked me to explain it so he could pass on the recommendation to the appropriate team. I have to say it just felt funny explaining to a representative of one of the world’s largest financial organizations what two-factor authentication is. “Yes, it’s spelled A-U-T-H-Y. Yes it’s an app. That’s right, for smartphones.”

Tuesday, October 20, 2015

How Both TCP and Ethernet Checksums Fail

Evan Jones (via Hacker News):

At Twitter, a team had a unusual failure where corrupt data ended up in memcache. The root cause appears to have been a switch that was corrupting packets. Most packets were being dropped and the throughput was much lower than normal, but some were still making it through. The hypothesis is that occasionally the corrupt packets had valid TCP and Ethernet checksums. One "lucky" packet stored corrupt data in memcache. Even after the switch was replaced, the errors continued until the cache was cleared.

I was very excited to hear about this error, because it is a real-world example of something I wrote about seven years ago: The TCP checksum is weak. However, the Ethernet CRC is strong, so how could a corrupt packet pass both checks? The answer is that the Ethernet CRC is recalculated by switches. If the switch corrupts the packet and it has the same TCP checksum, the hardware blindly recalculates a new, valid Ethernet CRC when it goes out.

Dropbox Paper

Nathan Ingraham (comments):

For now, Paper is a web-only app that you can access through your Dropbox account, although the company says it’ll have a mobile app ready to go when the product comes out of beta. At first glance, Paper’s UI is reminiscent of the scores of minimalist, lightweight text-editing apps that have come out in the past few years, such as IA Writer. But while IA Writer and its ilk are designed for solo composition, Paper is all about working together. As in Google Docs, multiple users can edit a document at the same time. Each is designated by a colored cursor, and the user’s full name is displayed in the margins, crediting their contributions to the file.

From a text perspective, Paper is quite basic; there’s only one font and three sizes available. You can do your basic bold, italics, underline and strikethrough formatting and format text into a block quote, but that’s about it. Dropbox specifically said that the purpose of Paper was to keep the focus on sharing ideas rather than formatting. In particular, the company made it so that you can use its app to share pretty much anything, regardless of what tools you might be using.

iOS Apps That Collect Users’ Personal Info

Dan Goodin:

The apps, which at most recent count totaled 256, are significant because they expose a lapse in Apple’s vetting process for admitting titles into its highly curated App Store. They also represent an invasion of privacy to the one million people estimated to have downloaded the apps. The data gathering is so surreptitious that even the individual developers of the affected apps are unlikely to know about it, since the personal information is sent only to the creator of the software development kit used to deliver ads.

“This is the first time we’ve found apps live in the App Store that are violating user privacy by pulling data from private APIs,” Nate Lawson, the founder of security analytics startup SourceDNA, told Ars, referring to the application programming interfaces built into iOS. “This is actually an obfuscated toolkit for extracting as much private information as it can. It’s definitely the kind of stuff that Apple should have caught.”

Apple:

We’ve identified a group of apps that are using a third-party advertising SDK, developed by Youmi, a mobile advertising provider, that uses private APIs to gather private information, such as user email addresses and device identifiers, and route data to its company server. This is a violation of our security and privacy guidelines. The apps using Youmi's SDK will be removed from the App Store and any new apps submitted to the App Store using this SDK will be rejected. We are working closely with developers to help them get updated versions of their apps that are safe for customers and in compliance with our guidelines back in the App Store quickly.

iOS Diagnostics & Usage Data

Joe Caiati:

Pre-iOS 8, you could have found this is section under Settings → General → About → Diagnostics & Usage, but now it lives in Settings → Privacy → Diagnostics & Usage.

I would liken the Diagnostics & Usage Data section to the Console on the Mac. There is a lot of noise in there, but sometimes you can find important information about issues related to your device. At its most basic definition, the Diagnostics & Usage Data section is a log of system events that happen on your iOS device. This log isn’t tracking your every move, but it is creating entries whenever events like an app crash happens.

My iPhone 6s’s display isn’t wide enough to see many of the full filenames.

String Interfaces

Ted Unangst (via Jeremy W. Sherman):

Although using strings subverts C’s already weak type checking, that’s probably not a major concern. One can screw up bit masks by using || in place of |. Or, as above, one can incorrectly pack the magic array. It’s usually much easier to visually audit a string than the C code used to plaster a dozen option together.

Of course, one should not use a string interface if it doesn’t make sense, but we need not reject the concept out of hand without at least some consideration.

Another example is libclang.

Monday, October 19, 2015

Options Dictionaries vs. Sets of Enums

Erica Sadun:

In Swift, you can re-architect this key-based system into a simple enumeration, specifying the valid type associated with each key case. Here’s what this looks like for the five cases listed above. The associated types are pulled from the existing pixel buffer attribute key docs.

enum CVPixelBufferOptions {
 case CGImageCompatibility(Bool)
 case CGBitmapContextCompatibility(Bool)
 case ExtendedPixelsRight(Int)
 case ExtendedPixelsBottom(Int)
 case PixelFormatTypes([PixelFormatType])
 // ... etc ...
}

Re-designing options this way produces an extensible enumeration with strict value typing for each possible case. This approach offers you a major type safety victory compared to weak dictionary typing.

However, a limitation is that currently you have to use an array of options rather than a set (unless you want to make the options hashable yourself).

Big iWork Update

Juli Clover:

There are also new Force Touch gestures in each of the apps, which work with the new Force Touch Magic Trackpad and the trackpad in the Retina MacBook Pro and the 12-inch MacBook. In all three of the apps, a Force click on an image will allow them to be edited, and this Force gesture has built-in haptic feedback.

Keynote and Pages have gained support for opening presentations and documents from 2006 and 2008 versions of the software, while Numbers is now able to open Numbers ’08 spreadsheets.

Zac Hall has a list of the features and other changes. Apple has an even more extensive list, although I don’t expect the URL to last long.

David Sparks:

Some of these updates are simple fixes for new features in the hardware and operating systems, like the ability to use split screen mode on the Mac or 3-D Touch on the new iPhone, but other bits show continuing development. For instance, Pages for the Mac got some improved AppleScript tools and added several new Apple designed templates.

John Gruber:

Pages for Mac is thus once again as OpenType-capable as Pages ’08 was. Or, you know, TextEdit.

Nick Heer:

It remains impossible to add mirrored page numbers, though.

I wonder whether anyone is keeping track of where the apps are relative to the ’09 versions. Are all the missing features back? If not, it might be best to keep the old versions of the apps installed, despite the improved support for the old file formats.

Update (2015-10-20): Bill Cheeseman notes via e-mail that the Bookmarks feature for making internal links within a document isn’t back yet. If I open a document with bookmarks in Pages 5.6, it presents a Warnings window that says “This Pages document may look different.”

Tesla’s OS 7 Interface Update

Luke Wroblewski:

Tesla goes flat.

Corbin Dunn:

However, even more important are the analog gauges indicating your speed and power. At a quick glance you can instantly see your speed by looking at the blue line on the left. You can quickly see if you are speeding; the blue line turns to a white line once you past the known speed limit. The known speed limit is a beautifully thought out small white line. Now, with the new user interface you are forced to read the digital speed number, and mentally interpret it. You then have read the digital speed limit sign, and think if you are higher or lower than this number to know if you are speeding. The old interface was even step better; it would flip the battery meter over and show you the speed limit at you once you pass through it. This subtle animation draws your eyes attention to it subtly alerting you to the fact that you are speeding.

[…]

The new [power] gauge is much more difficult to read, and I’m not looking forward to my next long distance trip. And where are the yellow dashed limiters that we used to see on cold days?

The layout of the dashboard and controls is one of the most important parts of a car. The idea that this would change—regress—after purchase is frightening.

El Capitan License in Plain English

Robb Shecter:

I thought it’d be a “fun” project to see what the “El Capitan License” actually says. Cool idea, huh? Kind of like spelunking through a cave that everyone says they’ve been through, but maybe no one really has. What will I find wedged in a wall or lurking in the dark around the next turn?

  1. I can’t use the Capitan with illegal copies of anyone’s stuff.
  2. Apple didn’t sell me this software. They still own it, in fact. I’m just borrowing it.
  3. If I install more Apple software, those are on loan as well.
  4. I can use the Capitan in two virtual Machines, and on one computer.
  5. But these VM’s cannot be used for business. The only exception is for software developers […]

Update (2015-10-26): Cory Doctorow:

The Justice Department lawyers argue that because Apple licenses its software -- as opposed to selling it outright -- that it is appropriate for the government to demand that Apple provide assistance in its legal cases.

Adding “Save PDF to iBooks” Support

David Gelphman:

The only substantive change needed to make the sample app use the share sheet is to take out the use of the UIPrintInteractionController from the sample and replaced it with the use of a UIActivityViewController. This controller takes an array of “Activity Items” as part of its initialization. When the controller is presented it determines what activities (or actions) can be taken on those activity items and allows the user to choose from those actions.

[…]

If you’ve already got printing working in your app, now’s the time to update to using the Share Sheet method instead of the older method. Without a lot of extra work on your part, users get a great new option to save your application’s content in a print ready format. And if you’ve not added printing to your application to date, the “Save PDF to iBooks” feature provides yet another reason to do so.

Thursday, October 15, 2015

Customizing Columns in OmniFocus 2.3

Derek Reiff:

Today’s update to OmniFocus, v2.3, is all about (OK, is mostly about) column customization. OmniFocus 2 introduced the Fluid layout, which turned tasks with a lot of data—defer and due dates, flags, context, project, and notes—into a readable row.

With 2.3’s Custom Columns layout, you can pick and choose what data you’d like to show, which Perspectives show what (Pro), or just flip a switch once to effect change everywhere.

[…]

This update also introduces Title Folding, which collapses an action’s title to just one line to keep row height consistent. Unless the row is selected, of course, in which case it’ll unfold. Turn it on in the View menu (Show Full Item Title->When Selected).

The Fluid layout was terrible for data density. An esoteric preference was added to put everything back on one line, but there was still too much white space. This update is a step in the right direction because in Custom Columns mode the rows are spaced more tightly. I’m not fond of seeing “defer” and “due” placeholders in every row, though; previous versions only showed these on mouseover, reducing the clutter.

There’s still no way to reduce the width of the sidebar (which is about 2x as wide as my widest context name), nor is there a way to resize the columns (which devote 3–4x as much space as needed to my project names).

Update (2015-12-04): William Van Hecke and Curt Clifton:

On the surface, the solution might seem to be to just bring back OmniFocus 1’s spreadsheetesque layout. But we believed we could design for these needs while holding on to OmniFocus 2’s hard-earned improvements in approachability. The result of this quest for balance is the new Custom Columns layout. Superficially, it looks a bit like OmniFocus 1, but Custom Columns have a lot more intelligence behind the scenes.

Update (2015-12-10): William Van Hecke and Curt Clifton:

Here’s a diagram showing the structure of controllers and views in an OmniFocus window before we added Custom Columns layout.

[…]

For Custom Columns layout we needed to use different table cell views, but wanted to retain as much of the existing, working code as possible. As the figure above shows, both OFIProjectTableCellView and OFIActionTableCellView are backed by .xib files and have a common superclass, OFIActionProxyTableCellView. We wanted to add two more leaf nodes and .xibs for Custom Columns layout: OFIProjectColumnarTableCellView and OFIActionColumnarTableCellView. These classes needed to share some behavior with each other, but also needed to share some behavior with their corresponding Fluid variant. For example, both OFIActionTableCellView and OFIActionColumnarTableCellView needed to manage their status circles. This is a classic example of the diamond inheritance problem.

Since Objective-C (and Swift) don’t have multiple inheritance, we chose to solve this diamond inheritance by introducing assistant classes for the action and project table cell views. Here’s a diagram showing that design.

[…]

Cocoa’s solution for these cases is NSStackView, which allows you to set priorities on subviews and have them automatically removed as needed. NSStackView is great for many use cases. Unfortunately, we’ve found that it doesn’t yet perform adequately when used in table cell views, many dozens of which can be laying out at once (for example, while you resize a window).

Swift Casting With _ObjectiveCBridgeable

Rafael Machado:

The documentation, which is only founded in header files says:

A Swift Array or Dictionary of types conforming to ObjectiveCBridgeable can be passed to Objective-C as an NSArray or NSDictionary, respectively. The elements of the resulting NSArray or NSDictionary will be the result of calling bridgeToObjectiveC on each element of the source container.

But this is not limited to the standard collection types. It can also be used to cast an Objective-C object to a Swift struct.

Quickly Dimming the iPhone Screen

Tim Stenovec (via Kirk McElhearn) and Justin Searls (via Josh Centers) show how you can set up your iPhone so that triple-clicking the Home button dims the screen. This seems to only change the brightness. It doesn’t change the color temperature like f.lux does. There is a limited way to do that in iOS via Settings ‣ General ‣ Accessibility ‣ Increase Contrast ‣ Reduce White Point, but I don’t know of a way to make a shortcut for that.

Update (2015-10-23): Dan Frakes wrote about this with iOS 8.

Empty Parentheses Are Not “No Parameters” in (Objective-)C

Jonathan Mah:

Using () in a function type declaration means unspecified parameters. This is a very old feature of C that has been maintained for backward compatibility. In fact, it was noted as an “obsolescent feature” in C89 — yes, that’s 1989!

[…]

Because this warning is apparently unimplemented, huge amounts of otherwise high quality code has these turds lurking in both public API and implementation.

You’re supposed to use (void).

Apple’s Processor Advantage

Steve Cheney (comments):

One of Steve Jobs’ biggest legacies was his decision to stop relying on 3rd party semiconductor companies and create an internal silicon design team. I would go so far as to argue it’s one of the three most important strategic decisions he ever made.

[…]

It is – in fact – these chip making capabilities, which Jobs brought in-house shortly after the launch of the original iPhone, that have helped Apple create a massive moat between itself and an entire industry.

[…]

The truth is the best people in chip design no longer want to work at Intel or Qualcomm. They want to work at Apple. I have plenty of friends in the Valley who affirm this. Sure Apple products are cooler. But Apple has also surpassed Intel in performance. This is insane. A device company – which makes CPUs for internal use – surpassing Intel, the world’s largest chip maker which practically invented the CPU and has thousands of customers.

John Gruber:

I don’t think it has gotten through the heads of many people that Apple has now turned the old dynamic on its head. Apple’s ARM chips are years ahead of the commodity chips used by its competition, and are set to surpass even Intel’s x86 chips in terms of performance-per-watt.

[…]

We should clarify one point from Cheney’s headline — Apple’s lead is formidable, not insurmountable. Nothing in tech is insurmountable.

Dave Lee (comments):

The University of Wisconsin successfully claimed that Apple used its microchip technology without permission in some iPhones and iPads.

The patent, filed in 1998, is said to improve the power efficiency of microchips.

devit:

Looks like the “idea” of the patent in the description is to use a predictor to predict when a STORE and LOAD alias and not speculate the LOAD and any instruction depending on the load (although the claims generalize this to any non-static dependency).

As it generally happens in software/hardware patents, the claimed solution seems quite obvious whenever one wants to solve that particular problem, and the hard part is the “execution”, i.e. implementing it efficiently and figuring out whether the tradeoffs are worth it.

Joe Mullin:

In this case, WARF said the ’752 patent improves the A7, A8, and A8X chips Apple uses in newer iPhones and iPads. Now that the jury has found Apple liable, it will decide on damages; in earlier orders, US District Judge William Conley has written that the maximum in damages that can be claimed is $862.4 million. A third phase of the trial will determine whether Apple was a “willful” infringer; if so, damages could be tripled. If both the damage and wilfulness phases go poorly for Apple, it could be a record-breaking verdict.

John Gruber:

The more I think about it, the more sure I am that it’s wrong to call WARF a patent “troll”. They are a non-practicing entity, but a university almost has to be. Universities don’t produce commercial products, they conduct research. And WARF uses its patent royalties to fund research.

MallocNanoZone=1 Makes for Hard Debugging

Gus Mueller:

Then it happened again, and I found a pretty reliable way to reproduce it. But again I wasn't running from Xcode and when I launched it from Xcode I couldn't reproduce it.

[…]

So what does the MallocNanoZone env variable do? It's a flag that changes the memory allocator for your app, and for the frameworks your app uses. I don't know the specifics of this allocator vs whatever the normal one is, but I do know how it hid this bug from me in Acorn. When MallocNanoZone was set, the allocator worked in such a way that when I used CFRelease with a CGImageRef, and then used CGImageGetWidth with that same (bad) reference, it would return the correct answer (CGImageCreateCopyWithColorSpace() may have been involved as well). When MallocNanoZone was off the normal allocator was used and CGImageGetWidth would return a bad answer (as it should!).

Wednesday, October 14, 2015

Google’s Accelerated Mobile Pages

Frédéric Filloux:

It didn’t take long for Google to fire back at Facebook’s Instant Articles. While the two company strategies differ, they both impact the future of news content distribution on mobile platforms.

Five months: that’s all it took for Google to respond to Facebook’s mobile offensive. In Mountain View, where the response has been brewing, the product is called AMP – Accelerated Mobile Pages. Not a super sexy name, but it could have been worse: the project was initially called PCU for Portable Content.

[…]

How did Google achieve such loading speed improvements? Again, in plain English: “amp-html” strips off most of the conventional web page payload and only keeps the HTML code directly involved in content rendering: text, images, videos gifs, basic ad formats and a few strictly mandatory trackers. Everything else —javascripts, iframes, embeds, large chunks of the CSS etc.— known to slow down page downloads is shuttled to a separate “container”. As for ads, they load separately, usually one second after the editorial content. No more waiting for a promotional video to start playing.

To speed up access, the other trick is a massive caching process that looks like this[…]

Update (2015-10-14): Felix Salmon:

AMP is based on an important insight: that almost all of that evil advertising technology is written in JavaScript. If you create a new standard for mobile pages which essentially strips out all JavaScript, or at least banishes it to the bottom of the priority stack, then suddenly people will be able to read the web pages they want to read on their phones, on the go, without waiting first to be identified and tracked and sold off to the highest bidder.

[…]

Ultimately it all comes down to power dynamics. Advertisers and media buyers have more power than any individual publisher: they can demand more intrusive ads, more trackers, more scripts, and the publishers will simply comply, lest they lose precious revenue. We’re all living the painful results of that dynamic. But there’s one entity even more powerful than the advertising industry, and that’s Google. If Google tells everybody to turn those off those scripts, then those scripts will be turned off—and advertisers will be forced to compete on the basis of creative output, rather than technological firepower.

Update (2015-12-16): Todd Hoff:

AMP is two things. AMP is a restricted subset of HTML designed to make the web fast on mobile devices. AMP is also a strategy to counter an existential threat to Google: the mobile web is in trouble and if the mobile web is in trouble then Google is in trouble.

[…]

Will Google advantage AMP in search results? Not directly says Google, but since faster sites rank better, AMP will implicitly rank higher compared to heavier weight content. We may have a two tiered web: the fast AMP based web and the slow bloated traditional web. Non AMP pages can still be made fast of course, but all of human history argues against it.

Background Data and Battery Usage of Facebook’s iOS App

Nick Heer:

Make no mistake: this is user-hostile. Facebook is actively creating channels to continue refreshing their app in the background when the user has explicitly stated that they do not want it to. Ironically, the best way to reduce the battery and data consumption of the Facebook app in the background is to switch Background App Refresh back on.

Federico Viticci:

Every time I take a look at a friend’s iPhone, Facebook is the app with the highest amount of battery usage in the background – even with Background App Refresh turned off. This has been going on for years, and instead of fixing the issue, it does seem like Facebook is always coming up with new ways to circumvent user control and consume more energy.

[…]

With iOS 9’s improved energy consumption stats, it’s easier to guess one of the various tricks Facebook may be employing to stay active in the background and drain battery. On my girlfriend’s iPhone, for instance, iOS 9 reports 5 hours of on-screen usage for the last 7 days, and another 11 hours of background audio usage with Background App Refresh turned off.

My guess is that Facebook is hijacking audio sessions on iOS by keeping silent audio in the background whenever a video plays in the app. And because, by default, videos on Facebook auto-play on both Wi-Fi and Cellular and few people ever bother to turn it off, that means there’s a high chance the Facebook app will always find a way to play a video, keep audio in the background, and consume energy to perform background tasks.

Lee Bennett:

Explains why I always have to force quit FB to regain ringer volume control. GRR.

Previously: iOS Background App Kludge.

Update (2015-10-14): Landon Fuller:

Where are the appstore reviewers? We’d need a jailbreak to independently investigate/confirm what they’re doing on our phones.

Update (2015-10-23): Ari Grant (via Paul Haddad, comments):

The first issue we found was a “CPU spin” in our network code. […] This repeated processing causes our app to use more battery than intended. The version released today has some improvements that should start making this better.

The second issue is with how we manage audio sessions. If you leave the Facebook app after watching a video, the audio session sometimes stays open as if the app was playing audio silently. This is similar to when you close a music app and want to keep listening to the music while you do other things, except in this case it was unintentional and nothing kept playing.

Update (2015-10-27): Nick Heer:

My understanding of the media APIs in iOS is that they will suspend operation when the app is backgrounded unless explicitly told to keep running. […] Whatever the case, it’s not working for Nate Boateng.

John Gruber:

Via Twitter, a few DF readers claim that the new version of the Facebook app still consumes a lot of energy in the background, even with background refresh disabled in Settings: General: Background App Refresh.

That Would Never Happen

Robert McMillan (comments):

One day, Lauren was playing with the MIT command module simulator’s display-and-keyboard unit, nicknamed the DSKY (dis-key). As she toyed with the keyboard, an error message popped up. Lauren had crashed the simulator by somehow launching a prelaunch program called P01 while the simulator was in midflight. There was no reason an astronaut would ever do this, but nonetheless, Hamilton wanted to add code to prevent the crash. That idea was overruled by NASA. “We had been told many times that astronauts would not make any mistakes,” she says. “They were trained to be perfect.” So instead, Hamilton created a program note—an add-on to the program’s documentation that would be available to NASA engineers and the astronauts: “Do not select P01 during flight,” it said. Hamilton wanted to add error-checking code to the Apollo system that would prevent this from messing up the systems. But that seemed excessive to her higher-ups. “Everyone said, ‘That would never happen,’” Hamilton remembers.

But it did. Right around Christmas 1968—five days into the historic Apollo 8 flight, which brought astronauts to the moon for the first-ever manned orbit—the astronaut Jim Lovell inadvertently selected P01 during flight. Hamilton was in the second-floor conference room at the Instrumentation Laboratory when the call came in from Houston. Launching the P01 program had wiped out all the navigation data Lovell had been collecting. That was a problem. Without that data, the Apollo computer wouldn’t be able to figure out how to get the astronauts home.

Non-Payment for Bundle Sales

MacNN:

When asked for more details, Ryan told us that “several developers (including Mariner) participated in his bundle last year. It did relatively well, from what we could tell. After the bundle ended, Samuel/Dan/Isaac (he goes by many aliases) was to have paid said developers their share. That didn’t happen. We pursued him (and continue to), but since he is in the UK, the probability of ever getting funds is small.”

Additionally, Charlie Monroe, the developer of movie cataloging app Rottenwood, spoke to us about the matter as well. Monroe said that he had his app in one of the bundles: “I supplied licenses to the guy, everything. Never heard back from him, never got a response to any of my emails after the sale.”

MacNN has reached out to nearly all of the developers associated with MacBundler and Bundlecult offerings. We’ve received responses from eight other developers who have confirmed non-payment from Bundlecult-related bundles.

[…]

Mayer from CoreCode discovered that Bundlecult, Macbundler, creativeloots, mightyloots, oyoyo, poplytics, printplum, smugcase, futurestaff, and 99closets are all related to the lessprices.co.uk domain -- which was suspended Thursday morning for reasons as yet unknown -- but has returned since.

Update (2015-10-14): Mark Munz:

MacNN didn’t contact me, but I can confirm MacBundler’s stopped paying app developers as far back as Apr 2014.

Update (2016-04-10): MacNN:

There have periodically been bad actors among software bundle creators, and it has come to MacNN’s attention that there is likely another that has been running bundles for some time under the BundleCult and MacBundler names, amongst others. Does this all sound familiar? It should -- MacNN originally ran the story about the group and issues paying developers in October, and we’re reminding readers now about it, because another bundle by the same group has gone on sale today.

MacNN:

We have periodically since October tried to reach out to the organizer to get their side of the story, but have never gotten a response until now. MacNN has finally received an email, and had a brief exchange earlier today from Dan Kingsley, the self-proclaimed “curator” of MacBundler. In the response, we were given some information by Kingsley discussing the situation, but in doing so, it raised more questions.

Tuesday, October 13, 2015

FogBugz, JIRA, and Wasabi

Prashant Deva (Hacker News, Reddit):

Both Atlassian and FogCreek started off as bootstrapped businesses. However, Atlassian is clearly the winner even though it started long after Fogcreek. I have seen how Atlassian went from underdog to beating Fogbugz.

[…]

It was very easy to run into an install of Jira on large open source projects, especially before Github became big. It served as huge validation and you ended up already trying the product before you even started a formal ‘trial’ for your organization. (Not to mention it also boosted Atlassian’s SEO).

[…]

Fogcreek invented their own language. This meant they couldn’t use all of the ecosystem and amazing tooling around Java, which Atlassian was able to take advantage of. Not to mention they had to spend enormous resources maintaining their own compilers and editors, and of course all new hires had to be trained on Wasabi.

[…]

Fogbugz did do a few things well though. It was super easy to create bugs. And it also supported hierarchical sub-tasks, something which Jira still doesn’t fully support.

However, anything beyond the basics and you start seeing the holes in the features.

solutionyogi:

Jira won because it was not opinionated. You can use it however you want. FogBugz had the philosophy to make bug entry super easy above anything else. Jira will let a manager define new custom fields and make them all compulsory. It perfectly fits how manager at big companies think.

Joel Spolsky:

FogBugz was designed for smaller collegial teams of people that wanted to work together effectively and needed a clean and simple way to track issues using the smart workflows that small, professional teams like to use.

It was remarkably successful and profitable from 2000 to today. We’ve never stopped working on improving it, but we also have never abandoned the market of small collegial teams of smart people.

By contrast, Jira was designed as “Enterprise Software” with features to help managers impose specific workflows on teams. Selling Enterprise software is a lovely, profitable business and Atlassian has great success selling to large organizations who ignore FogBugz, but it’s the opposite of what I wanted to do.

Benjamin Pollack:

First, I find the premise that FogBugz “lost” a bit odd. It unquestionably never achieved JIRA’s ubiquity, but it still exists, Fog Creek still exists, and the money FogBugz generated Stack Overflow and Trello. If that’s a failure, then I would love to have another one of that scale.

[…]

They undercut us on price for the one market segment we couldn’t afford to match. This is the single biggest factor. Atlassian figured out pretty quickly that they could charge practically nothing for JIRA licenses for 10-person shops, and then make it by having a massive step-up for enterprise licenses. But nearly all FogBugz customers were ten-person shops or less; charging $10 for a starter pack would’ve murdered our income.

They had a functioning sales team; we had only a marketing team (consisting entirely of Joel). The parent article is incorrect about this. I don’t care what you want to call the team; Atlassian had people on staff who built relationships with managers at tech companies. This meant that they were able to land a lot of those enterprise sales that Joel’s blog wouldn’t reach. If you want to get 10-person shops, Joel on Software is great. If you want to get 200-person shops, you really need someone building up a relationship with managers from day one.

[…]

Our Unix on-site version sucked a lot of resources. This is different from Wasabi (I’ll come back to this in a second), but supporting our on-site Unix installations routinely took 20% of our entire FogBugz dev team, and, at its peak, could take even more. This hurt our development speed, especially compounded with our lower resources.

carlfish:

What Atlasssian’s called its ”pre-sales” team was entirely reactive. If you called them they’d have someone who could answer your questions about what the products did, but that was about it. If you asked them for a deal or a discount because you were a big company, they’d politely direct you back to the pricing page on our website. After-sales there was an advocacy team who would occasionally call random customers to ask what we could be doing better, and who would email to remind you your maintenance was about to expire.

[…]

For the vital first five years, JIRA and Fogbugz had diametrically opposed product strategies. Fogbugz was a tightly focused product that eschewed customization in favor of presenting how Fog Creek believed an issue tracker would provide the most benefit for a team of developers. JIRA from day one wanted to be all things to all people: there was no deeper strategy than “listen to what our customers want and give it to them.”

So as Fog Creek got this base of loyal customers who bought into the product’s vision, Atlasssian got… everyone else. And everyone else was more people.

Benjamin Pollack:

I still think what you’re describing as pre-sales counts as a sales team. Fog Creek didn’t have a real equivalent; sometimes support would answer questions, and sometimes our SMTPs (management training program), and sometimes developers, and sometimes our office manager, but it was easy for us to lose you/not follow up sanely. Having a person to contact, even if it’s purely reactive, counts as sales--especially because, as a developer who wants my company to buy $foo, it gives me someone’s name and contact info to give my boss. Once we added sales staff (both reactive and outreach), because we realized we were losing sales to your pre-sales team, our sales went up, but that happened relatively late in those first five years. So, I hear you, but I still think you’re undervaluing what Atlassian was doing there.

[…]

I did forget another thing though, which actually is another side of both that point and my original post: Atlassian segmented their products like nobody’s business. FogBugz was just FogBugz (and later optionally Kiln) so that you’d have just one single thing to decide on, but that corresponded to JIRA + Confluence + Greenhopper (theoretically, anyway), + Crucible + FishEye. Five separate times Atlassian could charge a customer, each of which could individually be cheaper than FogBugz.

Benjamin Pollack:

Let me start by saying that Wasabi as a strategic move was brilliant. If David disagrees there, I’m a bit surprised: FogBugz represented an awful lot of battle-tested low-bug code, and finding a way to preserve it, instead of rewriting it, made one hell of a lot of sense. I’m with you that the general thoughts in this forum that we’d have to be insane to write a compiler are misguided. Wasabi let us cleanly move from VScript and ASP 3 to .NET without doing a full rewrite, and I’d be proud to work at a place that would make the same decision in the same context with full hindsight today.

That said, I think Wasabi made two technical decisions that I disagreed with at the time and still disagree in with in retrospect. First, Wasabi was designed to be cross-platform, but targeted .NET prior to Microsoft open-sourcing everything and Mono actually being a sane server target. At the time, I thought Wasabi should’ve targeted the JVM, and I still think in retrospect that would’ve been a much better business decision. I really prefer .NET over Java in general, but I know that it caused us an unbelievable amount of pain back in the day on Unix systems, and I think we could’ve avoided most of that by targeting the JVM instead. Instead, a significant portion of “Wasabi” work was actually spent maintaining our own fork of Mono that was customized to run FogBugz.

Ted Unangst

There are two or three versions of Wasabi, depending on how you count. The first version was a simple ASP to PHP compiler, called Thistle. The input language was not customized. Then it became Wasabi, gained a few more features, and accepted an input language more like ASP++, but still output classic ASP and PHP. Then came Wasabi .NET with a whole new backend. That’s when I joined. Not a whole lot is written about this version except when Joel called it supersonic. Wasabi .NET is the craziest of the variants, bearing the least resemblance to any existing language, but still remarkably like ASP. The point of the exercise, after all, was to avoid changing FogBugz as much as possible.

[…]

Instead of thinking of technical debt as yesterday’s work that I failed to do, I think of it as tomorrow’s feature I can have today. You have to pay interest, but in the mean time you’re shipping a product, have a roof over your head, and are keeping the lights on. A much hipper programmer might say something like “you ain’t gonna need it.”

In one sense, Wasabi was a rather substantial payment on the debt we had accumulated. FogBugz was written in a now dead language. Building a compiler extended the life of the product, though of course now we had to pay for the compiler, too. So maybe it was more like a bridge loan, or refinancing.

atesti:

For me the main way in which FogBugz has “lost” is that they silently discontinued the “FogBugz for your Server” version. The plugin system was great and we have our own installation on our own systems (no cloud allowed). With the “performance upgrade” they seem to have forked FogBugz, thrown out all the plugins, Lucene search and redid the GUI.

Hanselminutes:

Scott talks to Jacob Krall from Fog Creek Software about how his team used the open source C# Roslyn compiler to bring their ancient VBScript-style language called “Wasabi” into the 21st century. They solved real-world problems in a systematic way with smart decisions and computer science.

Previously: Killing Off Wasabi.

Coding Literacy

Jeff Atwood (via Slashdot):

If someone tells you “coding is the new literacy” because “computers are everywhere today,” ask them how fuel injection works. By teaching low-level coding, I worry that we are effectively teaching our children the art of automobile repair. A valuable skill — but if automobile manufacturers and engineers are doing their jobs correctly, one that shouldn’t be much concern for average people, who happily use their cars as tools to get things done without ever needing to worry about rebuilding the transmission or even change the oil.

Matt Weinberger (via Slashdot):

According to GitHub CEO Chris Wanstrath, in conversation with Business Insider at Thursday’s GitHub Universe event, the game plan is pretty straightforward.

If most of the world’s developers already use and love GitHub, then the company needs to help more people become developers.

“We’re thinking about the new developers,” Wanstrath says. “We want to lower the barriers to entry.”

Update (2015-10-13): See some good Twitter replies.

Alfred Thompson (via Hacker News):

Lastly if you don’t know what it is like to be a computer science teacher, don’t understand why and how being a computer science teacher is different from any other teaching job or if you want to understand more about how complicated it is to “create” more computer science teachers you really need to read these articles.

More International Taxes on Software Sales

Hugo Grimston (via Peter Steinberger):

The rules were well-intentioned — it was not right that Apple, Google and Amazon could set up shop in Luxembourg, thus gaming the tax system and disadvantaging EU competitors. However, the implementation was cack-handed — particularly the absence of a minimum threshold, which means that the compliance burden for indies is disproportionate (a threshold may now be implemented, but could take years).

This is old news, I hear you say, and already covered by TechCrunch, among others. And you would be right, as the EU rules have now been in place since January 1st and businesses will be making their third VAT MOSS return on October 20.

However, the “successful” roll-out of VAT MOSS has led other countries to formulate plans along the same lines as the EU scheme.

I switched my payment processor from PayPal to FastSpring, chiefly so I wouldn’t have to deal with the tax compliance details. The main alternative seems to be to use an à la carte service such as Taxamo that can plug into a “dumb” payment processor like Stripe.

Update (2015-10-13): Felix Schwarz:

I just stumbled over Avangate. They seem to offer lower fees & more flexibility than Fastspring.

Another option, which I also use, is eSellerate, although I’m not sure of its current status because the sign-up page seems to be gone, replaced by MyCommerce.

Christian Owens:

Our CFO (@hugo_grimston) wrote the original piece for TC. At Paddle.com we also help with this via our checkout product

Disk Utility in El Capitan

Lloyd Chambers:

Make it garish, dumb it down, don’t add useful functionality, and make sure the window cannot be resized, since everyone has just one drive anyway, right? […] I can’t see most of my drives and volumes any more without scrolling. This makes getting any view of what is there quite difficult (let alone relationships between drives/volumes/partitions), but worse it increases the risks of making a mistake (data destruction) by selecting the wrong disk. But there are gratuitous bugs also, not just crippled visuals.

[…]

There is no RAID tab any more, and look at the wonderful display of all these Untitled volumes (none of my volumes are called Untitled).

[…]

Scrolling way down past the 15 “Untitled” nuisances, I find my RAID volumes. Disk Utility does not see fit to indicate the type of RAID (stripe or mirror), or its status (say, a failed mirror drive).

Nicholas Riley:

Yeah, you can’t even launch 10.11’s Disk Utility in some configurations.

Rowan Pope:

10.11 Disk Utility is severely broken. If you replace a HDD, can’t even rebuild a fresh Fusion Drive. Need 10.10

Update (2015-10-16): Disk Utility also lost the ability to have multiple windows (and, thus, multiple operations running at once).

Update (2015-10-29): I continue to have problems with Disk Utility’s new interface for partitioning and am surprised at which information it thinks is important to highlight.

Update (2016-03-23): Craig Hockenberry (tweet):

When Disk Utility fails to mount a disk, no error message or other user feedback is presented to indicate there’s a problem.

Apple’s New Magic Keyboard, Mouse, and Trackpad

Jason Snell:

If nothing else, the new $99 Magic Keyboard seems to suggest that the keyboard dystopia I fear won’t come to be. This is a second new keyboard design from Apple in a year, and this one’s a lot more mainstream: It eschews the butterfly mechanism on the MacBook keyboard for a more traditional scissor mechanism, albeit one that Apple says has been tweaked to provide one of the features of the MacBook keyboard: improved key stability.

[…]

The Magic Keyboard’s key travel is about 1mm, less than that on the old Apple keyboards. But typing on it feels much better than the MacBook’s keyboard did. It’s hard to explain typing feel in words, and people can have dramatically different tastes when it comes to keyboards. In general, I’d say I like it. It may well be better than the older model, but it’s definitely different. There’s less travel, but more key stability. The reduction in key travel didn’t bother me; in fact, when I went back to my Logitech keyboard, it felt really weird.

Jacob Kastrenakes:

The keys are made ever-so-slightly wider by reducing the air gap around them, but their actual placement remains identical. The function keys are also changing in size, from tiny rectangles to full square keys. The keys all make a very satisfying tap as you press them.

While the updated keys are essentially in the same place, they type a lot differently. For one, they’re a lot shallower than those on the old standalone keyboard (but not quite as shallow as those on the new MacBook). That’s not as big of a difference as you might think, but it’s compounded by the change in the keyboard’s slope. Each row of keys is now much closer to being level with the rows beside it, which means you have to move your fingers slightly deeper to reach certain rows.

Andrew Cunningham:

Key travel is somewhere in between the old wireless keyboard and the extremely shallow travel in the MacBook, but the feel is more MacBook-y than Apple Wireless Keyboard-y. If you’ve already gotten used to the travel in the MacBook, you’ll have no problem adjusting to this one. If you’re used to the travel in the Apple Wireless Keyboard or in the MacBook Pro or Air, you may hate the way the new one feels.

There is now an integrated battery that lasts a month and charges in an hour via the Lightning port. It automatically pairs via Bluetooth when you plug it in. You can also just use it as a USB keyboard, with Bluetooth off.

Jason Snell:

Also gone is the silver color scheme—the Magic Trackpad 2 is all white, color matched to the keycaps of the Magic Keyboard rather than its aluminum frame. The entire top of the Magic Trackpad 2 is a touch surface—measuring 4.5 inches tall by 6.3 inches wide (the old model was basically a five-by-five square)—and its surface area is 29 percent larger than the old model.

Oh, and did I mention that it does Force Touch?

[…]

As on the MacBook, it’s kind of hard to believe that the Magic Trackpad 2 isn’t actually clicking when you push down. The glass does flex with the pressure a little bit, but that clicking feeling is entirely artificial.

I still think that mice are much faster and more accurate than trackpads. The Magic Mouse 2 still looks really uncomfortable. It can’t be used wired because the port is on the bottom.

Update (2015-10-13): Steven Levy:

“When we did the previous mouse we spent so much time dialing those feet, the material, the geometry, everything, so that it sounds good and feels good when you move it on the table,” says Ternus, whose title is VP for Mac, iPad, Ecosystem and Audio Engineering. “But then you change the mass of the product and you change the resonant frequency of the product and all of a sudden the feet that we loved weren’t great anymore. They weren’t what we wanted.”

[…]

The original Magic Mouse maximized the surface contact from its runners. But that approach didn’t work with the new version. “It was a little bit sticky — not in an adhesive sense but it didn’t glide the perfect way we wanted it to glide across the table,” says Bergeron. That resulted in the not-right noise.

“The solution was to reshape the high density polyethylene (HDPE) feet. “By actually riding more on the edge this time it was a better experience,” says Bergeron.

Steven Levy:

Schiller, in fact, has a grand philosophical theory of the Apple product line that puts all products on a continuum. Ideally, you should be using the smallest possible gadget to do as much as possible before going to the next largest gizmo in line.

Update (2015-10-14): Kirk McElhearn:

The extra width means that I have to move my arm more to use the trackpad, and I’m hardly using any of that space anyway.

[…]

Also, I’m finding that when trying to click and drag one or more icons, I either end up selecting the text of a file, or opening the file(s). It seems like the Force Touch thing prevents me from clicking and dragging. I can turn off the Force Touch feature, but then there’s no real advantage to this trackpad over the previous model (other than not needing batteries).

[…]

The height of the trackpad matches the height of the keys on the keyboard, not its body, as is the case with the older devices. As such, it’s sometimes a bit weird to move from one to the other, and I find that in doing so, I hit some of the keys on the right side of the keyboard.

Update (2015-10-15): David Sparks:

Another improvement is the on/off switch. In the existing keyboard, whether or not the device is turned on is always a bit of a mystery. You need to long press on the power button (located on the opposite side of the battery access cover) and that either results in the device turning on or turning off. The trouble is you don’t know until you try. The new keyboard has a switch. The slider background shows green if it’s on and red if it’s off. That’s much better.

Typing on the new keyboard I couldn’t tell any difference from the existing keyboard. Apple explained they’ve done additional work to improve the scissor switches to have 33% more stability and I have no doubt that they have but it felt pretty similar to me. One nice improvement is that the function keys now are full-size instead of half size on the existing keyboard.

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

Right now the Magic Keyboard is somewhere between the MacBook Pro keyboard and the new MacBook Keyboard, which makes sense given the switch. But it does mean I notice whenever I change from one to the other. Context is important but all other things being equal, consistency is a user benefit.

For example, I still occasionally trip up on the arrow keys on both the Magic Keyboard and the new MacBook, and for the same reason—the new spacing eliminates tactile awareness. I think that’s partly because the MacBook Pro still has the older arrow key layout, so I never really unlearn it.

Brett Terpstra:

However, this new Magic Keyboard is killing me. I don’t own one of the new MacBooks yet, but this appears to be the same keyboard. I’m unsure how everyone else is finding it so usable.

The key profile is so low that my fingers have no reference when sensing edges of keys. The response has an odd lag anytime the CPU is pegged, which I do not understand at all. The setup process is very cool (plug in a lightning cable and it pairs instantly), but my first impressions using it have been bad and going downhill.

I’ll be able to get used to the key profile, eventually, but there’s one thing that’s absolutely killing me: the configuration of the arrow key cluster. The seemingly small change in the size of the left and right arrow keys to full height has made it nearly impossible for me to use.

Sunday, October 11, 2015

Why the Floppy Disk Is Still Used Today

Brad Jones:

But while the average user might not have any cause to use a floppy disk, there are those out there who can’t settle for anything else. They’re in dire need of the disks, which most manufacturers have stopped producing. The floppy disk might seem like something better left in the 1990s. Instead it’s a product that’s alive and well in the 21st century.

[…]

“There are people who love floppy disks,” he tells me, giving the example of a court reporter who uses the format for sheer convenience and force of habit. “There’s a large embroidery company that does 500 jobs a day,” he goes on. “They could do that on a hard drive — except their machinery doesn’t work with a hard drive.”

Therein lies the biggest reason that floppy disks are still in demand in some corners of industry. “In the 1990s, hundreds of thousands of industrial machines were built around floppy disks, which were high-tech of the time,” he tells me. “They were built to last fifty years.”

[…]

Last year, a broadcast of 60 Minutes surprised many viewers with the discovery that 8-inch floppy disks were still the preferred method of removable storage for the computers in a U.S. Air Force nuclear silo. That report indicated that changes were in the pipeline, but the security of this outmoded technology was difficult to replicate with modern materials.

Lightroom 6.2’s Import Dialog

Adobe:

Customers were universally unable to decipher the Import dialog without getting frustrated. Some people pushed forward, bolstered by spending time searching the web for help. They might have been successful in importing files, but they didn’t feel successful. Others gave up, deciding that Lightroom might not be the right product for them.

The previous Import experience literally made people push back from their computers in frustration. Keeping the existing Import experience isn’t an option, and we needed to evolve the Import experience.

Tom Hogarty:

The simplification of the import experience was also handled poorly. Our customers, educators and research team have been clear on this topic: The import experience in Lightroom is daunting. It’s a step that every customer must successfully take in order to use the product and overwhelming customers with every option in a single screen was not a tenable path forward. We made decisions on sensible defaults and placed many of the controls behind a settings panel. At the same time we removed some of our very low usage features to further reduce complexity and improve quality. These changes were not communicated properly or openly before launch. Lightroom was created in 2006 via a 14 month public beta in a dialog with the photography community. In making these changes without a broader dialog I’ve failed the original core values of the product and the team.

The team will continue to work hard to earn your trust back in subsequent releases and I look forward to reigniting the type of dialog we started in 2006.

We already knew that Apple no longer cares to make software for professional or even prosumer photographers. Now Adobe is dumbing down the best remaining photography app. Lightroom’s old import dialog had its problems. The biggest one, in my opinion, was that it took so long to display lots of thumbnails only to hide most of them later when the window finished loading. But the new dialog buries some of the most important options (Copy as DNG/Copy/Move/Add) and removes others (various destination folder options), while making even the basic functionality worse (covering the bulk of each thumbnail with a giant checkbox).

Adobe has already committed not to provide new features for those of us who don’t subscribe to Creative Cloud. But it never said they wouldn’t take them away.

Update (2015-10-16): Tom Hogarty:

I’d like to thank our customers for their patience while the team reviewed several options for restoring import workflows and addressing quality in Lightroom. We can now confirm that, in our next dot release, we will restore the previous import experience.

New FogBugz Security Features

Tim Kington:

It’s very easy to set up – just enable two-factor authentication on the user preferences page and we’ll walk you through it. You’ll need an authentication app on your phone, and then it’s as easy as scanning a QR code. Once two-factor authentication is turned on, you’ll be asked for a code from the app each time you log in. This means even if someone gets your password, they can’t get into your account without the current valid code.

[…]

To this end, we have added a new Session Management page that administrators can access from the gear menu. This page displays all of the active login sessions, the IP addresses they originated from, and the time of last access. It also gives you three ways to invalidate tokens – you can delete individual tokens, all of the tokens for a user account, or you can choose the nuclear option and reset everything in the site.

[…]

On the case page, Administrators can now completely delete any event (comments, edits, emails) by entering edit mode and clicking the ‘X’ next to it.

I requested the latter two features long ago. It’s nice to finally see them implemented.

NSData, My Old Friend

Rob Napier:

I see a lot of Swift devs behaving as though Cocoa has somehow disappeared. Cocoa has become the embarrassing uncle that no one wants to acknowledge, even though he’s sitting right there at Thanksgiving dinner passing you the potatoes. And this is crazy. First, Cocoa is a great framework, filled with all kinds of tools that we use every day, implemented well and refined for years. And second, Cocoa is a required framework, filled with tools that we have to use every day if we want to write apps.

[…]

This “but is it correct?” came up all over the place. Would this operation cause a copy? Exactly how long is an UnsafeBufferPointer valid? There’s a lot of bridging magic in Array, and it’s not always clear what is promised. Testing only gets you so far if the current implementation just happens to work. Sometimes behaviors change just by importing Foundation.

[…]

In the end, I spent hours trying to be certain of the precise behaviors of Array bridging and copying. And all that to replace NSData code that is perfectly fine.

Friday, October 9, 2015

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.

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

You may have scrolled through the albums and downloaded a few photos. And you may have thought it would be cool if you could just download all of them. If you have about 60 GB of disk space free, you can.

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.

Update (2015-10-14): Rosyna Keller:

AT&T, Sprint, and T-Mobile do not charge minutes when using Wifi calling. However, only AT&T restricts to US.

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.

Marco Arment (comments):

I wasn’t very competitive against Pocket with Instapaper, and Pocket “won” (at least in the sense of having far more users, although if I had to choose either company to be running today, I’d definitely pick Instapaper).

I’m trying not to repeat my mistakes, and one of the biggest mistakes I made was putting short-term gain from paid-app sales above long-term growth. I watched my biggest competitor clone all of my features, raise VC money, and hire a staff. I knew he’d go completely free months before he did.

[…]

Podcasts are hot right now. Big Money is coming.

[…]

They’re coming with shitty apps and fantastic business deals to dominate the market, lock down this open medium into proprietary “technology”, and build empires of middlemen to control distribution and take a cut of everyone’s revenue.

Update (2015-10-15): Dave Winer:

Now people seem to think there has to be a linear relationship between code created and money paid. I come from the distant past where this was considered gospel. I made the mistake of charging for Frontier, a powerful system-level scripting environment, in its early days (1992). Ultimately it would have to compete with a product from Apple which of course was free, and even though our product solved many problems Apple left as “third-party opportunities” the users and developers gravitated to Apple. We went out of business quickly.

Thursday, October 8, 2015

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.

Apple:

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.

Jitterdämmerung

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).

Update (2015-10-21): The bug where audio pauses when you open the Camera is not fixed in iOS 9.1.

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 com.apple.mail MailboxListFont
defaults delete com.apple.mail MessageListFont
defaults delete com.apple.mail TocFont
defaults delete com.apple.mail 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 Capitan.app 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, SuperDuper 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. It also doesn’t tell you which account it’s checking.

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.

Update (2015-10-19): Benny Kjær Nielsen notes a bug in setting the default e-mail client.

Update (2015-10-23): The Time Machine crash is not fixed in Mac OS X 10.11.1.

Update (2015-10-30): I’m continuing to have problems with Mail on 10.11.1.

Update (2016-07-25): As of 10.11.6, the “Move to Trash” bug and Mail scripting and duplicate accounts bugs are all still present.

Wednesday, October 7, 2015

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 https://apple.news, Apple’s version of Twitter’s t.co:

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 News.app 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.”

Update (2015-10-09): Nick Heer:

Fortunately, if a website has an RSS feed, there’s another way to add it to News. In Safari, just tap the Share icon and scroll across the bottom row of actions until you find Add To News. Tap this icon and the sharing sheet will disappear. There will be no visual confirmation of any kind, but the site will be added to News.

I tried that with two sites, and an hour later both are still just showing the spinning progress indicator in the News app.

Update (2015-10-22): Samantha Bielefeld:

A site like Daring Fireball, which is almost exclusively text-only by design, has a News channel littered with images that are present on the source website being linked to.

[…]

My own channel hasn’t updated with my most recent content since I published ‘Universal Deep Linking in iOS 9’ all the way back on September 23rd.

Update (2015-10-29): Ben Brooks is having problems with Apple News missing posts, as am I.

Lee Bennett:

Related to Apple News woes, I submitted a site ages ago, denied coz title too simple. Resubmitted. Been >1 month with no progress.

Update (2019-05-16): Nick Heer:

I now know how app developers feel. It took them nearly three years to indicate that some bullets on some posts I made a long time ago might not be perfectly formatted.

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.

MethodSizeSavingsThroughput
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.

Update (2015-10-14): The Tweetbot 4.0.2 update adds a swipe gesture for closing the Safari View Controller.

Tuesday, October 6, 2015

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.

Update (2015-10-14): Keith Harrison:

To avoid handling the quick action twice we need to check in the willFinish… or didFinish… methods to see if we have a quick action, handle it and then return false. Returning false tells the system not to call performActionForShortcutItem.

Dan Moren:

That said, I think that 3D Touch is an awesome enhancement to iOS; I just wish that Apple had seen fit to use it in more places. In particular, I—and many of our readers, if my emails and Twitter replies are any indication—would love to see 3D Touch in use in iOS’s Control Center.

Update (2015-10-21): R. Kevin Nelson:

From my perspective, this means that I’m basically forced into looking at the first two touch values to calculate any kind of meaningful velocity, but depending on what you’re doing with 3D Touch, this quirk is worth being aware of: The first force is usually 0.00.

[…]

At extremely light force levels, I was mostly seeing the actual force value fluctuate between one of a few specific numbers. Yes, they are floating point, but they also exhibited extreme uniformity to the point that it was easy to hypothesize that the actual values were merely integers divided by a multiple-of-3 divisor. […] At this point, it seems pretty safe to say that the floating point value that Apple propagates to the developer interface is actually an integer between 0 and 400 that’s divided by 60 somewhere along the way.

[…]

So, it seems that at high pressures, the sensing mechanism is no longer linear with respect to touch location. Apple is apparently using pressures beyond the public API’s maximum for Peek and Pop, so it’s unclear where that breakdown in linearity happens. It won’t matter so much either way, though, since the _pressure value is private.

Monday, October 5, 2015

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

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:

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: