It’s Official. I’m Nuts.

May 28th, 2010

Turns out I’m nuts, and I can prove it. Last week a signed a contract to publish a book with Addison Wesley. Justin Williams at SecondGear put it best when he asked, “ARE YOU NUTS!?” Yep, apparently I am. And signing the book contract is my proof.

Kidding aside, I’m very excited about this opportunity to contribute back to iPhone development community, a community that has been extremely helpful to me over the last couple of years. The book is on learning iPad programming. It will focus on the unique aspects of programming for the iPad and will hopefully serve as a launch pad for many new iPad programmer entering the space.

Writing on the book has just begun, and I have a very aggressive 6-month delivery schedule. My life is going to be busier than ever over the next 6 months, but it will be a good busy as this is something I have wanted to do for a long time. So if you don’t hear from me much between now and November, you know why.




Learning While Watching Myself

May 20th, 2010

The video recording of my 360idev talk “Building Web Service Powered iPhone Apps” is now available from 360idev (free to attendees, for purchase for non-attendees). This was the first time a presentation I gave was recorded, and for the first time ever I get to see my own talk. I watched the video yesterday and overall I’m happy with the results. The best part for me, however, is using the video to learn from my mistakes.

A mistake I repeatedly made was not repeating questions asked by the audience. Repeating the question is an age old speaker tip, but the tip is easily forgotten during an actual presentation. Repeating the question is helpful to others in the audience who may not have heard the original question. Repeating the question also gives you a chance to make sure you understand the question, and it buys you a few more seconds while you think of an answer.

Repeating the question becomes more important when your session is being recorded. In the case of the 360idev recording of my session, you cannot hear questions from the audience. This sometimes makes it hard to understand the context of the answer. I could have avoided this by repeating each question before providing an answer. The lesson learned here, and one I must remember the each time I speak, is to repeat the question before answering.

The other lesson I learned by watching my session is to not do live coding. Live coding can be impressive, earning you some respect points with audience members. But live coding can also slow down the presentation. This is what happened in my session. There are lulls during my talk while I type code from memory. Also audience members will often see mistakes in your code as you type and shout out tips. This can break your thought process causing confusion and delay.

Having now watched my session video I have decided to no longer do live coding in these types of sessions. The extra time spent typing on the keyboard is better spent sharing additional knowledge with the audience.




Follow up on My Fight with Microsoft

May 18th, 2010

Update: See the blog post Score One for the Little Guy and Kudos to Microsoft for the latest news.

A few weeks ago I posted a story of how Microsoft turned me over to a collection agency for a past due invoice that 1) I never originally received, 2) for an account canceled a year before the said invoice was issued, and 3) no one from Microsoft is willing to talk with me about to answer my questions. As a final straw and an attempt to put the matter behind me, I paid the invoice even though I still feel the invoice is the result of an accounting error made by Microsoft.

The blog post got the attention of a large number of people. People were tweeting about my story and some popular web sites picked up the story. The increased traffic to my web site brought down my server for 4 hours and I scrambled to get the site up and running again as quickly as possible. But more importantly the blog post caught the attention of some Microsoft employees.

Two employees contacted me regarding the matter and offered to help. This was great news. I had hopes that I would finally have my questions answered. After all, that’s all I really want at this time, is to have my questions answered.

One of the Microsoft employees made some progress in finding a person to help figure out the mess. It looked like I would finally have some answered. Then the collection agency called again. Yep, instead of Microsoft following up with me directly they asked the collection agency to call me.

The agent I spoke with was the same person I spoke with last month. He said Microsoft ask him to call me to see what can be done to “smooth things over”. I told the agent the same thing I told him last month. All I want is to talk with someone from Microsoft who can explain to me what happened. All I want is answered to my questions.

It is not about the money. Paying Microsoft $134 is not going to bankrupt White Peak Software. But what I really want is to speak with someone who can answer my questions regarding the matter. It’s doubtful that will ever happen since Microsoft seems to prefer hiding behind contractors and collection agencies with limited information then to talk with me directly.

The fact that Microsoft will not talk with me directly makes me trust Microsoft less. Because I do not like doing business with companies I do not trust, it is likely the $134 I paid last month will be the last dollar Microsoft ever receives from me. The ironic part in all of this mess is Microsoft could have saved my trust in them as a consumer with a simple phone call.

