Archive for July 2013

Tuesday, July 30, 2013

Bento Discontinued

FileMaker (via Simon Wolf):

FileMaker will stop offering Bento Sept. 30, 2013, and will increase focus on FileMaker Product Line. […] As part of our sharpened focus, we will stop further development of the Bento consumer products.

Clark Goble:

The typical databases back in the day were contacts, tasks, events, passwords, and home inventory. There are excellent apps for all those vastly superior to what Bento could do. So why get Bento when 85% can be done better elsewhere?

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

There are limitations, though, since FileMaker Pro has no integration with the Mac Contacts, iCal, and iPhoto apps, nor does it offer Wi-Fi syncing between Mac and iOS versions. Plus, FileMaker Pro doesn’t support Bento’s Rating, Encrypted, Simple List, File List, and Message List field types, and Bento’s Collections and Smart Collections have no direct equivalents in FileMaker Pro, although you can set up relationships instead.


FileMaker’s announcement is troubling from several viewpoints. Most notably, of course, is how at least hundreds of thousands of Mac and iOS users have been left high and dry, and not just for any old app, but for database software, which almost by definition holds important data.


More generally, it’s often said of free services, especially those from small companies, that you get what you pay for. But with Bento, it was quite reasonable to think that buying popular commercial software from Apple-subsidiary FileMaker would be a near guarantee of future-proofing — could it get any safer? Apparently, yes, it could.

Parsing My Apache Logs

Dr. Drang:

I stopped using Google Analytics a couple of months ago. […] But I am still curious about which pages are being read and where the readers are coming from, so a wrote a little script to parse my site’s Apache log file and return the top five pages and referrers for a given day. Along the way, I learned more about Python’s collections library and the groupdict method for regular expression matches.

I’ve been thinking of doing something similar. Google Analytics is annoying to check because it requires logging in. My different sites are under different accounts, and it takes a lot of clicking around to get to the information that I want. Mint doesn’t filter referrers reliably and seems to increase the load on my server. By writing my own script that accesses the logs directly, I’ll be able to track non-JavaScript requests (e.g. .dmg downloads) and also calculate some custom analytics that wouldn’t be possible with off-the-shelf software.


The ReactiveCocoa project has a good description of the Model-View-ViewModel design pattern:

Although it seems similar to MVC (except with a “view model” object in place of the controller), there’s one major difference — the view owns the view model. Unlike a controller, a view model has no knowledge of the specific view that’s using it.

This makes the view-related code easier to reuse and test.

1983 Steve Jobs IDCA Speech

Marcel Brown (via Ole Begemann):

Regarding the speech, it is amazing to hear Steve Jobs talk about some things that were not fully realized until only a handful of years ago. This talks shows us just how incredibly ahead of his time he was. I’ve listened to the entirety of the recording a few times now and have taken extensive notes, of which I will further elaborate on in future blog postings. But for now, here are a few of the highlights – and remember – he is speaking in 1983. To put that in context, the Macintosh had not yet been introduced, Apple still thought the Lisa was going to be a hit, and the IBM PC was the second most popular personal computer behind the Apple II series.

This is interesting in the context of the App Store:

He compares the nascent software development industry to the record industry. He says that most people didn’t necessarily know what computer they wanted to buy. In contrast, when walking into a record store they definitely knew what music they liked. This was because they got free samples of songs by listening to the radio. He thought that the software industry needed something like a radio station so that people could sample software before they buy it.

Argument and Buffer Etymology

John D. Cook quotes An Introduction to Programming in Emacs Lisp on argument, i.e. parameter:

According to the Oxford English Dictionary, the word derives from the Latin for “to make clear, prove”; thus it came to mean, by one thread of derivation, “the evidence offered as proof”, which is to say, “the information offered”, which led to its meaning in Lisp.

and buffer (via @CompSciFact):

The word ‘buffer’, by the way, comes from the meaning of the word as a cushion that deadens the force of a collision. In early computers, a buffer cushioned the interaction between files and the computer’s central processing unit. The drums or tapes that held a file and the central processing unit were pieces of equipment that were very different from each other, working at their own speeds, in spurts. The buffer made it possible for them to work together effectively.

Sunday, July 28, 2013

Boolean Parameters

Mark Berstein:

