Classics iPhone App

October 30, 2008

Most eBook readers let you download books online, or transfer them from your computer. Classics takes an entirely different approach by bundling only a select few books, each with its own cover and illustration drawn from scratch by artists David Lanham and Sebastiaan de With. The result (packaged together with a great custom UI, sound and animation) really makes the app shine in a way that no other eBook reader I’ve seen has attempted. It’s the interface you’re paying for though; all the books are public domain and are available for free through other eBook readers.

Currently 12 books have been packaged and included in Classics. Free updates will include more books in the future. My only concern is the possibility that after two or three more books the developers will stop development and move on to something new. A lot of recent talk about the App Store indicates that sales fall dramatically once your app drops out of the new and featured lists. However, both Phil Ryu and Andrew Kaz have told me via Twitter that they are in fact dedicated to continual updates, and a have a lot of great stuff lined up for it.


October 28, 2008

Another great UI component from Matt Legend Gemmell’s source code library. MGScopeBar is a “filter bar” style control, similar to the one found in iTunes and many other recent Cocoa apps. I wish I had this earlier in the year when I was developing the filter bar for Runner’s Log, it would have saved me a lot of work.


October 28, 2008

Fundware is just one announcement from United Lemur, a company founded recently by engineer Mike Lee. The idea is for new software companies to start out with a small (but high quality) offering, such as an iPhone App. Visitors to Fundware decide to purchase the application not just on its own merit, but also on the potential of the company itself. If successful, the revenue from Fundware will give the new company capital they need to get off the ground and start producing great full-sized applications.

Most “indie” Macintosh software companies (including mine!) are started with free time and a savings account, not investment venture capital or loans. This seems like a great way to help out developers who have great ideas, but lack the time or money to implement them.

The first featured application is Puzzllotto, United Lemur’s own initial iPhone offering. Apart from being the driving force behind some great applications, Mike Lee has some lofty goals for United Lemur and how it will impact the Mac software development community— I hope he’s successful.

self = [super init]

October 27, 2008

Mike Ash on Cocoa Initializers. Great explanation of why you should use the debated self = [super init] in your Objective-C initializers. For the other side of the argument, read Wil Shipley’s take.

Better logging in Objective-C

October 27, 2008

If you’re an experienced Objective-C developer, chances are you’ve at least heard of spicing up your log statements with FILE and LINE. Here’s one method I wrote last night that includes variable arguments similar to NSLog(). To use it, just stick this line in your prefix header file:

 #define DebugLog( s, ... ) NSLog( @"<%p %@:(%d)> %@", self, [[NSString stringWithUTF8String:__FILE__] lastPathComponent], __LINE__, [NSString stringWithFormat:(s), ##__VA_ARGS__] )

The great thing about the preprocessor #define is that you can build all sorts of things into the DebugLog() function. For example, you could set it up so that the code is only included when you define a variable like BETA_VERSION in your code, or you could send the message to a custom logging class that writes to your own log file or database.

The App Store gamble

October 08, 2008

The past month or two has seen a lot of controversy over rejections in the Apple’s iPhone App Store. Apple has pulled not just “joke” apps which don’t have any quality or substance behind them, but seemingly legitimate applications like Podcaster and Nullriver’s NetShare.

I haven’t done any iPhone development yet, but I am thinking about porting a version of my OS X application Runner’s Log. By its nature Runner’s Log is a pretty tame application, but this news still concerns me. Is it possible it could fall under the ‘duplicate functionality’ clause the Podcaster was rejected for? The new iPod Touch has Nike+ software (which is definitely a competitor) built in, and it’s certainly possible it might make it into the iPhone eventually. What if my version of Runner’s Log could upload data to a website the same way Nike+ did? What if it could read Nike+ data as well?

Now, this is enough to bother me, but I’m not really concerned about it. I think the chances of Runner’s Log being rejected are honestly pretty low, if at all. But what if instead, you imagine Hulu as an example. Hulu is NBC’s flash based online TV service, and it seems to me there’s no reason they couldn’t create an iPhone app similar to YouTube if they wanted. Except, of course, that it would be a direct competitor to TV show sales in the iTunes Store. It wouldn’t exactly be duplicating iTunes, but how would Apple handle that?

Hulu has NBC behind it, so maybe it’s not fair to compare them to the typical indie developer shop that doesn’t have its own lawyers or high-up connections with Apple. The point I’m trying to make though, is that there are plenty examples of perfectly reasonable applications that could potentially fall victim to Apple. This is an area where Apple needs to be more upfront, either by providing a comprehensive list of what will and won’t be allowed, or through more communication with developers before the development process begins. Software companies big and small can’t afford to spend three, six months (or longer, in many cases) when there’s a possibility the application won’t even have a chance to pay off in the end.

The App Store is new, probably still overwhelmed with requests, and I have no reason to believe the process won’t continue to improve over time. Right now though, this is not a good situation to be in.

Infrastructure monitoring at Last.FM

August 01, 2008

