• Failing the first test to become one of my customers

    Just when I thought that ReceiptWallet and DocumentWallet were the easiest to use applications I've ever created, I had a user contact me saying that he couldn't install the software. The installation couldn't be easier. You mount the disc image and look at the picture:




    Picture 1.png





    Just drag the icon to the applications folder, open the applications folder and double click ReceiptWallet. Should I have a video to show people how to do this? Unfortunately for this customer, he had trouble with that step. I'm very scared about the questions this user will ask in the future if he failed the first test.

  • Scanner drivers suck

    I've probably written this before, but most scanner drivers for the Mac are garbage. This includes drivers from the major vendors such as HP, EPSON, and Canon. I've been pleased with the drivers from Sysscan for my DocketPORT and the Fujitsu ones are OK. I keep seeing crash reports with my products that clearly point to the scanner drivers. One that came in today looks like:

    Thread 0 Crashed:
    0   <<00000000>> 	0xffff926c __bigcopy + 300 (cpu_capabilities.h:194)
    1   <<00000000>> 	0xffff9188 __bigcopy + 72 (cpu_capabilities.h:194)
    2   com.hp.HPScanPro               	0x0379fb54 TwainEvents::SendEvent(TW_IDENTITY*, unsigned long, unsigned short, unsigned short, char*, unsigned short*) + 176 (TwainEvents.cpp:126)
    3   com.hp.HPScanPro               	0x0379e320 DS_Entry + 792 (SampleDS.cpp:156)
    4   org.twain.dsm                  	0x97f9a7e4 EntryDS(TW_IDENTITY*, TW_IDENTITY*, unsigned long, unsigned short, unsigned short, char*) + 180
    5   org.twain.dsm                  	0x97f998b8 DSM_Entry + 456
    6   ...gtenterprises.receiptwallet 	0x00014724 -[Scanner aquireNativeXfer:] + 356
    

    What does this mean? It means that ReceiptWallet sent a TWAIN command and TWAIN passed it to the HP Software. HP's software crashed likely while copying some memory. The thing that gets me about this crash is the crash shows the file name where the crash happened, "SampleDS.cpp". HP didn't even bother to rename the Apple sample code. While this may seem like a minor thing, if they overlooked such a minor thing, what else did they overlook?

    I had a customer tell me yesterday that he was relieved to see my comments about the HP drivers on my FAQ because he thought he was the only one that had issues with them.

    Then I've seen EPSON drivers where they incorrectly implemented part of the TWAIN driver; there are 2 choices for scanning, Memory Based and Native Transfer. If you use Native Transfer with some EPSON scanners, you get a yellow background. This is reproducible outside of my application, so I know it isn't my problem. So I had to implement code for Memory Based transfers which was a pain.

    Why, oh why, can't scanner vendors focus less on they're "pretty" interfaces (I say that factitiously as the interfaces look like crap) and more on functionality? On the consumer level scanners, how many people play with all the controls? Most don't, so the driver should just have a scan button, maybe a preview and ability to crop, but anything more than that is overkill and prone to making things more complex.

  • Think first, code later

    Several weeks ago, I was working on reports for ReceiptWallet and thought I had it all done in one weekend. The following Monday I realized I missed a part, handling sub items. I poked at it a few times and got nowhere. I then thought about the problem for 3 days and figured it out (all without coding). I told my wife that it would take me 1 hour to finish it. So the following Saturday, I got up, coded for 1 hour (exactly) and said that I was done. I went to test it and it didn't work. Damn. I had breakfast, thought a little more about the problem, came back, added one line of code and then everything worked.

    While it is obvious to think first, I'm not sure a lot of developers do that to solve complex problems. For me, these types of problems are all consuming and I must solve them before I can move on. Luckily no one complex problem seems all that difficult to me; I may not want to code it, but that's another story. Not wanting to code something has more to do with tediousness than complexity.

    Long story short, think first.

  • Childhood obesity

    Several months ago I started seeing and hearing numerous ads about childhood obesity. It kind of surprised me that there was a huge campaign to fight it that just appeared when this problem has been known for years. It sickens me to see overweight children. People blame computers and video games for many of the problems. While I'm not going to disagree with that, I think the problem lies in the habits parents teach their children. I use a computer 10+ hours a day for work and other things; however, I make it a point to go for a run 4-5 times a week and carve out that time in my schedule. In addition, I watch what I eat. I was never raised to drink soda all the time or have chips everyday for lunch. Society can be partially blamed for this, but maybe parental influence can also play a factor in preventing this. I don't have children, so I don't know how hard this is, but it would appear (from an outsider's point of view) that good and bad habits start in the home.

    I hope that the new initiatives against childhood obesity work as this problem is getting worse and is not only disgusting, it will cost our country a significant amount of lives (and quality of life for those who have it) and will be quite costly monetarily to treat the health problems associated with this.