David Sinclair's blog

Having RSS issues

I'm having issues with my RSS feed. Sorry about that. I think I've fixed it, so this is a post to see if it's working now, as well as to apologize for the issues.

I think it happened as a result an update to the Drupal CMS I use.

BlogAssist 2.1.2 released

BlogAssist version 2.1.2 is now available.

BlogAssist is a helpful tool; it adds a system menu (on the right-hand-side of the menubar) with a list of operations that can be performed on text. You can copy some text, choose an operation, and paste -- the text will be marked up based on the chosen operation. The operations include HTML and forum markup. If you prefer, a floating palette is also available (to drag the text), or you can mark up inline by selecting text in your web browser or editor application, hitting Cmd->, and choosing the operation in a small window that appears, then click OK to substitute it right in the app.

Very handy... I use BlogAssist daily. For example, the product icon, release notes link, and download link in this blog post were generated very simply by BlogAssist.

Anyway, this update adds German localization, improves the French localization, plus a few other changes.

Download now!

Simon 2.3.5 released

Simon version 2.3.5 is now available.

This update includes lots of changes, as follows. I considered calling it version 2.4, but strictly speaking all of the changes are improvements or fixes, not new features, which is my rule for bumping the second digit:

  • Improved the notifications to avoid notifying again if the test is already failing; it used to notify again if the error was slightly different, but that's usually just annoying. You can turn off the "Only notify once for each failure" checkbox to get repeatedly notified until recovery.
  • Improved the SSH service to avoid protocol identification warnings in the Console.
  • Fixed an issue with the FTP service where it had the wrong default protocol, which caused the incorrect Edit Test view to be displayed.
  • Improved the FTP service to work with the Security section of the Edit Test window, allowing checking secure FTP sites (without having to prepend the username and password to the URL).
  • Fixed a bug with the Basic service plug-in where it would mistakenly look for cookies for FTP services, which while harmless most of the time, can cause crashes in some situations.
  • Fixed a bug in the MySQL notifier plug-in where the Password field wasn't enabled correctly when using notifier-specific authentication.
  • Fixed a minor typo in a couple of report templates.
  • Fixed the tooltip for the "keep backup" checkbox in the Advanced preferences.
  • Enhanced the URLs for the Help menu to better support localization.
  • Updated the built-in Kagi purchasing tool to the latest version, which fixes some issues with Leopard.
  • Updated the French localization.

Download now!

Black Friday specials

Dejal cornucopiaHere in the US it's Thanksgiving Day tomorrow, which is traditionally followed by "Black Friday", a day of big discounts at retail outlets.

In keeping with that tradition, I'd like to wish you all a happy Thanksgiving and offer my own discounts. Until the end of the weekend, you can get big discounts of all of my products via the Dejal Store - no coupon or special code needed.

Save up to $50 on a Simon license, and similar large discounts on the other products. Hurry, this offer expires on 2007-11-25!

Happy Thanksgiving!

Caboodle 1.1.3 released

Caboodle, the handy snippet keeper tool, is now at version 1.1.3.

This bug-fix update addresses a bug with opening attachments: if you happen to have two attachments in Caboodle entries with the same name, and open both of them, Caboodle might have opened the first file again instead of the second one, thinking it was the same file. This is because the attachments are saved to a hidden temporary folder before they are opened. Now, Caboodle saves each attachment in a unique sub-folder, ensuring that files with the same name are still treated as different.

This update also adds German localization, kindly done by Ulf Dunkel of DSD.net, along with a few minor tweaks that came up during localization. Ulf will act as a reseller of Caboodle for German-speaking customers. Please purchase via his store to give him a cut of the proceeds.

This version is (as far as I can tell!) fully compatible with Leopard, and back to 10.3.9.

Download now!

Cocoa: custom attachment in a text view

I recently posted a query to CocoaDev asking for help with inserting a custom attachment cell into a text view. I had spent quite some time investigating and experimenting, and searches showed several people who had the same question, but no satisfactory answers. Some comments I read suggested subclassing NSTextView, which I tried, but not very satisfactorily.

Fortunately, Douglas Davidson was kind enough to point me in the right direction, combined with helpful off-list discussion with another developer who was working on much the same problem.

I thought I'd share my solution here, in case it helps anyone else. It turned out to be easier than I'd expected. Note: this is written for Leopard with Garbage Collection, so doesn't have releases etc.

