Swift Lessons

As I wrote in my last post, I’ve been learning Swift. This has been interesting. Chris Lattner and his team have been working on Swift for years and have done something that is amazing. Not only have I learned a bit about programming in Swift, I’ve learned a few things about using Swift.

  • Swift isn’t ready for prime time. I’ve seen references to this from Apple.
  • There are lots of bugs in the compiler; SourceKit crashes all the time and auto complete dies.
  • The syntax, while flexible, is a bit confusing at times. For instance, I have a framework in my app called Vera. In some places I access classes of that framework using the Vera namespace, i.e. Vera.Device.Category.Audio to get an enum value and in other places, I use an array of Device. This is confusing and inconsistent.
  • In some places, parameters have names and others they don’t. While you can specifically require the parameter names, sometimes you don’t have to do that and sometimes they’re required.
  • While Swift is extremely flexible, it is confusing as anything once you start getting into wacky things go haywire. Take a look at this code with AnyObject and Unmanaged.
  • There are bugs in the optimization such that turning on optimizations breaks certain code (like the one referenced in the last bullet). I can’t remember the last time that turning on optimizations broke code that I didn’t discover until I tried to deploy an app.

I’m sure that things will get better, but at the moment more work needs to be done. I’ll keep poking with Swift and enhancing my app.

Learning Swift

When Apple announced Swift at WWDC, I knew that if I was going to keep up with the youngsters, I had to learn Swift. Unfortunately it has been a long time since I learned a new language; I learned Objective-C in 2000, I think. While I am capable of learning, finding the time to learn it and use it are getting harder and harder. However, I know that I didn’t have a choice.

I started reading Apple’s books on Swift and made it part way through when I got distracted. I’ve restarted a few times, but still haven’t finished. So I decided to take my automation app and completely rewrite it in Swift. While I could have re-used my existing code, I decided to do my implementation completely in Swift using a few open source libraries (there may have been better libraries to use, but the ones I picked seemed reasonable for now). While I’m still learning Swift, I thought it was a decent attempt to learn it. I’ve put my rewrite on GitHub for all to mock.

I’m going to keep learning and I think that reading the books will make a lot more sense now that I have a project under my belt.

Time Flies – 20 years in mobile

It dawned on me yesterday that I’ve passed 2 milestones in my career. The first is that I’ve now been writing mobile applications for 20 years. Yes, there was mobile way before the iPhone and Android! I started writing mobile applications my senior year in college when Apple sent me a Newton MessagePad in exchange for licenses of my NotifyMail program. I sometimes think about all the changes in this industry and it just makes my head hurt! Development 20 years ago was generally not treated as a hobby due to cost; today, anyone can write an app with no skill (not sure if that is good or bad).

The second milestone is that I’ve been working from home for 15 years. I worked in an office setting for less than 4 years before I started this. It is a choice that I don’t regret and can’t imagine working in an office again. Even though I work for a large company, I have tons of flexibility and am far more productive than if I was in an office everyday.

Who knows what the next 15-20 years in my career will bring, but I look forward to them.

Giving up on Xcode Server

Several weeks ago, I started having problems with my media center where recorded shows started stuttering in playback. There were a huge number of variables that could have caused it as lots of things changed, like an update to EyeTV, update to my HDHomeRun, Xcode update, OS X Server update, etc. While I’m still trying to identify the cause, I think I’ve narrowed down the problem to Xcode and Xcode Server.

Why am I blaming Xcode? Well, I went into OS X Server and looked to disable it. It wasn’t turned on and didn’t have Xcode selected. Since I hadn’t turned it off and had selected a version of Xcode, I knew something went crazy. I selected Xcode again, restarted the Xcode Server and then turned it off. I noticed that even after I did this, there were still log entries related to Xcode Server. Huh? If I disabled it, why was it still doing stuff? I found a blog entry which identified a way to completely reset Xcode Server.

Before I had completely disabled Xcode Server, I had noticed periodic log entries about the server doing stuff which wasn’t a complete surprise as it had to check source code and do other things. However, the status showed a huge number of little spikes in CPU usage. After I disabled Xcode Server, the spikes stopped. When it wasn’t doing builds, it really shouldn’t have done much to warrant the CPU spikes.

I can’t say that I’m going to miss fighting Xcode server; I installed Jenkins and got it configured how I wanted my jobs configured. Jenkins, itself, was easy to setup and do the builds; the tricky part was getting my release notes to TestFlight and to get the archives named the way I wanted. Even though Jenkins is written in Java, I’m not seeing spikes in CPU usage; in fact, when idle, I’m seeing a decrease in CPU usage.