At the end of the day it is about providing great customer service and this is something that Microsoft has failed to do.




Building Web Service Powered iPhone Apps

May 17th, 2010

Last month I had the fortunate opportunity to talk at 360idev. My talk was on using web services in iPhone apps. The talk got off to a bad start due to various technical issues, the biggest issue caused when my MacBook Pro and the projector would not talk with one another. This caused my talk to start late which meant I had to skip some of the details I wanted to cover.

Another issue came up with I tried to demo a RESTful web service call to Twitter using HTTP Client. Twitter reported the request limit had been reached for the IP address. This meant I had to skip over the Twitter related demos. Lucky for me, the rest of the presentation and demos ran smoothly.

For those who may have missed the presentation, the fine folks at 360idev have posted a video recording of the session available for purchase. You can also download the sample source code and the Keynote presentation file from my 360idev repository hosted on github.




A Day with My iPad

May 7th, 2010

I decided to do a little experiment earlier this week. I spent the day in Boston so instead of taking my laptop I decided to take only my iPad. I had no plans to write code that day but I had a number of other things I needed to do. Specifically write a new blog post, work on a book outline, and review and edits some documents. All the tasks can be accomplished on an iPad but what I wanted to know is how easy is it and how productive can I be.

Long story short, the experience was not good. I definitely wasn’t as productive as I am with a laptop. The problem isn’t with the device. The iPad is truly awesome and I believe it represents the future. The problem was inconsistencies with the various apps I used combined with the lack of features and or weird behaviors.

The experiment started on the commuter rail into Boston. The MBTA provides free wifi to riders, which was a plus for me. My iPad is wifi only, not the 3G model. With the free wifi access I was able to check my email, sync Instapaper, and post a tweet or two. The experiment was off to a great start.

The train ride into Boston was about 30 minutes so I decided to write a blog post about setting up a private centralized git server. If you follow this blog then you already know the posting isn’t here. This is when the problems started.

I used the WordPress app to write the blog post. The app does an okay job but it ain’t MarsEdit. For starters there is no easy way to create links. Making matters worse, I wasn’t able to paste in a URL from the clipboard. I ended up wasting a lot of time trying to get a link in the blog post but that was only the start of the problems.

I needed to switch to other apps as I wrote the post. Switching apps could be a bit easier on the iPad but I was multitasking, something some folks like to say is not supported. In switching between apps I discovered that the WordPress app doesn’t always save my data. In some cases the app could tell I had exited before saving and would tell me it had to recover the data next time I launched the app. The warning message is not necessary. Just return me to the edit screen, thank you very much.

In other cases something much worse happened. My data was lost…forever! The worse case happened after I had type three paragraphs only to have it lost. It was at this point I decided to give up on writing up the blog post and moved on to another task.

I decided to work on an outline using Pages. As far as an editor goes, Pages is great and it doesn’t have any of the short comings founding the WordPress app. But Pages is far from perfect too.

The document I needed to edit was stored on Dropbox. The Dropbox app is awesome. I was able to go to my document and open it in Pages. Here’s where I noticed the first problem. While I’m able to open a document stored on Dropbox in Pages there is no way to save the document back to Dropbox. Once the document was in Pages it stayed in Pages until I emailed it, posted it to iWork.com, or exported it for file sharing, which mind you requires a computer. So I was able to edit my document but I could not update Dropbox with the latest version. (Just to be clear, this is not a problem with Dropbox. The problem is with Pages.)

Another problem I encountered while working in Pages is access the toolbar for styling content in my document. My iPad is typically in landscape mode when I type but the toolbar is only accessible in portrait mode. This means I was continually rotating my iPad as I tried editing the document. This is a huge productivity killer for me and very annoying.

I also ran into another problem which is more behavioral than a problem with the device or apps. As I type my brain wants to Command+s to save as I go. Saving often has been hard wired into my head for most of my life. On the iPad in apps like Pages documents are autosaved. There is no need to Command+s but this doesn’t stop my brain, or fingers for the matter, from trying to type the key combination. So what happens? I end up with lots of / characters randomly scattered throughout my document.