In this case, we can improve eighty-seven separate constructors with one simple refactoring that takes almost no time, while leaving a clear indication that those Legacy strings could bear attention when time allows.

Apple Prevents Android Lessons in Treehouse App

Kira M. Newman (via Edward Marczak):

Apple told him it broke the App Store guidelines by “promoting a competing platform,” says Carson. Looking at Apple’s documentation, the only guideline that seems to fit is 3.1: “Apps with metadata that mentions the name of any other mobile platform will be rejected.”

This is a short-sighted policy that Tim Cook should change.

BYTE Magazine Archive

The Internet Archive has a complete archive of BYTE Magazine in PDF, EPUB, Kindle, and text formats. Via Chris Hanson, who recommends the August 1981 issue about Smalltalk and the February 1983 issue with the Lisa review.

Update (2013-08-14): Chris Hanson finds an article about the Lisa Application ToolKit and one about Objective-C.

Friday, July 26, 2013

Searching the Curatorium

Allen Pike on searching for “Twitter” in the App Store (via John Gruber):

At the time of this writing, Tweetbot is #31 and Twitterrific is bafflingly #154. Twitterrific ranks below the timeless classic, “1,0000 YoMama Jokes”.

Going through the top 50, only 10 are specifically about Twitter. 6 more are general social aggregrators like Flipboard. The rest is just junk that mentions Twitter in their description somewhere.

#2 and #3 are Instagram and Cool Wallpapers HD.

Thursday, July 25, 2013

HockeyCoach 1.0

Bit Stadium:

Today, we’re excited to present a new Mac app to view and manage your crash reports. Say hello to HockeyCoach.

HockeyCoach provides an easy interface to navigate through your apps, versions and crash groups. Double-click a crash group and HockeyCoach lets you pick a local directory. If this directory is a Git repository, you can then choose the right commit, tag, or branch for the crash. Once the directory is assigned, HockeyCoach can show you the crash with your source code[…]

This requires that your app be built with the HockeyApp SDK and that you subscribe to their service.

Getting the Best Amazon Deal

Christopher Breen:

Follower John Coxon (@johncoxon) told me about camelcamelcamel. This Web-based service allows you to enter the URL for the item you wish to track. You can then view a history of the item’s price to get a ballpark idea of how low it’s been priced in the past. Then just enter the price you’re willing to pay ($120, in my case) and choose how you wish to be alerted—via email or Twitter.

TCP ex Machina: Computer-Generated Congestion Control

Keith Winstein and Hari Balakrishnan (via Slashdot):

Remy is a computer program that figures out how computers can best cooperate to share a network.

Remy creates end-to-end congestion-control algorithms that plug into the Transmission Control Protocol (TCP). These computer-generated algorithms can achieve higher performance and greater fairness than the most sophisticated human-designed schemes.

An early version of their paper is available, as is the code.

Twitter Fakes Tweets

Jeff Elder (via John Gruber):

The tweets look completely real, but SFGate discovered that while the Twitter users who are featured are real, their tweets are not. The users featured raving about TV commercials never said anything of the kind, and were unaware their profile pics and accounts were being presented in a post on Twitter’s blog sent out to hundreds of thousands via the @Twitterads Twitter account and retweeted to more than 1.5 million.


An earlier version of this blog post included an image with mock Tweets from real users of our platform. This was not OK. Once we became aware of this mistake we took it down immediately. We deeply apologize to the three users included in the earlier images.

They seem to be saying that the “mistake” was not a technical glitch, but rather that Twitter thought real users would be OK having fake tweets attributed to them.

Wednesday, July 24, 2013

Developer Center Downtime


Last Thursday, an intruder attempted to secure personal information of our registered developers from our developer website. Sensitive personal information was encrypted and cannot be accessed, however, we have not been able to rule out the possibility that some developers’ names, mailing addresses, and/or email addresses may have been accessed. In the spirit of transparency, we want to inform you of the issue. We took the site down immediately on Thursday and have been working around the clock since then.

Nick Arnott interviews Ibrahim Balic:

With altered web requests, Balic found that by only providing a single piece of user information, first name, last name, etc., he was able to get Apple’s servers to return additional information for a matched user account — specifically full name, username and email address.


So if the bug was in iAd, why does Balic believe he might be responsible for the developer portal outage? Of the 13 bugs that Balic filed with Apple, one of them was a XSS (cross-site scripting) vulnerability in the developer site that could have led to accounts being compromised. In fact, of the 13 total bugs, 12 of them were XSS vulnerabilities in various Apple services that had the potential to expose user details.

