Thursday, December 31, 2009

Day 8: 12 Days of Promo Codes for iTimeZone for iPhone/iPod touch

iTimeZoneDay 8 of Tangerine Element's 12 Days of Promo Codes for iTimeZone is also late, I promise I will catch up tomorrow! I was wrapped up in my first play of Assassin's Creed II...


You can read about the promotion here.

Wednesday, December 30, 2009

My Top 10 Video Games of the Decade

Since I banged out a Top 10 Movies of the Decade list, I figured why not put together a list on something I spend a lot more time doing than watching movies.

This list is primarily console games, my experience this decade has been on the Dreamcast, Xbox, Xbox 360, PlayStation 3, Wii, and just the one computer game, but it's a doozy. The system listed next to each title is how I played the game, not necessarily all the systems the title appears on.

  1. World of WarCraft - Mac OS X
    • No game has changed the video game landscape more in the last decade than WoW
    • My own struggles with addiction to this game have inspired a pretty good chunk of my blog posts
  2. Bioshock - Xbox 360
    • The first game I can remember playing that presents an agonizing, emotional, moral choice to make
    • Not only the moral choice makes this game special, but the story of what happened to an Ayn Rand-ian laissez faire scientific society free of all restrictions was a powerful one
    • See my full review
  3. Halo Trilogy - Xbox-Xbox 360
    • The Xbox would not have survived or certainly made it into the current generation without this franchise.
    • Local and online multiplayer pioneer with Xbox Live
  4. Uncharted 2 - PS3
    • There has been no more cinematic experience than this game.
    • Showed how powerful the PS3 really is with incredible graphics.
  5. Batman - Arkham Asylyum - PS3
    • Most licensed games suck, and certainly all Batman games have sucked, until this game
    • This wasn't just a great Batman game, it would have been a great game even if you didn't have Batman at all
  6. Wii Sports - Wii
    • You can't deny, even if it's just a collection of mini-games, that this title demonstrated believable, usable motion controls for the first time in a home console
    • In-person multiplayer opened people's eyes that the market for video games could be ages 5-85
  7. Rock Band 2 - Xbox 360
    • Pushed the music game experience from solo to group play and added an in-game song store which constantly adds new content to the game
  8. Super Mario Galaxy - Wii
    • Go read my full review, it says it all.
    • Well not all, this is the only game on this list I couldn't finish. I just got to a certain point where I couldn't figure out how to get to the next world and gave up. That has certainly dropped the game in my decade ranking.
  9. NFL 2K1 - Dreamcast
    • Redefined football games with better announcers, graphics, and play calling. I still remember seeing the close-up replays from across the mall when seeing a promo for this game and thinking when did EB Games get football on TV, only realizing it was a game when I got closer
  10. The Orange Box - Xbox 360
    • With Half-Life 2, HL2: Episodes 1 & 2, Portal, and Team Fortress, this was the most value packed video game bundle to ever arrive
    • It also helped that all the games are amazing. Half-Live 2: Episide 3 (or maybe it's Half-Live 3 now, the next episode is taking so long) has to be one of the most anticipated games of the 2010's

Day 7: 12 Days of Promo Codes for iTimeZone for iPhone/iPod touch

iTimeZoneDay 7 of Tangerine Element's 12 Days of Promo Codes for iTimeZone is late! It could be because I was laughing so hard at The Hangover...


You can read about the promotion here.

Tuesday, December 29, 2009

My Top 10 Movies of the Decade

Everyone's doing it, so why not:

  1. The Dark Knight
  2. Children of Men
  3. Memento
  4. Batman Begins
  5. Avatar
  6. Lord of the Rings - Extended Edition
  7. Casino Royale
  8. The Incredibles
  9. Master and Commander: The Far Side of the World
  10. Star Trek

Monday, December 28, 2009

Day 6: 12 Days of Promo Codes for iTimeZone for iPhone/iPod touch

iTimeZoneDay 6 of Tangerine Element's 12 Days of Promo Codes for iTimeZone sadly will not be able to erase the sting of losing all progress in New Super Mario Bros. Wii when son 1.0 & I died:


You can read about the promotion here.

Sunday, December 27, 2009

Day 5: 12 Days of Promo Codes for iTimeZone for iPhone/iPod touch

iTimeZoneBetter late than never and a very poor consolation prize for the NY Giants being humiliated by the Carolina Panther's today, but Day 5 of Tangerine Element's 12 Days of Promo Codes for iTimeZone is here:


You can read about the promotion here.

Saturday, December 26, 2009

Day 4: 12 Days of Promo Codes for iTimeZone for iPhone/iPod touch

iTimeZoneThe perfect cure for your after Christmas hangover is Day 4 of Tangerine Element's 12 Days of Promo Codes for iTimeZone


You can read about the promotion here.

Friday, December 25, 2009

Day 3: 12 Days of Promo Codes for iTimeZone for iPhone/iPod touch

iTimeZoneMerry Christmas! Tangerine Element's 12 Days of Promo Codes for iTimeZone is the perfect enhancement to an already wonderful Christmas morning. You can read about the promotion here.


Thursday, December 24, 2009

AdMob's Metrics on iPhone OS Version Share

Looks like I'll be supporting iTimeZone on iPhone OS 2.2.1 for a while yet if AdMob Metrics are correct.

This might be hard since the only 2.2.1 device I have is the iPhone Simulator. All my attempts to downgrade the iPod touch from 3.0 to 2.2.1 have failed.

Day 2: 12 Days of Promo Codes for iTimeZone for iPhone/iPod touch

iTimeZoneIt's Christmas Eve and gift shopping is finally done, but Tangerine Element's 12 Days of Promo Codes for iTimeZone is just getting started! Day 2 of promo codes are posted below. You can read about the promotion here.


Wednesday, December 23, 2009

World of WarCraft: Ninja Raiders

Jeff Atwood tweeted about this YouTube music video WarCraft Ninja Raiders sung to Beyonce's Single Ladies and I just had to post it since I am back in the WoW habit and had minimized the game to read some stuff before continuing the grind.

12 Days of Promo Codes for iTimeZone for iPhone/iPod touch

iTimeZoneIn the spirit of the holidays and giving gifts, Tangerine Element has started the 12 Days of Promo Codes for iTimeZone, only on the App Store. To kickoff the promotion, I've tweeted the first batch of promo codes already and here are the same reposted below. For the next 11 days, I will blog another batch of promo codes. This promotion is only valid for users of the U.S. App Store.


Every release of iTimeZone brings with it new Promo Codes to give away free copies of paid applications to users of the U.S. App Store. At Tangerine Element, I try to use all the promo codes available by giving them away. iTimeZone 1.3.1 is the current version on the store, and I have been working on a bug fix release, 1.3.2, for submission to the App Store after the holidays. Since the promo codes available will reset soon, and I hadn't used any codes for 1.3.1, seemed like a good time to set them all free.

Friday, December 11, 2009

Used MacBook for sale on eBay

If you are looking for a used MacBook, I posted one for sale on eBay last night.

Check the listing for details, but its 2 year 10 month old with AppleCare until Feb 2010 in excellent condition. My wife used it mostly for Web browsing and spreadsheet crunching, with the occasional viewing of Twilight.

Took 2 tries and one deadbeat buyer, but the laptop was finally sold.

Monday, December 07, 2009

Retro Review - Star Trek: Nemesis

Or as I like to think of it, the one that nearly sunk the franchise. Why watch it again? I didn't intend to make this a series after my recent Star Trek: First Contact review. I was at the library with my son and saw this on the DVD shelf and thought: "He can watch this. It can't be as bad as I remember it". Wow was I wrong. I still don't think it's as bad as Star Trek: Generations, but it's close. What went wrong?

It's so cheap it affects the plot
Of course this has happened before in Star Trek. Until J.J. Abrahms Star Trek, Trek movies were always made as cheaply as they could be. Extensive set reuse across all shows, reuse of effects (e.g. Klingon Bird of Prey explosion from both Star Trek VI & VII), and Starfleet only having the exact number of ship configurations for a long time that had made movie appearances. What happened in Nemesis?

Geordi is a parody of an engineer. Georgi never leaves the bridge. It's obvious the producers never wanted film anything more in Engineering once the shield (finally?) is put on the warp core. I guess extras cost to much money. There is one scene near the end of the movie that is laughably bad. The Enterprise takes another massive shot from the Romulan ship Scimitar, and transporters go offline. Georgi taps a few buttons on his screen and then gives up. He gives up. If this were Georgi from any previous Star Trek movie, or hell Scotty, engineer's don't give up, they keep trying stuff, even crazy stuff, until they save the ship.

Horrendously bad special effects. On the Scimitar, the hallways are wide for the couple phaser fights in them, but it's clear there are only one or two corridors. There is a hallway extension painting that is huge, but it's so obvious when watching the film "hey, there's a painting at the end of that hallway" it completely takes you out of the film. Also, the Romulan super weapon (I can't spell it) effect is bad CGI. The external CGI shot of the Romulan senate is also cheap CGI, and it's used twice.

Romulan Super Weapon on the Bridge?!? It just makes no sense at all that the Romulan Super Weapon power plant would be at the top of the bridge. It's crazy that isn't in engineering. Cearly the producer's just didn't want to design and build a Romulan engineering set. Obviously, showing engineering on any ship was off limits on this film, you have to show engine FX then.

Bad Music
Not all the music is bad, there is the appropriate use of the Star Trek theme from Star Trek The Motion Picture. Unbelievable, this is Jerry Goldsmith. What went wrong here? It pretty much comes down to much sythensizer that says "old tyme science fiction movie" and the "crazy strings" when the Romulans really go off the rails. This double-whammy of bad music is right in the opening Romulan senate scene, and I start to giggle as soon as I hear it.

Slow Moving Plot and Bad Choices
Shinzon and Picard talk to much about themselves when we everyone in the audience knows Picard and Shinzon are nothing alike in action. But that is only the least of the offenses

Boring Super Weapon. There is absolutely no tension behind what the Romulan Super Weapon can do, you are shown in the first scene. You know somebody called the Remans, have taken over. But you don't know who they are, all you know is they have a super weapon. The movie would have been much better to open on Riker and Troi's wedding.

How did Shinzon get his hands on beta Data? I could easily be mistaken, but I don't remember an explanation of where B4 came from, only that Shinzon got his hands on one and planted it in Death Valley, I mean a planet close to the neutral zone. How come Data has never heard of him before (I kill me with these puns)?

When did the Enterprise crew get lobotomized? Continuing on from the previous point, didn't anyone think that the sudden discovery of a beta Data near the Romulan Neutral Zone, on the way to a meeting with the Romulans, was a tad coincidental? How does Shinzon know the Enterprise is constantly scanning for positronic signals? How much radiation is Data emitting for a ship thousands of light years away to detect? But it gets worse.

Does no one on the Enterprise realize that while flying back to rendezvous with a fleet they are going to lose communications in a rift? Data, Picard, Georgi, hell even a red shirt navigator should have told you that. The flagship crew shouldn't be surprised they have plotted themselves into a trap!

Special Mention: Eyelight on Troi while she telepathically "zero's in" on the Viceroy. The whole rape of Troi could have been a powerful moment, the first moment in the bedroom mostly was, but then they ruin it by putting the eyelight on Troi while she tries to correlate the Scimitar's position by telepathy. Further, has no ever thought "Hey Troi, can't you read the emotions of an enemy ship cloaked?". I know there were TV show episodes where she read the intentions of aliens on other ships, does the cloak break this? How come no one asks her?

Nemesis == 80% Wrath of Khan
No mincing words (see I can do it too), Nemesis is almost a direct rip-off of Wrath of Khan. The Romulan Super Weapon is the genesis device, right down to the build up to detention and destruction of all life. The Scimitar and the Enterprise duke it out in a nebula rift. The Enterprise is heavily damaged. The villain has a personal vendetta against the captain. SpockData dies to save the Enterprise, but not before leaving his memories behind. It's so obvious, John Logan should have been sent to the principal's office for cheating.

I could go on, but this is enough to get Nemesis out of my head after enduring it again. In a way I am thankful this brought an end to the mostly ok, but not exceptional Next Generation movie line. It made room for the total reinvention of Star Trek with J.J. Abrahms, or did it? Perhaps another review is due...

3.5 Inner Exceptions

Sunday, December 06, 2009

What took so long for Google Public DNS?

In 2008 when PayPal was complaining about Safari, I agreed with Jeremiah that the best solution to stop phishing attacks was at the infrastructure level, with DNS. OpenDNS seemed to be the only game in town that was performance optimized and had built-in phishing filtering.

In 2009 Apple released Safari 3.2 with anti-phishing filtering. I revealed I had switched to OpenDNS and had been using it for 3 months. That continued until about 3 months ago when I mistyped some domain name in Safari and saw one of those OpenDNS branded error page with search results and ads. I knew they were going to do this, but hadn't seen it before and was annoyed when it happened. So I switched back to the DNS servers that Comcast assigns via DHCP, but performance was abysmal. I hadn't decided yet if I was going back to OpenDNS or not, but then Google launched free Public DNS.

What took so long?
I'm really struggling to come up with a reason Google hadn't already launched Public DNS. Of all the products that Google has released as public betas, capturing DNS traffic seems like that most natural way to make search smarter. Even if a customer isn't using Google search, their search could still be getting smarter through intelligence on the DNS stream. Linksys et all will soon be putting Powered by [VENDOR] DNS stickers on them to monetize their default DNS. Now that Google's done it, how long before Microsoft Public DNS is launched? Or do they buy OpenDNS to get into the game quick. DNS Wars 1.0 has just begun. Amazing that such a "low-level" networking service, around since the dawn of Internet time, stagnant for so long, will now be a hotbed of competition and innovation.

Why did Google do this?
The main reason is that excellent DNS helps Google make more money. Google doesn't have to own DNS to get some benefits, but by guaranteeing and controlling quality DNS, here's what Google gets:

  • Fast Performance
    • Chrome OS only runs Web applications. Slow DNS means slow apps. As Jason Kottke reminded us, Google knows that as little as a .5 sec delay in page load speeds means a traffic drop of 20%.
  • Request Info Aggregation and Analysis
    • See the section on privacy
  • Name Resolution Security
    • Implementing it's own DNS allows Google to hook into their existing anti-phishing lists.
    • This guarantees below the application layer interception of malicious sites that people might accidentally be requesting. If all your apps are Web apps, this goes a long way to eliminating Web app malware.

More on performance
I ran 100,000 pings to Google's primary public DNS server,, and 100,000 pings to OpenDNS' primary public DNS server,, and these where the response times (all in milliseconds):

Google Public DNS16.82327.5783901.46542.118

Surprisingly, OpenDNS performs better than Google's Public DNS. If anyone would be able to create the fastest DNS, everyone would have put money on Google winning this. This does change the decision making process on which DNS to use. Use OpenDNS and get the fastest performance today, but accept redirection on error to an ad-laden page or go with Google for slower performance but no redirection (today) on error. It's a tough call, I may switch back to OpenDNS.

More on privacy concerns
First thing I thought when I read Rentzsch's blog post headline was that this was another opportunity for GOOG to gather information about you. Of course, Rentzsch links out to another blogger because this is probably the first thought on anyone's mind whenever Google launches anything. Then I read their privacy policy and it's reasonable. Of course Google is going to anonymize and combine all the information now flowing their way. But they are not going to route queries for unknown servers to Google Search, they let the browser take care of that. This is very smart because you can easily see how this could turn into a future antitrust concern. That is the power of owning a users' DNS, you can send people to wherever you want. But until Google does something evil, I have switched to their servers.

You have to admire the response from OpenDNS founder David Ulevitch about Google's entry in the market. And really, why should be be scared? OpenDNS will still be able to sell their service to companies that are Google-phobic. They have also just become a prime acquisition target of at least Microsoft, and possible Apple. Faster and safer DNS improves everyone's Internet experience, whether you believe in Web-only apps or connected device apps, everyone wins.

Sunday, November 01, 2009

Retro Review - Star Trek: First Contact

Of the 3.5 Star Trek Next Generations movies (Generations is a bridge movie and only counts as half), the best Next Generation movie is clearly First Contact and quality goes down from there.

I've watched First Contact on Blu-ray now 4 times (hey a baby that doesn't want to sleep and being immobile from surgery leaves you with a lot of time on your hands). That includes all 3 audio commentaries. I think I am ready to finally, after nearly 13 years, put my feelings to bed on this film.

Not the Story I Wanted
When this film came out on November 22, 1996 (easy fact to drop in, First Contact is currently the only movie poster in my TV room), I was incredibly hyped for it. The Next Generation TV episodes Best of Both Worlds Part 1 & 2 where clearly the best of the show. If they just remade those episodes with movie quality sets and effects, it would have made an awesome movie.

That is obviously not the direction they went. What I expected was a sequel to Best of Both Worlds where the Borg come in force to take over the Federation. I imagined something like the Enterprise-E still being built in act 1 while the Borg invade Federation space and assimilate something big and shocking like the Klingon home world, symbolically replacing the original best Trek bad guys with the new best Trek bad guys. Then Picard and crew take the E out at the beginning of Act 2 with a smaller to medium size armada to stop another assimilation, nothing critical yet, but the ship isn't ready. The Klingon ships in the fleet, overcome with revenge and grief, stop following orders and coordinating their attack, everyone is destroyed except the E and a few Klingon ships. The E is damaged, but retreats before any critical damage is done. The E is meant as the Federation's Borg stopping ship. It's clear then the Borg are on their way to earth, and the E needs its full compliment of Borg stopping weapons. Then in Act 3, the Enterprise with every ship left in the Federation fleet, as well as old enemies and now allies like the Romulans, gather en masse to destroy the Borg ship. I didn't have character beats specifically in mind, but that was the general outline I had in mind back in 1996. That's not what we got.

It's clear listening to the Brannon Braga and Ronald D. Moore commentary on the First Contact Blu-ray that budget is the primary constraint to something like I was expecting and even hampers what is seen in First Contact. Even within the constraints of the budget, some things are just wrong with the story we get, and none of the audio commentaries address them.

Bad Time Travel Story
Whenever any story uses time travel, the danger is always that it's difficult to follow and just a little thinking about it will unravel any logic about its use. The Terminator movies have this problem, and sadly First Contact has this problem as well. If the Borg intended to go back in time and stop first contact, but they failed, why not try again until they succeed. Why would they need to travel to earth at all to travel back in time, just travel back in time in their own space and then travel to earth and assimilate it. Presto, no Federation. In fact, the Borg can take over the entire universe this way with no resistance. If a small ball ship can open a time travel worm hole, it can't be difficult.

It's also clear from the Bragga/Moore commentary the time the Borg go back to was arbitrary. It was originally going to be the middle ages, but then they set it at First Contact to be a kind of origin story of the Federation, which is nice to see, but making it all fit together sacrificed the Borg as being the smart and scary villain they originally where.

Bullshit Opening Sequence
OK, not the opening sequence, the Picard double-dream is pretty badass. Nope, I am talking about once the Borg are known to be heading toward earth, Starfleet doesn't want the Enterprise in the fleet. Totally crap, the audience knows within seconds, that this is a total contrivance that will be undone in a few minutes. There is absolutely no drama in it. Well, Picard listening to opera is a nice character move, but you could easily have that part when in warp as Picard prepares for this Borg confrontation.

Borg Stay on the Enterprise
Once the Enterprise destroys the Borg ball (all too easily, seriously 3 quantum torpedoes), them beam onto the Enterprise. Why not beam some Borg onto earth to take out Cochrane's first contact ship? Isn't that what they are there to do? Taking over the Enterprise is done for what reason? So they can get home? Surely the humans on earth are less capable of offering any resistance. The Enterprise isn't carrying anything like Marines, the Borg could have still easily assimilated earth.

With these problems, the best things going for First Contact are the characters' stories, the Borg queen, and the humor of meeting and steering Zefram Cochrane into making first contact. For that, the quality of Frakes' direction, production values, and the too brief and small space battle, I give Star Trek: First Contact the following rating:

3.5 Inner Exceptions

Saturday, October 10, 2009

iTimeZone 1.3: Rejected from the App Store 2 far

iTimeZone 1.3 - 1st Rejection
Another sad tale of multiple rejections from the App Store for a new version of an app already in the store. I've submitted 4 major releases of iTimeZone, two of them have been rejected on the first submission, but the still in review 1.3 release has been painful.

I was busting my ass to get this release done before my second son was born. I thought I got it done and was happy, proud even, that with the mountain of "getting ready for baby 2.0" work, I finally pushed out the latest release of iTimeZone.

The first rejection email came from  the night before, 8:43 PM to be exact, my wife was giving birth. 17 days after I first submitted it. In no way did it spoil the impending arrival of our new son, but it did hurt.

Take a look at the top image on the left. iTimeZone 1.3 was first rejected from the App Store for use of an "Apple trademark image", the Google Maps icon. The reason this bothered me so much was because the icon was already in the app, larger even, in 2 previous releases, and it wasn't rejected for it. Further, with iPhone OS 3.0's new MapKit, there wasn't guidance I could find on how to graphically refer to an in-app map, no UIKit standard icon to use. There still isn't  sample code on the iPhone dev center to even give you a clue on how to use MapKit, functional and UI wise. For the rejection,  kindly referred me to the relevant section of the developer agreement in the rejection email which is pretty clear that I was in the wrong.

So the night after son 2.0 was born, I pulled out the laptop in the hospital and get to work. Replacing the icon with another, simple, finding an icon was the hard part. I first started seeing if I could mimic , take a Google Maps view of my home neigborhood, then clean it up and make it an icon. Ultimately, two things stymied me. The skills and technique to make a similar icon, and time. Maybe I could eventually get there graphically, but with a new baby and many sleepless nights staring me in the face, buying an icon was the better, quicker move. So I googled around, and finally found eddit's nice iPhone UI Icon Set for $69. What I wanted was something that called back to the Google Maps icon without being that icon poorly done. As you can see in the bottom left screenshot, I used the street sign icon from eddit's set.

Change made and I submitted the new binary to Apple for review. I thought 1.3 was finally going to ship, but sadly it turns out I was wrong again.

iTimeZone 1.3 - 2nd Rejection
The image on the left was sent by  in the second rejection, 12 days after I submitted 1.3 again with the new icon. This rejection is on me. I made the call to try and ship without alerting the user of no or spotty network connectivity. I rationalized this decision by saying everyone knows Google Maps requires an Internet connection. It could easily wait, but  disagreed, and they were right.

I was willing to sacrifice the user experience until I got more time to digest the Reachability sample code and incorporate it into iTimeZone. Adding the alert was one of the few things I had on the 1.3.1 TODO list. With just about no desire to open Xcode during son 2.0 first month in the world, I didn't start work on it until 15 days after I got the rejection. In total it took me between 20-25 hours of development & testing with the sample code to implement this. Dropping the sample code in iTimeZone wasn't a big deal, but testing it and inducing dropped network connections during Map loading, then resolving my own bugs, as usual, took time. I also implemented KVO for the first time and reduced memory consumption by reusing an NSNumberFormatter that I was creating on every cell draw. It feels like I have taken another step on the road to being a complete Cocoa developer.

Positives changes to iTimeZone aside, the only thing I wish  did different was reject iTimeZone the first time with both issues. I can't complain too much, the review process improved the user experience of iTimeZone 1.3. I submitted the latest build on Thursday October 8th, so I'll see how long review takes this time. Hopefully 1.3 finally hits the App Store before Halloween. If not, I will of course log the ordeal here.

iTimeZone 1.3 has been released to the App Store! It can be downloaded through the App Store.

iTimeZone App Store Approved/Rejected History

  1. 1.0 Approved
  2. 1.1 Approved
  3. 1.2 REJECTED 1 time - ☺  Thankfully caught a bug
  4. 1.3 REJECTED 2 times - ☹☹
    1.  told me to remove the Google Maps icon in the app since 1.1 for "copyright violations"
    2.  told me after removed the Google Maps icon & resubmitting that the in-app Google Map for OS 3.0 users wasn't displaying any error message without network connection.

Friday, October 02, 2009

UITableViewController and UIViewController don't handle observeValueForKeyPath:

In an iPhone 2.0 or greater app if you are seeing this error:

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: ': An -observeValueForKeyPath:ofObject:change:context: message was received but not handled.

It might be because in YourClass's observeValueForKeyPath: method you are doing this:

// be sure to call the super implementation
// if the superclass implements it
[super observeValueForKeyPath:keyPath ofObject:object change:change context:context];

This could be because you saw in the Key-Value Observing Programming Guide those exact lines in the sample and didn't give it much thought.

If your base class doesn't implement observeValueForKeyPath:, like UITableViewController or UIViewController didn't, and you just assumed that the base class must even if it did nothing, like I did, then the above exception gets thrown.

Tuesday, September 08, 2009

Blocks in Snow Leopard Sound Awesome

John Siracusa's review of Snow Leopard is the definitive one. Of you
haven't read it, you should:

The entire section called "Internals Ahead" really got me excited. I
felt the developer gravitational pull of new tech with Snow Leopard's
Grand Central Dispatch & Blocks as well a Clang built in to Xcode 3.2.

I never really understood anonymous functions before reading John's
stuff. I wouldn't say I oils apply this technique right now if called
to, but I really want to understand it.

I really want to start an OS X development project now just to use and
learn this stuff. Just need an idea...

Sunday, July 12, 2009

Happy 1 Year Anniversary iTimeZone!

iTimeZone has had a great year. Version 1.3 is going to be released, if Apple cooperates, by the end of July. Since being released on July 10, 2008 along with the iTunes App Store, all my expectations have been exceeded for the product. Here are some of the milestones:

To celebrate iTimeZone's 1 year anniversary, here are promo codes to get a free copy:

  • RPWP997MKXA3
  • TA9W9JLT3K6N

Monday, April 27, 2009

A Letter To Senator Collins of Maine on Pandemic Flu Preparation

The Nation with Know-Nothings Fought Pandemic Preparedness reminded me that Senator Susan Collins of Maine (R) trumpeted that she took the lead role in stripping the Economic Stimulus bill of pandemic flu preparation. Comically and tragically, nature has "conspired" to make Republican complaints about preparing for extreme events, e.g. Bobby Jindal against volcano monitoring and now Susan Collins against pandemic flu preparation, look even more backward than before these events happened.

So I wrote Senator Collins this letter and I encourage you to do the same:

Mrs Collins,

Since you were the primary proponent in the Senate of stripping the Economic Stimulus bill of money for pandemic flu preparation, now that governments all over the world are actually confronting a possible pandemic flu, I want to know if you feel good about your irresponsible actions in order to play politics? My wife and I considered today whether I should commute to my job in NYC as a precaution against any possible outbreak, it doesn't take long to consider the massive financial impact a full blown outbreak would have on the economy if everyone stayed home because of potentially contracting a fatal disease like this swine flu.

I expect you to denounce your former actions and get ahead of this issue by introducing the pandemic flu portion of the Economic Stimulus bill as it's own legislation now that you can see first hand what could happen if a flu pandemic hits near panic proportions. Just look at the footage from Mexico of soccer games, the countries most popular sport, played in an empty stadium, and office buildings empty, and apply that to the US. Thankfully, it looks like DHS and the CDC are ahead of the swine flu in the US, but the next time we might not be as prepared or able to respond in an appropriate manor because those agencies don't have the funds to meat the threat.

Sunday, March 22, 2009

Silverlight 3 a tipping point, Mac development available

Nearly two years ago I asked Where are the Silverlight developer tools for Mac?. Well we have the answer, there is a plugin for Eclipse called eclipes4SL which allows Mac developers to write Silverlight applications.

Inflection Point
I am not vouching for these tools, I have installed them, but I don't know enough about the specifics of Silverlight (yet...) to make a claim either way, but the world has changed. With development tools in any form on the Mac, Silverlight as a long term cross-platform solution just became real.

Silverlight 3
I don't know if the Mac dev tools were out before Silverlight 3 was announced on Wed. March 18 at MIX09, but I found out about them through Tim Heuer's guide to Silverlight 3 features. Silverlight 3 addresses some more of my concerns for the environment. Native H.264 video/ AAC audio is included. Silverlight 3 applications can now run outside the browser, probably to compete with Adobe Air.

Evaluation Time
I recently started thinking about using Silverlight for a redesign of one of the day jobs primary .NET apps. The Silverlight 3 announcements, and I haven't even begun to process the actual development enhancements, make evaluating Silverlight an urgent day job task. The mental calculus also got a lot easier between Adobe Air and Silverlight with the alarming resource usage of a couple popular Adobe Air apps, Twhirl and TweetDeck, documented in this tweet and this one.

Monday, March 16, 2009

App Store Review System Still Broken

I have been extremely frustrated by the App Store review system. At first anyone could post anything they wanted about your app, whether they bought it or not. In September 2008, Apple stopped accepting reviews for apps that the reviewer hadn't bought. Good right, but then Apple didn't actually go back and remove old reviews recorded without owning the app until late February 2009! Great, another baby step toward a more fair system to app producers and consumers. But it still wasn't fair to app producers for a number of reasons:
  1. Apps were getting rated on deletes from devices. No way to log a rating without deleting.
  2. App rating distribution, meaning how many times your app had been rated a particular star level, weren't visible
  3. Reviews and ratings had no visible date associated with them
  4. Reviews and ratings had no visible app version associated with them
  5. The relationship between reviews and ratings was unclear
iTimeZone All Ratings
What Changed March 10, 2009 - March 13, 2009?
Apple slowly trickled out an overhaul of the review system for the App Store. It has been very strange how this has been done. Bits of functionality here, more there. It seems by March 13th, 2009 (Friday the 13th, must be an omen) Apple started breaking out the distribution of rating scores by stars. In the screenshot on the left, current version means iTimeZone 1.2.1
These changes made great strides forward, answering at first glance all of my bullet points above. Sadly, I have to conclude Apple still has a slight miss here.
What's Still Wrong?
Here's why based on my analysis of the data for iTimeZone:
  • Average Customer Ratings do not include Customer Reviews. The only way the math works, that Average rating for all versions is 3 stars, is if you exclude customer reviews. A 3 star rating has to at least fall between 3.0 and 3.25. Since we don't know Apple's rounding policy, and we know Apple does half-stars, it is entirely possible anything between 3.0 and 3.49 is a 3 star rating. Luckily for this exercise, the average of iTimeZone's customer reviews is 4.26. That happens to be just enough to make the combing ratings and review score 3.5, yet iTunes only shows a 3 start average rating for all versions. Thus, the aggregate rating can't include customer reviews, only ratings. So Customer Ratings are averaged for the current version, and across all versions, but customer reviews are not, they are only listed. If a customer took the time to write a review, surely that star score should be included in the ratings? That is just not intuitive at all. I would have to recommend at this point that if you write a review, you also leave a rating.
  • Tracking Reviews/Ratings by Version is too literal. The accepted convention for version numbers, and the one I am using follows Apple's generic versioning scheme. Major.Minor.Revision, X.Y.Z, 10.5.6, 1.2.1. Major means a platform release, minor means a feature release, revision means changes/fixes to existing features. Mac and iPhone apps are thought of feature stable when X.Y remains the same. This is not controversial, except the App Store is now boxing reviews by X.Y.Z. So reviews for version 1.2 of iTimeZone mean the current version doesn't have any reviews because the current version is 1.2.1, and there are no written reviews yet for that version. Current version literally means the one on sale, there is no intelligence behind it. This is going to result in developers being reluctant to release fixes quickly, and instead only take the version review reset hit when they are going to release features. The other possibility is gaming the version system so that the app gets updated, but the version number doesn't change so reviews don't get reset. I haven't investigated this thoroughly yet, but I am sure it has already crossed more than my mind. Sure, developers could try and game the review by version system the way I propose, but if Apple had clear rules posted on versioning and then bounced apps during review for adding features without upping the X.Y version, developers would get the hint.
But you don't take my word for it, download the spreadsheet in your format of choice and look at or mess with the data:

One More Thing..
I have real trouble drawing conclusions from data like this. Either people really like/love the app, or they just hate it. There is no middle ground. Even if you look at the ratings for all versions, the app is top heavy with 4 and 5 star ratings, but 1 stars are just as frequent as 2 and 3 star ratings. If you rate an app 1 star, you are saying it just flat out sucks, no mincing words. I would only give an app 1 star if it were a total failure at what it was doing. iTimeZone is not that. You may not like how some things are implemented, think things could be done better, but its not an out and out failure by any stretch. I haven't received any feedback from anyone that harsh, so if you think iTimeZone sucks, tell me why at at That said, 1 star ratings seem frequent enough I wonder if there isn't a systemic problem where users feel they have to go nuclear on an app.

I can only hope Apple further tweaks the system and fixes the problems I have highlighted. Given that it took 8 months from App Store launch to get the current changes pushed through and the amount of work they surely have ahead of them with iPhone OS 3.0, I am not very hopeful.

Since I wrote the bulk of this, iTimeZone has received 2 more customer ratings both 5 stars. So the current version has a 3.5, yeah for me, but it doesn't change the unintuitive disconnection between Ratings and Reviews.

Friday, March 13, 2009

Recommended Custom Keyboard Shortcuts in Mac OS X

It all started by listening to the Customizing Keyboard Shortcuts episode of the Apple Quick Tips podcast. In Mac OS X, you can do all sorts of keyboard customization, assigning hot keys to any menus you see, with a built-in System Preference panel. I have been using OS X for over 5 years now, and it was only since Feb 2, 2009 that I actually started using this powerhouse feature. I know there are power OS X users out there that, like me, didn't know what you could do with this funtionality, because they have whined on Twitter that something should have a keyboard shortcut. But you can do that yourself!

This is where you start

Click on the Keyboard Shortcuts tab:

You can start adding your own shortcuts now by clicking the + button, but let me show you the ones I recommend:

ApplicationMenu TitleShortcut 
All ApplicationsSystem Prefernces...CMD-SHIFT-,⇧⌘,
SafariMerge All WindowsCMD-SHIFT-M⇧⌘M
Microsoft WordSave As...CMD-SHIFT-S⇧⌘S
Microsoft ExcelSave As...CMD-SHIFT-S⇧⌘S
PreviewAdjust Size...CMD-OPTION-T⌥⌘T

Notes On Creating Your Own

  • Custom Keyboard Shortcuts only work on menu titles.
  • The menu titles you enter in system preferences have to match exactly what is in the menu, including the ... on Save As... for example.

Fixing A Bad Default Finder Shortcut
There is one default shortcut choice in OS X that I find either a poor choice or just outright bad design. In the system wide Save dialog box, ⌘D goes to the Desktop. This is great for quickly saving something. The catch is that in the Finder, ⌘D doesn't bring you to the Desktop, it Duplicates whatever is selected. By default, to get to the Desktop in the Finder, you type ⇧⌘D. I can't stand this mismatch in keyboard shortcuts, and now I know how to change it. There is a catch though. The Finder does not appear to be an application that the Keyboard & Mouse System Preference wants you to find. This is how you can.

  1. After clicking +, scroll to the bottom of the Applications list and pick Other...
  2. Navigate to Macintosh HD/System/Library/CoreServices/ (or whatever you have named the main hard drive)
  3. Double-click on Finder
  4. For the Duplicate menu title type ⇧⌘D and click Add.
  5. Click + again, then for the Desktop menu title type ⌘D and click Add.

Now you should have the Finder configured to match the Save dialog, and your Finder keyboard shortcuts should look like this:

Someone would wear a Java jacket?!? Really?

Saturday, February 21, 2009

How Apple and iPhone Jailbreakers Can Get Along

Full Disclosure: iTimeZone is on the App Store, so I leave it to you to decide if Apple as our application distributer affects this opinion.

It's been in the news a lot recently that Apple wants iPhone jailbreaking to not be legal. You can read all the documents linked through the Engadget article if you care, I have only skimmed Apple's response, and the arguments are pretty simple:

EFF: We bought the device, it's the consumers, they should be able to do what they want with it.

Apple: Jailbreaking violates our copyright, the DCMA, and we get millions of support calls from jailbreakers when the software is broken. Plus, regular people who view a friend's jailbroken iPhone, aka a pirated iPhone, could think that crappy experience is the real iPhone experience. In other words, a jailbroken iPhone is just like a Folex (aka fake Rolex) you buy in Times Square.

This post apparently containing a letter from Cydia (jailbroken iPhone App Store equivalent) to the US Copyright office is interesting. Their arguments all amount to the way I have classified the EFF position. However, it does remind that there are people (I remembered I knew one after reading it) that love the iPhone except for something here, something there. Some choose to jailbreak. It would be intellectually dishonest, as that letter is, to suggest that all or most jailbreakers are just trying to make legitimate changes to their iPhone when everyone knows jailbroken iPhones/iPod touches are running pirated software from Apple's App Store as I found out first hand yesterday. The image on the left is from a blog listing free Appstore games and apps (misspelling on Appstore is the sites). iTimeZone is $1.99 on the App Store, that post was from November, and I haven't seen the current version 1.2.1 pirated yet.

Where do Apple's rights ends and consumers begin? As I learned from a trio of lawyers at the Intellectual Property 101 session at NY Comic Con (I know, real learning at a comic book convention, who knew), what's copyrighted is the product that is being distributed, the whole work. If anyone thinks I have misunderstood this, please comment. As should be plainly obvious is that the iPhone is just a hunk of commodity hardware if it weren't for the software. As a product, you can't separate the two. Apple allows specific uses of their product, as a consumer, that is how you are allowed to use the product, those are the terms of sale. If you were individually negotiating with Apple, and you told them you wanted to break their software, which might break their hardware, after purchasing, they would most likely choose not to sell it to you. As a consumer, you are not entitled to buy any product on the market and do with it whatever you choose. If you don't like the terms of sale, don't buy the product. I am sympathetic to people that buy a product like the iPhone and don't understand its limitations and then choose to jailbreak when they have no other option. Well, they feel that way, their options are to live with it, sell the device and get another, or break the law.

We are all consumers, but we are not all producers. If you are only a consumer, your thinking is different, you feel you should be able to do whatever you want with the products you buy. As a producer, you are creating a work that you put on sale under specific conditions with specific intended usages. How can this fight end? Every device has "jailbreakers" and every producer of devices has to fight this battle. Is there an end in sight?

Apple sets up the ability to register consumers' iPhones as jailbroken. Why would consumers do this? What is the incentive? We all know some consumers are jailbreaking their iPhones and then asking Apple for support anyway (aka they aren't taking personal responsibility for their decision), why wouldn't they keep doing that. I think Apple would have to offer a rebate to people looking to register as jailbreakers, something nominal like $15. Once registered, consumer loses full support from Apple. Reported hardware malfunction resolution is more restrictive then a real iPhone customer. Hardware damage caused by jailbroken software is not a fixable item. The rebate can't be so large that a majority of iPhone owners take the rebate and role the dice only to really want support from Apple in the end. If you take an unregistered device to Apple that is jailbroken, your warranty is voided immediately. Consumers can restore their jailbroken iPhone to the real iPhone OS by Apple for say US $50.

