Smaller iPhone = Smaller Environmental Impact

So you want to save the world? Get an iPhone SE.

Apple publishes environmental report cards for many of their hardware products on their Environment page. These reports contain detailed information about the environmental impact of production, lifetime use, recycling and more for each device. An estimated life cycle carbon emission value, measured in kilograms of Carbon dioxide equivalent, is provided for each device.

Most of the emissions occur at production of the phones and, as is evident in the chart above, the larger the phone the more carbon emissions are required to manufacture and ship it to the customer. As Apple has gone all in on larger devices their environmental impact has been slowly trending up over time despite the massive effort the company puts into making every step of the process as environmentally friendly as possible.

Of the phones that support the latest iOS version the iPhone SE is the device with the lowest impact at 45 kg CO2e, which is only about half of the impact of the massive iPhone 11 Pro Max. Some years earlier the even smaller, and to my eyes yet more beautiful, iPhone 4 had achieved the same low level of emissions.

There are some glaring omissions in Apple's list of product environmental report cards which is why the chart is missing data for the original iPhone, iPhone 5 and 5c, and iPhone 6 and 6 Plus.

Tesla Model 3 Unplugged – Summer edition

This is a follow up to my previous post about monitoring the phantom drain of my Model 3's battery as it sat parked for an extended period of time last winter.

Phantom Drain Summer 2019.png

Over 7 weeks this summer I remotely monitored the charge state of my car while I was away on vacation. During this time the state of charge dropped from 85% to 72%, meaning I saw not quite 2% of battery drain per week as the car sat parked in the garage.

The charge state was checked weekly using the Tesla app, thus allowing the car to remain at its low power sleep state for longer durations than during my last experiment when I took daily readings. I believe this explains why the drain was significantly lower this time around.

Car specification: Long Range Rear Wheel Drive Tesla Model 3, firmware version 2019.20.4, Sentry mode disabled.

Tesla Model 3 Unplugged – “phantom drain” when parked without plugging in

Despite Tesla recommending plugging their cars in when parking for extended periods I had to leave my Model 3 unplugged when I went to Sweden over the winter holidays.

Before heading to the airport I charged the car to 85% to make sure it wouldn't run flat. During my trip I tracked the so called “phantom drain” from the battery by taking a reading of the charge level every evening using the Tesla app.

Charge level vs. Day.png

After 42 days the charge level had only dropped by 28 points, to 57%. That's on average about ⅔ of a percentage point, or ½ kWh, lost per day. Based on this I wouldn't even worry too much about leaving the car unplugged for up to three months as long as I've charged it up beforehand. But plugging in while parked is of course always preferable as it lets the car run its battery management system.

An interesting data point to note is that one day after starting the experiment the charge level had increased to 86%. I suspect this was due to the battery recalibrating after the charging session.

Car specification: Long Range Rear Wheel Drive Tesla Model 3, firmware version 2018.42.4.

Environment: Unheated indoor garage in Seattle during December and January, temperature range 0 – 15°C (32 – 59°F).

Electric road trip from Seattle to Mount Rainier

In August 1919 a Detroit Electric EV made a promotional trip from Seattle to Mount Rainier. It's now 99 years later, and I decided to set out in a Tesla Model 3 Long Range to see if modern electric vehicle technology can do the same.


The goal of this trip was to see if it is possible to reach the Sunrise Visitor Center and make it back to civilization without getting stranded on the side of the road in the middle of the wilderness. Since charging infrastructure is extremely lacking around the mountain I took some precautions to avoid running out of juice.

The aero wheel covers were put back on the car to improve aerodynamics, the tires were pumped just past their recommended pressure to lower rolling resistance, and Chill Mode was enabled to compensate for my lead foot. I left downtown Seattle with the battery charged to 99%.

Click to enlarge map

Route and efficiency

