Why is currency programming so hard?

One of the most requested ReceiptWallet features was to be able to handle receipts in multiple currencies. OK, simple enough I thought as I could just treat all values as strings so that they have a currency symbol in them. The problem was that I had to verify that the currency symbol was valid and format the value so it is appropriate to that currency, for example, the Japanese Yen doesn’t have decimals in the number. My first pass that this was pretty decent, handled dollars, Euros, Yen and a bunch of other currencies. Turns out this wasn’t a complete implementation. In order to build my list of currencies, I used what are called locales on Mac OS X to get the currency associated with a locale. Problem is that some currencies aren’t associated with a locale, such as Swiss Francs (I have no idea why). So I had to find a way to get a list of currencies and do some formatting magic. I think that I managed to do this, but I just don’t understand why it was so hard. Is it inconceivable that people would want to use multiple currencies on one machine? If it was easy, everyone would have this type of code in their programs!

Charging a Motorola RAZR over USB

The Motorola RAZR has a mini USB plug on it for charging and hooking to a computer which is great as I have lots of those cables lying around. Unfortunately it won’t charge over USB from a Mac out of the box. Luckily, I know some tricks and someone told me the magic to get it to charge. I whipped up a little program that tells the RAZR (or any other Motorola cell phone) to charge over USB. My app is free to download. If you like it, please take a look at my ReceiptWallet program and consider purchasing it. The app is pretty simple; place it in your applications folder, launch it and set it as a login item. Whenever you plug in your phone, it should start charging. If your machine goes to sleep, it will stop charging. (For those curious, all the program does is open and close the USB interface on the phone.)

If you can’t get the program to work, unfortunately there is nothing I can do about it other that to suggest to Motorola to fix their phone so that it charges automatically when plugged in via USB.

Update, there are “sync only” USB cables that allow you to charge Motorola phones without MotoCharger; I have one and it works quite well. I’ve also decided to post the source code. You can grab it here. There are no restrictions on the source, just please don’t claim it for your own. If you like it or use it, please use my Amazon link to buy something.

Overlooking the obvious

In my latest program, ReceiptWallet, you can create and delete receipts. While I was developing it, I always hit the Delete key to remove receipts as I’m pretty keyboard centric and don’t like using the mouse if I can help it. The Delete menu item is always dimmed and I have received a number of messages asking how to delete receipts. I can’t believe I forgot to hook up the menu item for Delete. Stupid me. So in the next version, I hooked up the menu item and added a big Delete icon on the toolbar.

ReceiptWallet finally released!

Today is a very exciting day for me as I just released my latest product, ReceiptWallet. It’s been a long time since I’ve released my own product. This product allows users to scan, manage, and organize receipts. It came out of my own frustration in finding a receipt one day. With the help of a few testers, I think this is my best application, yet. I think it has the most user interface polish, the right feature set (for a 1.0 release) and works quite well.

While the basic development of the product took about 2 weeks (that’s about 100 hours while I was still trying to do my regular job), it took another few weeks to have the icons done, to write the documentation, and to do the website.

Unlike some of my other applications that have come out of my head, ReceiptWallet is the first that requires virtually no documentation and can be used by the novice user. Both my parents are using it and usually they ask me a ton of questions about how to use some programs, but ReceiptWallet is an exception. They’ve asked me a few questions and had a number of good suggestions, but nothing to drive me crazy. Normally my ideas are quite complex and work for me, but are far too complicated for normal people. This has also been one of the most enjoyable products I’ve worked on in a long time; I had a chance to learn new Apple technologies and was able to pour my heart into it as it is a program that I’ll be using several times a week, at least.

I hope that others find ReceiptWallet as useful and as compelling as I do; if you have a big drawer full of receipts and can’t find anything like me, then ReceiptWallet is for you!

(How’s that for a product plug?)

A little UI tweaking can go a long way

The other day, I sent my latest program to a friend of mine to test and he asked if I wouldn’t mind some constructive feedback. I’m always hesitant to get user interface feedback as last time I did (from an Apple UI guru), I was in the host seat for well over an hour getting what I thought was a good user interface ripped apart. Anyway, I told my friend that as long as it didn’t involve brushed metal (the look that Apple is using everywhere in excess), I’d listen. Over the course of a day or so, we exchanged instant messages and email and I was amazed to see the transformation. While I thought my program was technically solid, I wasn’t all that pleased with the user interface before; it was very utilitarian. My friend’s ideas along with some of my own sparked by his comments turned my program into something that I’m extremely pleased to show off (when the time comes).

User interfaces will never be perfect or to everyone’s liking, but a little effort and a little different perspective can go a long way.

Debug Logging in Shipping Code is not nice

During some development today, I had to install the scanner drivers for my HP 6110xi all-in-one device. Knowing that scanner drivers have been consistently horrible for the Mac, I decided against installing on my main machine (which also serves as my development machine) and instead installed it on one of my test machines. Well, it is really sad to be right in this case. The 101 MB download for the HP scanner included a whole lot of crappy software. As I was debugging my application, I write a bunch of stuff to the Console and as I was watching the Console, I saw lots of stuff like this:

2006-10-21 16:30:34.134 HPEventHandler[204]: DebugAssert: Third Party Client: (NULL != m_lock && 0 == errno) Can’t create semaphore lock[/Volumes/Development/HP/Mac-Sirani/mac-software/components/HPEventHandler/Sources/Core/HPTMNotificationManager.cpp:62]

appear, as well as debug statements showing the scanning process. I didn’t enable any special logging or anything like that. I wonder how much debug code shipped with the driver and bloated it? It really is a good idea to turn off the debug logging when you ship a product or at least turn if off and make it an option to turn it on in case you need to have a user send you something.

With the rush to get products out to market, quality has gone to the birds in a lot of products.

Learning new technologies (Apple technologies, that is)

For a long time now, I’ve been wanting to learn various Apple technologies such as Core Data and Bindings. However, it hadn’t been until last week when I finally had a chance to start learning them as well as Image Capture Framework. I came up with an idea that I’m excited about and started work on the project last week. Since I’m supporting OS X 10.4 and later, I can use Cored Data and Bindings (bindings go back to 10.3.9 or so). I always have trouble learning new software stuff if I don’t have a use for it; now that I have a use for it, I learned both technologies in a matter of days. I’m pretty impressed with Core Data. It works well and I haven’t found anything to really dislike about it, yet. Bindings, on the other hand, sounds great in theory, but sometimes just doesn’t work how I want it to work. So, I spend a lot of time trying to jam a square peg in a round hole until I give up and go back to the way I did it before. This isn’t to say that bindings are useless, they’re just not for everything.

On to Image Capture. The sample code made it look easy and scanning was working real well until I tried to muck with the contract, brightness, etc. It appears that none of the settings work (at least with my scanner). So I start poking around and figure out that most scanner apps on my machine are using TWAIN instead of Image Capture. OK, so I wasted another day realizing that Image Capture Framework (for scanners) is broken or I’m not using it right (the sample code produces the same results as my code). TWAIN seems to work OK, until I try to have 2 scanners on my system so that I can detect them. Took me 30 minutes to figure out that the EPSON Perfection 1250 drivers that say that work on Intel Macs aren’t universal binaries, so they work in Rosetta applications, but not native ones. My other scanner, a DocketPORT 465 does have native drivers (that’s one of the reasons I bought it). So my code worked fine, EPSON is just behind the times. On a side note, it’s amazing to me that scanner vendors still are clueless after all these years…they make crappy software and always have.

Anyway, a few more technologies under my belt and it wasn’t all that painful. Stay tuned for my latest product which has managed to get me excited about programming, again!

Geeks unite!

This morning, I got up early (couldn’t sleep) and got down to Moscone Center West to pick up my badge for Apple’s WWDC. I got there around 7 am and people were lined up for the 10 am keynote. After I got my badge, I went back to the hotel and then met people for breakfast. Maybe I’m just an old fart, but I don’t see the big deal in waiting in line for 3 hours to get a good seat to see Steve Jobs speak. I did get a seat and could see the keynote clearly on a large screen (I could see the stage a little bit, but who cares). Others must be more fanatical than I am to want to sit in the front; last year I got VIP seating which meant I was closer to the stage. My world didn’t change because I could see the stage.

To me, the keynote was uneventful. I saw the new machines coming and the key features of Leopard had some nice eye candy, but not a whole lot of meat. One feature I really like (as an end user) is the Time Machine backup. While I’m one of the 4% that does backup, any easier backup strategy is music to my ears.

Other than that, I can’t talk about the rest of the week as all the content is covered under NDA; however, I’m sure there will be leaks. The leaks won’t come from me.

Learning new computer technologies

There are so many computer technologies that I need to/want to learn, that I have no idea where to start. I learn all the time, but never really have the time to spend to sit down and learn something new unless I’m going to use it immediately. My current list of technologies/programs/whatever I want to learn include:

  • MySQL (how to make queries, create new databases, etc.)
  • Core Data
  • Sync Services (actually how to program it)
  • php
  • perl

I’m sure there are other things I want to learn, but I can’t think of them now. If I had tons of time and didn’t have to move forward developing with what I already know, I’d have plenty of time.

Cool developer tip of the day

If you’re like me, you only test certain software you’re developing on your main user account. For me, anything that involves syncing, I use a second account or machine for testing. As my second machine is a 6 year old G4 tower that sounds like an airplane, I don’t like firing it up. Today I discovered a really cool trick to make testing with a second user account more efficient. Tiger has support for VNC built in, however, it appears to only allow you to control the user that is at the console, in other words, the user that is using the machine. This creates a problem (fun things happen if you try it) as I want to control a second account.

A program called OSXvnc to the rescue. This program starts up a VNC server in each user account that you run it in (use fast user switching to login to the other accounts and launch this app; make sure you set a password). Then use a VNC viewer, I use Chicken of the VNC, to connect to the other OS X user accounts. This allows me to test from secondary user accounts, while still being logging into AIM, able to check my email, and develop from my main account. Performance is pretty good on my MacBook Pro. This will definitely save me a ton of time.