Archive for July 13, 2013

Saturday, July 13, 2013 [Tweets] [Favorites]

URL Path Retrieval Cheat Sheet

Mike Abdullah:

As Cocoa developers, there’s quite a broad range of APIs available to us for pulling out the path component of a URL. I often forget the particular quirks of them, so here’s a handy cheat sheet to bring all that together.

Without reading the documentation, you might have assumed that CFURLCopyPath() and -[NSURL path] were equivalent.

LaunchControl 1.6.1

LaunchControl (via Nicholas Riley):

LaunchControl is a fully-featured launchd(8) frontend allowing you to create, manage and debug system- and user services on your Mac.

With LaunchControl you see all services and their respective status at a glance. Invalid services are highlighted and a problem description is provided. You can enable or disable services with a single click. The same goes for loading, unloading and ad-hoc starting. Long list of jobs may be filtered. You find what you are looking for in an instant.

It’s from the developer of BackupLoupe.

5 Years of App Store

Ben Thompson:

There’s something about seeing the words “innovative” and “landmark” in such close proximity to “free” that really brings home the fact that Apple just isn’t interested in enabling sustainable businesses on the app store. This celebration is not about developers; it’s about users getting treats for having adopted the platform.

Unofficial AirPlay Protocol Specification

Clément Vasseur (via Frederic Jacobs):

This document describes these protocols, as implemented in Apple TV software version 5.0, iOS 5.1 and iTunes 10.6. They are based on well-known standard networking protocols such as Multicast DNS, HTTP, RTSP, RTP or NTP, with custom extensions.

All these information have been gathered by using various techniques of reverse engineering, so they might be somewhat inaccurate and incomplete.

IFTTT for iPhone 1.0

Federico Viticci:

I was skeptical when I first got the IFTTT beta, but now I’m surprised by how well the app works with native iPhone channels considering the limitations of iOS 6. The IFTTT team cleverly took advantage of the non-sandboxed areas of iOS 6 to create useful new channels that can be integrated with the service’s existing web channels and actions.

Finding Undefined Behavior Bugs by Finding Dead Code

John Regehr:

In summary, by adopting a solid premise (“developers want to know when code they write can be eliminated based on exploitation of undefined behavior”) the authors of this paper have found a way to home in on a serious class of bugs and also to avoid the false positive problems that might otherwise plague an intraprocedural static analysis tool.

DocSets 1.1.1

Ole Zorn (via Michael Jurewitz):

DocSets for iOS is a dedicated app for reading Apple’s developer documentation on an iPad or iPhone.

It downloads the entire library (iOS and/or Mac), so that it’s pretty fast and even works when you have no internet connection.

It’s kind of like an open-source, iOS version of Dash.

Dropbox Datastore vs. Core Data and iCloud

Tom Harrington on the new Dropbox Datastore API:

The Datastore API may be a good idea if your data model is not highly structured and if your users mostly already have Dropbox accounts. For anything more sophisticated or for non-Dropbox users, probably not. Or at least not without a lot of extra work. The API is by no means a replacement for SQLite or Core Data, but it’s probably enough for many apps.

[…]

Brian explained that DBList uses operational transforms to maintain list ordering in the face of conflicting changes, for example rearranging a list on one device and deleting some items on a different device. So while the class API seems pretty limited, there’s more to the class than it seems at first.

[…]

One of Dropbox’s major selling points when compared to iCloud is that files can easily be shared between different users. There is no sign that this kind of sharing exists for the Datastore API. Data stored this way does not show up like files stored in a Dropbox account. Neither the Dropbox web site nor the API has any sign of sharing options. The API provides a single-user data silo just like iCloud.

[…]

The API for searching the data store is quite simple, maybe too simple. To find records, pass an NSDictionary to the DBTable and you’ll get any DBRecords with the same key/value pairs. Easy! Except... the results need to match exactly. No getting records where a numeric field is more or less than a reference value, no partial string matching, etc. Also, since there’s no relationship support, your query is limited to values on the target table.

Lex Friedman:

Tapbots’s Paul Haddad told Macworld that he didn’t even bother looking at the Datastore API. “I don’t really care,” he said. Because it’s not core Apple functionality, Haddad said, “it doesn’t run in the background,” which makes it far less appealing to him. Even with iOS 7’s improved background functionality, Haddad said, Dropbox won’t be able to match the ubiquitous omnipresent syncing that iCloud affords.

Calca 1.0

Calca (via Ole Begemann):