Firstly, a file wrapper is used to create a placeholder TIFF with a special "sub-extension" to identify it. I could store any kind of data, but I use a placeholder image so if the user pastes the text into another app, it shows up as something nicer than a generic document icon. The identifier is a unique reference to the data that the attachment represents:

- (NSFileWrapper *)fileWrapperWithIdentifier:(NSString *)identifier;
{
    NSString *wrapName = [[identifier stringByAppendingPathExtension:@"myspecialmarker"] stringByAppendingPathExtension:@"tiff"];
    NSSize size = {100, 18};
    NSData *data = [[NSImage imageNamed:@"AttachmentPlaceholder"] TIFFRepresentation];
    NSFileWrapper *wrapper = [[NSFileWrapper alloc] initRegularFileWithContents:data];
   
    [wrapper setFilename:wrapName];
    [wrapper setPreferredFilename:wrapName];
   
    return wrapper;
}

This method inserts the attachment with the above wrapper and my custom cell:

- (void)insertMarkerWithIdentifier:(NSString *)identifier;
{
   NSFileWrapper *wrapper = [self fileWrapperWithIdentifier:identifier];
   NSTextAttachment *attachment = [[NSTextAttachment alloc] initWithFileWrapper:wrapper];
   MyAttachmentCell *cell = [MyAttachmentCell new];

   cell.identifier = identifier;
   [attachment setAttachmentCell:cell];

   [[myTextView textStorage] appendAttributedString:[NSAttributedString attributedStringWithAttachment:attachment]];
}

I use a couple of text view delegate methods to write the cell's file wrapper to the pasteboard as file contents, allowing it to be copied, dragged, and saved to disk with the text:

- (NSArray *)textView:(NSTextView *)aTextView writablePasteboardTypesForCell:(id <NSTextAttachmentCell>)cell
             atIndex:(NSUInteger)charIndex;
{
   return [NSArray arrayWithObject:NSFileContentsPboardType];
}

- (BOOL)textView:(NSTextView *)aTextView
       writeCell:(id <NSTextAttachmentCell>)cell
         atIndex:(NSUInteger)charIndex
    toPasteboard:(NSPasteboard *)pboard type:(NSString *)type;
{
   if (type == NSFileContentsPboardType)
       [pboard writeFileWrapper:[[cell attachment] fileWrapper]];

   return YES;
}

And to convert the attachment back to my custom cell after pasting/dragging/loading it, the text storage delegate (which is set via [[myTextView textStorage] setDelegate:self];). It looks for TIFF attachments that have my special marker "sub-extension" but aren't using my custom cell, and replaces their cell with my custom one:

- (void)textStorageWillProcessEditing:(NSNotification *)note;
{
   NSAttributedString *text = [myTextView textStorage];

   if ([note object] != text)
       return;

   NSUInteger length = [text length];
   NSRange effectiveRange = NSMakeRange(0, 0);
   id attachment;

   while (NSMaxRange(effectiveRange) < length)
   {
       attachment = [text attribute:NSAttachmentAttributeName atIndex:NSMaxRange(effectiveRange) effectiveRange:&effectiveRange];

       if (attachment)
       {
           if ([attachment isKindOfClass:[NSTextAttachment class]] &&
               ![[attachment attachmentCell] isKindOfClass:[MyAttachmentCell class]] &&
               [[[[attachment fileWrapper] preferredFilename] pathExtension] isEqualToString:@"tiff"] &&
               [[[[[attachment fileWrapper] preferredFilename] stringByDeletingPathExtension] pathExtension] isEqualToString:@"myspecialmarker"])
           {
               MyAttachmentCell *cell = [MyAttachmentCell new];
               [cell setIdentifier:[[[[attachment fileWrapper] preferredFilename] stringByDeletingPathExtension] stringByDeletingPathExtension]];
               [attachment setAttachmentCell:cell];
           }
       }
   }
}

The custom attachment cell is a subclass of NSTextAttachmentCell, to simply draw in a custom way.

I hope this is helpful to others.

Dejal and Leopard

LeopardAll the cool kids are doing it, so it must be my turn....

Mac OS X 10.5 "Leopard" is available tomorrow. It's a great update, that I've mostly enjoyed using for the past few months, so I highly recommend it to everyone. But an important consideration is always: will my existing software run on the new OS version? So here's a summary of the Leopard compatibility status of Dejal products, as far as I'm aware.

