Lovely HP Scanner

My dad has some random HP Photosmart scanner and keeps running into problems with it and ReceiptWallet. His messages imply that it is an issue with ReceiptWallet and that very well may be the case. I looked at his ReceiptWallet log today and saw:

               XResolution: 200.0000
               YResolution: 200.0000
        imageInfo:
                ImageWidth: 616
               ImageLength: 1528
           SamplesPerPixel: 3
             BitsPerSample: 5605
              BitsPerPixel: 16815
                    Planar: 0
                 PixelType: 2
               Compression: 0
got the image info 0...
setupMemXfer.MaxBufSize: 16777216
setupMemXfer.Preferred: 1048576
bytesPerRow: 0
Getting image via memory based transfer...
totalMaxDestBytes : 0
rc: 1
Got image via memory based transfer: 1

This means that the scanner says that it has 16815 bits per pixel! Most scanners do 24 bits per pixel. His scanner must be so advanced that it can capture color 800 times better than the average scanner! OK, so the scanner reported an error and somehow ReceiptWallet didn’t properly handle this (I think I fixed this). The better question is why oh why do HP scanners report bogus information? It seems like the HP scanners are the ones that randomly screw up scans the most. I worked on an issue last week with a different HP scanner doing something similar. Did I mention that the scanner logs debug message to the Console? This is very bad form in a shipping app. ReceiptWallet’s debugging information is turned on via a hidden switch and logs it to its own file to make it easier to troubleshoot. I’m hoping that someday the drivers get better.

GrandDialer is far more successful than I could have imagined

My first iPhone application, GrandDialer has been downloaded more than 9000 times! I thought that it wouldn’t be that popular because people can’t get GrandCentral accounts. Boy, was I wrong! The reviews are pretty good, but some people expect way more than I can do with the application. As far as I can tell, the only external interface to GrandCentral is through an HTTPS connection. GrandDialer is based on a perl script.

While I’d like it to do more, pretty much all I can do is dial the number. Things may change in the future, but GrandDialer is going to remain a one trick pony until GrandCentral opens up more interfaces (I don’t plan on doing web scraping as that is very error prone and just not fun to program).

I encourage people to read the FAQ before contacting me as it answers a bulk of the questions people ask and the response time is fast!

If people like the program, please purchase something through my Amazon link.

Reviews on the AppStore

When I look for software, I like to try it out before I buy it. However, with the AppStore for the iPhone/iPod Touch, you can’t so you have to rely on reviews and the product description. Even for free apps, some people find reviews important. The review mechanism on the AppStore has a lot to be desired. For instance, anyone can post a review even if he/she hasn’t downloaded/purchased the app. This should change as it skews the reviews and can be misused, especially for paid applications. Second, there is no way for developers to respond to comments without posting a review with a star rating (and of course, who is going to give his own program anything less than a 5 star review?). Third, even posting a 5 star review, it looks like I only get one, so I can’t respond to reviews and point out why I shouldn’t get poor reviews. Apple should take some lessons from VersionTracker; while VT isn’t perfect, it is a lot better than the AppStore. Fourth, there is no way to post a review without giving it a star rating; so people that ask questions like “How do I get a GrandCentral account?” give it a 2 or 3 star review.

While the current review system works for music, it needs to seriously change to be usable for applications.

(On a side note, why do people post crappy reviews saying stupid things without reading the instructions or contacting support?)

My first iPhone app has been released!

My first iPhone application, GrandDialer, is now available on the App Store. Basically it allows GrandCentral users to call people and have their GrandCentral number appear on the caller ID. The reviews have been pretty positive and I’m quite excited. It is free and seems to be getting a bunch of downloads (the audience is quite limited at the moment because GrandCentral isn’t accepting new users). If I charged for it, would people pay? I think some would, but not everyone.

The App Store is a bit of a mixed bag; the centralized distribution is cool. The waiting for Apple to post it is a downer; the review system needs lots of work (the only way I can respond as a developer is to post a 5 star review which just isn’t right).

I have some idea on what to add to the app, but I’m quite limited in what is exposed from GrandCentral.

If you have a GrandCentral account and an iPhone/iPod Touch, go grab a copy of GrandDialer!

Unacceptable anti-spam system

A user contacted me about an issue this morning (basically a corrupted download of ReceiptWallet which most people would just re-download it and be done with it) and when I replied to the message, I got an anti-spam challenge that sent me to a link. The link brought me to the following form:

antispam.png

First off, on my web site, I say that I don’t click the links to verify that I’m a human (I did this time because I was curious). Second off, look at how much stuff they want me to fill in. This is completely unacceptable. Is EarthLink’s spam filtering not as good as Google’s? Google’s works quite well for me and I don’t have to inconvenience people with this kind of baloney. When are people going to learn that these challenge and response systems just piss people off. I had my own system many, many years ago and stopped using it as it prevented legitimate people from sending me email.

Finding bugs automatically

A colleague pointed me at a tool called LLVM/Clang static analyzer which is supposed to find bugs in code automatically. I was skeptical at first as how could it do it? Well, after running it on a few projects, I quickly became a believer! While it finds some stuff that isn’t technically bugs, it did catch a number of memory leaks that I’m actually ashamed to have found in my code. Some of my old crufty code had leaks in it and a few places where I misunderstood memory allocation caused me to revisit them (turns out that most of the sample code I’ve found dealing with NSManagedObject subclasses also has memory leaks). I’m going to make sure to run this on all my projects; I need to put a better front end on it so I don’t always have to type in the command and remember the syntax.

