For my friend, Kevin Miller

This morning, I was hit with heart breaking news. A friend of mine perished in a traffic accident last night. We had just spoken in the morning. He and I hadn’t spoken in months, outside of some exchanges on Facebook. The call from him came out of the blue. He was looking to buy a MacBook and, as the resident Apple evangelist in our crew, he sought my opinion. After a few minutes discussing the merits of the particular model and the price, we move on to talk about our lives. He recently became a father, of a little girl just a few months old and a seven year old as well. I was the same, having just gained custody of my two youngest nephews. We talked about the changes that we dealing with. We discussed the role of parents, fathers in particular, how to nurture our children while also being stern, and preparing them for the very real challenges that they have to face in this world. We were both in a new chapter of our lives, sharing something new in common.

I met Kev through a mutual friend. My friends and I schedule frequent get togethers (“Man Dinners”) where we take the opportunity to catch up on life, share some laughs and reminisce about our college days (most of us were roommates). Kev was a friend of one of us and came out to join the group. The conversation went from sports to cars and the Aston Martin (because of course it would) and I made a statement about the price of the Vantage. Kev checked me on it and after verifying it on the internet (because of course we would), I found out I was wrong. It was the beginning of a friendship in which we challenged each other.

Like me, Kev had been boxing and was a big fan of the sport. We got to talking about our previous experiences and he spoke about wanting to fight again. He set a goal to get back in shape and train for a fight. I was up for that as well and decided to join him. I loved to train and so did Kev. We would get our road work, jump rope, heavy and speed bag work in each session. We’d mix in things like plyometrics or weights and pad work when we had access to a trainer. I even introduced him to capoeira, as it is great core work. We talked about our favorite fighters (Tyson, Pacquiao) during our session breaks. We’d try (unsuccessfully) to match PacMan’s punch output on the bag. Our mornings began with a text to each other to meet at the gym. Those messages were a challenge to not let excuses get in the way of our goal. We each held the other accountable. Get your butt up and let’s “get this work in”. We went hard, got it in and got out. We had other challenges awaiting us.

Kev was one the hardest working people I’ve ever met. While he was working one job, he started a training program for another and then picked up part time work as well. He was always about “getting this work in”. We’d have occasional conversations while he was in route to one job or another. He was always thinking about improvement and working towards other goals. Whether it was the mobile training manual for his staff, a new mobile app for getting the newest sneakers or talking about joke writing (we were both giving standup a try), our interactions always revolved around joyous work. I admired that most about him. His actions pushed me to be better, to keep moving and not let life stop you.

Real friends challenge you. They push you to be better. They’re not afraid to tell you when they think you’re wrong. And you know they’re your friends because you love them for doing it.

Kev, I love you and I’ll never forget you. I’ll keep pushing and getting this work in, like you always did and pushed me to do.

RIP Kevin Miller 1975 – 2015

The Little Engine That Couldn’t (Coding By Train: Leg 3 Chicago to Denver)

Our train arrived in Chicago an hour late (a pattern that I’d soon learn is quite common). I can;t say anything about the city itself, as I never left the train station. From the ride into the Windy City, I was only able to make a single assessment: the place looks massive. Without a decent public transit system, I couldn’t imagine trying to make my way around.  I walked through the food court to see what local food I could sample. I now understand why vendors offering local fare are present in airports and train stations. It’s not cheesy tourism. For some travelers, it’s a close as they’ll get to the city. I’ve always had the luxury of time in the past to explore but when the forces of time are against you, you settle for the depot hot dog stand.

By 10am, the station was filling up with Bears fans making their way to the stadium. The long line at my departure gate was comprised mostly of Cornhusker fans coming back from a victory over Northwestern. They have long memories, including the loss to the Yellow Jackets in the 1991 Citrus Bowl (during my glorious freshman year)  We shared a laugh about how every football program has a Voldemort in its history, that coach who inflicted so much damage that they’ve earned the title of He Who Shall Not Be Named. This was confirmed by the t-shirt of one fan listing the coaching lineage from Devaney to Pellini with one redacted. (Interestingly enough, both school’s Voldemorts are named Bill).

