David Sinclair's blog

Indie+Relief: charity for Haiti

As you no doubt know, Haiti recently suffered a disastrous earthquake, with at least 200,000 dead as of the latest official report.

Many people have been reaching out to offer support and donations to reputable charity organizations.

The Mac and iPhone independent developer community have come together to do their part. Almost 150 independent developers have declared that they will donate the proceeds of software sales on January 20 (tomorrow) to worthy charities of their choice.

I am participating in this. All proceeds from Dejal Mac app sales on this day will be donated to Mercy Corps for Haiti relief efforts.

Also, one of my products, Narrator, is now in the new Mac Bundle Box promotion. I will donate my share of sales from tomorrow's bundles to Mercy Corps, too.

If you've been thinking about buying a Dejal Mac app, please buy on the 20th so your purchase helps those in need.

For more information about the Indie+Relief effort, see the website. Take a look at the hundreds of other great apps available from generous independent developers. As the banner says, you get great software, Haiti gets financial help.

Featured blog posts of 2009

My blog posts often just cover new releases, but sometimes I post general-interest or developer-interest topics. Some highlights from 2009 included:

I hope you enjoyed these posts.

Dejal decade in review: 2000 to 2009

Dejal has been around since 1991, but has gone through a number of changes over the years. In the first decade, from 1991 to 2001, I wrote applications and system extensions (FKEYs etc) for Mac OS 9 and earlier. These are still available on the Classic Products pages.

In 2001 my wife and I moved from New Zealand to the US, and of course my business moved with us.

In 2002 I formally set up the company as "Dejal Systems, LLC", and started writing applications for the then-new Mac OS X operating system. The first such app was Narrator, a fun app to read stories in multiple voices. Later in 2002, the first version of Simon was released: my server and website monitoring tool. (News from 2002.)

In 2003 I started a Mac OS X version of QuickEncrypt, an encryption tool that had been fairly popular under Mac OS 9, though as it turned out it got sidelined by other projects, mainly due to lack of customer interest. I also released the first version of Time Out, a useful (and free) break reminder tool, and BlogAssist, a HTML markup tool... which was also free initially. And finally, I introduced Caboodle, my handy snippet keeper app, also as freeware initially. A busy year for new apps! (News from 2003.)

In 2004 a third-party product that I was working on as a contract programmer was released: MindFortress. The client saw Caboodle and wanted something similar with their spin on it. It was a popular inspiration: the makers of iData wanted help with rewriting their product, so I did that as a contractor, too. I also decided to give away the old Classic products this year, and introduced yet another new app, Macfilink, an affiliate link cloaking tool, written as a joint venture with an Australian friend. My various existing apps were also updated. (News from 2004.)

In 2005 I rolled out a major website redesign, including adding a RSS feed for news. Several apps were updated, including Time Out to version 1.3.2, Caboodle to 1.0b3 (still not in general release!), and most notably a major upgrade of Simon to version 2.0 then 2.1. (News from 2005.)

In 2006 I started sponsoring the great Joy of Tech web comic, which has been renewed each year since. Various apps were updated, most notably a major upgrade of BlogAssist to version 2.0, where it became a paid product, and Caboodle finally reached a 1.0 general release. I also introduced the Dejal Blog and Dejal Forums, and redesigned the Dejal logo to its current form. (News from 2006.)

In 2007 I made a number of website improvements, including an improved design and nicer Dejal Store pages. I also started tweeting (@dejal), posted lots of blog posts, and of course did a number of app updates.

In 2008 I rewrote Narrator from scratch to use the latest technologies, and released as version 2.0, along with the usual batch of app updates and blog posts. I also branched out into iPhone app development with my first app for that platform, SmileDial, a handy and fun app to text or call people by touching their face: touch their eyes to have them read a text message, or touch their mouth to speak to them.

In 2009 I continued the blog posts and app updates, as usual. I also introduced two new apps: a free Mac app called FinderFront to bring all Finder windows to the front when you click the desktop, and an iPhone app called Valentines to celebrate Valentine's Day with heart-shaped photos and messages. I also added iPhone optimization to the website. Plus I spent a few months working on a secret new iPhone app, which I've hinted at on Twitter as [DEJALDACTED].