The route I took included a detour to pick up my brother at Seatac Airport, and then to the Weezer concert at White River Amphitheatre, before ending the first day of driving at a hotel in Puyallup. There was no charging at the hotel, so early the next morning we set off up the mountain with battery capacity at 77%.

Tesla's navigation indicated that we would reach Sunrise Visitor Center at 1950 m elevation (6400 ft) with 30% remaining. Surprisingly we actually made it there with 41% remaining, having used 220 Wh/Km (353 Wh/mi) on the 114 Km (71 mi) drive from Puyallup.

While we enjoyed the views and mountain air for a few hours, we knew we were quite literally not out of the woods yet. Would the 41% battery be sufficient to get us to civilization?

Energy consumption went negative on the way down the mountain

Energy consumption went negative on the way down the mountain

We decided the next leg of our trip would be Route 12 south of the mountain, to the Centralia supercharger. As it turned out we needn't have worried about range. The regenerative breaking worked wonders on the way down and we arrived at the charger with 19% remaining in the battery, having used only 76 Wh/Km (122 Wh/mi) on the 195 Km (121 mi) drive from Sunrise Visitor Center.

Supercharging at Centralia, WA

Supercharging at Centralia, WA

After charging up at Centralia it would be no problem getting back to Seattle, so we declared the experiment a success at this point.

Road Trip Statistics

The stats for the full drive Seattle > White River Amphitheatre > Puyallup > Sunrise Visitor Center > Centralia ended up being 417 Km (259 mi), using 80% of the battery at a reported 133 Wh/Km (214 Wh/mi).

These reported consumption numbers look a little dubious to me. Assuming a battery capacity of 75 KWh the 80% utilization over 417 Km (259 mi) should be 144 Wh/Km (232 Wh/mi). I don't know how to account for this discrepancy unless losses while parked are excluded from the reported numbers. We did see 2% phantom drain during the hotel night, perhaps there was more drain during other stops along the way that I didn't notice.


I am frankly a little surprised at the reported efficiency figures we achieved during this trip. In my day to day driving I usually see reported consumption of 150 Wh/Km (240 Wh/mi). We did use air conditioning, but didn't speed or drive aggressively. I suppose the low speeds of the mountain roads helped avoid drag.

Something I hadn't considered before setting off was the lack of AT&T connectivity in the area. This lead to the car's navigation system being pretty unusable for the trip down the mountain until we found a spot with signal. Luckily I had brought a physical map. My brother's T-Mobile connection was superior to AT&T, so we could also use his phone as a navigation fallback.

Instead of heading straight for Seattle we decided to extend our road trip to the Pacific ocean, setting our sights on Westport where we were delighted to find the Cranberry Road Winery, which had a Tesla destination charger.

Destination chargers at the Cranberry Road Winery

Destination chargers at the Cranberry Road Winery

Referral code

If you are considering buying a Tesla car or solar panels you can use my referral code "kim33408" to sweeten the deal. Details on the linked referral page.


Icons used in route map graphic; "buildings" by Blair Adams from the Noun Project, "Airport" by Melissa Ambroso from the Noun Project, "Hotel" by Gan Khoon Lay from the Noun Project, "Mountains" by Alice Noir from the Noun Project, "charging" by Jared Ng from the Noun Project

App Camp for Girls campaign and interview

I was recently interviewed by App Camp for Girls about app development, diversity, and my background in the tech field. The interview is a part of their campaign to raise money to expand their program with camps in three new cities.

If you have the ability to do so you can support the campaign on Indiegogo. And if you're interested in how I ended up doing app development in Seattle I recommend reading the interview. As an additional bonus you'll see a never before published photo of me enjoying the outdoors in the state of Georgia :-)

The Yosemite Adventure

Ever since I played adventure games on my dad's IBM PC XT as a little kid in Sweden, the mountain featured in the Sierra On-Line logo represented magic and adventure to me. That mountain, I've since learned, is named Half Dome and is in Yosemite National Park.

This spring I was able to take a week off work and head to California for the Yosemite conference. It's billed as The Apple Conference with a View — and boy were there views to behold!

