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

Easiest update to WordPress yet!

I saw that WordPress 2.5 was released and always dread updating my WordPress installations as I have to read the instructions so I don’t screw it up. Well, today I decided to try out the update script I wrote and I was amazed (OK, I shouldn’t have been amazed) that it took just a few seconds and the upgrade was done. Everything seemed to work and now I’m running WordPress 2.5 on 2 installations! I’m not sure what I get out of the new versions, but the admin interface looks cool. Thanks WordPress folks for the upgrade and if you upgrade your WordPress installation when new versions come out, definitely check out my script as it could save you a lot of time.

NSTextField’s lack of filter capabilities

I love Cocoa, but it seems that some simple things are missing. For example, NSTextField doesn’t have the ability to filter text input as the user is typing. A friend reminded me that this is a feature that PowerPlant had ages ago. Cocoa has NSFormatters which allow the field to be validated after text is input, but in many cases, the right way to restrict input is to prevent it from being typed. I like NSFormatters and have created a very complex one to handle multiple currencies in ReceiptWallet, but I realized I needed something else.

So, I present FilteringTextField. 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.

The subclass of NSTextField, has 3 methods.

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

The first lets you set the characters that can be typed; anything that isn’t in the set is eaten. The second, only allows x characters to be typed and the last limits the value if the user is typing in a number. This class can easily be extended to handle other constraints. Pasting in text is also filtered.

If anyone finds problems with this code, please let me know.

Download source

Cool Cheap Camcorder

Last Sunday, I saw on Richard Wanderman’s blog a note about David Pogue’s review of the Flip Ultra. Last year I was contemplating getting an HD video camera to record our son’s first year and eventually his first steps. I spent a long time researching and thinking about it. I was about to purchase one, but decided against it as it isn’t all that convenient to use any camcorder.

When I saw the Flip Ultra, I said cool. The resolution, 640×480 is four times the resolution of the video clips on our digital camera, so what did I have to lose in getting one. I ordered on Sunday from Amazon for about $142 and received it yesterday. It is so easy to use, it’s unbelievable. I’ve only taken a few clips with it, but I can see us using it a lot and hopefully we’ll always have it handy to record our son.

The only downside I see right now is that it uses the 3ivx codec. Why is that a problem? Well, if you want to playback the video, you have to install the codec and if we want to post video online, others have to also download the codec which isn’t all that easy for novices. However, since I have QuickTime Pro, I can export video to H.264 which pretty much everyone can view these days. (I realized today why they chose 3ivx; it has to do with money. The H.264 and AAC codecs could amount to several dollars per unit shipped and with the Flip Ultra costing $140, a few dollars can make a huge difference.)

I think that I’m going to be quite happy with this as the main purpose was to shoot better video than what our digital camera does and at the resolution it does, it easily meets that requirement.

Oh the irony

Today I was digging through some files in my file cabinet looking for my business tax certificate. I mentioned this to a friend and he said “You do realize the irony here, right?”. Yeah, I realize that I’ve written this awesome program for dealing with documents and here I am digging through paper. I do have a good reason for this. I like to keep my business and personal documents separate, so I never scanned in my business documents into DocumentWallet and didn’t scan my receipts into ReceiptWallet. Now that ReceiptWallet handles multiple libraries, separating business and personal is quite simple, so I’ve begun to put business documents into a separate ReceiptWallet document library.

Before ReceiptWallet 2.0, doing this was not very practical. While there have been some user rumblings about some of the ReceiptWallet 2.0 changes including multiple libraries, this experience shows me that the multiple library decision was definitely a correct one. It may take some time for users to get used to multiple libraries, but in the end, I think that users will find many uses for them.

Can’t buy reviews like this!

theappleblogcom20080326budgetorganizeanddeclutteryourlifewithreceiptwallet-clipped.pngA few friends of mine pointed me to a ReceiptWallet review today over at The Apple Blog. I had no idea that a review was being written and that it would be so glowing! While the user base of ReceiptWallet is increasing, I usually don’t hear from users unless they are having problems. Reading reviews like this makes me smile and know that all my hard work is appreciated.

Any other reviews out there? Let me know.

Buying a computer? Wait a week?

I’m not sure where I heard it, but I love the saying that says if you want to buy a computer, wait a week. There will never be a good time to buy technology as it will always get “better” and become cheaper. I had been planning on purchasing a new MacBook Pro after I paid my taxes, my my dog’s root canal put that on hold. Today, I’m sort of glad I waited and will be waiting for the new round of MacBook Pros to come out (whenever that is) because Fujitsu announced a 320 GB 7200 RPM portable drives. I always get my portable machines with 7200 RPM drives as I like the extra speed for development. As of now, the largest you can get (at least from Apple in a build to order configuration) is 200 GB for a 7200 RPM drive. Hopefully Apple makes the Fujitsu an option or other vendors increase capacity for the 7200 RPM drives.

Waiting, however, will be hard as my current machine is approaching 2 years old which is an eternity in computer time.