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 notifylogin.sh.


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

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

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

> chmod +x notifylogin.sh 

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 | ./notifylogin.sh 
Seems to work.

Seems to work.

 

Sending push notifications

We'll use Boxcar.io 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" \
       https://new.boxcar.io/api/notifications

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 notifylogin.sh, 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" \
         https://new.boxcar.io/api/notifications
}

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

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

 

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 watchlog.sh that performs the tail command and pipes the results to notifylogin.sh. We need to make sure we give the full path to notifylogin.sh since this will be executed by the system, so replace [USERNAME] to provide the correct path.


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

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

> chmod +x watchlog.sh

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 watchlog.sh.


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
    <dict>
        <key>Label</key>
        <string>com.theevilboss.notifylogins</string>
        <key>ProgramArguments</key>
        <array>
            <string>/Users/[USERNAME]/watchlog.sh</string>
        </array>
        <key>RunAtLoad</key>
        <true/>
    </dict>
</plist>

 

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 notifylogin.sh script file.
  3. The watchlog.sh script file must contain the correct path to notifylogin.sh.
  4. The com.theevilboss.notifylogins.plist file must contain the correct path to watchlog.sh.
  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.

arc1.jpeg

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

arc2.jpeg

- Set Speaker Output to Home Theater.

arc3.jpeg

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 whitepages.org 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.

Conclusion

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 Vintcase.com 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 http://developersagainstpoverty.org/.

-----

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.

Therefore;

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.

Installing Leopard on the G4 Cube

CubeLeopardHeader.jpg

The PowerMac G4 Cube, arguably the coolest computer on planet Earth, is not supported by operating systems later than Mac OS X 10.4 Tiger, but there are many reasons you may want to run a later system. For me the main incentive to upgrade was that Apple dropped Tiger support with the release of iTunes 10, which means a Cube on 10.4 can not partake in the wonders of Home Sharing.

The minimum system requirements for installing Leopard on a PowerPC based Mac is an 867 MHz processor and 512 MB of RAM. The memory requirement isn't really a problem since the Cube supports up to 1.5 GB, and you wouldn't want to run Leopard on any less than 512 MB anyway. The processor speed requirement, however, is a problem since the fastest (unmodified) Cube runs at 500 MHz. Luckily there is a way to fool the Leopard installer's system requirements check by temporarily modifying the processor speed reported by the firmware.

Back up your Tiger

First off you'll want to create a bootable backup of your internal disk on a firewire drive. Do this using SuperDuper! or a similar tool, and make sure you can really boot from the backup drive.

No really, do not go on until you have succesfully booted from your backup and made sure it works.

Set the startup disk

CubeStartupDisk.jpg

Put your Leopard installation disk in your DVD slot, or copy it onto a firewire drive if your Cube can't read DVDs. Then set the installation disk as your Startup Disk in the System Preferences so that on next restart your Cube will boot from it and start the installation.

Modify Open Firmware

CubeOpenFirmware.jpg

Restart your Cube, and hold Opt-Cmd-O-F during boot to enter the Open Firmware prompt. You will now temporarily set the reported CPU speed to 867 MHz and then continue booting. To accomplish this you will type some commands on the prompt, Open Firmware will respond with an 'ok' message after each understood command. The reported speed will revert back to the original value after next reboot.

For single CPU systems type the following three commands exactly as shown.

dev /cpus/PowerPC,G4@0

d# 867000000 encode-int " clock-frequency" property

mac-boot

For dual CPU systems use the following five lines.

dev /cpus/PowerPC,G4@0

d# 867000000 encode-int " clock-frequency" property

dev /cpus/PowerPC,G4@1

d# 867000000 encode-int " clock-frequency" property

mac-boot

Continue with the installation normally, and eventually end up with a Leopard Cube.

CubeInstallation.jpg

Thanks to MacRob on CubeOwner.com for turning me onto this solution.

Retro gaming on iPad, for iOS developers

MADTV and Gabriel Knight running in dospad on the iPad

MADTV and Gabriel Knight running in dospad on the iPad

Sometimes it's good to take a break from coding, and what's more relaxing than running some retro games on your iPad?

Getting DOS onto iPad

Some time ago a DOS emulator called iDOS briefly made it into the App Store, but it was already long gone when I heard of it and tried to download it. As luck would have it the source code for the app is available under the name dospad from Google Code, so any registered iOS developer can build it using Xcode and run it on their iPad.

I believe iDOS or dospad is also available for jailbroken iPads, for those who are not registered developers but are OK with jailbreaking their device.

Installing games

With dospad you get a fully functional DOS system for your iPad. There is mouse support and sound support, making it brilliant for some retro gaming. If the games are mouse driven you can even go full screen for a very immersive experience.