The situation as it is now isn't sustainable, their is mistrust between producers and consumers. Producers works get pirated, resulting in time spent enforcing their copyrights instead of on new or existing products. Consumers feel "cheated" that they can't do whatever they want with "their" product. The only way forward, even if you disagree with my specific proposal, is to attempt to restore trust on both sides by giving consumers more choice about their ongoing relationship with a producer. Just giving producers stronger laws to sue everyone that infringes isn't the answer.

Wednesday, February 18, 2009

iPhone App Ideas I Apparently Could Have Got Rich With

Rich in at least one case. In the past couple weeks, I have learned that a few ideas I was considering implementing for the iPhone had been done.

This is a simple matter of resources for me. I don't have infinite time to work on iPhone stuff, I do have a day job. I don't have deep pockets to fund additional development resources. I am also not looking for funding for iPhone projects. It just seems incredibly risky to, if you are a moonlighting indie, ditch a day job to work on iPhone apps full time on your dime or an investors when the economy sucks and app success is hard to impossible to predict. Plus, iTimeZone has taken a lot of time to get to the point it is, and I still feel like there is a ton to do. If I am not thinking clearly on this, please educate me in the comments.

Here are the app ideas I had most seriously considered.

Yo Mama (iTunes Link)
Middle of January, I was brainstorming about ringtone apps, what did I think could be done that could potentially hit the App Store jackpot, a Top 10 Paid app. The one idea that came to mind which didn't appear to be done was an app for Yo Mama jokes. I have always loved these things, and it felt like the perfect ringtone idea.