So what's in store for 2010 and the next decade? Firstly, the aforementioned new iPhone app. That'll be an exciting release. After that, I'll work on version 2.6 of Simon, and Time Out version 2, which was designed and started quite a while ago, but has been pushed back... but no more. After that, I have big plans for updates to my other apps.

Other than the [DEJALDACTED] iPhone app release, I see 2010 as returning my focus to my Mac apps. 2011 and beyond... who knows. Maybe I'll work on apps for Apple's rumored tablet, or more iPhone apps, or new Mac apps... or more likely a combination of all those (and updates to the existing apps, of course). The focus will depend in large part on feedback from customers like you.

Regardless, it'll certainly be fun to celebrate the 20 year anniversary of Dejal in 2011!

My year in cities, 2009

Time for my traditional list of the cities I spent one or more nights in during 2009:

Portland, OR (home)
Cannon Beach, OR
Ashland, OR
Seattle, WA (twice)
Washington, DC

Just one air travel trip this year, to DC for the lighting ceremony of the National Christmas Tree, Capitol tour, White House tour, and memorial and Smithsonian exploring. An enjoyable trip, though my wife and I both came home with colds that took us out for the next couple of weeks.

We're still hoping to get back to New Zealand for a visit around Christmas time, this year. We really have to make it this time, to help scatter my father's ashes.

(Compare to 2008, 2007 and 2006.)

My home office, explored

I included a photo of my home office in a previous post, "There's no place like home":

(Click to embiggen)

I thought I'd explore it for those who are interested.

  • MacBook Pro 17": My main computer. I like the (high resolution) screen combined with the portability, e.g. if I want to take it downstairs or on a trip.
  • 23" Apple display: to the left of the MBP. It's a rather ancient model, with the huge frame, but it works. It displays Woopra and Twitterrific normally, or secondary windows as needed.
  • Antec USB-Powered Notebook Cooler underneath the MBP, to help keep it cool (only used in Summer; this photo was taken in August).
  • PowerMac G5 tower (not visible): currently running Tiger, used for testing and as a music player.
  • 17" Apple display: hooked up to the G5. I have a keyboard and mouse attached, but can also control it from my MBP via the handy teleport utility.
  • Various desk accessories... calculator, water, docks, speakers, etc.
  • Wireless Weather Station, in case I do want to venture outside.
  • xkcd's height poster... fascinating.
  • Satellite image poster of Portland and north to Mount St. Helens. I have a similar one of the Puget Sound area (around Seattle) behind me.
  • Cat tower, enjoyed by our three cats.
  • Various baseball bobbleheads (from the Seattle Mariners and Portland Beavers), toys, and puzzles on the shelf of a cabinet containing books.
  • At ceiling level, a Grip-a-strip display rail holding pages to help me schedule my work, with different colored Post-It notes for each project, with a note for each week of work in columns for months (I currently have up till June 2010 planned out).

Not visible is another desk to my right, which holds a paperwork organizer, drawers of cables, a HP OfficeJet print/scan/fax machine, etc.

So that's my world. :)

Happy Holidays from Dejal!

I know that a lot of people will be going away or not thinking about software over the next week or two, but I'll continue to keep an eye on the Dejal Forums and support queries. So if you have any questions, let me know.

As my gift of the season to you, I've just added an automatic coupon "JOYTOALL" on the Dejal Store — everyone gets discounts on all my Mac apps till the end of 2009!

Visit the Dejal Store to share the joy.

I hope everyone has a pleasant and safe holiday season.

There's no place like home

As a followup to a post of a few months ago, "I'm an introvert, and I'm okay", I thought I'd talk about my work situation.

I work from home, and I like it. A lot.

I run Dejal from my home office:

(Click to embiggen)

There are of course the obvious commuting advantages: literally just a few steps to get to work; no wasted hours sitting in a car or other transport; no costs of said transport, eating out for lunch and similar expenses. And I can claim home office expenses. It is also very handy to always be home when service people arrive, or I need to sign for deliveries, etc.

This is not a lifestyle for everyone, though. Going back to that previous post, extroverts would find it draining to be working alone, hardly ever needing to leave the house. I know that many people who can work from home choose to instead work at a coffee shop or rent an office space, for the social interaction. But for me, I thrive on alone time, and have no problem with not leaving the house for days.