After suffering through constant rain and hail for a thousand literal miles on the I-5 from Seattle, the climb over the pass into Yosemite Valley under a clear sky with pure white snow alongside the side of the road was a great experience. The view was simply mesmerizing.

The Yosemite conference, which took place at the Yosemite Valley Lodge, is not where you come for a deep dive into technical details. Instead the talks of this conference focus on how to stay sane and thrive in the tech industry, whether as an indie or in a jobby-job. Tips on getting products shipped, the importance of delivering quality, how to get a good night's sleep, and even how cows can promote creativity were the order of the day. And in addition to the talks there were musical components with Jonathan Mann providing daily musical commentary on the proceedings, as well as a performance by James Dempsey and the Breakpoints featuring a plethora of guest artists.

Jonathan Mann and friends performing the Accidental Tech Podcast theme song

Similar to my experience at the Big Nerd Ranch, Yosemite offers barely any network connectivity to the outside world, providing a sense of isolation. I personally found the lack of connectivity helped build community within the group of attendees and presenters. Many of us would meet up in the bar in the evenings for interesting conversations that sometimes went a little too far into the night.

Laura Savino and Doug Beal mixing their own non-alcoholic drinks at the bar

While I was lucky enough to meet and hang out with several new acquaintances, one of the most memorable interactions was a lengthy conversation I had with Jason Snell about Californian geography and the space industry.

Hal Mueller making use of the one spot with decent 4G connectivity

Mixed in with the frankly super inspirational talks and performances, by an all star cast of presenters/entertainers, was the opportunity to go hiking with the other attendees. The selection of hikes catering to all experience levels would be a shame to miss as the scenery in Yosemite Valley rivals even the beauty of the Seattle area.

A photo walk led by James Duncan Davidson was also offered. Leisurely strolling through the scenery with a group of people all looking to find unique photo opportunities was a fun experience.

A group of photography enthusiasts

Jeff Watkins went off trail to get the shot

Maia Olson sneaking up on the wildlife, represented by Christopher Pickslay

I'm tremendously happy that this spring I got to see Half Dome in person for the first time. To me it no longer just represents gaming adventure — it now represents professional adventure as well. With most of the year behind me, including a trip to WWDC, I firmly believe that going to the Yosemite conference was my best decision of 2016.

Me, El Cap, and the Half Dome

My sincere thanks to the Klein family for organizing a wonderful conference, to Hal Mueller for the safe and comfortable ride from Seattle to Yosemite, and to Alan Forkosh for driving me to San Francisco after the conference ended. In SF I got to spend the night drinking tequila in the marina aboard an Apple design manager’s yacht. But that’s a story for another time…

Apple Watch and Task Oriented Watch Faces

After having spent a lot of time reading reviews, watching videos, and learning as much as possible about the Apple Watch without having one, I've decided to pursue a lightweight type of app concept I've chosen to call Task Oriented Watch Faces.

These are apps meant to be worn while performing activities which make two handed use of the watch inconvenient, but where you’d want quick access to relevant information by glancing at your watch. I've started work on a rock climbing app under the working title Upp (the Swedish word for up).

The concept of task oriented watch faces is based on the capability to set the watch to show the latest shown screen when it's awaken, instead of showing the regular watch face. Using this setting the wearer can use Upp as a temporary watch face during their climb to get instant access to how high they've climbed since setting off.

Upp watch interface mockup

Upp watch interface mockup

On-the-watch interactivity will be limited. The idea being you launch the app before starting your climb and then access it by raising your wrist anytime you want to see the current altitude status.

I have ideas for other Task Oriented Watch Faces, but at the moment I'm focusing on Upp and am in need of Watch wearing beta testers. Please get in touch if you are willing to help out.

Playful data visualizations using Sprite Kit

On March 12th 2015, I gave a brief show & tell about how I used Sprite Kit to make something that isn't a game at the Seattle Xcoders meetup.