Well 100 Proof Software released their Yo Mama app on February 17, 2009, and it's right now #2 paid on the App Store. My implementation would have been considerably more sophisticated, which was part of the problem. I had set the quality level way to high for myself, if you look at Yo Mama (iTunes Link), it is an incredibly simple app. You might be looking at a few weeks of work. Congrats to 100 Proof on your success, you are digging in the gold mine now.

comiXology (itunes Link)
I have been going to NY Comic Con every year since it started. February 7th 2009 I was walking through the Expo hall when I see a large iPhone printed around a flat screen TV. I went over to talk to the guys, and they showed me the app, comiXology, I have wanted to build for a long time for both the Mac and iPhone. This kind of app was the reason I started looking at Mac development in the first place. That knowledge helped get iTimeZone out when the App Store opened.

Take a look at the app in iTunes, it shows you comic book titles coming out week to week, and helps manage which books are on your pull list. The app looks great, with services tied to the comiXology site. The only negative I had was the demonstrator I talked to at NY Comic Con was clearly nervous (shaky hands) and wasn't that familiar with the iPhone/iPod touch (e.g. double-tapping on table cell rows). Relax and learn your product, it looks like a winner.

Well the other negative I had was jealousy, but I was quickly over it. I haven't bought comiXology because I have stopped buying weekly books back in June. This was a budgetary and time management decision. Since I was mostly reading comics on train rides into and out of NYC, and I replaced that leisure activity with iTimeZone development and other production instead of consumption. If you are buying weekly comic books, then I strongly recommend you take a look at comiXology.