This brings up another issue. Apps on the iPad behave differently. For example the WordPress app uses an edit screen with a Save button at the top. As I painfully learned the app does not autosave so I must touch the Save button, which I find myself doing often. Pages on the other hand autosaves. There is no explicit save action. This means my behaviors when using Pages must be different when compared to using the WordPress app. It becomes annoying that different behaviors at required for different apps and this can hurt productivity.

Overall the experiment was useful. It opened my eyes up to the challenges we third party developers have when trying to create really useful apps. I also learned that while I can do many tasks on my iPad I’m still not as productive as I am on my laptop. I don’t fault the device for this. It’s the apps that are to blame. Inconsistent app behavior and lack of sharing data between apps impact productivity. But the good news is, this is only the beginning. The experience is only going to get better. Apps are going to get better. And it is only a matter of time before my iPad replaces my laptop for most of my daily activities.




Section 3.3.1 Does Not Prevent Cross Platform Development

May 4th, 2010

Apple has come under fire over its latest developer agreement for iPhone OS developers. The section causing concern is 3.3.1 which says applications must be originally written in Objective-C, C, and C++ (or JavaScript when using the WebKit engine). This restricts developers from using other cross-platform development tools such as Adobe’s Flash CS5 packager.

Steve Jobs has clearly explained his thoughts on Flash, but more importantly he talks about the impact felt from third party cross platform development tools. Those of us who have been in the software industry long enough will likely agree with Steve’s comments regarding the impact cross platform development tools have on software development.

An interesting fact: An abstraction layer separating the developer from the platform does not have to come from a third party to cause problems. When Microsoft first released Windows 7 the only way to take full advantage of the new features was to use a development tool that allowed the developer to talk directly with the platform, in this case the Windows API. This may come as a surprise to some but it meant you could not use .NET including C# to tap into the newest Windows 7 features. Microsoft’s own layer, the .NET Framework, prevented C# developers from tapping into the latest features in Windows 7. A developer’s only option at the time was to use Visual C++ or Delphi.

For years programmers have dreamed of some magical development tool that would allow them to write code once and run it anywhere. Sound familiar? That was the promise made by Java over a decade ago. Guess what. It never really happened. Most cross platform applications are subpar and do not feel or behave like applications written specifically for the platform.

This brings me to a comment I read this morning in an article speculating Apple may change the iPhone developer agreement to avoid an antitrust case.

“Mobile advertiser Greystripe’s CEO Michael Chang has explained that writing an app using Flash CS5 for the iPhone could cost $75,000 initially but would cost just a few thousand dollars more to port to Android. Without Adobe’s tool, however, developers could be forced to rewrite from scratch and spend as much as they did before. The sheer expense could be considered anti-competitive as it would make writing for more than one platform cost-prohibitive for smaller studios.”

First of all, writing a top quality cross platform application is hard and costly. It doesn’t matter what development tools you are using. Second and more important, when did Flash CS5 become the only cross platform development option? Last time I checked C and C++ were considered cross platform programming languages with C being one of the more popular options for cross platform development. The iPhone developer agreement doesn’t restrict the use of these cross platform programming languages.

Yes, it would be great if cross platform development were cheaper but to say the expense associated with cross platform development should be considered anti-competitive is just down right stupid. The developer agreement is not preventing cross platform development. It is preventing the use of third party cross platform abstraction layers that separate the developer from the platform.

Why stop with Flash? Let’s start a petition against Apple because I can’t use my favorite programming language, Pascal. I think I should be able to use Pascal as my programming language of choice and not just for iPhone OS development. I want to use Pascal for any device and platform. Pascal should be a first class programming language for the Kindle, PSP and DSi, and Amazon, Sony and Nintendo should be responsible for making this happen otherwise face accusations of being anti-competitive.

This grumbling about section 3.3.1 in the iPhone developer agreement boils down to two things:

1) Businesses want to reduce development cost.

2) There are lots of lazy programmers out there.

Let’s discuss these 2 points a bit further. Building a cross platform application using a tool like Flash CS5 might help businesses reduce development cost. Will it help a business be successful? Maybe and maybe not. Success depends on whether or not customers like the apps produced by the business. Personally I dislike non-native apps because most are subpar and behave differently. If the apps are subpar then a business will likely not succeed despite using third party cross platform development tools and saving a few dollars in development cost.