Sierra's adventure game Gabriel Knight is one of my all time favorites, and since I no longer have a floppy disk drive on my computer I downloaded it from an abandonware site called The House of Games, where there's a large selection of old DOS games.

dospad2.png

With dospad installed on your iPad, you can drag files into it using iTunes. Just go to the iPad's Apps tab and select dospad under the File Sharing header.

Dospad comes with an unzip utility so once you have transferred the zip file with your game you can use the DOS command prompt to create a directory and unzip the file into it.

dospad3.png

For Sierra games you then run install.exe to select your sound options. I selected Soundblaster Pro which seems to work well.

Launch the game by running sierra.exe.

Mouse controls

Obviously, this being DOS, you don't use it like a standard touch screen. Instead you control a mouse cursor on screen in the same manner you would using the touchpad on your Macbook. Tapping the screen left clicks at the position the cursor points to.

dospad4.png

You can play either in portrait or landscape mode, as well as full screen.

dospad5.png

Happy retro gaming, and make sure to save your game often.

Add your own teams to Starting 11

Version 2.0 of Starting 11 was just submitted for App Store review and should be available on the store shortly.

New features

The new version lets you add any number of your own favorite teams and players.

Formations you prepare are stored for future modifications, meaning you don't need to start over from the beginning the next time you want to prepare a starting eleven.

How to get it for free

Version 2.0 will be priced at $2, but it is a free upgrade for users of version 1.0. So if you haven't yet downloaded Starting 11 you can get 2.0 for free by acting now, before it goes online at the store.

App store link

The evolution of an iPhone app interface

I recently released Starting 11, an iPhone app in which you can pick your own football team line up and share it via e-mail and Facebook.

From idea to app store submission took about 10 evenings of work. The lions share of that time was spent perfecting the user interface. Below are the design iterations from idea to App Store release, click the images for full versions.

Since I had the idea for this app just before the FIFA World Cup started, I quickly decided to use the Xcode template "Navigation-based Application" to simplify development, hoping to get it published before the World Cup had finished. By focusing on polishing the pitch view, which would be the view where the user spends most of his time, I figured I would get the most bang for my efforts.

Initial idea sketch

Starting11_idea.png

Using the brilliant and free Adobe Ideas app on my iPad i quickly sketched the basic UI and zoomed the resulting image to match the size of my iPhone. This gave me a feel for the size of the UI components, allowing me to decide that it would be feasible to have a full football team on screen at once.

Grass and scoreboard

To generate the grass for the pitch I followed Andrew Houle's Photoshop tutorial, ending up with a huge image of grass texture. My brother graciously provided me with the chalk lines marking the pitch and with the scoreboard graphic which has a nice detailed mesh effect only visible with the extra resolution available on the iPhone 4.

Player kits

I had decided to represent the players on the pitch by having their jerseys show the number on the back, the name would appear beneath. My first effort used a combination of rectangular UIViews to create the illusion of the jersey. I was hoping this would allow me to save time, but it just didn't look good enough to match my vision for Starting 11.

I had to implement my own UIView subclass to handle drawing the player using vector graphics. This allowed me to create something that more closely resembled a jersey.

I also decided to add a dark background to the player names.

After using the app in this state for some time I decided that the shoulders needed to be more rounded, and that a black outline around the player added some needed contrast, especially important when using the application outdoors in the sun. For the same reason the color behind the player name was darkened.

I also added a small line to indicate the separation of the player's legs, without which it looked like the players were wearing skirts.

Finally the flags for all countries had some shine added to them, then the Share button was added and I decided that instead of having the team's name appear on screen twice the navigation bar should contain the application's title.

And there you have it, the UI of version 1.0 of Starting 11. What do you think? What would you change?

Looking forward

After the World Cup is done and we have a new world champion team, the next step will be to add the possibility for customers to add and modify teams. This will make the app useful for the club competitions that start up after summer.

Regarding the iPad I think Starting 11 would be a wonderful fit for the larger screen, so I plan to make it a universal app that supports both the iPhone and the iPad form-factors.

Until these steps are done the app will remain free. I will eventually start charging.

Starting 11 for iPhone in HD

It has yet to be listed in the App Store, but I'd like to introduce you to my latest effort. Starting 11 is an app developed for the ongoing FIFA World Cup.

You choose which team you want to manage and position the players on the pitch in the formation you prefer. You can then share the resulting lineup via e-mail or Facebook.

Starting 11 has been in review at Apple for a over a week already so it should hopefully go live shortly.

Retina Display ready

This is my first attempt at an app supporting the full resolution of the Retina Display of iPhone 4. The difference in detail level is simply astounding, as you can see for yourself below.

Click the image for full size comparison.