It wasn’t long before I realized that I was aboard the Little Train That Couldn’t. Two hours outside of Chicago, the train stopped and we had to wait for another engine to complete the journey. Conspiracy theories about the efforts of Norfolk Southern, Union Pacific and other freight trains to ruin Amtrak were tossed about at dinner. One of my companions rattled off a statistic of 7% on-time arrivals for Amtrak, a stat that I found highly suspect until I checked the Amtrak website  (11.5% on-time arrival for the California Zephyr in the month of September)

The second night of sleeping was surprisingly more comfortable than the first. I didn’t get a neck pillow but I did learn how to work the lower leg rest in the recliner. The morning leg was pleasant enough with another grit-based breakfast and a view of sunrise from the observation car. Not much in terms of scenery though as the landscape between Chicago and Denver looks like a stock image set on a loop.

On the coding front, I didn’t get much done. I spent most of the evening unsuccessfully trying to get a VPN client to work (Thanks, Yosemite).

As We Begin Again

With this post, I am hoping for a return to more frequent and relevant posting to my blog. It is my opportunity to begin again. The year has been quite busy (too many projects undertaken) but I’ve not taken time to reflect on the things that I have experienced, which is the whole point of this blog. In the interest of brevity, I’ll just summarize:

  • On the development front, iOS has undergone a massive amount of change this year. A new programming language, Swift, tons of new APIs (HealthKit, WatchKit, etc.) and even more devices (iWatch!) means that more time is required just to keep up and maintain quality of existing apps.
  • Speaking of existing apps, my current apps (Capoiera Songs, Team Tryouts) are overdue for updates and those are coming but they will have to wait a bit longer as other projects have priority.
  • Conferences this year have been awesome. AltConf, 360iDev and the 360iDev min were great experiences and opportunities to make new friends and reconnect with old ones. And the year isn’t over, as CocoaConf Atlanta is taking place in December. Next year, I’ll be looking to present.
  • Speaking of conferences, though I didn’t attend, I was excited by the announcements at Google I/O. I will be returning to native Android development (in addition to, NOT in lieu of iOS. I’m not a sadist)
  • I joined the panel of the iPhreaks podcast. I’m grateful that they invited me on and it allowed me to fulfill my wish to return to podcasting. Each week is a learning experience as I am exposed to areas of develop that I be otherwise unaware of.
  • Pending apps such as PomoTracker are still in development (though I may change the name). My past year in beta testing combined my current work has shown me that I needed to change the tool’s design/focus. It wasn’t meeting my needs so I’ve gone back to the drawing board.
  • A passion project, Gateway Transit, is also in the works. It is a mobile app for the local transit system in my county. I’m hoping that it is the first of many volunteer projects that allow me to give back to the local community.
  • I have been Mobile Developer at TeamSnap for over a year now. It is an awesome company with great people. If you are a customer, we’ve got more cool stuff coming your way.
  • The Cocoa Nomad blog wouldn’t make sense without more from the road. Though I’ve neglected to post from San Francisco, Denver and Greenville, SC this year, I will do my best to make sure that doesn’t happen again.

More Cocoa. More Nomad to come

2014 Schedule (iOS Dev, Beer, BBQ, Sports, Comedy)

  • January 15 – Open Mic – Three Layers Cafe (Jacksonville, FL)
  • January 16 – Open Mic – Rain Dogs (Jacksonville, FL)
  • March 16 – 20 – Snowboarding (Salt Lake City, UT)
  • March 22 – 29 – Spring Break Poker Classic (Biloxi, MS)
  • April 4 – 5 – CocoaConf Austin (Austin, TX)
  • April 7 – 11 – TeamSnap Team Mtg (Boulder, CO)
  • April 15 – NSCoder (Greenville, SC)
  • May 9 – 10 – CocoaConf Raleigh (Raleigh, NC)
  • June 12 – 15 – US Open (Pinehurst, NC)
  • August 12 – NSCoder Louisville (Louisville, KY)
  • August 14 – 17 – PGA Championship (Louisville, KY)

Creating Launch Images for iOS apps