If you have an app idea that you haven't seen others do, move fast.

I forgot to mention that comiXology has a Lite version for free to try. comiXology on Twitter responded to my blog post through Twitter to inform me of the Lite version. Apologies for the oversight, I had just told some friends about the Lite version before posting to the blog, but it slipped my mind when writing the post.

Monday, January 26, 2009

ClickToFlash - Stop Automatic Flash Loading in Safari

Daring Fireball posted about ClickToFlash, a Safari or WebKit plug-in that stops the downloading of Flash in the browser and currently shows a gradient instead. Click to load Flash if you want. While this is fantastic, and I wish it were built-in to Safari, the gradient isn't enough to know that it could be clicked. For example, if you go to the site for the upcoming MMO Star Wars: The Old Republic, all you see is a blank gradient screen. There is an open issue for this on Google Code, so hopefully in an upcoming release it's changed.

When I was cleaning up the download, realized it came with the source code. I then cut and pasted the code from the open issue and put it into the _drawBackground method in the code, compiled, and replaced the installed plug-in with my custom built version. Problem solved, I now see Click To Flash centered in the gradient. Excellent!

If you want my custom version, click here to download. Source and the plug-in included, no warranties of course

Jonathan 'Wolf' Rentzsch has taken over ownership of the ClickToFlash project, and released ClickToFlash 1.1 today. This version never implemented the Click To Flash text, which was the change I made, with an image pictured left. The other big feature is a whitelist, so you can always load Flash on selected sites. This installer for this version will replace my custom built version if you installed that.