It took me awhile to get it to say that some of my projects were “bug free”; it uses function names as indicators as what should retain memory and what should not. There was a function GetSomeValue which returned a CFStringRef that had to be released by the caller. CF convention says that the caller does not have to release an object if the function name has get in it. I had to switch the name of the function to CopySomeValue as CF convention says that the caller must release an object that has copy or create in it.

How not to get contract work

I was browsing LinkedIn today as I got accepted to the iPhone Developer Group (whatever that really is) and noticed an ad at bottom:

engineerad.png

(URL removed to protect the innocent.)

While it may seem that Google AdWords is a good way to get business, how many serious projects that are worth several thousand dollars do you think you can get off this? I had a hard enough time getting people to buy ReceiptWallet off an AdWord (I probably didn’t do it right) let alone pay me a ton of money to write an app.

Good luck with this type of advertising!

iPhone Development is Cool, but not easy

TextToAFriend.pngI’ve been doing some iPhone development lately (screenshots and announcement of my first app will be next week) and realized yesterday why I keep running into hurdles; I’m a perfectionist. I want everything to look and work well and have studied the built-in apps for guidance. In my app, the hardest part was the settings believe it or not. As I was looking at apps yesterday and found some issues with some major applications in terms of functionality and interface.

AddLocation.pngLet’s take a look at a screen from the AP news application pictured to the right. The text placeholders are far too big and in my opinion, there should be labels to the left of each text field. Second and this is where someone really didn’t pay attention to details is that if you hit the + button, it brings up the people picker; there is a cancel button like there should be, but if you hit the Groups button (standard in the people picker), you’re stuck. You must choose a group and then hit the cancel button. Next if you goto the Local section, if you add a location, there are 2 glaring issues to me; first, the return button in the lower right. That really should be a done or something else. The second is that the title says “Add Zip Code”, but the keyboard is NOT theNumberPad.png standard number pad used for PINs and the like. Furthermore, you can enter something like Los Angeles, CA and it says that there is no local news. This is not very user friendly. Do I happen to know the zip code for LA? (OK, I could enter 90210 and get close).

Am I nitpicking? Of course. Will someone pick apart my apps? I’m sure that someone will just to say that I can talk the talk, but not walk the walk. Everyone and his brother is going to say that they do iPhone apps and there will be tons; I hope that people pay close attention to detail as that is what I think will separate the iPhone from other platforms.

I hope to have some neat apps for the iPhone in the near future; so far I really enjoy the platform, but paying attention to detail is the hardest part. In the current app I’m working on, I re-did my settings 3 or 4 times until I liked how it worked.

If you have any ideas or need a contract iPhone developer, please let me know.

No excuse for crappy UI

I’ve been reading about Stevens Creek‘s new TripLog/1040 application through some discussions about bad UI. Steven Patt, the author and long time Palm developer (like me, however I stopped a few years back), defends his decisions saying that users want everything viewable on one screen. While this may be true, this app looks like a horrible Palm OS app. It follows none of the Apple UI guidelines and looks nothing like any built-in iPhone application. There is absolutely no excuse for it; some of the buttons are far too small to actually hit on a device. They may work fine in the Simulator, but they are not usable. Then the background color is just awful.

He can justify his decisions all he wants, but this kind of UI just makes the iPhone look like a piece of junk. Developers need to adhere to the guidelines to make the platform look solid. Years ago I wrote an article for one of the Palm conferences about minor things developers could do to polish their apps, like have the correct button sizes and placements. Many Palm OS developers ignored it.

While I’m ranting about software, it was so nice of him to violate his non-disclosure with Apple by posting screenshots of his application. It seems like he wasn’t only in this violation. Does Apple care? I don’t know, but it annoys me to no end that even if I did have an app ready, I would have honored the NDA and not posted anything until I was released from the NDA. I would have hoped that Apple would have punished these developers by not accepting their apps into the AppStore, but this didn’t happen.

New features for newer operating systems

I’ve written a number of times (I think) about how long should I support an older OS. I’ve also said that I’m not abandoning Tiger users, quite yet, but I may have mentioned that new features are likely going to be Leopard only as required to make things easier. In the recent past, I’ve implemented 2 Leopard only features; the first is support for Image Capture scanners. Image Capture seems like a broken framework that might be fixed someday. In the meantime, the only way for me to reliably test and get things working is to require Leopard.

The other feature (which I just finished today) is allowing a library to be encrypted. The approach I took was to create an encrypted disc image and shove everything in that. Encrypted disc images are supported on Tiger, but one of the slick features in Leopard is a sparsebundle. What is a sparsebundle? Well, it is a growable disc image that has “bands”. This means that if you modify a few files in the disc image, only the necessary bands are updated. This is absolutely necessary for backups otherwise each time a user touched a ReceiptWallet library, he’d have to backup the entire disc image (backup apps do the right thing; it isn’t a manual process to copy the bands). With one of my libraries approaching 1 GB, that would be a complete waste of time. Time Machine uses sparsebundles for the Time Capsule and if it is good enough for Apple, it’s good enough for me! So, I’ve disabled encryption on Tiger. I’m sure that some people won’t be too happy about this, but doing encryption another way would have taken significantly longer with no true reward.

Everyday, I look at the statistics I collect on what operating systems users run. The large majority run Leopard. In the graph below, you have to make one big assumptions as the data is anonymous so users that check for updates all the time (more than the default once a day) will get recorded more than once, and that is that Tiger and Leopard users check for updates at the same rate. The actual numbers are irrelevant; it is the trends I look at and the ratio of Leopard to Tiger users. The blue and red lines represent the most recent versions of Leopard.

UserData.png