Now on to lazy programmers. Actually saying “lazy” is probably the wrong word to use. I often say I’m a good programmer because I’m lazy. I don’t like to repeat the same task over and over, so I write a program to do the task for me. This makes me lazy because I find ways to reduce the amount of work I need to do. So being a lazy programmer can actually be a good thing. The DRY principle is another example of being a good type of lazy programmer.

In my second point I’m referring to a different type of lazy programmer, a bad lazy programmer. This is typically a programmer who does programming as a job and programming is just that, a job. This type of programmer doesn’t have the same love for programming that someone like me has. This type of programmer isn’t interested in learning new programming languages and this type of programmer definitely is not the type who would be programming even if he or she didn’t get paid to do it.

The bad lazy programmer wants everything to be easy. He wants to write an app once and have it run everywhere. He’s main goal is to move up the corporate ladder in hopes of making more money. And what better way to move up the ranks than showing your company how it can reduce development cost by using a third party abstraction layer and tool.

These are the types of programmers complaining about section 3.3.1. Programmers too lazy to learn a new programming language such as Objective-C, C or C++. Yes, these languages are harder to learn than many of the newer programming languages including those fun scripting languages used by many today. And yes, I might be a little basis because I first learned C over 25 years ago and I have no problems using it today. But instead of bitching about terms in the developer agreement why not accept the fact that cross platform development is hard and costly. After all you can still use the same C and C++ code in both iPhone and Android apps. Yes, that’s right. The Android NDK (Native Development Kit) does exists and allows C and C++ code to be used to implement parts of your application. It’s not easy but it’s possible.

Adding more fuel to my fire is this comment in NY Post article from yesterday:

“Regulators, this person said, are days away from making a decision about which agency will launch the inquiry. It will focus on whether the policy, which took effect last month, kills competition by forcing programmers to choose between developing apps that can run only on Apple gizmos or come up with apps that are platform neutral, and can be used on a variety of operating systems, such as those from rivals Google, Microsoft and Research In Motion.”

Yes, exactly what world needs. Apps that are platform neutral. But wait! Don’t we already have that today in the form of web-based apps? And doesn’t the iPhone and iPad come with Mobile Safari capable of running web-based applications “that are platform neutral and can be used on a variety of operating systems”?

Ah, but you say you want native built apps that take advantage of the platform. That’s cool. You can have that too. But this notation that you can have a native built app that is also platform neutral is just crazy talk. It’s not going to happen anytime soon and it shouldn’t be Apple sole responsibility to make it happen.

I wonder, if Objective-C were more popular would the torch carrying mob go after Google, Research in Motion, and Microsoft for not supporting it on their mobile devices?




I Paid for Microsoft’s Mistake

April 26th, 2010

Update: A positive outcome as resulted from the blog post below. See the blog post Score One for the Little Guy and Kudos to Microsoft for the latest news.

It’s no secret that my dislike for Microsoft has grown in recent years, but today that dislike skyrocketed to a new level of anger that is rare for me. My growing dislike for Microsoft is centered around my belief that Microsoft’s operating systems are not as good as the alternatives, their developer tools are not as good as the alternatives, and their productivity software programs are not as good as the alternatives. But today I’m angered not by Microsoft’s technologies but by their unacceptable customer service. I’m upset because I’m left with no other option than to pay for a mistake caused by Microsoft, and after dealing with the issue for years, I have yet to receive a single reply from a Microsoft employee.

The story begins in the fall of 2004. Microsoft acquires Placeware, Inc and its online meeting solution now called Live Meeting. I had recently started working full time for White Peak Software and was looking for an online meeting solution. Microsoft ran a special in December 2004 for it’s newly acquired solution Live Meeting, $99 for a 1-year, 5-seat subscription. For me it was a no brainer. I signed up as soon as I heard about the offer.

Jump forward a year later to December 2005. Turns out I rarely used Live Meeting during my 12 month subscription so I canceled the service. No harm, no foul. I tried the service and it wasn’t for me.

Skip forward to 2007. I received an email from an Accenture contractor working on behalf of Microsoft. I can only assume he was working in the Accounts Receivable department. The email said I owed for a past due invoice. The invoice was attached to the email as some funky Word HTML format that I could not view.