Not that I'm really alone most of the time. My wife, Jennifer, also works from home almost every weekday. She works for a big corporation, and has a cubicle at the office, but is able to telecommute, and most days does so. Fortunately, she is also an introvert, and we each have our own home offices.

For those that can swing it, by way of vocation and temperament, there's no place like home.

Simon 2.5.5 released

Sometimes I'm just too clever for my own good. Or more likely, not clever enough.

My apps have a handy license lookup feature, where you can enter your name and licensed email address and click a Find button to look up your license if you ever need to re-enter it, without having to store the serial number somewhere. But it's long had problems handling diacritical characters (e.g. "é") on the server side, so in Simon 2.5.4 I made a change to solve that. However, that change inadvertently broke another aspect of the license lookup.

So, here's version 2.5.5. I really dislike having to do a bug fix to fix a bug fix, both because releasing is a fair bit of work, and I know that people don't like having to download an update too soon after another one. But in this case it's unavoidable.

The problem didn't affect many people, but it's the kind of problem that must be fixed even if only a few people are affected — can't have licensed users unable to enter their licenses!

Anyway, many apologies to those affected, either experiencing the problem themselves or having the hassle of downloading another update so soon. You can skip this update if you like; if you've already added your license, there's no need to update. If you're still evaluating, you could skip it too, though will probably need to upgrade if you are on 2.5.4 when you do purchase.

Download Simon 2.5.5 now!

Happy Thanksgiving everyone! Please note that Dejal support will probably be delayed over the next couple of days due to Thanksgiving events, but I will catch up with all queries as soon as possible after that.

Simon specials ending soon

Simon, my website and server monitoring tool, is available for discounted prices from a few places for just a little longer.

  • TheMacBundles includes a Standard license for Simon (normally $59.95) as part of the bundle — which only costs $49.95, so they're effectively paying you $10 and giving you 10 other handy apps for free! But this bundle expires in just a few days, so hurry!
  • Simon Standard is available by itself from MacUpdate Promo's extended deals for just $44.96 (25% off) for a limited time.
  • Simon Basic is also available from MacUpdate Promo for $22.46 (25% off, retail $29.95).
  • Simon Enterprise is similarly available from MacUpdate Promo for $146.25 (25% off, retail $195.00).
  • Not to be left out, existing Simon customers can upgrade from Basic to Standard or Standard to Enterprise for much less via the Dejal Store coupon "MUPUPGRADE", only till the end of the month.

Hurry, don't miss out on these great deals! This range of specials has never occurred before, and may never be repeated!

Simon 2.5.4 released

Simon, my website and server monitoring tool, has been updated to version 2.5.4. This is a minor bug-fix update, but recommended for everybody.

  • Fixed an issue with the Calendar plug-in that caused a conflict with the SMS plug-in on Snow Leopard.
  • Fixed a bug in the license regeneration feature that could cause minor back-end issues when diacritical characters are used.

Download Simon 2.5.4 now!

Caboodle 1.3.4 released

Caboodle, my lean clean snippet machine, has been updated to version 1.3.4. This has a number of improvements... and perhaps should have been called version 1.4, as it straddles the fine line between feature enhancements and bug fixes. This is a recommended update for everybody.

  • To improve performance and reduce disk space, imported PDFs, files dragged to the Dock icon, or via the Save PDF to Caboodle print option are now copied to an Attachments folder within the Caboodle data folder, and aliased to the entries. This can be disabled via a hidden preference, by entering "defaults write com.dejal.caboodle ImportAsAlias NO" in Terminal, if destired.
  • The entry icons for files dragged to the Dock icon and saved to Caboodle are now set to those files' icons.
  • Fixed an issue where entries added by those means could be lost if Caboodle was quit without making further changes.
  • Find text operations, e.g. Find Next (Cmd-G), Find Previous (Cmd-Shift-G), now work when the entries list is the active control; the entry text is made active then the operation performed.
  • Removed ancient code to move pre-1.0 data, since nobody could still be using those versions.
  • Improved the data loading to reduce the risk of using empty data if the existing data can't be loaded.
  • Now includes a 512x512 application icon.

Download Caboodle 1.3.4 now!

Narrator 2.0.6 released