Sunday, January 25, 2009

GeoNames Web Service Crushed Under Load From Free iPhone App

The GeoNames blog posted today What to do against DDOS effects? They aren't suffering from a malicious DDOS attack, but a free iPhone game called iMob Online is using the GeoNames web service for data. The app has become so popular that the GeoNames free web service has been crushed under the load.

In my iTimeZone 1.1 Post-Mortem, I talked about the choice to use the GeoNames CSV files instead of the web service for city data because, in part, the web service took control of the user experience away from me and put it in the hands of a potential fickle network resource. I feel bad for the GeoNames and iMob teams, no one could really predict this on either side. It again highlights though the inherent risk of building a product around free web services with no recourse if something goes horribly wrong.

Wednesday, January 21, 2009

US Democracy Server: Patch Day Version 44.0

If you have ever read an MMO's patch notes (like the recent released World of WarCraft Patch 3.0.8, then the US Democracy Server: Patch Day Version 44.0 release notes are hysterical, or at least me and Michael Jurewitz did. Thanks for tweeting the link Mike.

Promoting iTimeZone or I Didn't Know I Had To Be A Marketing Exec

I thought I was reasonably well prepared to be a moonlighting indie iPhone application developer. Here's what I thought was required before I got started:

Application Idea...
Intel Mac for Development...
Accepted into iPhone Developer Program...
An Icon I Liked...
Application Name...
Company Name...
Blog (hey, your reading it!)...
Twitter account...