I kind of like the work Last.FM put into setting up infrastructure monitoring displays around their office. From old analog devices measuring web server response time to a series of traffic light colored bears that detects problems in an SVN check-in, it’s the kind of thing I’d like to set up at work if I had the time and money.

Last.FM Monitoring

BoulderFest 2008

July 29, 2008

Last weekend was BoulderFest 2008, a three day music festival held in downtown Rochester at Boulder Coffee Company. Boulder Coffee is one of Rochester’s best places to hear all kinds of live music, and definitely worth checking out if you live in the area.

See pictures on my Flickr account.

Subsidized pricing can be a pain

July 14, 2008

You can take advantage of our no-commitment pricing option, with the exception of iPhone which requires a 2-year commitment.This line may be eligible for an equipment discount on 09/19/2008

Someday I’ll be able to get into this iPhone business, I hope.

Cocoa KVO tricks: binding to an array of arrays

May 13, 2008

Earlier this week I was working on a project where I wanted to filter a table view based on tags. The data model I was working with was very simple. My table view was bound to an array of objects through an NSArrayController, and each object had it’s own array of NSStrings which represented tags. My goal was to create a filter bar control, which I could bind to the array controller in order to popular the list of tags. The filter bar would display each unique tag once, and update itself when objects were added or removed, or an object’s tag array changed.

At first this seemed somewhat complicated. Implementing key value observing is easy, but I would have to observe both the array of objects and also each object’s individual tag array. Handling insertions, removals, and replacements adds to the complexity of the code I needed to write, all in order to solve what should be a simple problem. When I stopped to think about it, I went back to the documentation and found there was a much, much easier way of dealing with this situation:

[filterBar bind:@"tags"

One last thing; in my case I actually had to use two array controllers, one for the filter bar, and another for the table view. Since I was using the filter bar to create an NSPredicate for the table view’s array controller, if I bound both UI objects to that same array controller I would be removing tags from the filter bar after I applied the predicate! To avoid this, just create two array controllers and bind them both to the same NSMutableArray (just setting the content outlet won’t work).

Thoughts on ExpanDrive

April 24, 2008

I started using ExpanDrive today, a SFTP application that uses MacFUSE to access a remote server in Finder. There was a good review of it a few weeks ago at Daring Fireball, and I’ve been hearing good things from several other developers.

The appeal of ExpanDrive is that it “just works;” you don’t have to worry about disconnecting or reconnecting to the server if your network connection changes (working from a MacBook Pro, mine frequently does) or any of the other problems that Finder sometimes has with remote volumes. With the exception of one Finder crash, ExpanDrive has worked very well with me. In no particular order, here are some quick thoughts, both good and bad (I’m currently using version 1.1).

  • I wish ExpanDrive had the option to display "." hidden files in Finder, like .htaccess. There's probably a hack to enable this systemwide, but it would annoy me to see them everywhere; I want it enabled just on my webhost. It's not hard to use to open hidden files, but it would be better if it was an option, like it is in Transmit.
  • ExpanDrive doesn't let Finder dump lots of metadate files (.DS_Store and ._Filename.txt) on your remote volumes, from what I can tell. That's good! I was afraid this wouldn't be the case, and it actually kept me from trying ExpanDrive at first.
  • Finder reports my webhost remote server as an 8TB volume with 8TB free. I could be wrong, but I assume that's just the maximum volume size, not the actual disk space. It would be great if I could configure this per server, so Finder would report the actual disk quota for my hosting company.
  • ExpanDrive is fast! I'm not just talking about moving bits across the Internet either; copying, moving and editing files is just quicker through Finder than a separate FTP application like Transmit.
  • Bug report. Adding a "," in the volume name causes the MacFUSE connection to fail. ExpanDrive showed it as connected until I restarted the application.
  • Minor annoyance, but I don't like the menu bar icon. It's too three dimensional compared to other menu bar icons, and there's really no reason for me to use it often. A preference pane would have been better suited, with the option of showing a menu bar icon for users who disconnect and reconnect to drives more frequently than I do.

I still love Transmit, and I’m going to keep using it for some tasks, but I’m probably going to end up buying an ExpanDrive license when the demo expires. The allure of using SFTP reliably through Finder is just too much to resist.

Cabel Sasser at C4[1]

April 12, 2008

I know it’s old, but last week I finally got around to watching Cabel Sasser’s C4[1] presentation.

Earlier this year I gave a talk (my first public presentation ever, actually!) at Johnny Rentzsch's intimate and engaging C4[1] conference in Chicago. Despite nervousness, it was really great fun. We had just recently finished Coda, and with one hour to fill and a lot of Coda-related things still swirling around my mind, I pretty much just started talking. What followed was a whole lot of hyper-warp thoughts about all things Panic.

The presentation is great; lots of insight into the visual design process at Panic, and some of the challenges of developing Coda.

One of the more interesting parts was at the very end of the audience questions, where Cabel talks about the differences between developing a “big” application (Coda) and working on several tiny ones. Apparently the small applications each had enough feature requests and bugs that they took nearly as many resources and time as creating a larger application, only the smaller price tag meant only a fraction of the profits.