Calca is the fast symbolic calculator that gives you instant answers as you type. No network needed, powerful enough for scientists and engineers, and it’s always with you.

Frank Krueger (via Matthew Guay):

One day, when it came time for me to write the Jacobian of a system of six functions each involving a quaternion with six different variables, I decided that neither Sublime Text nor the physical pen and paper were adequate. It was time to write a better tool.

It’s a live worksheet like Soulver, but the documents are plain text (or Markdown) files.

Update (2013-07-16): Frank Krueger:

This is showing that the UI code of the iOS version is nearly 3,000 lines of code compared to 1,000 lines for the Mac version.

[…]

This is the general lesson I’ve learned over the years: writing iOS apps is a hell of a lot more work than writing Mac apps. Enlightening? No. Honest? Yeah.

I wrote this app, as I do all my apps, using C# and Xamarin tools. I want to take a moment to thank them for their awesome product. Calca was a labor of love and it was wonderful to use my favorite tools to create it.

Update (2013-07-26): Jason Brennan interviews Frank Krueger (via John Gruber).

DBError

Apropos of the new Dropbox Datastore API, Jonathan Wight comments on how the SDK bizarrely makes a new class, DBError, that subclasses NSError to change the return type of the existing -code method, but doesn’t add any functionality. Exposing a separate error class makes all sorts of code much more complicated. And then there’s the issue of some methods taking DBError * for what is supposed to be an output parameter (DBError **). It’s API amateur hour.

Update (2013-07-13): Some of this is apparently fixed already.

Explaining the Apple Ebook Price Fixing Suit

Adam C. Engst:

Again, there is nothing inherently illegal with the agency model, price caps, or an MFN clause. And there isn’t even anything wrong with combining them in negotiation with a single company. The problem comes when they’re combined in negotiation with six publishers that between them control nearly 50 percent of the book market, and over 90 percent of the New York Times bestsellers.

[…]

In Judge Cote’s opinion, the combination of Apple working with all the publishers simultaneously to fix ebook prices in such a way as to cause them to rise was where Apple violated the Sherman Antitrust Act. Whether the 2nd Circuit Court of Appeals upholds or strikes down Cote’s ruling remains to be seen.

[…]

Nor should you interpret Amazon’s role in this case to mean that Apple was somehow riding in on a white horse to save the day for customers. First, the agreements that Apple negotiated with the publishers caused ebook prices to rise, which is one of the things antitrust law is aimed at preventing. Second, although it’s easy to say that the iBookstore increased competition in the ebook market by providing an alternative to Amazon, Apple’s agency model and MFN clause ensured that the publishers would charge the same price everywhere, entirely eliminating competition on price. That in turn would likely have made it significantly harder for any new companies to enter the ebook retailing market and compete with Apple and Amazon.

Update (2013-08-14): Adam C. Engst:

It’s hard to see how the DoJ’s proposed terms would have any positive effect on the ebook industry, given what has already happened. Plus, the Court explicitly noted that agency agreements, and both MFN clauses and price caps, were perfectly acceptable in general, so it seems unreasonable to prevent Apple from using them. In fact, the publishers have filed a motion with the court, saying that the DoJ’s proposals would hurt them, by limiting Apple’s ability to discount books.

Update (2013-09-10): Adam C. Engst:

In the list of prohibited behaviors, Apple may not enforce a retail price MFN term or enter into any agreement with an ebook publisher that includes such a retail price MFN term. (MFN, or most-favored nation, means that a retailer can match other retailers’ prices, regardless of other agreements.)

Plus, Apple cannot enter into an agreement with any of the big five publishers who were also named in the suit (all of whom settled) that restricts Apple’s ability to “set, alter, or reduce” the retail price, with a series of staggered expiration dates for each publisher ranging from 24 to 48 months.

Slender 2.0

Slender:

Slender is one of those rare tools that fits neatly between development and design. Instead of cutting corners or introducing artifacts with bizarre compression, Slender simply tells you which asset files aren’t being used. Along the way, you can also see which assets are missing their @1x counterparts, or if your @2x images have incorrect pixel dimensions. Not only does Slender shrink your projects by removing unused files, it can help make them prettier.

Unfortunately, Kyle Richter reports:

Slender 2.0 rejected from MAS due to Sandboxing concerns, may not be solvable might need to abandon MAS for Slender.

ReadKit 2.2

ReadKit 2.2 adds more keyboard shortcuts (including NetNewsWire-style arrow keys) and fixes a scroll position bug that had been bothering me.