While working on my latest app, PomoTracker, I was trying to come up with a simple way to create launch images for the app. Since I needed a total of 7 images, I searched for a tool that may make the creation simple. I haven’t come across anything yet but I have at least simplified the process a bit.

The first view controller that loads is a UITableViewController that lists all the user’s projects. The projects are loaded via a single goal to configure the table view. When I need to make launch screenshots, I simply replace the call to configure the tableview with the following:

 self.navigationItem.leftBarButtonItem = nil;

 self.navigationItem.rightBarButtonItem = nil;

 [self setTitle:@” “];

You could further refactor this by creating a simple showInLaunchMode method and use a macro to determine when this method is called versus the normal tableview configuration.

App Challenge Episode 2: Attack of the Feature Creeps

I demoed the current version of TouchCase to an attorney this week and received valuable feedback. While looking at how the tool would fit into his current workflow, we compared it to the software that he was currently using, a web-based application. He showed many of the functions that he could perform using his current tool of choice. The session was eye-opening to say the least. Watching him work, I realized the beta missed the mark in a major way. As a result of the session, I came away with the following assessment for TouchCase:

  • It was missing essential data
  • It was missing key workflow elements
  • The TouchCase feature set was smaller

In light of this, my options included:  logging the feedback as stories in the icebox and continuing as planned or moving the suggested changes into the current sprint, pushing week 3 sprint work into week 4. Choosing the former would go a long way towards making TouchCase relevant to more users, even in beta, while choosing the latter would keep things moving along my previous plans. Questioning my choices in the context of agile development allowed me to make what I believed to be the best decision. The true goal of the App Challenge is not just to create 3 apps, but to deliver first versions that are viable. It was clear from my observations that my app wasn’t even minimally viable. I spent the week adding the missing data and updating the UX to more improve the workflow. I stopped short of updating the feature set. A product doesn’t necessarily have to do everything a competing product does.

I also made progress in improving the UI, thanks to some wonderful resources. Using elements from templates at App Design Vault and the UIAppearance protocol, I added some polish to the interface and support for easier subsequent changes. I should also apologize for my prior comments about homemade soap being ugly. Homemade soap looks much better now than what I remember from my grandma’s house.

Current Status (Week 3)

Sprint 3 work for PomoTracker/Haggler will commence this week (now Sprint 4). I haven’t abandoned hope of getting an MVP for all three apps yet (it’s the halfway point), but it looks like Haggler will most likely not get the UI love in its first beta.

After attending Rob Napier’s CoreText and Practical Security sessions at CocoaConf DC, I picked up a copy of iOS 6: Pushing the Limits. It has been a great resource for implementing the Rich Text features of UIKit and augmenting the information from each session.

On the BDD front, I found a great video of Sandi Metz talking about the design of  tests. It has helped guide me in creating more effective tests (i.e. fewer and in the right places).


I’ll be back at Greenville Cocoaheads for the monthly meetup. Looking forward to @emperioreric’s talk on the UIAppearance proxy (timely). Afterwards, it’s on to Atlanta to catch up with friends and attend the iOS Developer’s meetup.



2013 Schedule

  • January 6 – Cocoaheads  (Greenville, SC)
  • February 18 – 19 – DevNexus (Atlanta, GA)
  • February 19 – Atlanta iPhone Developer’s Meetup (Atlanta, GA)
  • February 21 – Cocoaheads – Greenville Cocoa  (Greenville, SC)
  • February 28 – Cocoaheads  – Triangle Cocoa (Raleigh, NC)
  • March 19 – NSCoder (Cary, NC)
  • March 21 – 23 – CocoaConf DC (Herndon, VA)
  • April 9 – NSCoder (Cary, NC)
  • April 11 – Cocoaheads – Greenville Cocoa  (Greenville, SC)
  • April 16 – Atlanta iOS Developer’s (Atlanta, GA)
  • May 30 – Jun 1 – Greenville Grok (Greenville, SC)
  • September 8 -11 – 360|iDev (Denver, CO)
  • Oct 10 -12 – CocoaConf Las Vegas (Las Vegas, NV)
  • Oct 24 – 26 – CocoaConf Atlanta (Atlanta, GA)