I've just released an update to Narrator, my fun app to read out stories and interviews in multiple voices.

Version 2.0.6 fixes a couple of small but annoying bugs, and is a recommended update for everyone:

  • Fixed a bug where the age, gender, and sliders might not update when changing actors or characters.
  • Fixed a bug that could occasionally cause the Play button to stop working when playing/pausing or changing voice attributes quickly.

Download Narrator 2.0.6 now!

Simon Standard & BlogAssist featured in TheMacBundles

I'm pleased to announce that Dejal Simon, my flagship server monitoring app, is featured in the fifth TheMacBundles collection. Plus, for a limited time, Dejal BlogAssist, my handy HTML markup tool, is also included as a bonus app.

Dejal Simon is the essential site monitoring tool for Mac OS X. It checks servers for changes or failures, and notifies you via e-mail, sound, speech, Twitter, or other means. You can use it to track updated sites, and to alert you when an important server goes down or recovers.

The bundle includes the full Simon Standard license — normally $59.95!

BlogAssist is a handy tool to help weblog and website editing by making HTML markup easier. comes with several useful operations, including web and e-mail links, bold/italics/strikethrough/etc, LiveJournal tags, and more. But you aren't limited to those — you can add, change, or remove them via the Operations Preferences.

You can see more of them on the Simon and BlogAssist pages.

This bundle also includes 10 other fine apps, for only $49.95. A bargain! Especially since you're getting a Standard license for Simon — for less than it normally costs by itself.

The included apps are:

  • iPhoto Library Manager
  • MYStuff
  • MyTunesRSS
  • PDFClerk Pro
  • Simon
  • Spyder
  • WebPrint Plus
  • Yum
  • Yummy FTP

Plus bonuses:

  • A-Dock X
  • BlogAssist
  • FolderGlance

12 apps for just $49.95 — a saving of over 85%!

Visit TheMacBundles.com to learn more, or to take advantage of this great deal.

In App Purchase for free iPhone apps

iPhone App StoreI've been meaning to follow up on this for the past few days. Back in March, I wrote a blog post titled "Apple, please support iPhone trial apps", where I urged Apple to reconsider their position that "free apps will always be free."

I discussed how not allowing free apps to use the new In App Purchase feature introduced in iPhone OS 3.0 was very limiting — this restriction prevented free trials of apps, as is very popular in Mac software, meaning that the only way a developer could provide a trial is to have two separate apps (e.g. Lite and Pro editions), which is more hassle for the developer and customers, including issues with migrating data.

So you can imagine how pleased I was when I learnt recently that Apple has removed this restriction. Now any app can use In App Purchase, including free ones. So now the trial distribution model is finally feasible.

There is no more need to release Lite and Pro editions. Developers can release a single application as a free download, perhaps with limited features, then enable people to purchase an upgrade to the "full" edition.

There are still some restrictions. The most common trial model for Mac software is a time-limited demo, where the application lets people evaluate it for a certain time period (e.g. 14 or 30 days), then disables some functionality if still not purchased. My Mac apps do this, as do most other "shareware" apps. This is not allowed on the iPhone App Store. iPhone apps have to be fully functional, and can't disable essential features.

But there are other things that can be done, like provide a basic set of functionality, and perhaps display ads, then the purchase provides extended functionality and removes the ads. So the app remains useful forever as a free app, but becomes more powerful (and without distracting ads) if the user chooses to purchase.

This is what I plan to do for my future iPhone apps. For the secret project I'm working on now, I'll release it as a free app, with ads and perhaps some feature limits (but nothing that impinges on the usability), then offer In App Purchase to disable the ads and extend the functionality.

It looks like it'll be quite easy to set up; for this sort of situation, it appears that the purchase can be handled entirely via Apple's server, storing the purchase in the iTunes account, enabling multiple phones used by that account to use the full app (e.g. when buying a new phone).

I haven't decided on terminology for this yet... call the purchased upgrade the "Paid" or "Premium" edition, or something else.

It'll be most interesting to see how many app developers adopt this technique. I've seen a few so far, and expect it to be quite popular, especially with the indie developers who are used to this kind of distribution model.

But, thank you Apple!

A fork of DSActivityView: WTFeedbackView