The victims of airbnb and short term rentals

I’ve heard people say that airbnb and the like are disrupting the hotel industry by letting anyone rent out his or her residence. This may seem like a great idea until you’re the person living next door to one of these rentals. Instead of having a neighbor that you know by name, you have random people staying for 1 night, 3 nights, a week. This can bring more crime, noise, and reduce property values. San Francisco just passed an ordinance regulating short term rentals putting a cap on the number of days a place can be rented a year. This number is capped at 90 days, but that is still far too many, in my opinion.

My neighbor decided earlier this year to kick out the family that had been renting his house for a few years and turn it into a vacation rental. He claims that he is a “family man”, but the only motivation for doing this is greed. He “fixed up” the house by putting in a hot tub, redoing his deck and planting grass. His vacation rental doesn’t fit into our neighborhood as all the houses in the immediate area are single family houses that are either owner occupied or long term rentals (I’ll ignore the mini-dorm across the street owned by another greedy person). So now we’re going to get random people staying at the house and have to deal with potential noise and the feeling that we may not be safe because we have no idea who is supposed to be next door.

The city of San Diego is too chicken to pass regulations on short term rentals because that would affect beach rentals and other rental properties that bring the city money via the transient occupancy tax (provided people collect and report it). Zoning laws are supposed to separate different uses for properties, i.e. commercial and residential. A short term rental is definitely commercial as a residence is where someone lives. Shouldn’t short term rentals fall under commercial zoning regulations?

People could have similar arguments against bed and breakfasts, but they are more regulated (one we stayed in said that they could only serve breakfast and not any other meal) and have a host/manager on site.

The rise of short term rentals anywhere someone wants may be good for the property owners, but in my opinion, is not wanted by many residents of neighborhoods.

Fun with Xcode Server – Round 2

Earlier this year, I wrote about Xcode Server as well as some issues I had with it. My Xcode Server has been running well for months spitting out builds for testing as well as ones that goto the AppStore.

Unfortunately, Apple changed Xcode Server as part of Xcode 6/Server 3.2.1 (the Xcode Server part of OS X Server primarily is found in Xcode itself as far as I can tell; feel free to correct me if I’m wrong). There were a number of things I had to do in order to get my server building again due to a change in the location of the provisioning profiles and where the key/certificate pair are stored for the profile. These steps are long and not guaranteed to work, but give them a try if you’re feeling lucky.

  1. Switch to root user
    sudo su -
  2. Switch to the Xcode Server keychain directory
    cd /Library/Developer/XcodeServer/Keychains
  3. Copy the Portal keychain to your Desktop
    cp Portal.keychain /Users/<youruser>/Desktop/
  4. Make a backup copy of the keychain.
    cp Portal.keychain Portal.keychain.bu
  5. Change the owner of the keychain to your user.
    chown <youruser> /Users/<youruser>/Desktop/Portal.keychain
  6. Record the password of the Portal keychain
    cat /Library/Developer/XcodeServer/SharedSecrets/PortalKeychainSharedSecret
  7. Leave this terminal window open.

  8. Open Keychain Access as your user.

  9. Add the keychain you just copied to Keychain Access – /Users//Desktop/Portal.keychain

  10. Open a new terminal window

  11. Unlock the Portal keychain

    security unlock-keychain -p \
    <secret you copied from the PortalKeychainSharedSecret File> /Users/<youruser>/Desktop/Portal.keychain
  12. Copy the key and certificate used for the provisioning profile to the Portal Keychain in Keychain Access.

  13. Lock the Portal Keychain

  14. Go back to the Terminal window where you are the root user. You’ll still be in the Keychains directory for Xcode Server.

  15. Copy the Portal Keychain back to the directory.

    cp /Users/<youruser>/Desktop/Portal.keychain .
  16. Change the owner of the keychain
    chown _xcsbuildd Portal.keychain
  17. Switch to the Provisioning Profiles directory
    cd /Library/Developer/XcodeServer/ProvisioningProfiles
  18. Copy your provisioning profile.
    cp /Users/<youruser>/Desktop/MyProfile.mobileprovision
  19. Edit your bot in Xcode and reset git credentials. I always let the bot create a new SSH key pair and add that to either GitHub or Bitbucket depending on the project.

  20. Cross your fingers and build.