In addition to all the development, UX, and graphics work I had to do, I planned on blogging and tweeting for marketing. That should be enough right? Wrong! I was shocked to learn I also had to become a marketing exec!!!

When iTimeZone 1.0 was released, sales where higher than my optimistic projections. I had been seriously worried that I would not break even on my modest initial investment. iTimeZone was not bringing in get rich money, just better than expected. As summer turned to fall, sales kept gradually decreasing. I was already working on iTimeZone 1.1, feeling some pressure to get the new release out due to customer feedback. I was also really counting on the new release of iTimeZone to push sales back up, just as I had grown to expect from reading from various Mac indie developers over the years. Reading the PCalc 1.1 for iPhone post-mortem threw cold water on those expectations, since I learned that new versions of existing apps no longer pushed apps to the top of the Release Date filter in App Store category view. iTimeZone is in the Travel category. Apps only get listed in one category. I had low expectations then that releasing iTimeZone 1.1 would be sales invigorator until I read Benjamin Ragheb's comment, which said to change the availability date of the app in iTunes Connect. That did the trick!

Onward and Upward
When iTimeZone 1.1 was released, sales did increase a good amount, but the effect doesn't last. I am not sure I have seen even a modest boost with the release of iTimeZone 1.2. As the number of apps is only increases and accelerating (see image on left, 15,000 app, 500m downloads as of this post), you don't stay on top of your apps category by Release Date for long. Especially when a city guide, for example, is released as one app per city all on the same day, resulting in 30 separate apps. If you are lucky enough to get a prominent property with a large audience to mention your app, you will get a huge boost. Right after iTimeZone 1.1 was released, we unexpectedly got it.

