• Caught with his pants down

    I had a user send me email the other day indicating that his copy of ReceiptWallet was already registered and he couldn't enter his newly purchased registration code. He sent me a screenshot of the about box which shows the registration code and I ran the code through my database to discover a) it was never issued and b) it is in the wrong format to be a valid code. Hmmm. When I was at Macworld, I spoke to an engineer at eSellerate who indicated that their serial number library was updated to be more secure as there have been some cracks out there of it; I still use the library as some of my users purchased way back when I used eSellerate to process my sales. So, it would appear that there is a cracked serial number for DocumentWallet (and now ReceiptWallet) floating out there.

    Should I be concerned? Not really. I know that software is pirated and just take that as a given. If I spent huge amounts of time building in super-duper code to handle piracy, I couldn't spend time on the stuff people care about. I worked for a company way back when that spent so much time on anti-piracy, that they neglected to fix issues in the product and had few customers to show for it. I have blocked the serial number from use in future versions, but I'm sure it will get cracked again.

    (Yes, I know I could do server side validation of registration codes and block them, but this gets people a bit paranoid if I go out of business, their software stops working. So, I'll live with piracy.)

    Back to the user; I'm not sure if I'll hear from him again. While I didn't accuse him of piracy, I did ask him questions about how long he's been using the product as his original email indicated he had problems upgrading from DocumentWallet. Since he purchased ReceiptWallet last week, he either wasn't using the product for the last 3 weeks (since ReceiptWallet 2.0 came out) or he was using DocumentWallet with a hacked code.

  • Tech support via Screen Sharing

    One of the features that I really like about Leopard is iChat's ability to do Screen Sharing. There have been different implementations of screen sharing including Apple Remote Desktop and VNC, but none is as easy to use through home routers as this. In the last week, I helped my dad with email (he just upgraded to Leopard) and helped a ReceiptWallet user with an issue. Sometimes it is much faster and easier for me to poke around than to talk on the phone or exchange email. While there are some problems with the feature dealing with different screen resolutions, for most people it works quite well. This feature, alone, is a reason to get anyone that you support to upgrade to Leopard; if you've ever spent hours on the phone trying to talk someone through a problem, then this is for you!

    (Of course, certain firewalls and routers can cause this to fail. I got rid of my Linux server awhile ago that was my router and now things like Screen Sharing work quite seamlessly. If you have problems, stop kidding yourself and buy an Apple TimeCapsule or Airport Extreme and be much happier. It costs more than other routers, but the time and hassle it saves is well worth it.)

  • Excellent Crash Reports

    I find that a majority of the crash reports that come in for ReceiptWallet have the following for the description:

     

    Yes, they are blank! While I appreciate people sending in crash reports (I read everyone of them and try to figure out the problem), having no description makes it much harder to figure out the problem. Today I received a blank description, but in reading the report, I was able to "reproduce it" (hard to reproduce when I wasn't told what happened) and quickly fixed it. I'm contemplating making description a required field for the report; this could reduce the reports which I don't want as it would give me a false view of how many crashes people are getting.

  • Filtering NSTextField - Take 2

    Thanks to Jim Correia of Bare Bones Software, I have a slightly different method for filtering NSTextFields based on an NSFormatter. While my older method worked, this is a bit cleaner.

    Like my old filter, this also has three methods:

    - (void) setAcceptableCharacterSet:(NSCharacterSet *) inCharacterSet;
    - (void) setMaximumLength:(int) inLength;
    - (void) setMaximumValue:(int) inValue;
    

    However, they're called differently. You'd do something like this:

    NSMutableCharacterSet *characterSet = [[NSMutableCharacterSet alloc] init];
    [characterSet addCharactersInString:@"0123456789"];
    [secondaryTextField setFormatter:[[[PartialFormatter alloc] init] autorelease]];
    [[secondaryTextField formatter] setMaximumValue:65535];
    [[secondaryTextField formatter] setAcceptableCharacterSet:characterSet];
    [characterSet release];
    

    Note that the formatter is based on NSFormatter and not NSNumberFormatter. I actually am using this for a number field as I want the number field to give me back a string instead of a number, so that's why I put in the setMaximumValue and didn't base it on NSNumberFormatter.

    As always, feedback is welcome.

    The attached code can be freely used in commercial and non-commercial projects. While I'd like some credit in the about box, it isn't necessary. This code has no warranty and you assume all risk for using it.

    Download source