I should point out that this is based on a recent seed (pre-release version): Mac developers don't get the final version of Leopard any sooner than you do... and in fact get it later if they wait for the copy Apple sends as part of the Apple Developer Connection membership. There's been a bit of an uproar about that, but it was the same with Tiger, and will probably be the same again with the next big cat. Such is life.

Simon: My website and server monitoring tool runs fine under Leopard. It has been updated to use Leopard's window style for the Monitor window when running under 10.5, or the custom window style under 10.4 or 10.3.9. I plan on making several more Leopard improvements in a future version.

Time Out: Version 1.5 of this break reminder app was released not long ago, which added Leopard compatibility. It has no known issues with 10.5. Work on version 2 is underway (though currently paused); you can expect that in Q1 2008. It will require a minimum of 10.5, as it leverages several Leopard technologies.

Caboodle: This handy snippet-keeper app is also Leopard-ready as of the current release, version 1.1.2. I have big plans for Caboodle over the coming year, once I've done the other updates.

Narrator: My fun speech synthesis app hasn't been updated for a number of years, but appears to run okay under Leopard. I am currently working on a long-overdue new version of it -- actually a complete rewrite. The new version requires a minimum of Leopard. Watch the Dejal blog for more information about that as it progresses.

BlogAssist: This useful HTML markup tool is Leopard-ready as of the current release, version 2.1.1. It will also see some improvements in 2008, using technology being developed for Time Out.

Macfilink: My affiliate link cloaking app hasn't had an update for Leopard yet, but it seems to work okay. I haven't decided what to do for its next update, but it's possible I'll replace the data storage with Core Data for the Leopard update. It's the lowest priority, as this app does one job and does it very well as-is, so it doesn't need much tinkering.

So there you go. I hope you enjoy Leopard as much as I do. Please let me know if you discover any compatibility issues, but as far as Dejal products are concerned, you should be good to go!

Possible Dejal site downtime this week

The Dejal site will be moving to a new server at a new data center sometime this week, as part of a planned migration that my web host is performing. Hopefully this will result in improved reliability and performance of the server. But in the meantime, the site may be offline for a while.

They assure me that there shouldn't be any noticeable downtime, or only for a few minutes. But you never know with such operations, so I thought I'd provide warning here. Apologies in advance if you try to access the Dejal site and get an error. Please just try again later if you do.

Rest assured that I will be closely monitoring the situation (via Dejal Simon, of course!), and will do what I can to minimize any downtime.

Simon 2.3.4 released

Just a couple of days after version 2.3.3, here's another bug-fix update for Simon.

I really don't like doing releases so close together, and apologize for any inconvenience... but I figured that it was soon enough that many people wouldn't have got the weekly update notification yet. And the issue this update fixes affected a reasonable number of people, so was important to address quickly.

The main point of this update is to fix Mac OS X 10.3.9 compatibility, which was broken in the 2.3.3 release. It also fixes a minor bug with the status menu, that nobody has reported (or probably noticed), but was worth fixing regardless.

So, how was 10.3.9 compatibility broken, you may ask? Well, I develop on my MacBook Pro under Leopard, but it doesn't have the compiler for 10.3.9 installed. So to do a release I open the project on my PowerMac G5 running Tiger, do a clean build there, plus update the localization, then package the release up in a disk image and upload it back on the MBP. It's a little convoluted, but doesn't really take much longer than just using one machine, since both computers are on my desk, and I can open the project via file sharing.

Anyway, the important part there is a "clean" build -- if I forget to clean the code (i.e. throw away already-compiled binaries and re-compile it), the app won't work on 10.3.9. This has bitten me a few times, though I usually catch it quickly.

Of course, this issue will go away in due course, as each app is upgraded to require a minimum of Leopard -- which will happen over the next year or so.

So, sorry again if you upgraded to Simon 2.3.3 and have to upgrade again. Only about 5% of Simon customers are using 10.3.9 still, but that's enough people to make this quick update worth doing. If you are using Tiger or Leopard, you could skip this update... but there's no harm in updating, too, especially if you didn't already update to 2.3.3.

Download now!

Simon 2.3.3 released

Version 2.3.3 of Simon, the website and server monitoring tool, has now been released.

It is an important update, recommended for all Simon customers. Apart from some minor updates to the German localization and Growl support, it also includes three important changes:

Firstly, the way the test scheduling works has changed. In recent previous versions, I had added a "secret" preference called overlap prevention, which was on by default. This prevented more than one test from being automatically checked at once, as a way to reduce the load on the machine and ensure accurate checking times. The problem with this, though, is it could cause some tests to never get checked if the tests table is sorted by Next Check date and there are lots of tests, as they become queued but are never reached. This was because it scans for candidates to start in the sort order, and always found another queued one before the earlier queued one. Kinda convoluted, and only affecting a few people, but there it is.

This release goes back to allowing multiple tests to be checked at once, but changes things so they are started at least one second apart, even if they fall due at the same time. It uses the same checking interval as set in the Advanced preferences for checking all or multiple selected tests. It still scans in sort order, but it adds all due tests to a queue and starts them one second apart, ensuring that the computer isn't overloaded.

Another important change is to fix a bug in the Edit Test window. I spent a couple of vexing days tracing this, with the most valuable help of a customer. The mystery was that Simon seemed to be forgetting about notifiers assigned to tests in some random conditions. I couldn't recreate it, and added logging to trace what was happening to the data, and nothing seemed missing. Yet when the customer viewed the test configs, sometimes it'd only list one notifier when there should be three or so assigned to the test. Yet if he added the notifiers back, the next time he checked the missing ones would be back, along with the new ones. Wacky!

It turned out that this mysterious situation was just a cosmetic issue. No notifiers were being lost. What was happening was the disclosure triangles were interfering with the loading of the lists of notifiers (and auto-pause and reports). If the disclosure was in a collapsed state when the window was opened, the notifiers list UI wouldn't be visible, so wouldn't be resized to show more than one notifier. If it was in an expanded state, all worked as expected. So the fix was simply to set the disclosure triangle state (and thus UI visibility) after loading the lists, rather than before. An easy oversight, but and important one!

Lastly, this update has several report enhancements. One is to allow digits in test short names (as used for URLs in reports), to allow for people who name tests like "UL102", "UL104", etc, i.e. differing only by digits. Another report change is to handle the file:// protocol better. When saving a report locally to the Desktop or some other location that isn't in the global or user-specific web sharing folders, the report is accessed via the file:// protocol rather than http://. That's all fine and dandy, but several report templates use directories for detail pages to provide tidy URLs, which doesn't work so well with the file:// protocol, as it opens directories as folders in the Finder. So this version solves that by adding the detail page (e.g. index.html) to the end of the URL. As part of that, it also adds a new report variable, SummaryPath, which is like BasePath but includes the index in the URL of the Summary page when saving to a file:// URL - useful for links from the detail pages back to the summary page.

Lots of good fixes and improvements. Download now!

I'm the MacTech Spotlight for October 2007

MacTech magazine has a monthly feature at the back of each recent issue called "MacTech Spotlight", where they devote a page to Q&As with a developer or other personality in the Mac community. They've talked with Paul Kafasis of Rogue Amoeba, Wolf Rentszch of Red Shed, and several others.

This month was my turn.

I haven't seen how the article turned out yet (my copy's in the mail), but hopefully it'll be okay. :) I talked about how I originally got into computers and programming, how Dejal got started, what I like about Apple and Mac OS X, how I come up with product ideas, and more.

For those interested, MacTech offers discounts on subscriptions - 60% off the cover price, or a limited-time offer of a six-month sub for only $9.95.

Simon tip: automatic offline support

One "hidden" feature of Simon is how it handles the situation when your computer loses its internet connection.

People sometimes ask me what Simon does in this situation, concerned that it would count as a failure for tests. Simon is smarter than that, though. Every time it starts a check, it first checks if the computer has a current internet connection, and only then performs the check.

If it determines that your internet connection has been disrupted, it places the test in an "offline" state, where it shows a blinking "lightning bolt" for the status icon until the connection is restored. This offline state doesn't count as a failure (or success).

Simon works out if you have a connection by seeing if it can resolve one of two popular domain names; if either work, your connection is probably fine, but if both fail, it is likely disconnected. Using two domains avoids a temporary outage of either one.

From version 2.3 onwards, you can disable this internet connection check on a per-test basis via the new Can check when offline checkbox in the Edit Test Checking Options. This is useful if you want to create a test to notify you when your connection goes down, or for tests that don't require an internet connection (e.g. using the Application or Script service plug-ins).

Test Options

Caboodle tip: alias a file instead of copy it

