In The Spirit of Getting Rid of the 2008 Baggage Before the New Year

In The Spirit of Getting Rid of the 2008 Baggage Before the New Year

I have had terrible luck this week getting two new apps approved into iTunes.

No bugs – each time I was kicked out of the approval queue because of Apple Human Interface Guidelines.

It’s not like I haven’t gotten apps through before.  But for whatever reason, I am unable to get these two apps through.

Perhaps I would have better luck if I had added a Fart noise to the splash screen of each app.  Or a flashlight feature.

There.  The last of the 2008 bitterness is out and I am ready to ring in the New Year.

Happy 2009.

Living the 80-20 Rule

Living the 80-20 Rule

For the past few weeks I’ve been living the 80-20 rule, up close and personal.

You know the 80-20 rule. 80% of the work can be done in 20% of the time, but the last 20% of the work can be a real witch to complete.

I’ve had several apps lately that I – in all honesty – slayed getting up for the most part, on time or early.

But oh that last 20%.

The part that differentiates the hobbyist from the professional. The part that allows my kids to eat and for the bank to hear from me once a month.

The part that really counts.

Strange how you can go for months and have very little friction in projects, and then hit a patch of time where everything – and I do mean everything – is an effort.

What to do during those rough patches?

Push through.

Because these rough patches are when real learning occurs. Those development lessons that stay with you so that when you see them again, you gingerly step over the land mines. Those development lessons that enable you to say to a customer “yeah, you could do that, but be warned that you will encounter a, b, and c.”

It is a trusim in writing that to be a better writer, one must constantly write. The same is doubly true in software development.

In sports, it’s analogous to practicing at the speed and intensity that you plan to play the actual game, so that your body remembers what it feels like to perform at speed, at top ability.

I read an interview over the weekend with Philip Seymour Hoffman (PSH) in the New York Times. PSH felt great acting was torturous. I understood exactly what he was saying. To be great, you can’t quit at the 80%. It’s the last 20% that is hell.

Anyone can be good. To be great, that last 20% of effort, where all the dues are paid, has to be pushed through.

This morning, I went to Einstein Bros Bagels for breakfast. When I got home, my order was correct as far as getting the right number of bagels and the right variety were concerned.

But all of the bagels were cut only to the halfway point. They may have well not sliced them at all.

Look – in the big scheme of big schemes, this was the smallest of deals.

But being half-assed in the last little detail of any transaction can ruin the entire experience.

The bagels were delicious. The carelessness of detail, however, will make me reconsider my choice of breakfast locales.

All because the last 20% of effort – hell, not even that – was tossed away.

Do what you do, the best you can, at speed, and completely.

Do that, and you will succeed.

Because most people bother only with the 80% and not with the 20%.

An Exercise in… Something

An Exercise in… Something

I can’t remember a time in my life when the immediate future outlook for business was so negative.

That’s precisely why NOW is the time to start planning for the rebound.

For the next two weeks here in the U.S., nothing is going to be accomplished work wise for most people – that is, for most of the people who haven’t punched out yet for the holidays.

A perfect time to get to a quiet place, seal yourself off, contemplate the past year, and plan for the next.

One of the damn shames of this life is that most people spend more time planning their vacations rather than taking and owning an active part in the course their lives will take in the coming years. I’m as guilty of this as the next guy.

So, to get an early jump on the whole New Year’s Resolution thing, I’m spending whatever free time I have (aside from family) toward planning and blue sky daydreaming.

I’m going to will myself to a better 2009 than 2008. And I’m going to have some killer ideas to act upon.

I just have to get them out of my head and onto something. Paper. Device. Web site. Service. Something.

Simple Formatting in a Cocoa Touch Text Edit Field (UITextField)

Simple Formatting in a Cocoa Touch Text Edit Field (UITextField)

Several challenges of the XCode / Cocoa Touch development environment involve doing things that are trivial in other places, but no so much so within XCode.

One of those challenges is formatting a text edit field.  Social security numbers, phone numbers, postal codes, VINs… the kind of mundane crap that is uber-trivial in tools like MS Access, but often prove to be ball-busting-ly frustrating to do in Objective-C.

For me particularly, I had a price field that I wanted to display.