Update (2013-07-24): They’ve added a system status page.

Update (2013-07-28): Sites are reporting that the ADC Web site is back up, although the status page shows that Xcode Automatic Configuration (presumably necessary to install the command-line tools), Pre-Release Documentation, Videos, Member Center, App Store Resource Center, Program Enrollment and Renewals, Apple Developer Forums, and Technical Support are all still down.

Update (2013-08-10): All the services are back online.

Update (2013-08-21): Juli Clover (via John Gruber):

Apple has released new details (via @cabel) on the security flaw that caused the Developer Center to be down for more than a week, noting via its Apple Web Server notifications page that a “remote code execution issue” was fixed.


While security researcher Ibrahim Balic speculated that he might have been behind the security breach, it is now clear that the issue he reported was unrelated to the major flaw that caused the downtime.


ParcelKit (via Clark Goble):

ParcelKit integrates Core Data with Dropbox using the Dropbox Datastore API.

Interesting idea, although it seems like for most data models you would need to layer on top your own conflict resolution (as with iCloud).

Beware of Sync Platforms

KS Sreeram:

Any sync-platform that claims to perform automatic conflict resolution is broken. This is because conflict resolution is fundamentally a domain specific problem that cannot be magically solved by a generic platform.


In essence, the notion of a conflict depends on the meaning that we assign to the data. Dropbox knows nothing about the meaning. It only knows the shape of the data. And that’s not enough to resolve conflicts.

JavaScript Object Notation (JSON) Patch

RFC 6902 (via Mattt Thompson):

JSON Patch is a format (identified by the media type “application/json-patch+json”) for expressing a sequence of operations to apply to a target JSON document; it is suitable for use with the HTTP PATCH method.

This format is also potentially useful in other cases in which it is necessary to make partial updates to a JSON document or to a data structure that has similar constraints (i.e., they can be serialized as an object or an array using the JSON grammar).

Patches are atomic; if any operation is not successful or one of the “test” assertions is violated, the patch doesn’t make any changes.

API Smell: NSNumber

Christopher Bowns:

NSNumber’s weakness lies in the ambiguous type of its value. If you receive NSNumber *aNumber as a method parameter and want to know its scalar value, what type should it be evaluated as? Is it correct to treat it as a YES/NO, and send it [aNumber boolValue]? Or perhaps it’s a floating-point value and should be sent [aNumber floatValue]? Without introspecting the Objective-C type encoding of an NSNumber, a glance at its value doesn’t hint at the original value. Consider an NSNumber whose integerValue is 1. Is it a signed or unsigned integer? Is it a boolean? Or is it a float that happens to be 1.0?

He recommends:

An objective evaluation of one’s use of NSNumber makes for clearer and more future-proof code. NSNumber should be used only as a temporary representation of a numeric value. If an instance of NSNumber has numeric meaning, it should be converted to a scalar value; otherwise, it should be converted to an NSString.

Also, if you have an API that uses NSNumber, you should document its type. This is not good:

NSString * const NSURLFileSizeKey; // Total file size in bytes (Read-only, value type NSNumber)

I would have assumed that a file size is an unsigned long long, but this Apple sample code treats it as a 32-bit signed integer.

Improving the Security of Your SSH Private Key Files

Martin Kleppmann (via Mark Jason Dominus):

I don’t know why ssh-keygen still generates keys in SSH’s traditional format, even though a better format has been available for years. Compatibility with servers is not a concern, because the private key never leaves your machine. Fortunately it’s easy enough to convert to PKCS#8:

$ mv test_rsa_key test_rsa_key.old
$ openssl pkcs8 -topk8 -v2 des3 \
    -in test_rsa_key.old -passin 'pass:super secret passphrase' \
    -out test_rsa_key -passout 'pass:super secret passphrase'

If you try using this new PKCS#8 file with a SSH client, you should find that it works exactly the same as the file generated by ssh-keygen.

Victory Lap for Ask Patents

Joel Spolsky:

The America Invents Act changed the law to allow the public to submit examples of prior art while a patent application is being examined. And that’s why the USPTO asked us to set up Ask Patents, a Stack Exchange site where software developers like you can submit examples of prior art to stop crappy software patents even before they’re issued.