A quick tip for Caboodle, from the FAQ:

Normally when you drag a file into a Caboodle entry it copies it, allowing you to delete the original. But often you want to keep the original in place too, and want to avoid bloating Caboodle's data with large files (or folders).

The solution is to hold down the Control () key when dragging the file or folder to the Caboodle entry: the mouse pointer will change to include an alias symbol instead of the green plus. It will then make an alias (link) to the original. Then when you double-click on the file (or view it inline for images and PDFs), the original will open. Of course, in this case you shouldn't move or delete the original file.

Piwhacket: 1994 - 2007

Piwhacket, our beloved cat of about 13 years, passed away early this morning, following a week of veterinary treatment, due to kidney and heart troubles.

My wife and I got Pi as a kitten, shortly before we got married. She was named after a cat in the movie "Bell Book & Candle".

Pi was a great kitty, who enjoyed sitting on my lap while I work, despite bad eyesight making it harder for her to jump up. She had a cute "quack" sound she'd make when she wanted attention. When we were sick, she was always there to comfort us. She was our pretty princess. She is greatly missed.

Piwhacket

Piwhacket's opal eyes

Internet people commenting on the universe

A clip show! Here are three fun videos I saw in the last week or two. You may have already seen them, but they're enjoyable to watch again if so.

Firstly, Internet People, a fun song featuring lots of popular names in the blogosphere. I think I recognize most of these, though there are a few I don't. (Via WebbAlert - see that link for a list of everyone mentioned in the video.)

Next, a hilarious video on what a business meeting would be like in the style of web commenters... less well behaved ones than on Dejal, anyway! Warning: not suitable for work (NSFW):

Don't miss the followup from the same people, which is perhaps even funnier (and also NSFW).

Finally, an impressive video that starts out with an aerial view of a picnicking couple, then slowly zooms all the way out to 100 million light years from them... then back in again down to a microscopic level. Along the way, it includes an indication of the scale in powers of ten. Very impressive. (Via Dark Roasted Blend, a great site of interesting images and videos.)

And here's a similar scale-of-things site, as a clickable animation.

Enjoy!

Simon tip: shortcut for entering test URLs

The Web (HTTP) service is the most popular one for tests. So I thought I'd share a helpful tip with adding them.

When entering the URL, you can use very minimal text, and Simon will fill in the remainder when you click OK. It automatically adds the default protocol ("http://") and the "www." and ".com" if necessary.

For example, if you type "apple" (without the quotes), it will be saved as "http://www.apple.com/". Similarly, entering "dejal/simon" will end up as "http://www.dejal.com/simon/".

Web (HTTP) test

Happy anniversary, Dejal

Dejal anniversary

Today is the 16th anniversary of founding my company. 16 years ago today, on September 20, 1991, I started Dejal, with an aim to produce high quality Mac software. Actually, the exact date could be argued: I had used the Dejal name informally for years before that, as a kind of nickname for myself, and the company grew organically over time, with things like getting a commercial bank account and registering the name at different times during the growth. But September 20th was when historic evidence points to me having started treating my programming hobby as a business.

I had produced a bunch of freeware products beforehand, but my first shareware product was called SndPlayer, a Classic Mac app to play a bunch of sounds easily. It was started on October 24, 1991, and first released on February 24, 1992. It's still available on my site (now freeware), too.

Thanks to everyone who's purchased products or offered congratulations this week. You've still got a couple of days to take advantage of the anniversary specials:

Buy now with the anniversary discounts!

Be quick — these specials expire on Sunday, September 23, 2007.

Dejal's sweet 16!

Dejal anniversary

I first started selling Mac software under the Dejal name in September 1991... which makes this Thursday the 16th anniversary of the founding of the company. Wow... it's certainly been a while!

As a celebration of this event, I'm offering discounts on all of my products from today till the end of the week. No special codes or coupons required, but you need to use the online store, not the in-app purchasing tool, to take advantage of these low prices.

Buy now with the anniversary discounts!

Be quick — these specials expire on Sunday, September 23, 2007.

Choosing big cats

LeopardWhenever a developer does a major new release, one of the many issues that they need to consider is which OS versions to support. It's always a tradeoff: having the apps continue to work with older versions allows more people to use the product, whereas the more it is restricted, the more new OS features can be leveraged.