The Apple Boost
It is hard to overstate what a sales difference being on the front page of the iTunes App Store home page is. Sales increased several orders of magnitude. Even better, iTimeZone wasn't leaving the front page for a whole week, and would then get shuffled back in the NEW box until it dropped off after a month (there are 4 pages). Did iTimeZone make the 100 Top Paid Apps? Yes, incredibly, iTimeZone climbed to #75 as far as I can tell.

Pretty soon after iTimeZone was on the App Store front page, Apple launched the iPhone Your Life site, which included a World Travel section. This was the first indication that Apple was going to break out top apps by paid and free in each category, and iTimeZone happened to be the top paid travel app when the World Travel site launched.

Being promoted by Apple is the best marketing you can get, it's free, but its impossible to quantify how to get it. That said, marketing your app is your job, not Apples. The deck might be slightly stacked against you on the App Store, but there are things you can do, or at least try.


Not the actual ad
Click through to the product page

Not the actual ad
Click through to the product page

I had looked into using Google AdWords for iTimeZone weeks before 1.1 shipped, even setup the ad (pictured left) but was holding off turning it on until 1.1 was released and the web site was updated. I activated the ad on a very modest budget of $50/month. I was floored the morning when 30% of my budget was burned through overnight, in about 13 hours. I was using up my budget at a pretty good pace, and I changed the ad (pictured right) to use action words (e.g. Buy) and just let it go for a while. I found AppCubby's blog post in early December (ok, someone in my feed list linked it, sorry, can't find that source) about marketing iPhone apps. The post articulates something that was nagging at the back of my mind since turning on AdWords, how do I correlate the clicks on the ads to actual sales? You can't, and the price of keywords is only going up! AdWords itself told me that my ads weren't running enough to be effective by late December (advertisers, recession, have you heard of it?), so in early January I stopped trying to run the ads until I can dedicate the time to figuring out how, or if, I can effectively use some form of advertising.

What's Next and Lessons Learned
What is a realistic expectation for iTimeZone sales? Should I set the goal to be sustainable Top 100 sales across the whole store? Seems highly unlikely given the number of apps in the store, the rate of new apps, and the kind of app iTimeZone is. iTimeZone is a use once in a while, or in short bursts (e.g. planning a trip) app, so it is never going to attract the same kind of attention that say, a farting app will. How about Top 100 Paid in Travel? That seems doable, but I am going to have to take some action, aside from what I am already doing, to sustain or hopefully increase ongoing sales. There are numerous next steps that I can take, and I will probably try most or all of these.

  • Press Releases. This seems like a no brainer now. Both directly to key sites, and trying a listing site like prMac.
  • Promo Codes. Since Apple has unveiled the ability to give away promotional copies, going to have to figure out a group of people I would like to get iTimeZone in front of and cold email them or something offered the promo codes. Of course, I could send out promo codes to anyone that has contacted us for support. Not huge reach, but a token of appreciation maybe.
  • Lite version. There has been some mixed advice, some like iShoot have seen phenomenal new success with existing paid apps after releasing a Lite version of their app. I have read it really hasn't moved the needle at all for other apps. Seems to me though a lower featured version of iTimeZone would be essentially good free publicity, and maybe some number of iTimeZone Lite downloaders will convert to iTimeZone buyers.
  • Interviews, Case Studies, and Publicity. These are much harder to pull off, but if you are asked to participate in any of these, you need to go for it. I have a few opportunities I am hopeful will pan out.
  • Podcasts. I draw the distinction here between interviews, where you don't run the podcast, and running your own podcasts. I can't see doing this right now.
  • Alternate versions. Since apps are only listed in the App Store once, perhaps segmenting the app, if it makes sense, into different tiered features and pricing. A Lite version if the typical one, but I am also considering what I am thinking of as a Pro version of iTimeZone, probably in another category.
  • Release another app. If you only developing one app, not only are all your sales tied to that app, so is your exposure. If Apple decides to consume the idea you are shipping in the OS, you are out of business. If people like your one app, you don't have another to sell them. If customers aren't interested in your app, but like how you are doing things, you don't have another app to potentially sell them. It is easier to sell to existing customers than new ones, essentially you are potentially leaving money on the table.
  • ABS. Always Be Selling. I think natural sales people just know when and how to sell, and how to market their wares to people. Even if you aren't a natural, if you are talking to people you know or at conferences and such, you have to look for openings to sell yourself and your work.

While as a developer you might not have thought it necessary, or you even find it distasteful, the simple truth is that marketing is The One Thing Every Software Engineer Should Know. Ignore it if you don't want anyone to buy, use, or enjoy your work.

This post on Majic Software Jungle has some good info on pricing strategies, which I intentionally avoided in this post because concrete data on what works or not is pretty hard to come by.

Thursday, January 15, 2009

iTimeZone 1.1 Post-Mortem, or Limiting Features Based On How Little You Know

iTimeZone 1.2 is out, so I figured it was finally time to do a post-mortem on iTimeZone 1.1.

Picking Your Battles
One of the challenges when trying to ship a product using a new development framework is limiting the amount of stuff you need to know to implement your features. This is particularly acute for indie developers since they are either a team of one or few. Dividing up feature assignments according to unknown frameworks isn't a viable tactic. Instead, shipping features have to be limited to minimize the frameworks the developer(s) must learn. That reasoning led to iTimeZone 1.0's city list being extracted from the built-in iPhone OS time zone data. There was too much engineering to make a large city list work for someone (aka me) that had never done any real OS X, Objective-C or Cocoa development and make a July iTunes App Store release in their spare time. It was obvious that a large city list had to be in iTimeZone 1.1, the question was just how to implement it.

Missed Wide Right
There where two possible paths, and the frameworks those approaches mandated, to get cities:

  • Web Service:
    • Threading. Every character a user types starts a new search. In this case, a new web service call
    • XML Parsing. Going to have to crack the results and create objects
    • Caching. Should cut down on web service queries by storing user selected cities and search results locally, either in memory or on disk
  • Local SQLite Database
    • Threading. Every character a user types starts a new search. In this case, a new DB query
    • SQLite. Needed to store databases locally and execute queries
    • Caching. If queries are expensive, cache results in memory

Deciding which engineering approach to use largely depended on the data source for the large city list, and how did they provide the data. I found GeoNames, which not only had a web service but an export of their city list in CSV format. That didn't help, GeoNames was too flexible, it was completely in my court.

I decided to go for using a Web Service first for these reasons:

  1. The app and others are going to need all kinds of data from the Web in the future, this is the most reusable investment
  2. Everyone uses web services, it has to be fast enough
  3. Every iPhone has permanent connectivity, and iPod touch has WiFi, requiring a network connection won't be a big deal
  4. I didn't want to worry about stale data.