Apple supplies a couple of keyboard choices for the iPhone that could have done the trick for supplying numeric data entry, but they had about 40 characters more than I needed (0-9, and decimal point were all I really desired, and being lazy, didn’t want to write a regular expression for parsing).

There is a phone number pad (no good) and a number pad (almost what I need – but no decimal point).  But the number pad would be “good enough” if I could just embed an implied decimal point.

Apple has no built in / native way to format a text field with say an embedded decimal (so I wouldn’t have to type it). I had to write my own handler to take care of this.

Here is my home brewed work around for this situation. I’m not going to focus on setting up UITextField events, only on the problem at hand.

Consider the following Edit Changed code:

// Our price changed... we want to format it with an implied decimal point.
-(void)textFieldPriceDidChange:(id)textField {

static BOOL toggle = NO;
if (toggle) {
toggle = NO;
return;
}

NSString* strPrice = [[textField object] text];

strPrice = [strPrice stringByReplacingOccurrencesOfString:@"." withString:@""];
toggle = YES;
price.text = [@"" stringByAppendingFormat:@"%0.2f", [strPrice floatValue]/100.0];

}

The code assumes that I have a UITextField named price somewhere on a form. When the field’s text is changed, the event fires, and I:

-) Strip out any existing decimal point,
-) Divide the float representation of the value by 100, to give an implied 2 decimal point precision,
-) Use the printf-styled %0.2f formatting string to pretty up the output the way I want,
-) Put the value back in the field.

But wait a minute… won’t putting a value back into the price field trigger yet another Edit Change event, and cause an endless loop?

Yes. It will.

But take a look at the BOOL static toggle.

That toggle essentially says “OK. If I see that I am already handling the formatting of this field, reset the toggle, and return.”

This is a simple but very effective way to add formatting to a text edit field, and the concept can easily be extended to other formats without a lot of sweat (%05d-%04d, %3d-%2d-%4d, %2d-%7d, %2d/%2d/%4d – you get the point).

Enjoy… and happy coding.

Cheap Gas! Plus… in App Store Review

Cheap Gas! Plus… in App Store Review

FINALLY! I have submitted the premium version of Cheap Gas!, Cheap Gas! Plus, to the Apple iTunes App Store for review.

The significant differences between the free version and the premium version is the ability to change prices and add stations to GasBuddy.com.

There are many people who simply want to check gas prices and don’t care about updating anything.  The free version will continue to serve those users well.

For those commenters and reviewers who wanted a way to update GasBuddy.com from within the app, Cheap Gas! Plus is just the ticket.

With luck, the premium version of the app will be up and on iTunes before Christmas.  If not, then it most likely will be sometime after 12/28 since the App Store Support will be closed for the holidays.

Respect Your Customers. Or At Least, Pretend To.

Respect Your Customers. Or At Least, Pretend To.

We had a surreal experience last night at hockey practice.

For those of you involved in the sport, I don’t have to tell you that it requires many hours of driving to a rink somewhere – sometimes, hundreds of miles away – on a frequent basis.  I would conservatively estimate that during season, we are at a rink between six and ten hours a week.  This time is spread across practices, games, scrimmages, and clinics.

In short, it’s not an inconsiderable amount of time.

And while other sports have limitations regarding playing spaces, ice hockey is unique in the high cost of access to the playing surface (at our local rink, the RDV Sportsplex, ice time runs around $300 an hour) and the limited number of ice venues in some areas.

So, where’s the part about “respecting customers?”  I’m getting there.

Each week, our travel teams – about five of them – have 2 hours of practice scheduled and paid for.  Costs are mitigated to a degree by having teams practice half ice.  These practices are scheduled (and are standing) months in advance, and are paid for in advance.

Last night our kids were “shooed” from the ice.  No.  “Shoo” is much too cute a word.

Screamed off the ice is more accurate.

The rink had sold ice time – ice that we had already purchased – to another buyer.  And We were being screamed off the ice.

This was not a mistake.  We’ve been practicing every Thursday since the end of August from 6-7:15.

Usually, when the ice is cleaned at the end of a session, it’s one guy on a Zamboni, honking the horn and waiting for the ice to be cleared.

Last night, it was three people – and the Zamboni pulled halfway onto the ice, with 40 kids on the ice.