Micah showed me a document from the USPTO confirming that they had rejected the patent application, and the rejection relied very heavily on the document I found. This was, in fact, the first “confirmed kill” of Ask Patents, and it was really surprisingly easy. I didn’t have to do the hard work of studying everything in the patent application and carefully proving that it was all prior art: the examiner did that for me.


My dream is that when big companies hear about how friggin’ easy it is to block a patent application, they’ll use Ask Patents to start messing with their competitors. How cool would it be if Apple, Samsung, Oracle and Google got into a Mexican Standoff on Ask Patents? If each of those companies had three or four engineers dedicating a few hours every day to picking off their competitors’ applications, the number of granted patents to those companies would grind to a halt.

Tuesday, July 16, 2013

SkyDrive in Windows 8.1: Cloud Storage the Way It’s Meant to Be

Peter Bright:

The files themselves use the reparse point mechanism first introduced in Windows 2000. During that first sync, stub files ("reparse points") are created to mimic the directory structure stored on SkyDrive. Any operation on these files is intercepted automatically, allowing SkyDrive to download the file on-demand.

The use of this (rather low-level) mechanism makes SkyDrive in Windows 8.1 very transparent. Virtually any application should work correctly, with only a download delay disclosing that a file isn’t stored locally.


As a result, you can have tens or hundreds of gigabytes of files stored on a server, while still retaining pseudo-instant access. There’s no long sync process.

Signed Mac Malware Using Right-to-Left Override Trick


The objective here is not as convoluted as the one described in Kreb’s post. Here it’s simply to hide the real extension. The malware could have just used “Recent”. However OS X has already considered this and displays the real extension as a precaution.


However, because of the RLO character, the usual file quarantine notification from OS X will be backwards just like the Krebs case.

AirPort Time Capsule 802.11ac

Michael Brown:

Based on my experience testing 802.11ac routers with Windows machines, I expected the 802.11ac Time Capsule to be considerably faster than the 802.11n model. And that’s certainly what my WiFiPerf results indicate. But these real-world file transfers defy that expectation.

The current theory, first published at Anandtech, is that OS X is not properly scaling TCP window size during file transfers to allow the MacBook Air’s 802.11ac client adapter to achieve peak performance. While Apple has not confirmed this to be the problem, the company is aware of the performance discrepancy and is reportedly working on a solution.

Apple has also integrated the power brick into the device and added “AirPort” to the product’s name.

Apple’s Answer on Upgrade Pricing

David Smith:

Logic Pro X is a Major (with a capital M) update to their professional audio editing suite. It appears to represent a significant investment in both time and resources. So how is it being sold, especially to people who already paid $200 for the previous version (Logic Pro 9)? It is a separate app download with a full cost purchase. No upgrades, no introductory pricing, just straight forward sale.

Update (2013-07-18): Also revealing is that Logic Pro X is not sandboxed.

Using Soulver for Design

Marc Edwards shows how to add constants to Soulver to make it easy to compute iOS button sizes and spacings (vid David Smith)

Monday, July 15, 2013

Effective Objective C 2.0

Mark Bernstein on Matt Galloway’s Effective Objective C 2.0:

This book is organized and presented as an Objective C homage to Scott Meyers’ classic work, Effective C++. The new book is good and interesting and provides useful tips for working in Objective C, but it’s far less interesting than Meyers.

I agree that there could be more discussion of key-value observing and concurrency. Also, Item 48 recommends block enumeration over for loops:

In the case of a dictionary, you get both the key and the value without any additional work, thereby saving the extra cycles required to obtain the value for a given key. Instead, the dictionary can give both at the same time, which is highly likely to be far more efficient, since keys and values will be stored together in a dictionary’s internal data structures.

This makes intuitive sense, but I seem to recall reading that, in practice, a loop with fast enumeration is faster (perhaps due to function-call overhead).

Why Microsoft’s Reorganization Is a Bad Idea

Ben Thompson:

Apple is the exception that proves the rule; they are functionally organized, but that absolutely does not mean a functional organization is best. Understanding why almost all corporations are organized by divisions (and how Apple manages a functional organization) illustrates why I think Ballmer is making a grave mistake.