Let's explore the second point first. Each time Apple does an OS upgrade, they make some cosmetic UI changes, add new bundled apps, and so forth, but they also introduce new or improved development frameworks, APIs, and tools. For example, in Tiger (10.4) Apple introduced Core Data, a sophisticated database-driven data modeling and storage API, among others. While it is possible to use some new functionality by checking for its availability, some are more fundamental, so just have to be done without to maintain support for older OS versions.

Apple's Non-Disclosure Agreement forbids me to talk about the new features in their upcoming OS, Leopard (10.5), other than what has been publicly announced. But it should be clear from the available information that Leopard is one of their most significant OS updates, with numerous UI changes, and for developers, Objective-C 2.0, which includes fundamentally different memory management and other improvements.

Being able to leverage the new technologies in Leopard will offer a huge advantage in terms of the features that can be added, and the efficiency of the underlying code. To maintain compatibility with Tiger, a developer would either have to forgo these features, or write lots of code to emulate them. Certainly doable... but is it worth it?

That brings us to the other side of the equation: how many people would benefit from a release that supports an older OS? Thankfully, history provides some guidance. Of course, it should be pointed out that every market is different, and people find software in lots of ways. Lots of people, probably the majority, just pick up a few boxed software products when they buy their Mac at a local Apple store or other retailer, and never explore beyond that. They only need a few core apps, many of which come bundled with the Mac, and that's all they want.

While I'd love to bring my products to the attention of these people, the ones that most interest me are those who actively seek out third-party indie apps to enhance their Macs. This subset tend to be early adopters, often upgrading their computers every few years, and thus getting the new OS then, or they go out and buy the OS as soon as it is released, or perhaps after an update or two, to ensure it is stable. In fact, one could hypothesize that there is a strong correlation between the speed of upgrading the OS and that of upgrading third-party apps. Or put another way, if someone isn't interested in keeping the OS up-to-date, they are probably less interested in keeping third-party apps up-to-date, or even trying third-party apps.

I have tracked OS versions of people using my products, as many other developers do, and these numbers support this hypothesis. For fascinating interactive charts showing the OS versions and other attributes of the Omni Group's customers, see their update charts.

So, there seems to be little benefit in maintaining support for older OS versions, and several benefits from being able to leverage the new technologies.

As for my own products, I do plan to require Leopard when I next do major upgrades of each product, but they will be phased in over time. I will continue doing updates that support 10.3.9 and later in the meantime. Even after the major upgrades, the older releases will continue to be available for customers who aren't ready to upgrade their OS. Hopefully that will keep most people happy, while allowing me to move forward.

New Zealand and the US: a comparison

As some of you may know (if you've read the About Dejal page), I was born in New Zealand, and moved to the US in 2001. I'm a citizen of both countries, and both have special places in my heart.

As a fun distraction yesterday, and to satisfy something I've been curious about, I superimposed a map of New Zealand (and a portion of nearby Australia) on one of the US, using the same scale for each. I lined up New Zealand's east coast with the US's east coast, being a similar angle.

The result is quite fascinating. It shows that New Zealand is about the same size as the small east coast states of the US, and where I am in Portland, Oregon is an equivalent distance from New York (say) as between Auckland, NZ and two-thirds of the way across Australia.

USA with NZ and Oz superimposed

Some interesting statistics (numbers from Wikipedia): New Zealand has a land area of 103,738 square miles and a population of 4,228,000. Compare that to the US's area of 3,718,695 square miles and population of 302,394,000... bit of a difference! Interestingly, the state of Oregon has an area of 98,466 square miles and population of 3,421,399 - both only a little smaller than the entire NZ.

I also did another comparison image, this time with Greater Auckland (NZ's largest city, actually a metro area made up of four cities) superimposed on Greater Portland (a medium-sized US metro area, Oregon's largest city). The size difference wasn't all that great this time, unsurprisingly; both Auckland and Portland have similar population sizes. In numbers, Auckland has a size of 419 square miles and population of 1,329,900, while Portland covers about 600 square miles with about 2 million people. Both have constraints on growth, too: Auckland has two harbors limiting growth, and Portland has very firm urban growth boundaries.

Portland with Auckland superimposed

What does all this mean? Nothing profound. The US is big. NZ is small. NZ is about the same size as Oregon. Auckland is about the same size as Portland. Whatever the sizes, they are both great places to live.

Oh, and I'm entirely too fascinated with maps. :)

Syndicate content