The slides and sample code have been posted to my GitHub page.

Note that the posted sample code is a simplified project only focusing on the Sprite Kit section of the talk. For example; the interactive line chart which was also briefly demonstrated has been replaced with a static image.

The event was recorded, but the video hasn't been posted yet. I'll update this post once it's available. In the meantime here are links to some good resources about Sprite Kit;

Regarding Lynda, if you have a Seattle Public Library card you can access all their courses for free.

OS X intrusion monitoring using push notifications

Warning: You need to be very comfortable using the Terminal to follow along. I take no responsibility for what happens to your system if you try to follow these instructions without understanding what they do.

Watching the documentary film The KGB, the Computer, and Me inspired me to try my hand at setting up an intrusion detection system, similar to the pager alert system Cliff Stoll used to alert himself when the intruding hacker logged onto the computers he administered at Berkeley in the 1980s.

My home server exposes both VNC and SSH to the public Internet, and it has always worried me that someone could hack into it and perform any number of unsavory deeds without me ever finding out. I did some quick studying and decided I should be able to detect VNC and SSH log ins and send myself a push notification without too much trouble.


Detecting log in events

Connection events in OS X 10.10 Yosemite are recorded in the system.log file. As soon as a new line is added to this log file the intruder notification system should look at it to see if it indicates that a successful log in event has occurred.

We can run tail on the log file in the terminal to see the system log messages in real time.

> tail -F /var/log/system.log

By analyzing log events while logging in using VNC and SSH I determined that suitable phrases to look for are Authentication: SUCCEEDED for VNC connections and Accepted keyboard-interactive/pam for SSH.

To automate this work we create a shell script in our home folder named

while read line; do
    if [[ $line == *"Authentication: SUCCEEDED"* ]]
        echo "VNC login detected"

    if [[ $line == *"Accepted keyboard-interactive/pam"* ]]
        echo "SSH login detected"

Before we can try our script out we need to make the script file executable.

> chmod +x 

We can now verify our intrusion detection by piping the output from the system log file into our script and logging in using VNC and SSH.

> tail -F /var/log/system.log | ./ 
Seems to work.

Seems to work.


Sending push notifications

We'll use to send push notifications to our phones. The Boxcar 2 app needs to be installed on the phone meant to receive our notifications, but you don't need to create a Boxcar account or sign in unless you feel like it. You do need to give it permission to show you notifications, obviously.

We will need to copy the access token out of the app's settings pane so Boxcar knows where to send our notifications.

Copy user token.gif

Once we have our access token we can use curl from the terminal to send ourselves a push notification. Substitute your personal access token for all occurrences of [ACCESS TOKEN] in the commands and scripts below.

> curl -k -d "user_credentials=[ACCESS TOKEN]" \
       -d "notification[title]=Login detected" \
       -d "notification[long_message]=Someone logged in" \

For more information about the parameters we can send to Boxcar, see How to send a notification to Boxcar users.

We now add a function for sending push notifications to, and add calls to this function when either type of log in event has been detected.

