• My first reseller!

    I've signed up my first reseller for ReceiptWallet and DocumentWallet. DataViz is now selling the products on their website. Already (in its first day) this has driven at least a few people to my products that would never have otherwise seen them. I hope that this works out well and doesn't cannibalize my direct sales.

  • 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.