In my (very-biased) opinion, I believe collaboration is fundamentally broken at Microsoft. It is all about politics, not great outcomes, and that is absolute death in a functional organization, which has nothing but collaboration to hold together cross-functional product teams. At least in a divisional model all of the relevant team members have a common product and a common boss, meaning everyone has no choice but to work together. Unless the employee review and compensation model is significantly changed, this, along with the lack of mission and clear accountability, will grind progress to a halt.

Update (2013-07-24): Ben Thompson posits an uncanny valley:

However, a company organized functionally that does not have the necessary cultural ingredients for true collaboration is actually in worse shape for having tried; the disagreements will turn into conflict, and the agreements made through groupthink will arguably be worse.

LINQ Ruined My Favorite Interview Question

Scott Chamberlin (via Hacker News):

The question is “Return the top 10 most frequently occurring words in a string.” This year a couple candidates gave me a solution which I haven’t seen in 5+ years of asking this question—they solved it with a couple lines of LINQ. I decided to dig deeper in to these solutions post interview and I’m writing up what I learned.

See also: NSEnumeratorLinq and RXCollections.

Objective-C Garbage Collection, in 1991

Graham Lee:

Then I discovered a conference talk by Paulo Ferreira:

Reclaiming storage in an object oriented platform supporting extended C++ and Objective-C applications

This is a paper presented at “1991 International Workshop on Object Orientation in Operating Systems”. 1991. That is—obviously—11 years before GNUstep’s GC work and 17 years before Apple released AutoZone.


I’m really surprised that it took so long for me to find out about something that’s almost directly related to my everyday work. Mind you, maybe I shouldn’t feel too bad: the author of AutoZone told me he hadn’t heard of it, either.

Saturday, July 13, 2013

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.

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.

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.

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.

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


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.

Slender 2.0


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.

Tuesday, July 9, 2013

Dropbox Chooser, Saver, and Datastore

Marcus Wohlsen:

With its new Chooser and Saver options — the first of a planned family of features the company calls Drop-ins — developers can make Dropbox the “open” and “save” windows in their apps. (For now, the Chooser is available for iOS, Android, web, and mobile web. The Saver is just available for the web and mobile web to start, with other platforms to follow).

Here are the blog posts about the Chooser, Saver, and Datastore.

The Datastore API provides a new model for storing and syncing data beyond files. When you use datastores, you don’t have to build a complicated sync engine from scratch — you can add the power of Dropbox into your app in a snap!

Unlike with iCloud, there is a Web interface where you can look at your tables and rows on the server to help with development and debugging.

Unsustainable Productivity

Chris Adamson:

Moreover, what if Apple got serious about purging dead apps? There are already apps that don’t even run in iOS 6 — my kids are bummed that Jelly Car 2 crashes at launch on iOS 6, and it’s appalling that Disney Mobile still offers it for sale without fixing it — and it’s likely that more will break in iOS 7. And many of those that don’t break will look like ass on the new OS, particularly those that tried to create their own UI elements to resemble the earlier iOS appearance.

Apple likely wouldn’t want the PR hit of the number of apps in store going down instead of up, but it would likely be healthy for the app ecosystem as a whole for Apple to eject apps that don’t target iOS 7 by, say, this time next year. Apple already has minimum requirements for updates, but that practice overlooks abandoned apps.


Kit FUI (via John Gruber):

Fantasy User Interfaces, Fictional User Interfaces, Fake User Interfaces, Futuristic User Interfaces. Regardless of what the F stands for, they all represent the same thing, the user interfaces and heads up displays found in many popular movies and television shows.


Kit FUI is an IMDb-like database that makes it easy to find screenshots, videos and the designers of these FUIs.

Why Mobile Web Apps Are Slow

This whole long article by Drew Crawford is worth reading, but here are some interesting nuggets:

The thing is, JITing JavaScript was a 60-year old idea with 60 years of research, and literally thousands of implementations for every conceivable programming language demonstrating that it was a good idea. But now that we’ve done it, we’ve run out of 60-year-old ideas. That’s all, folks. Show’s over. Maybe we can grow another good idea in the next 60 years.

But at any rate, what I can tell you, from publicly available information, is that Apple’s claims of 3.8x faster whatever does not necessarily translate into anything useful to you. I can also tell you that if I had benchmarks that refuted Apple’s claims of beating Chrome, I would not be allowed to publish them.