function notifyLogin {
    curl -k -d "user_credentials=[ACCESS TOKEN]" \
         -d "notification[title]=Login detected" \
         -d "notification[long_message]=Someone logged in using $1" \

while read line; do
    if [[ $line == *"Authentication: SUCCEEDED"* ]]
        echo "VNC login detected"
        notifyLogin VNC

    if [[ $line == *"Accepted keyboard-interactive/pam"* ]]
        echo "SSH login detected"
        notifyLogin SSH


Start monitoring on system startup

We're almost done, but an intrusion detection system that doesn't automatically start on boot isn't worth much. To finish up we add a launch daemon to our machine.

First we create a script file that performs the tail command and pipes the results to We need to make sure we give the full path to since this will be executed by the system, so replace [USERNAME] to provide the correct path.

tail -F /var/log/system.log | /Users/[USERNAME]/

As usual we need to mark this script as executable for it to work.

> chmod +x

We then create a .plist file in the /Library/LaunchDaemons/ folder to launch this script on system boot. We name the file com.theevilboss.notifylogins.plist, and make sure to replace [USERNAME] to provide the correct path to

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "">
<plist version="1.0">


Verification and troubleshooting

After restarting the machine we should be able to confirm that the notification system works by simply logging in using VNC or SSH and waiting for a notification banner to appear on our phone.

If no notifications come through there are a few likely issues:

  1. Banner notifications should be enabled for the Boxcar app.
  2. We must use our personal Boxcar access token in the script file.
  3. The script file must contain the correct path to
  4. The com.theevilboss.notifylogins.plist file must contain the correct path to
  5. The com.theevilboss.notifylogins.plist file should be placed in the folder /Library/LaunchDaemons/.

Another issue is that the file com.theevilboss.notifylogins.plist could be somehow malformed, in which case it wouldn't load. We can see if it's loaded using launchctl in the terminal.

> sudo launchctl list com.theevilboss.notifylogins

DISCLAIMER: This solution is what I came up with after a little research, but it may not be the best way to do it. If there's an obviously superior method, or if something I did is a bad idea for any reason I very much want to hear about it.

Replacing the battery in an Estimote iBeacon

After about a year of usage one of my Estimote iBeacons ran out of battery power this spring. I couldn't find any proper instructions explaining how to replace the CR2450* battery inside, but I did find some guidance in a comment on an Estimote blog post.

...the best and easiest way to cut the Beacon is a vertical cut across the top of the enclosure.

I followed the advice, and I have to say it worked out well enough.

Using a razor blade I made a cut down the middle allowing me to, with some effort, wrestle the actual beacon hardware out of the enclosure and replace the battery.

The beacon enclosure does carry a visible scar from the operation, although I doubt you'd notice unless you knew to look for it. I also suspect the device is no longer weather resistant. But it is, once again, a fully functioning iBeacon!

Extending battery life

Earlier this year Estimote released an update to their firmware with a set of power saving features. The firmware update is applied using the Estimote iOS app.

After briefly playing around with the power settings, the new battery in my Estimote beacon has a life expectancy of 32+ months.


*Estimote beacons shipped in May 2014 and later use a bigger CR2477 battery.

How to configure ARC between a Panasonic ST60 TV and a Yamaha RX-V375 receiver

In the Audio/Video world Audio Return Channel (a.k.a. ARC, but not to be confused with Objective-C's Automatic Reference Counting) is a way for a TV to output audio over the same HDMI cable already hooked up between it and a receiver. This renders a separate audio output cable redundant, resulting in a reduction of the cable mess usually found behind your A/V equipment.

In theory it's great, but actually getting it to work can take some configuration. Below are the steps I took to set this up so that the audio from the over-the-air TV channels I watch on my Panasonic ST60 TV would play through my receiver, which is a Yamaha RX-V375. I only mention the make and model of my equipment since it's the one combo I know these steps work for, although the procedure should be similar for other equipment.

- First you obviously need to connect an HDMI cable from the receiver's HDMI output to the TV's HDMI2 input, which is the input marked (ARC).

- Then set the TV to show the HDMI 2 input, so you can see the video output from the receiver.

- On the receiver's remote control press the Setup button to bring up the setup menu.

- Now turn the receiver's setting for HDMI > HDMI Control to On.


- On the TV's remote control hit the Apps button and go to the Viera Link app.


- Set Speaker Output to Home Theater.


And there we are, you can now enjoy the audio from TV broadcasts through the superior speakers hooked up to your receiver.


I put these instructions here mainly for the benefit of my future self as I will probably have to do this again at some point in the future, and don't want to spend time doing the research a second time. Perhaps someone else will also find it useful.

This article is based on information found in the ST60 eHELP Owner's Manual and the RX-V375 Owner's Manual, specifically page 18 and 59.

Thoughts on Phones

Apple may well be on the verge of disrupting the U.S. cellphone industry again, finally achieving what they set out to do initially – controlling the sale of the device and the customer experience by breaking the carrier contract lock-ins.

On a recent episode of The Talk Show, John Gruber and M.G. Siegler discussed how the original iPhone was sold to customers at full price in an effort to disrupt the long standing tradition of US providers subsidizing devices in order to lock customers into long contracts.

While the original iPhone was a success it was too pricey to manage to disrupt the US carrier business, so subsequent models have been sold subsidized with two year contracts. It seems to me Apple is about to make a second attempt at disrupting the carrier subsidized business model with the rumored introduction of a more affordable iPhone model to be sold straight to consumers mainly from Apple's retail stores.

AT&T benefited from being the sole iPhone provider in the US market for the first few years. This time I believe T-Mobile, with their newly announced "Un-Carrier" strategy focused on non subsidized plans with unlimited data, stand to gain should this lower cost iPhone model be introduced in the US. The lure of a comparatively affordable monthly plan and the availability of a lower cost iPhone could turn a portion of the US cellphone market towards paying for device and plan separately in order to avoid being locked into contracts. This allows the customer to upgrade their device on their own schedule, a behavior which is common in large parts of Europe and elsewhere around the world.

If US customers start transitioning away from the contract model T-Mobile is the only larger provider currently giving them the opportunity to do so. Were I not locked into another year with my AT&T contract I would go for T-Mobile's Simple Choice Plan which includes unlimited everything for $50/month*. Unless the market changes significantly in the coming year chances are I'll do exactly that when my contract is up.


*The $50 plan includes 500 MB of data at 4G speeds, which should be enough for anyone who is on wifi frequently. After the first 500MB the data speed is throttled, but no extra charge is incurred.

DISCLAIMER: This is all speculation based on the prevailing rumors. I have no inside knowledge of Apple's business strategy.

The Undercover MacBook

For someone in possession of a stolen computer it is no longer enough to look over their shoulder while using it, these days the computer itself can turn informer and lead the police straight to them.

This summer I had my MacBook Air stolen from a hotel room while vacationing in Las Vegas. Along with the machine, roughly 1500 photos taken during the preceding three week road-trip through California and Nevada were gone. Thanks to my heavy reliance on the cloud storage service Dropbox I lost almost no other data, despite having used this as my main machine for the last couple of months. I would have been devastated had I for example lost the source codes to my apps.

I promptly made a report of the theft to the Las Vegas Metro Police Department where they let me know, in no uncertain terms, that I should not expect to see my computer again. They did however assign a detective, one Russel Lee to the case.

A Ray of Hope

Despite the Police's pessimism, I maintained a ray of hope. After buying the laptop I had invested in a piece of software called Undercover to keep my MacBook safe. Described as a “revolutionary theft-recovery software” it would supposedly provide me with all the information needed to recover the computer in case it was ever stolen.

Using my iPad I logged on to the Undercover recovery center website and marked my computer as missing — telling the software to start tracking it.

Things were quiet for several days. I had already made my way back to Sweden and the ray of hope was starting to fade when I finally received an e-mail proclaiming that the computer had been used to access the internet and that Undercover had started tracking it. As promised, I was provided with webcam photos, screenshots, the computer’s IP address, and an approximate location!

I could see that the person using it had logged in to the computer’s guest account and had connected to a Wifi network. While it’s no fun seeing someone using your computer without your consent, I was nevertheless relieved that the tracking software seemed to be working.

Hello there, what are you doing with my laptop?

Oh, you’re hitting up women on Facebook. Carry on then.

The location in Henderson, Nevada, wasn’t exact enough for the police to figure out which house to visit. Frustratingly, I also found out that it takes the police all of 60 days to get the subscriber information for an IP address.

Profiling the User

During the following weeks I was informed whenever the computer was used and I tried to piece together the information I could gather from the screenshots in an effort to point the police in the right direction. I quickly found out the user’s Facebook profile and Skype account, but he used the alias Dee Macc and I couldn’t figure out his real name and address. His Facebook profile did mention that he graduated from LA High class of 2007, so that prompted a search of their online yearbook, alas to no avail.

Eventually a bit of luck, he typed his phone number into a couple of chat windows while trying to pick up women. But according to the number he gave is registered to a 60 year old person in Los Angeles. Not the age you would expect of someone who uses the phrase “im not no baby yeah”. Also, according to his Facebook profile Dee Macc was born on February 5th 1990 making him 21 years old. Thus, the registered owner of the phone number is definitely not our man.

It looked as if my machine was making lots of new friends as other people also started using it now and then, always from the same location in Henderson, NV. Some of their Facebook profiles were under their real names. One of those people, let’s call him B., turned out to be the owner of a Las Vegas boxing gym near Las Vegas Boulevard. Another user was his son D., whom I could tell from his Facebook account is a promising young boxer.

As time passed and more information came in I forwarded everything to the police, but they still didn’t have enough to take action.

The Retrieval

One late evening as I was ready to turn in for the night I was alerted by Undercover that the computer had moved to a new location. At first I thought this was bad news since it meant the IP address subpoena would have to be restarted from scratch, but I couldn't have been more wrong. The location was reported to be close to Las Vegas Boulevard, and the webcam photos showed D. hanging out in a very nice boxing gym. For the first time in weeks I knew exactly where it was!

I sent a quick e-mail to Detective Lee.

New and actionable information.

D. XXXXX is at the time of me writing this using the computer at the XXX XXXXXX Boxing Gym, XXXX Paradise Road, Las Vegas.

I had a reply just minutes later

Perfect! Thanks, I’ll run over there and see.

As webcam photos continued to come in over the next few minutes, I forwarded them to Detective Lee to help him find the right people in the gym. Then all of a sudden the computer went offline. A worrying turn, but I maintained hope as the last screenshot contained an intriguing Facebook update.

“ugghhh i hate police officers…makes me wanna qweef”

Moments later the e-mail I had been hoping for arrived from Detective Lee.

I have your computer! Good Job!!

High fives all around! The Undercover software had delivered on its promise, and combined with the swift action from Detective Lee it had recovered my MacBook Air.


As I’m writing this I have just taken delivery of the computer from the Las Vegas Metro Police Department evidence vault, and I was glad to see my road-trip photos remain safely stored on the disk. Detective Lee had already mentioned that my user account was still on the computer which lead me to believe they would be there, but it’s good to have it confirmed.

After 10 weeks of being separated from my computer I can finally get back to app development and get som delayed updates out the door — once I'm done organizing the road-trip photos of course.

Lessons learned

I was lucky in having been sufficiently prepared before having my computer stolen. Take these lessons to heart, should it happen to you;

  • It’s a good idea to take the precaution of having theft-recovery software installed on your computer.
  • It is vital to have your computer’s serial number available when filing the police report, without it you may not be able to legally prove it’s yours even if you are able to track it.
  • Set up a guest account so the thief can log in and connect to a network, or tracking will not work.
  • Lock your user account whenever you step away from the computer so that a thief can’t access your files and won’t have administration privileges to the system.

This ordeal has made me consider taking a couple of additional measures now the computer is back in my possession.

  • For insurance reasons always make use of the hotel in-room safety box, no matter how insecure.
  • Set a firmware password, a simple measure which will make it impossible for a thief to wipe the system and reinstall the operating system, thus removing the tracking software.
  • Install some software to allow me to siphon off data in the background so that I could have copied over my photos while the computer was connected to the internet but not under my control.

Undercover is available from Orbicule. I highly recommend you install it on your Macs.

Excerpts of collected evidence

Below are some of my favorite screenshots and webcam photos selected from the huge amount of data I received from Undercover during this episode.

Installing Flash? Not on my computer you don’t!

Some webcam photos of people hanging out with my MacBook Air.

“yu cute” — Dee Macc using the shotgun approach on Taberah and Gisele.

“im not no baby yeah” — Dee Macc's failed attempt at sounding mature.

Fine prose from Dee Macc and friends.

NSZombies and the Program received signal: “EXC_BAD_ACCESS” exception

[The following article applies to Xcode 3.x]

Even when following the memory management techniques explained by Steve "Scotty" Scott I sometimes run across my most dreaded runtime error;

Program received signal: “EXC_BAD_ACCESS”

This happens when you try to access an object that has already been released. Sadly the error message doesn't give you any information on what object you were trying to access, but luckily you can call up some zombies to help out.

Control-click the Executable you are trying to debug and select Get Info

Use the + button to add a new environment variable called NSZombieEnabled and set its value to YES.

When you run your app with this variable enabled, all deallocated objects are kept in memory and you will get a better error message in the console once one of them receives the unexpected call which crashes your app.

The debugger stack trace can at this point help you figure out exactly where in you code the problem occurred. Hovering the mouse cursor over the offending object will indicate that it is indeed an NSZombie.

Now that you know which object was accessed after being released you should be able to squash the bug in a few minutes by making sure to apply the memory management techniques correctly on it.

Make sure to uncheck the NSZombieEnabled variable before you ship your code, otherwise no memory is ever freed from you app. If you forget to uncheck it all released objects will be kept around in a zombie state, consuming your memory and eventually getting your app force killed by the system.

Since it is important and you need to remember this, say the following phrase out loud;

"I will not ship zombie infested code to my customers."

The iPad case for explorers and adventurers

I'm pretty sure I never saw Indiana Jones use an iPad, but had he owned one he would certainly have kept it in a Vintcase. Just look at the thing, it radiates pure awesomeness.

When folded up, the wrap-around string keeps it snugly closed, ready to go explore the world.

The Vintcase is made in Spain from high quality cowhide leather. This card matching game is made in Sweden from the absolute highest quality digital bits.

There's no need to hold your iPad or prop it up against anything when watching a movie or using it for recreational gaming. The Vintcase can stand independently on any level surface.

The case was delivered lovingly wrapped with a note saying "I hope you like it" – that's how you make a good first impression! The whole thing just oozes class and I certainly do like it.

If you are interested in getting one of your own, take a look at for more photos and information.

Full disclosure: I am not affiliated with Vintcase in any way except for being a satisfied customer.

"Barkeep, this round is on me"

How you can do good toward your fellow man, and end up with some quality apps for yourself.


Update March 1st:

I sold 341 apps during February. After subtracting income taxes a donation of $143 was made, providing 20 years worth of clean water for 7 people.

My thanks to all who helped by purchasing apps. The charity runs through March, you can donate directly at


Living in a town which sees more than 100 rain days per year, I find it hard to imagine what it must be like not to have access to clean and safe drinking water. Sadly there are people on this planet for whom clean water is an unattainable luxury.

Unsafe water and a lack of basic sanitation kill more people every year than every form of violence on the planet, including the wars raging around the globe.

This is a fact I learned after tuning in to this week's episode of the chat show iDeveloper Live, where Scotty (the show host) has launched Developers Against Poverty — a campaign asking software developers to help bring clean water to areas of the world that lack it.

After hearing about this initiative, and then being inspired by Baked Ham Games' pledge to donate a percentage of their app sales, I have decided to support the effort as best I can.


I hereby pledge to donate 100% of my February profits from the app store to the cause championed by Developers Against Poverty.

The donation will be made during the first week of March, as soon as the February sales numbers are in.

So if you are at all interested in football (soccer if you're American) or perhaps want to study some Japanese, I hope you will join me in supporting this noble cause by buying some apps, which coincidentally are all currently on sale.

Even if none of my apps appeal to you, do consider donating directly to the Developers Against Poverty charity campaign.