200 Million iPads Update
Back in September, I estimated that Apple would sell 200 million iPads by the end of 2012. It looks like I was a little too optimistic.
Apple just reported stellar quarterly results. However, iPad sales growth was not quite as strong as Apple’s initial sales seemed to indicate. Two years after introduction, the iPad is selling better than the iPhone did two years after its debut. But it looks like it may take one extra quarter for Apple to hit 200 million iPads.
Actual Results
- Apr to Jun 2010: 3.27 million
- Jul to Sep 2010: 4.19 million
- Oct to Dec 2010: 7.33 million
- Jan to Mar 2011: 4.69 million
- Apr to Jun 2011: 9.25 million
- Jul to Sep 2011: 11.1 million
- Oct to Dec 2011: 15.4 million
Estimated Results
- Jan to Mar 2012: 11.8 million
- Apr to Jun 2012: 23.4 million
- Jul to Sep 2012: 28.0 million
- Oct to Dec 2012: 38.9 million
- Jan to Mar 2013: 29.9 million
Disclosure: I own AAPL stock.
The First 100 Days of a Startup
Josh Coates, founder of Mozy and current CEO of Instructure, once taught a series of classes at BYU on high-tech startups. I jumped at the chance to audit his class.
One of the things Josh covered was what should happen during the first 100 days (14 weeks) of a high-tech startup.
Week 1 — Research and choose business
Week 2 — Build financial model and development plan
Week 3 — Build pitch with screenshots and practice
Week 4 — Interview law firm, staff and advisers
Week 5 — Incorporate and setup shop with office space and equipment
Week 6 — Initial documents, books, hires and cap table
Week 7 — Create website and logo (do a trademark search)
Week 8 — Identify 10 to 20 potential investors and study who else they invest in
Week 9 — Practice the pitch and setup meeting with the least important investor
Week 10 — Interview, build product, pitch again
Week 11 — Interview, build product, pitch again
Week 12 — Interview, build product, pitch again
Week 13 — Interview, build product, pitch again
Week 14 — Interview, build product, pitch again
He recommended interviewing one potential employee every day. Pitching to the least important investor first lets you have a chance to practice in a situation where making a mistake isn’t as damaging.
I first met Josh just after publication of an article he wrote on how many angel investors in Utah were doing it wrong. The article, entitled “Poison in the Well”, in addition to having a great title, was direct and clear in its criticism. It was one of the reasons I later applied to work at Mozy.
For anyone who knows him, I think “direct and clear criticism” is a good phrase to describe what it’s like to work for Josh. His class was no exception. It was a great chance to learn from someone who’s been there and done it successfully.
Four Stages of the Game
Seth Godin says there are four stages to every “game” that we play in life. These are projects and activities in which we are involved. We even use game-like labels for some of these: the dating game, the corporate ladder, the rat race. I’d never before thought of them directly as games that could be played.
- You don’t even realize there’s a game.
- You start getting involved and it feels like a matter of life or death.
- You realize that it’s a game and you play it with strategy.
- You get bored with the game, because you’ve seen it before.
I’ve read Seth’s short article several times and wondered about myself. I’ve started to recognize these stages in the games that I “play” at work and home. Looking back, I see myself mostly in stage two: caring a lot about the outcome and stressing that things aren’t going well.
More recently, I see myself being able to step into stage three at times: not taking things so personally, being willing to change my behavior and conversation to be more effective. Stage three is certainly less stressful.
Occasionally, I’ve hit stage four and moved on. I felt like I’d learned all that I would and lost interest in continuing. Not giving up in frustration. More like losing interest in continuing to do something at which I already excelled.
Mostly, I wish for more than this. I’d love the passion and enthusiasm of stage two with the lower stress of stage three in a game that avoids the boredom of stage four. Marriage and family can be this way. Work has the potential as well, though the nature of corporations seems to work against it at times.
200 Million iPads
About a month ago, I mentioned in a meeting at work (and later tweeted) that I believed Apple would sell about 200 million iPads by the end of 2012. Brief awkward silence. Then I was asked to send out the details of how I’d arrived at that number.
Honestly, at that point, I’d just eyeballed the sales trends. As I opened up a spreadsheet, I really hoped my estimate would hold up. :)
The first iPad went on sale on April 3, 2010. Here are Apple’s official iPad sales numbers:
- Apr to Jun 2010: 3.27 million
- Jul to Sep 2010: 4.19 million
- Oct to Dec 2010: 7.33 million
- Jan to Mar 2011: 4.69 million
- Apr to Jun 2011: 9.25 million
At this point, we only have one year-over-year growth number for comparison. That’s fairly weak evidence on which to predict the future. But this is just for fun and games, right?
Assuming that the growth rate remains consistent, here is what iPad sales will look like:
- Jul to Sep 2011: 11.8 million (actual result was 11.1 million)
- Oct to Dec 2011: 20.7 million (actual result was 15.4 million)
- Jan to Mar 2012: 13.2 million
- Apr to Jun 2012: 26.1 million
- Jul to Sep 2012: 33.3 million
- Oct to Dec 2012: 58.4 million
192 million iPads by the end of 2012. Apple is selling every iPad they can make so these numbers may be limited by Apple’s ability to meet demand.
Put another way, here are the yearly totals:
- 2010: 14.8 million
- 2011: 46.4 million (actual result was 40.1 million)
- 2012: 131.0 million
That’s the beginning of a very fast growth curve. There are a few others who agree.
Apple will report their next financial results in mid-October. Then we’ll have two data points.
Disclosure: I now own some AAPL stock.
Ron Paul for President (Again)
Ron Paul is again running for president. This short video of Ron Paul explaining his foreign policy views is exactly why we need him as president. No other candidate in either party has the integrity and vision to advocate for peace and liberty over war and killing.
On another note, if you are familiar with LDS culture I really recommend this hilarious set of jokes about “How Mormon is Mitt Romney”. The jokes could be equally applied to any LDS presidential candidate. :)
Quote: Helen Keller
Security is mostly a superstition. It does not exist in nature, nor do the children of men as a whole experience it. Avoiding danger is no safer in the long run than outright exposure. Life is either a daring adventure, or nothing.
Learning to ride a motorcycle, working yourself out of a job, asking someone you don’t know out on a date, traveling overseas, braving TSA agents at the airport — there’s quite a rush to living life as a daring adventure.
Zen Habits: Lessons Learned
Leo Babauta wrote an article at Zen Habits describing 38 life lessons he’s learned in 38 years. He explains each point. Many resonated strongly with me. Worth taking a moment to read and consider.
2. Possessions are harmful.
3. Slow down. Rushing is rarely worth it. 5. The moment is all there is.
6. When your child asks for your attention, always grant it.
13. You will miss a ton, but that’s OK.
14. Mistakes are the best way to learn.
15. Failures are the stepping stones to success.
16. Rest is more important than you think.
17. There are few joys that equal a good book, a good walk, a good hug, or a good friend. All are free.
19. The destination is just a tiny slice of the journey.
20. A good walk cures most problems.
21. Let go of expectations.
22. Giving is so much better than getting.
27. The world is full of distractions, but very few are as important as creating.
29. Don’t sit too much. It kills you. Move, dance, run, play.
33. Do less. Throw out the checklists and focus on what you love.
37. You’ll shy away from doing great things, from going on new adventures, from creating something new and putting it out in the world, because of self-doubt and fear. Do it anyway, because they are wrong.
The earliest comment I can remember my then future wife making is, “Giving is the best gift anyone can receive.” She’d bought someone else lunch on her own birthday. Her happy attitude was one of the main reasons I (eventually) asked her out.
Free DNS Hosting Performance Tests
Way back in April 2009, I read two articles about using Pingdom to test hosted DNS services. Pingdom has a limited free account, includes several types of web-related performance tests and has test servers in over 25 locations throughout North America and Europe. I started using it immediately and have been very pleased with their product and service.
I’ve been wanting to test the performance of hosted DNS services that include at least one domain for free. Two years later, I finally got around to it. All tests were done with my own domain name.
Each test covered eight days (except Afraid, which I ended early after six). I would have preferred to run the tests concurrently over a longer period of time. If I missed anyone, please let me know and I’ll add them to the list.
| Name | Uptime | Response | Std Dev | Notes |
|---|---|---|---|---|
| Namecheap | 100.00% | 82 ms | 175 ms | Includes free email forwarding. |
| ClouDNS | 100.00% | 93 ms | 319 ms | Excellent user interface. |
| Moniker | 100.00% | 114 ms | 248 ms | *** Included with domain registration. *** |
| ZoneEdit | 99.65% | 91 ms | 280 ms | |
| GeoScaling | 99.78% | 103 ms | 332 ms | |
| XName | 100.00% | 117 ms | 325 ms | |
| DNS Exit | 99.98% | 256 ms | 1025 ms | |
| FreeDNS | 100.00% | 187 ms | 530 ms | Website down for days recently. No comment on why. |
| Afraid | 80.45% | 223 ms | 1022 ms | Sub-domain sharing. Down 4 mins every 19. |
I recommend Namecheap and ClouDNS. If you are willing to pay for DNS services, there may be faster and more reliable options. I’d love to try out easyDNS and DynDNS but neither have a free option.
UPDATE May 2011: Namecheap’s DNS service has recently experienced two outages: one due to a denial of service attack and the other caused by a misconfigured DNS entry at another registrar. Their service is relatively new, so I hope they handle these types of issues better in the future. I appreciate the honesty and openness with which they have reported these issues. ClouDNS is also experiencing intermittent downtime, but has not mentioned anything. END UPDATE
Here are the charts to give you a visual idea of the test results. Pingdom needs to allow customers to control the vertical scale. I’m just too lazy to make my own charts using their cool API. :)
Namecheap
ClouDNS
Moniker
ZoneEdit
GeoScaling
XName
DNS Exit
FreeDNS
Afraid
The Homeless Woman
Received via email:
A woman was walking down the street when she was accosted by a particularly dirty and shabby-looking homeless woman who asked her for a couple of dollars for dinner.
The woman took out her wallet, extracted ten dollars and asked, “If I give you this money, will you buy some wine with it instead of dinner?”
“No, I had to stop drinking years ago,” the homeless woman replied.
“Will you use it to go shopping instead of buying food?” the woman asked.
“No, I don’t waste time shopping,” the homeless woman said. “I need to spend all my time trying to stay alive.”
“Will you spend this on a beauty salon instead of food?” the woman asked.
“Are you nuts?” replied the homeless woman. “I haven’t had my hair done in 20 years!”
“Well,” said the woman, “I’m not going to give you the money. Instead, I’m going to take you out for dinner with my husband and myself tonight.”
The homeless woman was astounded. “Won’t your husband be furious with you for doing that? I know I’m dirty, and I probably smell pretty disgusting.”
The woman replied, “That’s okay. It’s important for him to see what a woman looks like after she has given up shopping, hair appointments and wine.”
:)
How to Modify the Dock or Login Items on OS X
If you need to programmatically add or remove applications from the user’s Dock or Login Items, you’ll find that there isn’t a standard way to do both that works on OS X 10.4 and later systems.
Apple provided some early sample code for handling login items called LoginItemsAE. The code is complicated and does not work consistently for me.
CocoaDev has a page that talks about starting an application on startup. I agree that launchd user agents do not work well on 10.4.
If you no longer need to support 10.4, you can use the LSSharedFileList API that Apple introduced in 10.5 to manage Login Items. Information on that API does not yet appear in the official documentation, but you can find example code here and here.
As far as I know, Apple still does not provide a way to easily manage Dock items. I believe this is by design. The Dock is supposed to controlled by the user. However, I’ve found that users sometimes want an application to add or remove itself from the Dock for convenience.
Login Items
This code uses NSUserDefaults to modify the settings files for the user’s Login Items. If the System Preferences application is open, it must be closed and reopened to see the changes.
@implementation NSUserDefaults (Additions)
- (BOOL)addApplicationToLoginItems:(NSString *)path {
NSDictionary *domain = [self persistentDomainForName:@"loginwindow"];
NSArray *apps = [domain objectForKey:@"AutoLaunchedApplicationDictionary"];
NSArray *matchingApps = [apps filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"Path CONTAINS %@", path]];
if ([matchingApps count] == 0) {
NSMutableDictionary *newDomain = [domain mutableCopy];
NSMutableArray *newApps = [[apps mutableCopy] autorelease];
NSDictionary *app = [NSDictionary dictionaryWithObjectsAndKeys:path, @"Path", [NSNumber numberWithBool:NO], @"Hide", nil];
[newApps addObject:app];
[newDomain setObject:newApps forKey:@"AutoLaunchedApplicationDictionary"];
[self setPersistentDomain:newDomain forName:@"loginwindow"];
return [self synchronize];
}
return NO;
}
- (BOOL)removeApplicationFromLoginItems:(NSString *)name {
NSDictionary *domain = [self persistentDomainForName:@"loginwindow"];
NSArray *apps = [domain objectForKey:@"AutoLaunchedApplicationDictionary"];
NSArray *newApps = [apps filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"not Path CONTAINS %@", name]];
if (![apps isEqualToArray:newApps]) {
NSMutableDictionary *newDomain = [domain mutableCopy];
[newDomain setObject:newApps forKey:@"AutoLaunchedApplicationDictionary"];
[self setPersistentDomain:newDomain forName:@"loginwindow"];
return [self synchronize];
}
return NO;
}
@end
Dock
The code for adding applications to and removing them from the user’s Dock is very similar. The differences include the domain, key, predicate and dictionary entry.
This code uses NSUserDefaults to modify the settings files for the user’s Dock. The Dock must also be restarted after making a change. The command “killall Dock” works, either programmatically or from the Terminal.
@implementation NSUserDefaults (Additions)
- (BOOL)addApplicationToDock:(NSString *)path {
NSDictionary *domain = [self persistentDomainForName:@"com.apple.dock"];
NSArray *apps = [domain objectForKey:@"persistent-apps"];
NSArray *matchingApps = [apps filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"%K CONTAINS %@", @"tile-data.file-data._CFURLString", path]];
if ([matchingApps count] == 0) {
NSMutableDictionary *newDomain = [domain mutableCopy];
NSMutableArray *newApps = [[apps mutableCopy] autorelease];
NSDictionary *app = [NSDictionary dictionaryWithObject:[NSDictionary dictionaryWithObject:[NSDictionary dictionaryWithObjectsAndKeys:path, @"_CFURLString", [NSNumber numberWithInt:0], @"_CFURLStringType", nil] forKey:@"file-data"] forKey:@"tile-data"];
[newApps addObject:app];
[newDomain setObject:newApps forKey:@"persistent-apps"];
[self setPersistentDomain:newDomain forName:@"com.apple.dock"];
return [self synchronize];
}
return NO;
}
- (BOOL)removeApplicationFromDock:(NSString *)name {
NSDictionary *domain = [self persistentDomainForName:@"com.apple.dock"];
NSArray *apps = [domain objectForKey:@"persistent-apps"];
NSArray *newApps = [apps filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"not %K CONTAINS %@", @"tile-data.file-data._CFURLString", name]];
if (![apps isEqualToArray:newApps]) {
NSMutableDictionary *newDomain = [domain mutableCopy];
[newDomain setObject:newApps forKey:@"persistent-apps"];
[self setPersistentDomain:newDomain forName:@"com.apple.dock"];
return [self synchronize];
}
return NO;
}
@end
If you need to manage both the Dock and the user’s Login Items. You can put all four methods into one category.
I consider this code to be in the public domain. Please feel free to copy and paste. And let me know if you find any problems or have suggestions.













