Archive for November 9, 2012

Friday, November 9, 2012


Mike Abdullah:

My colleague Dan Wood has also recently been discussing this UI pattern.

I decided to make it a re-usable component, since “Show password” is something I find myself wishing more apps offered. And thus KSPasswordField was born. Go check it out and, hopefully, include in your apps where appropriate.

I’ve often wished that NSSecureTextField offered a checkbox to show its contents.

MarsEdit 3.5.8 and the Mac App Store

Daniel Jalkut:

It always feels terrible to ship a serious, crashing bug. It’s even worse in the context of the Mac App Store where developers have no direct control over the approval and release of new versions of the software. After waiting 14 days for 3.5.7 to be approved, I was excited to release it as soon as it was ready. But once you approve an app for release in the Mac App Store, there’s no going back. I can’t “wind back the clock” to make 3.5.6 available again.

I decided to remove MarsEdit from sale on the App Store until Apple approves 3.5.8.

FogBugz on Demand and Hurricane Sandy

Mendy Berkowitz:

That evening, the storm surge from Sandy, assisted by a rising tide and full moon, flooded the basement of our data center, cutting off the fuel supply to the backup generator. The next morning, Peer1 informed us of an impending emergency shutdown of the generator. We executed a protective shutdown to prevent loss or corruption of customer data. Later, when we’d secured confirmation from Peer1 that there was no imminent danger of power loss, we restarted our systems. The total duration of this unplanned, voluntary downtime was 3 hours.

FogBugz is a great service, and the team worked hard to minimize the downtime. The data center is still not on city power, but the service is running smoothly. Once things are back to normal, I think we’re owned an explanation for why there was only one data center. When I signed up for the hosted FogBugz service, it was based on Joel Spolsky’s 2007 description of their infrastructure:

Rather than setting up Los Angeles as a mere backup, we decided it would be completely live. Half our customers will be hosted from Los Angeles, and half from New York. That way we know at any time that both data centers are working and set up correctly, and we don’t have to wait until a massive failure to discover the problems with the backup data center.

Copies of the database backups are maintained in both cities, and each city serves as a warm backup for the other. If the New York data center goes completely south, we’ll wait a while to make sure it’s not coming back up, and then we’ll start changing the DNS records and start bringing up our customers on the warm backup in Los Angeles.

However, the current infrastructure page describes only a single data center.

Update (2013-03-05): Mendy Berkowitz:

All excellent questions, but as we debated the various answers we realized there was nothing wrong with our current datacenter that a second datacenter wouldn’t fix. In a disaster (natural or man made) situation, a second geographically diverse datacenter with a tested and practiced failover procedure is our best option for providing our customers with continued service.

Objective-C in the Cloud

Objective Cloud:

You push code (or compiled code) to Objective Cloud. This can be done by using git (for example via GitHub) or by uploading it manually to our servers. We then make your app logic available via RESTful web services which you can access via HTTP. You can also define blocks of code that are not exposed to the public but which are triggered automatically. Once code is pushed to Objective Cloud, we scale it automatically according to your needs. We do provide an SDK which includes an Xcode template that you can use to get started; however, you don’t have to use the SDK at all. Of course you can test your app locally before pushing it to Objective Cloud.

Lots of cool stuff could be built with this.

MailMate 1.5 and the Mac App Store

Benny Kjær Nielsen:

The main reason for the unusual amount of time between updates is that MailMate has not yet been sandboxed and this is now a requirement for distributing through the Mac App Store. MailMate is still not sandboxed and a consequence of this release is that MailMate is no longer for sale in the Mac App Store. […] It is not yet decided when (if ever) MailMate returns to the Mac App Store.

Dynamic Linking on OS X

Gwynne Raskind:

dyld is one of the most essential parts of OS X; without it, nothing but the kernel would run. With that responsibility inevitably comes significant complexity, and dyld has it aplenty. Some of that complexity comes from the massive backwards-compatibility requirements of dyld, and some simply from the sheer scope of the tasks it must handle. Most developers will have no need to understand linking in such detail, but maybe the next time you get a strange error message in Xcode from the linker, you’ll have a better idea of where to look for the problem.

Protocol Data Types

Mark Granoff:

As almost a last ditch effort, I carefully reviewed the implementations of all my UITableView delegate and data source methods. Sure enough, I found I had implemented the above method with the wrong return value. And when I changed it to correctly return an NSInteger instead of a CGFloat, all was right with the world.

This is the sort of mistake that Xcode should be able to catch but can’t yet. The commenters suggest using Xcode’s code completion to avoid this typing in the first place.

iTunes Match at Year’s End

Kirk McElhearn:

So, if you’ve decided to throw in the towel on iTunes Match, you had better prepare. If you don’t have local copies of all your music, start downloading it now. Because if you don’t, when iTunes Match turns off for you, you won’t have access to any of that music, and you can’t get it back.

With the advent of Amazon Glacier, the pricing equation has changed. iTunes Match is $25/year. Storing my 88 GB iTunes library in Glacier for a year (e.g. using Arq 3) would cost roughly $11. Of course, iTunes Match offers other features beyond backup.