The rink workers – particularly the female worker – were yelling at the kids to get off the ice.  Not just yelling.  I really can’t describe how venemous it all was.

So, I really don’t know what the hell was really going on.  Using my g-d given common sense, I know it goes beyond a simple scheduling mix up.

But here’s the thing:

  • Don’t piss off the people paying your salary in the biggest down market in a half century.  It’s bad business, and just plain stupid.
  • Don’t yell at kids when you have a problem with adults.
  • If you have an unpleasant “surprise” you are going to spring, do so before your customers start using your product, and not until they are in the middle of what they * thought * they paid for.

During all of this hub bub, the local hockey organization was holding it’s board meeting – just outside the rink doors – when all of this little slice of heck broke out (I had to beg off the meeting because my three year old is a three year old and needed some Dad face time, and I wanted to watch my nine year old practice).

At the meeting, they were to discuss the future of the organization (name change, bringing more kids into the league, relationship to RDV, etc.).

Sounds like I missed one hell of a meeting, based upon the rink reaction.

Whatever the background story turns out to be, I must say that as a parent I was taken aback by the vitriol and treatment a bunch of 9-12 year old kids received, from the people ostensibly there to serve them and provide a safe practice facility.

Kids who have paid $900 a week since August to play at that facility – not including tournament time and clinics and hockey gear bought in the pro shop and skates sharpened once a week in the pro shop and concessions bought… you get the idea.

Don’t treat your customers like you don’t respect them.

They might start believing you really don’t.

Cheap Gas! Plus…. Sneak Peak

Cheap Gas! Plus…. Sneak Peak

Another Year Ends

Another Year Ends

Soon, everyone will be focused on the end of the year and the beginning of a new one. I know this time of year I am usually consumed with getting tax work lined up and wrapping up loose ends. This year is no different.

In the midst of all the rush and noise and activity, I do want to say “Thank You” to everyone who has worked with me this year and who has given me the opportunity to do what I love.

I am truly humbled to work with great people and look forward to waking up each day to see what is in store.

I hope you all have a safe and Happy Holiday Season, and that the upcoming year is a happy and prosperous one for us all.

OK… For Real This Time… myBloglines Submitted to App Store

OK… For Real This Time… myBloglines Submitted to App Store

Again, I have submitted the myBloglines Bloglines Reader to the Apple iTunes App Store.

I was not really happy with the application the last time I submitted it, because of performance and memory use issues so I pulled it from review.

Now, after much time in Instruments and the Debugger, I feel like it is store-worthy.

This application will be listed for $1.99 in the App Store as soon as it is approved for sale… watch this space!

Gotta Get One Last Gripe In Before The Weekend

Gotta Get One Last Gripe In Before The Weekend

It is absolutely disgraceful – disgraceful – that Apple has let a significant iPhone library component remain uncorrected for a couple of releases now.

The component in question is the NSURLConnection class; specifically, making synchronous requests.

What’s the problem? Only that a synchronous call leaks 3.5K each time invoked.

And before you weisenheimers chirp in and say to use Asynchronous calls instead, that isn’t an answer.

There are times blocking calls are required, and to avoid the issue is a total cop out (Me: Doctor! Doctor! It hurts when I do this!  Doctor: Then don’t do that).

It’s challenging enough working with a device architecture where not cleaning up after yourself vis a vis memory management has extreme consequences (i.e., out of memory and your app shuts down toot sweet).

It’s doubly hard when iPhone libraries from Apple are buggy.

And this is a significant bug.

How many iPhone Apps need to make blocking http calls? A butt-load, that’s how many.

While the eye candy of the iPhone Cocoa Touch environment gets a lot of oohs and ahs, there are a lot of holes like this one that are quite frankly a royal pain in the ass.

Like the non-support for XPath on iPhone devices (yeah, yeah – I’m using NSXMLParser. It’s a lot more trouble than loading a DOM and doing an XPath query.)

We’re not talking world peace here.

But we are talking about real problems in the underlying code from Apple that has a direct adverse affect on commercial apps in the iTunes App Store.

So, the next time one of your favorite iPhone Apps mysteriously craps out (like the Facebook App did to me while composing a lengthy reply), don’t be so quick to curse the developer.

OK. Got that outta my system.