What this chart says is “As long as you have about 6 times as much memory as you really need, you’re fine [with garbage collection]. But woe betide you if you have less than 4x the required memory.”

There are also some good comments on Hacker News.

Mutability, Aliasing, and the Caches You Didn’t Know You Had

Andy Matuschak:

I’d like to propose that these kinds of implicit caching problems occur all the time, almost whenever you pass mutable data around a typically stateful imperative system. Consider: “The Register button should be enabled when the user enters an email address and a pair of matching passwords.” or “The text field displays a formatted string produced by [insert date math] on the submission date.”

Twitter Architecture

Todd Hoff:

It happened gradually so you may have missed it, but Twitter has grown up. It started as a struggling three-tierish Ruby on Rails website to become a beautifully service driven core that we actually go to now to see if other services are down. Quite a change.

Twitter now has 150M world wide active users, handles 300K QPS to generate timelines, and a firehose that churns out 22 MB/sec. 400 million tweets a day flow through the system and it can take up to 5 minutes for a tweet to flow from Lady Gaga’s fingers to her 31 million followers.

On NSURLConnection API Design

Ole Begemann:

The original goals for NSURLConnection still show in its API design today. Contrast this with a modern networking library like AFNetworking, which has been designed from the start with web services in mind. Consequently, it handles HTTP 4xx and 5xx status codes as errors and comes with an extensible system for dealing with different response types like XML, JSON or images.

Monday, July 8, 2013

Low-Level Concurrency APIs

Daniel Eggert:

First, we’ll go through most of the bits and pieces that make up Grand Central Dispatch. It’s been around for some years and Apple keeps adding to it and improving it. Apple has open sourced it, which means it’s available for other platforms, too. Finally, we’ll take a look at atomic operations – another set of low-level building blocks.

This is part of issue 2 of, which also has a good article on testing concurrent applications.

Filosync 1.0 Beta

Filosync is now in beta:

So we’re working to deliver software that brings all the benefits of cloud computing without forcing you to hand off control to a third-party provider. Filosync’s flagship product runs in your own Amazon Web Services account, and all your data are encrypted with keys only you have access to. Or you can run the Filosync server on-premises for even more control over your data.

It sounds like a private version Dropbox. From Arq developer Stefan Reitshamer.

Update (2013-09-14): Filosync is now shipping.

Saturday, July 6, 2013

Doug Engelbart, RIP

John Markoff:

In a single stroke he had what might be safely called a complete vision of the information age.

The epiphany spoke to him of technology’s potential to expand human intelligence, and from it he spun out a career that indeed had lasting impact. It led to a host of inventions that became the basis for the Internet and the modern personal computer.

Bret Victor:

Technology writers, in particular, tend to miss the point miserably, because they see everything as a technology problem. Engelbart devoted his life to a human problem, with technology falling out as part of a solution. When I read tech writers’ interviews with Engelbart, I imagine these writers interviewing George Orwell, asking in-depth probing questions about his typewriter.

Dave Winer:

It’s hard to fight a wave of technology. People who do it, almost always end up sidelined, unless they give in and go with the new wave. I’ve had to make the kinds of decisions Engelbart faced, quite a few times. Sometimes I fought the change, only to lose, and other times I embraced the need to start over and give up on your total vision and settle for part of it.

Update (2013-07-07): Ehud Lamm:

To commemorate this famous event, commonly known as the mother of all demos, SRI held a 40th anniversary celebration at Stanford today. As a small tribute to the innovative ideas that made up the demo, it is befitting to mention some of the programming languages that were used by Engelbart’s team. A few were mentioned in passing in the event today, making me realize that they are not that widely known.

Wednesday, July 3, 2013

Downside of Automatic App Updating

Matt Henderson:

Manual app updating, prior to iOS7, was beneficial to developers as a mechanism to notify their customers that a new version was available. Since Apple doesn’t otherwise provide developers with a way to communicate directly with their customers, that indirect mechanism served an important role.


Joshua Nozzi:

Make the content a Github-hosted, automatically-wiki-linked, automatically-deployed set of Markdown files.

A clever solution that makes it easier to edit and also prevents wiki spam. Hope he can get the site back up soon. It’s a good resource.

Monday, July 1, 2013

Sustainable Businesses on the App Store

Ben Thompson:

iOS 7 introduces radical change in nearly everything except for app monetization.