I asked that the invoice be resent in a viewable format, preferably as a PDF. I also stated in the reply email that I was unaware of any past due invoices related to Live Meeting. I explained I signed up for the service in December 2004, for 1 year then canceled in December 2005. I also included proof of payment for the 1 year subscription (dated December 28, 2004 and paid to Placeware), and I tried reaching the person via the phone. I left voice mail.

I did not heard back from the Accenture person acting on behalf of Microsoft. No reply email or returned phone call. I assumed the matter was resolved. Then in December 2007 I received email from another Accenture person acting on behalf of Microsoft once again saying I was past due on an invoice, which once again I could not view. I asked that the invoice be sent in a viewable format, something other than this weird Word HTML, and I provided dates and proof of payment for my 1 year Live Meeting subscription dating from December 2004 through December 2005. No surprise that I got zero responses, so I once again thought the matter had been resolved.

Now we jump ahead to July 2009, a year and a half since my last contact regarding this matter. I got yet another email with yet another non-viewable attachment from the same Accenture person who emailed me in December 2007. Again I explained I could not view the invoice and asked that it be resent. I also resent the proof of payments, dates, etc for my 1 year subscription started in December 2004 and ending December 2005. Of course I got no reply, no viewable invoice, and again I was left with the assumption the matter was resolved though deep inside I knew better.

Today I got a voice mail from a collection agency regarding a past due invoice for a Live Meeting subscription. A collection agency? Seriously Microsoft? After not returning my phone call or emails over the years, you turn the matter over to a collection agency?

I promptly called the collection agency back. I talked with a friendly gentleman name Dan who shed light on the situation, something Microsoft and their Accenture contractors failed to do.

First, he tells me I am past due on an invoice date December 13, 2006 for a 1 year subscription to Live Meeting. The subscription is for the period between December 13, 2006 and December 12, 2007, a full year after I had canceled my account. Not only that, he said his records show I started the account in December 2005, not in December 2004. Of course my credit card statement says otherwise, showing a payment to Placeware, Inc on December 28, 2004.

It turns out the past due invoice that has been in question for years and I was unable to view is from December 2006, a full year after my account was canceled. Not only that, Dan told me the invoice was mailed in December 2006 to my office address in New York City. I relocated the company to Salem, MA in March 2006, so that explains why I never received the original invoice. (Side note: He also email me a copy of the invoice, in PDF format. I was finally able to see the invoice for the very first time after all these years.)

Best I can tell the whole mess is due to an error on the Microsoft side, and if I had to guess it has something to do with Microsoft’s acquisition of Placeware, Inc and the switch over in billing systems. Remember, my payment was to Placeware in 2004 and my account was canceled in 2005. I was never asked or invoiced for the period between December 2005 and 2006. Then out of the blue comes an invoice in December 2006, sent to the wrong address, for the subscription period between December 2006 and December 2007. And remember the collection agent said according to his records the account started in December 2005, yet there was no record of payment for the period between December 2005 and December 2006. That because the account was actually canceled in December 2005, not started.

It is obvious to me that there was some accounting error on the Microsoft side in 2006. Despite the error by Microsoft, I have no choice but to pay the outstanding invoice. I asked the collection agent if there is a contact at Microsoft that I can talk to about this matter. Short answer, “No”, and past attempts to talk with Microsoft representatives also failed.

So here we have it. The big, mighty Microsoft with piss poor customer service chasing $99 thought to be owed to them by a small business and why? Because of an accounting mistake they made.

I would love to talk with someone at Microsoft regarding this matter, not an Accenture contractor, not a collection agency, but a real live person from Microsoft. I would love to hear the reasons why my emails were never answered years ago. I would love to hear why the records show my account was re-opened in 2005 and was never charged (obvious proof they screwed up). And I would love to hear why out of the blue I was invoiced in December 2006 for the period December 2006 through December 2007 despite having canceled my account in December 2005.

I doubt I will ever hear from Microsoft. Meanwhile I paid the invoice. I guess Microsoft needs the money more than I do.




NSiPhoneDevs is Now NSHappyHour

April 21st, 2010

A few weeks ago I renamed the iPhone developer meet-up from NSiPhoneDevs to NSHappyHour. When I announced the name change I said I would follow up with the reasons behind the name change but I totally spaced and forgot. Thanks to @jlbruno for reminding me to explain the reasons behind the change.