It appears to me that Xcode Server has gotten worse where more functionality has moved to Xcode and less is in the web interface. This means I can’t change the git branch I use for building and I can’t edit my bots using the web interface. I think that there is a lot of potential with Xcode Server, but there is a long way to go in terms of usability. The server must be able to do more than run tests and must be able to let the small development shop do builds that can’t be distributed via TestFlight and uploaded to the app store.

Automation is key in any development project as the manual process is for the birds. Many developers don’t need the power of Jenkins, but could easily use Xcode Server if it worked a little better. Doing builds locally and then uploading for testers is cumbersome and a process that should be avoided. I’d be more than happy to talk to the Xcode Server folks about build practices. At work, I have our Jenkins based build system crank out 13 builds at a time and upload to TestFlight with minimal effort; we just push code to a build branch in git and out pops the builds. We can do several builds a day if need be without blinking an eye. For my personal projects, I was doing a build nightly for someone I was working with and without the automation, he wouldn’t have been able to see the progress as quickly as I would have spent 5-10 minutes a day doing builds which really adds up.

Review: SportRX

Earlier this year I came to a realization that I was putting in my contact lenses on most days only to run. I’m not sure why it took so long as I work from home and in most weeks, I tend not to leave the house except to run. So I was wearing my contacts for a few hours a day which has become old. I decided to look into prescription running glasses, glasses with a little bit of a wrap. I found SportRX online and realized that they were less than 5 minutes from my house.

I wandered into the storefront one day and a very helpful optician, Sarah, gave me 3 choices because of my prescription. My eyes aren’t great and I can’t see anything without glasses. I left to see if my optometrist could match the price as I’d be able to use my vision insurance there (VSP is strange and can only be used at optometrist owned shops from what I understand). A few days later, they got back to me and basically said that they could make the glasses, but couldn’t guarantee that they’d work as the wrap requires a different way of making the lens. I wasn’t willing to take the risk, so I went back to SportRX.

Again I walked into SportRX and went ahead and ordered Rudy Project Horus frames with prescription lenses. The whole package wasn’t cheap, but I was super excited to get them. I received email about 2 weeks later that they had arrived and I went in to pick them up. I tried on the glasses and almost fell over because they made me disoriented. The optician, Tim, took a look and said he’d talk to the lab. I chatted with him a few days later after I checked my order online and the lab had made the lenses wrong and they were going to remake them.

A few more weeks went by and my new sunglasses arrived by UPS. I put on the sunglasses and felt a little dizzy. However, I thought my prescription was a bit different. I wrote them a number of times and ran with them a few times, but couldn’t get used to them. I’m not sure exactly what was the problem, but decided to return them. (SportRX has a very generous return policy which is one of the reasons I decided to give them a try.) When I went back, I was given the option of a refund or could try a different frame. A third optician, Rob, assisted me and just like the other day, was extremely helpful. I opted to try another frame; I was assured that if they didn’t work, I could still get a full refund. While the frames I chose, Oakley Chainlink, weren’t as sporty as the Rudy Project ones, my options seemed quite limited. This time when I went in, I took my son in to take a look around. The receptionist said Rob was on the phone and offered us something to drink as well as the opportunity to play tabletop shuffleboard which was very kind. I showed my son how to play and he was entertained. After Rob finished helping me, he brought out a pair of kids sunglasses and gave them to my son to keep. This extra special touch reinforced my decision to give SportRX a try.

I received my new sunglasses 2 weeks ago and have been wearing them running, driving, and all the usual activities where I normally would have worn contacts and non-prescription sunglasses. At first they seemed a little weird like the last pair, but now that I’ve gotten used to them, they’re fine. They’re a little different than my regular glasses, but not enough to return them. I feel a bit free in that I don’t have to put in my contacts when I leave the house; just grab the sunglasses and go.

The major problem I experienced (and it has nothing to do with SportRX or the sunglasses) is that I was wearing my sunglasses driving and it started pouring rain; I had to pull over to the side of the road to swap glasses as I can’t see a thing without them.

Now that I have a pair of prescription sunglasses and a pair of regular glasses, I need a nurse to hold them both!


  • Large selection of frames for people with not awful vision
  • Extremely friendly and helpful staff


  • Higher prescriptions may have problems getting good lenses made
  • Choices are limited in high prescriptions
  • Cost; prescription sunglasses that are sporty are not cheap


Despite the problems with my sunglasses, I had a good experience with SportRX and would recommend them. The money back guarantee and their willingness to work with me made the experience pleasant. My only disappointment is that my eyes are bad enough that my choices on frames were limited and the lenses didn’t turn out exactly as I had hoped (in order to reduce the wrap, the lenses stick out a bit on the sides).