It turns out I was wrong on all four points above! Here's why in order:

  1. I was only partially wrong on this. Yes, iTimeZone or other apps are going to have to pull data from the Web, and I figured out how to do this in Cocoa, but I wasn't going to be using it because...
  2.'s Web Service's (at least the free one) performance was too unpredictable. I could be in a full strength 3G signal, and wouldn't receive first results from the service for many seconds after tapping a character. It worked eventually usually, but I never felt comfortable with it because I couldn't guarantee what end users would experience. That is kinda endemic to Web connected apps to some degree, and it will be acceptable for a lot of data, I wasn't happy with it for iTimeZone
  3. iTimeZone has to work without a network connection. I don't know why I ever thought it could require a network connection. We here at Tangerine Element use it in places that are likely to have limited or no connectivity, and getting on the WiFi outside of known hotspots turns out to be an exercise in frustration.
  4. City and time zone data is relatively slow changing. Sure, city names change and governments change daylight savings rules all the time. I realized though that I could simply continue using the iPhone's built-in time zone data, the offsets and effective dates, matched up based on the time zone id.
I sunk over a month building a prototype to pull city data from, learning threading to make it more responsive, and figuring out how I was going to cache the data, but at some point performance wasn't predictable enough and network connectivity so spotty were I was testing, I bit the bullet and gave up on it.

So You Want To Use a Database on the iPhone...
Most of what I had learned about threading and caching large results sets because of the GeoNames prototype was applicable when using SQLite. Using SQLite though had it's own set of challenges.

  • SQLite is a C, not Cocoa, library. This meant understanding how to convert between Objective-C data types and what SQLite expected. Mostly easy, with the exception of how to format LIKE queries.
  • There are a bunch of calls and interaction patterns to get right. I mostly used the SQLiteBooks sample application Apple provides to iPhone SDK members to understand this, but there were a few things I learned from the APRESS book The Definitive Guide to SQLite. I confess though I haven't read it cover to cover, just spot read where I needed to learn something.
  • Mac OS X only comes with command-line tools to create SQLite database. So I bought SQLabs SQLiteManager for $49. Easily worth it for the ability to easily import CSV files into database tables.
This all had to be done largely because CoreData doesn't exist on the iPhone OS 2.2 and below. Eventually though by importing the GeoNames cities CSV file into a SQLite database, and some massaging of the data, I had a pretty good city list.

Lessons Learned About iPhone Development
What did I learn going while developing iTimeZone 1.1?

  • The SQLiteBooks example is not the ideal pattern. This is perhaps pedantic, but I should have just created a SQLiteController and put everything in there. I haven't done this yet even in iTimeZone 1.2, but when I feel like it, I'll probably move stuff around so that if CoreData drops in a future OS release, my storage code is already disentangled from AppDelegate.
  • Preparing SQLite statements is time consuming. I ended up putting the preparation of the most commonly used statements in another thread at launch, the delay doing them inline was pretty high the first time, and there was very little reason to make the user what when a thread could do the work in the background.
  • Consider using a third-party library. The one I know of is Gus Mueller @ Flying Meat's FMDB. I choose not to use it because I was nervous about committing to it only to find it didn't do something I wanted and having to add it myself, but this is another decision I might reevaluate depending on the CoreData situation.
  • Creating threads might be expensive, reuse them. I still haven't done this in iTimeZone 1.2, I am creating and destroying threads for every character typed into search, but that is probably not a high enough usage to justify the rewrite at this point since it performs well enough.
  • Use the Leaks Performance Tool. No matter what, you are going to leak memory, make sure you are using this tool to find and stop memory leaks.
  • Do as much on background threads as you can. Pretty much since device OSes have had threading this rule stands, but just to reaffirm it's truth. My examples are preparing SQLite statements and loading the top X number of cities after the UI appears.

Monday, January 12, 2009

iTimeZone 1.2 Released to the App Store

On Monday January 12, 2009, iTimeZone 1.2 was released to the iTunes App Store. Here is the list of what's new or changed. We are already investigating features and UX enhancements for iTimeZone 1.3 (or is it 2.0?), but as has become Tangerine Element's custom, features and changes won't be announced until they are done and being tested or in App Store review. Some changes are still being trickled out (screenshots in App Store, Tangerine Element site revision), but should all be done by tomorrow.

What Can Be Learned From Rejection?
Due to the change in UITableView's expectations for numberofRowsInSection and the bug because of it not being caught in testing, the first time iTimeZone 1.2 was submitted for approval, it was rejected! This was the first time a submission of iTimeZone was rejected. It was interesting because it showed that people are manually testing and approving applications. I had thought it was a 50/50 shot the apps were being run through a battery of automated tests and maybe manually running it on the device, then you got approved if it all passed. It was clear though from the iTimeZone 1.2 rejection evaluators are actually using the app, and providing crash logs if needed. How nice!

Thursday, January 08, 2009

iTimeZone 1.2 Feature Complete

iTimeZone 1.1 was released on Tuesday October 21, 2008. Work was started quickly on iTimeZone 1.2 with the intention of turning it around very quickly. The only planned feature for 1.2 was Change Top City. A couple of software updates to 1.1 (1.1.1 and 1.1.2) slowed down 1.2 a little, but the plan really came apart due to completely unforeseen events. Here's what's changed:

Change Top City
When iTimeZone 1.0 was designed, the intention was never for the top city (the one that the time wheels show the date and time for) to change in the app. If the user wanted to change the top city, they would change the Date & Time city in the iPhone/iPod touch Settings app and iTimeZone would match it. This will be talked about more in an upcoming iTimeZone 1.1 post-mortem, but during 1.1 development it became obvious through internal usage and user feedback (thanks all) that changing the top city had to be in the app.

In iTimeZone 1.2 users can double-tap any city in the list to make it the top city, but there's a catch. The time wheels (which is a UIDatePicker control) don't always calculate correctly the date and time after changing the timeZone property, which iTimeZone has to do when changing the top city. This is one of the unforeseen events I mentioned,and a bug has been filed with Apple (#6452008). Hopefully Apple fixes this issue in a near-term iPhone OS release, or I might have to investigate alternative ways to implement the time wheels. In the meantime, I have chosen to handle this condition by alerting the user once per iTimeZone session when the top city changes about the issue as shown in this screenshot:


UI Tweaks

 1.11.2Changes in 1.2
Main with Cities
  • Country Flags. A popular request, makes it easier to quickly ID a city.
  • Bold Fonts in the City List. Makes it all easier to read and pop.
  • Weekday on City Date. Whenever a date is shown in the city list, it now had the short day of the week
  • Shrunk the city cell height. Made it just a tad smaller so the top line of the fourth row is visible.
  • Faster Scrolling. Doing all drawing manually instead of letting controls lay themselves out on screen.
Add City
  • Back Navigation. Removed the city's time zone so that the screen title was better positioned
  • Automatically put focus in the search box and loaded the keyboard
Add City - Search Results
  • See Full State/Region and Country. Each cell has two lines, state/region and country can be seen without abbreviation, while emphasizing city name
  • Country Flag. Top aligned with the city name
  • Faster Scrolling. All drawing done manually instead of laying controls out by themselves
Main Edit
  • Custom Drawing in Edit. Removing the day/night icon to focus user's attention on the delete and move icons.
City Detail
  • State/Region Added. For completeness
Settings are in the Settings App
  • Always Show Dates. If you don't like seeing Today, Tomorrow, Yesterday when the top city's date is today's date, then this is for you. The default as with past releases is OFF.

What's Next
iTimeZone 1.2 has been testing and is in App Store review, which hopefully won't take too long.