I came up with the name NSiPhoneDevs back at the beginning of the year. I like the name because it’s a good play on words, or rather a good play on prefixes. “NS” is the class name prefix in the foundation framework used by iPhone and Mac developers, but “NS” also stands for North Shore. For those who don’t know, Salem MA is located in Boston’s North Shore area. So NSiPhoneDevs is short for North Shore iPhone Developers.

While I like the name it is not without it’s problems. First, NSiPhoneDevs doesn’t exactly roll off the tongue. I for one am guilty of saying “NSiDevs” on more than one occasion. Another issue with the name is some may believe it excludes iPad developers. This is a stretch I know but I’m sure with the release of the iPad there will be more new developers entering the space who consider themselves iPad developers.

The third, and most important reason for the name change, is the name NSiPhoneDevs excludes a major developer group, the Mac developer. I talked with many Mac developers who said they are not interested in the group because it’s iPhone only, and this includes Mac developers who also do iPhone development. My intentions were never to exclude Mac developers. On the contrary, I want more Mac developers to come especially given that I’m doing more Mac desktop development these days.

The iPhone has attracted a large number of developers who come from other platforms including Windows, .NET, and Java. The reasons for moving from another platform to the iPhone varies by developer. Some are interested in mobile development. Some are interested in joining in on the gold rush. For others, including me, the reason is out of love for Cocoa, Objective-C, Xcode, and OS X.

I switched from Windows and web development to work in the world of Apple because, in my opinion, it provides the best developer experience. Programming on my Mac, whether for the desktop or for the devices, is way more fun for me then in Windows, and I find the developer tools to be far better than anything else I have used in recent years.

So back to the NSHappyHour name change. As someone who is also doing Mac development I did not want others in the Mac developer community to feel excluded. After all, we all use a Mac for programming, we use Xcode as our developer IDE, and we work with many of the same core frameworks.

This point hit home for me at NSConference 2010 where I met a lot of people who share the same passion and love for the developer experience provided by the fruit company. It was at this time I realized NSiPhoneDevs is the wrong name.

The NSiPhoneDevs name is good because it builds off the hype that is the iPhone, but at the same time the name is bad because it does not recognized the development community as a whole. At the end of the day we all work with pretty much the same tools and we can learn a lot from one another whether you are writing iPhone/iPad only apps, desktop only apps, or doing all of the above.

So the group is now called NSHappyHour. After all, that’s what the group is really about. Getting together with fellow Cocoa developers to talk shop over a few beers. So if you are writing code and producing apps for the iPhone, iPad and or Mac then NSHappyHour is the perfect gathering for you to socialize, learn, and network while enjoying tasty adult beverages.

For more information about NSHappyHour, visit http://nshappyhour.org.




Another 360idev Comes to a Close

April 15th, 2010

Today was the last day for 360idev and what a great 4 days it has been. Catching up with friends, making new friends, listening to great talks, and yes, having a beer or four. This 360idev was extra exciting me for because I got a chance to talk.

My presentation “Building Web Service Powered Apps” didn’t start off great. There was a technical issue with my laptop and the projector that cause the talk to start late. Then as I tried to show an example of a web service call using the Twitter API I got a request limit reached error.

Despite the bumpy start and the shorten time frame, I think the talk was okay. Not great but okay. I wasn’t able to talk through some of the points I had hoped to cover and I had to skip a couple of the demos. My plan is to record the skipped demos as a screen cast and post them here soon.

Thanks to all who came to my talk, and big thanks to the 360idev team, other speakers and the attendees who made the last few days in San Jose great.




Hey Peanut – iPad App for Toddlers

April 2nd, 2010

Hey Peanut version 1.1 has just been released and is available in the App Store. I’m very excited about this update because it adds support for the new iPad, which will be available for purchase tomorrow. Best of all the update is free to existing users, so if you already bought Hey Peanut and you are getting an iPad then you will get the iPad version of Hey Peanut for free as well.

Haven’t bought Hey Peanut for your toddler? No worries. The price will remain $1.99 and will include both the iPhone and iPad versions. It’s like getting 2 apps for the price of 1.

HeyPeanut-iPad-Sample.png