iPhone developers: you may have seen my DSActivityView open source project. Another developer was inspired by it, and created his own variation, WTFeedbackView, with support for progress bars, among other changes.

Here's his introduction:

WTFeedbackView is a class to display a HUD-like view with either an activity indicator view or a progress view. It's based on DSActivityView by David Sinclair (http://www.dejal.com/developer/dsactivityview), with some significant additions and modifications.

More specifically, WTFeedbackView offers:

  • Client access through a single class, by means of class methods only, for all features;
  • Changes to the text being shown trigger an animation that resizes the HUD view appropriately;
  • Three built-in styles (like DSActivityView):
    • Simple style: displays a transparent view containing an activity indicator view next to the text explaining the ongoing activity;
    • Bezel style: displays a dark semi-transparent view containing either an activity indicator view or a progress view, above the text explaining the ongoing activity;
    • Keyboard style: same as the Bezel style, but covering only the keyboard;
  • Three built-in kinds:
    • Activity kind: displays only an activity indicator view, plus the text explaining the ongoing activity;
    • Progress kind: displays only a progress view, plus the text explaining the ongoing activity;
    • Flexible kind: contains both an activity indicator view and a progress view (plus the text explaining the ongoing activity), but displays only one at a time, on demand. This is useful when the ongoing activity has parts whose lengths are sometimes known and sometimes unknown. Rather than create a new feedback view for each part, a single one can be used, minimizing screen distractions;
  • Easy updating of the progress view, through a class method +updateProgress: (CGFloat) progress;
  • Thread-safety where needed. For instance, +updateProgress: can be safely invoked from a background thread;
  • Possibility to subclass WTFeedbackView to create custom feedback views having the general behavior of WTFeedbackView but looking differently.

Although iPhoneOS 3.x isn't a requirement, WTFeedbackView and the demo were compiled using iPhoneOS 3.1.2. They were *not* tested on any version prior to 3.x, so don't assume they will work with 2.x.


I'm hosting it for him: download now.


As you may have noticed, I'm fascinated with multi-touch interfaces. I just saw an interesting concept that proposes a desktop-based multi-touch system that avoids the need for touching a screen directly (which has issues of fingerprints, muscle strain, and obscuring the view), plus an interesting desktop usage metaphor.

I'm not entirely sold on it, but it definitely has some potential. I'm really not sure how well the proposed windowing system would scale — I currently have 23 windows open between all my apps, and often have more; their system of scrolling through them could be cumbersome, though the zooming out overview might be okay.

They also seem to reserve most multi-touch gestures for managing the windows, which could limit what apps can do with them.

Anyway, check it out; it's a fascinating concept, and a good description of some potential issues with more conventional approaches:

10/GUI from C. Miller on Vimeo.

I'm an introvert, and I'm okay

I read an article that really resonated with me a while back, that was written a few years ago. It was entitled "Caring for Your Introvert", written by Jonathan Rauch in The Atlantic.

In the article, he clearly defines what an introvert is, and how we are perceived by extroverts. Yes, I am most definitely an introvert. But that doesn't mean I'm antisocial or unpleasant. It just means that I and other introverts are energized by being alone, instead of by interacting with other people.

Leave an extrovert alone for two minutes and he will reach for his cell phone. In contrast, after an hour or two of being socially "on," we introverts need to turn off and recharge.

So very true. I enjoy spending time with friends and attending conferences and such, but tend to hang back and observe rather than directly interact, and even so I feel drained afterwards, exhausted by the social interactions.

People who don't know me or other introverts well might be concerned that I'm suffering in some way, perhaps feeling left out... but it's really the way I prefer things.

We tend to think before talking, whereas extroverts tend to think by talking, which is why their meetings never last less than six hours.

Amusing, but not much of an exaggeration. Which is one reason why I prefer to communicate with clients and others via email, rather than phone conversations. I want to think through my response in peace and quiet, without meaningless niceties filling in the dead air.

So if you're an extrovert and you see a quiet person, don't be concerned. We're just fine, thanks.

Nice video of Portland, Oregon

My wife and I moved from New Zealand to Portland, Oregon back in 2001. It's a great city, with a nice friendly "small town" feel but the amenities of a big city. This brief video show a lot of the great things to see and do around Portland:

iPhone Open Source: detect tap outside a button like table's Delete

This blog post has been replaced by a newer edition.

Please see blog posts on DejalView.

Sorry customers, another development blog post. :)

For a new iPhone app I'm working on (shh), I have a button that I wanted to behave like the Delete button in a table view. You know, when you tap the delete toggle to the left of a cell, a red Delete button appears. And tapping anywhere other than that button will hide it without doing anything else:

Table Delete button
(Contacts app)

I couldn't see any obvious way to do it, so asked on the iPhone Developer forums, and got a helpful reply suggesting a UIWindow subclass, overriding -sendEvent:.

I tried implementing that, but what I really wanted was to override -hitTest:withEvent:, since I wanted to block taps on views other than a specific button, and the documentation says one should always invoke the superclass of -sendEvent:.

Then I noticed that -hitTest:withEvent: is actually defined in UIView, and further experimenting with the table Delete feature showed that it appears to be implemented UITableView, since the cancel tap behavior only occurs in the table, not the navigation bar or toolbar. Besides, implementing in a UIView subclass is more focal, so a better choice.

So here is my UIView subclass to do this. It uses a delegate approach, with a protocol to declare the method:

@class DSView;

@protocol DSViewDelegate

- (UIView *)view:(DSView *)view hitTest:(CGPoint)point
withEvent:(UIEvent *)event hitView:(UIView *)hitView;


And the actual subclass interface; as conventional, the delegate is not retained:

@interface DSView : UIView
id DS_viewDelegate;

@property (nonatomic, assign) id viewDelegate;


With the implementation just overriding the hit test method. It simply invokes the superclass then gives the delegate a chance to change it (or perform some other action) if it implements the delegate protocol method:

#import "DSView.h"

@implementation DSView

@synthesize viewDelegate = DS_viewDelegate;


Overrides this method to add support for the -view:hitTest:withEvent:hitView view delegate behavior.

Written by DJS 2009-09.

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event;
UIView *hitView = [super hitTest:point withEvent:event];

if ([self.viewDelegate respondsToSelector:
return [self.viewDelegate view:self hitTest:point
withEvent:event hitView:hitView];
return hitView;


To use this, simply change a container UIView to DSView in the view hierarchy, then set the delegate property to your view controller (via code or IB):

self.view.viewDelegate = self;

Then implement the -view:hitTest:withEvent:hitView: delegate method in your view controller, e.g. as follows — this will cause a tap on some special control to go through as normal, but tapping anywhere else in the view will hide the special control, without passing the tap on to whatever was actually tapped:

- (UIView *)view:(DSView *)view hitTest:(CGPoint)point
withEvent:(UIEvent *)event hitView:(UIView *)hitView;
if (hitView == someSpecialControl)
return hitView;

someSpecialControl.hidden = YES;

return nil;

I hope this is useful to someone else too.

You can get the code from my Dejal Open Source Subversion repository via this Terminal command:

svn checkout http://dejal.svn.beanstalkapp.com/open/DSView

Or browse the source directly on the web.

If you haven't seen it already, check out DSActivityView, too.

DSActivityView updated

This blog post has been replaced by a newer edition.

Please see blog posts on DejalActivityView.

DSActivityViewI've committed a minor update to the DSActivityView open source project for iPhone. See the DSActivityView introductory post for more information, including a video demo.

This update adds a showNetworkActivityIndicator boolean property. It is NO by default, but if set to YES the network activity indicator in the status bar will be displayed, and automatically hidden when the DSActivityView is removed.

You can toggle this property as needed while the activity view is in use. For example, you might have the network activity indicator appear while fetching some data from the internet, then disable it while parsing it (while the activity view is still visible).

Of course, you can easily show and hide the network activity indicator yourself, but this tweak saves having to remember to disable both it and the DSActivityView.

You can set this property via:

[DSActivityView activityViewForView:self.view].showNetworkActivityIndicator = YES;

or to toggle it on an already-visible activity view:

[DSActivityView currentActivityView].showNetworkActivityIndicator = YES;

You can get the project from my Dejal Open Source Subversion repository via this Terminal command:

svn checkout http://dejal.svn.beanstalkapp.com/open/DSActivityView

Or browse the source directly on the web.

Syndicate content