Archive | Uncategorized RSS feed for this section

Don't Let Java/.NET Deployment Scare You

Ali commented, in regards to my last post, that I should really program my next project in C++ or similar, as requiring a Java/.NET library download scares off lots of dialup customers.  This would have been a valid consideration… in 1998.
In 2006, not so much.

1)  I don’t have dialup customers.  I am targetting a group of very non-technical customers.  The biggest two ISPs in my logs are Comcast and AOL, very mass-market ISPs.  Do you know how many of my visitors stroll on by with dialup?  10%.  60% are on cable/DSL and 30% are on a corporate internet (mostly teachers on their work computer, I’m guessing).  Additionally, of the 10% of customers who are on dial-up fully half of them hail from countries where I do not expect to ever sell a single copy of my software.

2)  Java/.NET deployment is very high.  97% of my visitors have some flavor of Java installed and enabled.  97%.  (Similarly, Flash stats: 98% total, 85% v8 or v9.) That doesn’t help me if they have the ancient MS1.1 JRE installed, which is one of the only widely-deployed JREs Bingo Card Creator won’t run on.  I don’t have any convinient way to check for that other than getting them to visit a certain page on my site, which most people don’t.  Of the highly unrepresentative sample that do, 80% of them at last count have Sun 1.3 or higher.  Don’t believe the statistics from 2000 that you read on the Internet about 50% deployment rates — Java, like Flash or .NET or anything, is a very viral bit of software.  You’ll eventually stumble across content which you want to access that needs it, and after you do this you’re set until your next computer upgrade.  The average person upgrades computers once every 4-6 years, which means as time goes on the number of machines which will have any given runtime approaches 100%.

3)  Know your market.  Lots of educational software, including the stuff distributed on CDs, requires Java to run.  I am able to happily piggyback on the inroads made by metric truckloads loads of eduware.  Its like how you can assume DirectX is installed on the machine of anyone who has bought a AAA computer game in the past, oh, ten years or so.

4)  Java comes pre-installed on most new consumer PCs.  it can’t be bundled with Windows anymore, but it comes bundled with your Dell, Gateway, Mac, etc etc.

From where I sit, its not worth the vastly higher development time and impact on the user experience to cut Java out of the equation, unless its  in favor of .NET, which I may very well try out for my next project but which has exactly the same wrinkle.  At current traffic rates, assuming every one of my dialup customers had no JRE and refused to install, that would cost me a total of 5 successful trial installations a month.  I get more installations originating from AdSense spam sites every week.

I’m not totally sanguine about requiring the JRE to run my application, but I think its a good tradeoff of market size versus development complexity.  I guarantee you that if I had to do my interface in MFC I’d still be months away from launch.  I suppose I could be convinced to change my mind by hard statistics showing that vast numbers of my potential customers can’t run Bingo Card Creator, but the best statistics I have available indicate this is not the case.

The (Trial Downloads) Numbers Game

I passed a milestone some time in the last week — over 1,000 trial downloads of some version of Bingo Card Creator.  Its actually a little higher than that as reported by my server logs but I’m discounting that a bit to account for download site update spiders and pirates.

But its really, really hard to tell exactly how many people are using Bingo Card Creator today.  This is obviously a number of profound interest to me.  In the last week, for example, Google Analytics reports that 95 people have hit my thanks-for-downloading page, which starts automagically downloading a trial demo.  On the other hand, only 18 people have used the update feature in Bingo Card Creator (17 of them with version 1.02, 1 with version 1.03).  So my lowball estimate for number of people using the software is 18ish at the moment, plus an unknown number of folks who are stuck with version 1.0 which doesn’t have update checking.  That number is unfortunately *growing* because getting a new version onto Download.com takes two weeks if you’re not willing to pay through the nose, and I’m not (need sales to cover August advertising still).

I’ve got a couple of worries for the discrepency between downloads as reported by Analytics and confirmed downloads as reported by update checking.  They could be due to any of the following:

1)  Analytics records the download but no download actually took place.  This could easily happen on, for example, IE.  Microsoft’s late-in-the-day embrace of security makes it impossible for my meta-refresh to the .exe to work properly on most computers, so I have to rely on the customers actually reading the first line of text on the page and right-clicking the download link.  This is obviously the worst sort of failure — its a failure I’ll never know about and can’t recover from.

2)  People download the demo and then fail to install it, after forgetting about it or what have you.

3)  People download the demo, install it, run it, and then are told they don’t have a sufficient IDE.  Despite the fact that launch4j, the Java wrapper of my dreams, will offer to launch the Java download page, I obviously can’t sit on folks shoulders and make them press the 6 buttons it will take to get the 18MB JRE installed.

4)  Folks might download the demo, run it successfully, and then opt-out of the checking for updates.  After all, the thinking goes, why would I need to check for updates if I’ve just downloaded it 2 minutes ago.  I might get an update request from them in 15 days when Bingo Card Creator expires their previous cancel (and then I won’t know whether its a user continuing to use my product or a new downloader… grr…).  It would be the simplest thing in the world for me to ping my server regardless of whether they want to check for updates or not, but its not honest.

Anyhow, I’m thinking of sweetening the pot a little bit to encourage people to check for updates.  At the moment my software comes with about a dozen unique word lists, and as time goes on that number is going to increase.  (I should really sit down and write some more, actually — they’re “new features” from the perspective of my users and only take ~10 minutes to compile each.)  I think I’ll reserve, say, 5 of these lists as a Bonus Pack.  And then, if folks don’t have the bonus pack installed, when I ask them for an update I’ll say “You’re missing the Bonus Pack of free word lists.  Would you like to download the Bonus Pack and check for other updates now?”  Since the Bonus Pack would be downloaded exactly once per customer, that would give me a more accurate count of total installations.

I could even, theoretically, just put the Bonus Pack in the installer and only *enable* it if folks choose “Check for Updates” (and/or automagically download a decryption key and decrypt it, whatever).  That, however, leaves a bit of a bad taste in my mouth.  Its the same “tell me you exist and I’ll give you additional benefits” transaction as the download-the-bonus-pack option is, but it seems to be based on a deception.

A Love Note To My Favorite Productivity App. Ever.

I just downloaded the Direct Access program from Nagarasoft today. It lets you type words to act as shortcuts to essentially anything you want on your computer. In default mode, its “type your keyword, then hit F1″ and you get your action. I call that the BANG key because in the Linux world typing a BANG (exclamation point) after the first few letters of a command gets you completion for it if you’ve done it recently. For example, out of the box fireBANG gets you a browser opened… from any place you can type text on your system.

15 minutes of setting up keys which are more useful to me and I had a configuration which I was happy with. I also remapped the BANG key to Alt-Enter, which I can quickly hit without having to move a hand and which I’m used to from Java IDEs. My productivity has not increased so much since I learned to Alt-Tab.

Let me paint a picture for you: here’s what my screen generally looks like when I’m in development mode.

A cluttered desktop

Looking at this ugly monstrosity, I suddenly realize “Uh oh, I really need to copy/paste a file from C:\cygwin\home\nameofdayjob\nameofdayjobcurrentproject\server\perl to C:\cygwin\home\nameofdayjob\nameofdayjobcurrentproject\client . And then I need to zip it. Aww “#$”. Zipping isn’t bad, thats as simple as right-clicking the file and using Winzip’s shell integration.

But opening monsterfolder is tricky. If I had the desktop available it would be as simple as picking the right shortcut out of the fourty that are there. But I don’t — I’ve got 15 other applications vying for my attention. And, likely as not, one of them is modal at the moment. Which means even if I try Windows-M (“Automagically minimize all programs and dump you on your desktop” — and if you don’t use this, START) I’ll get trapped at some file chooser dialog somewhere. So instead I have to navigate to it by picking one of those open explorer windows and typing the whole evil path in the address bar, in the process losing the contents of the explorer window.

But no longer!

Now its svrBANG and I get taken straight to that directory.

Now imagine I’m staring at that ugly, cluttered screen and one of the office secretaries comes up to me. “Sorry, Patrick, this needs your signature urgently.” “This” is invariably a memo which has Japanese I can’t read on it. The most recent culprit was “international exchange activities aimed at promoting economic improvement”, which naturally the Japanese have a two-letter word for. I have a dictionary site which I am totally dependent on for situations like that bookmarked in Firefox (it would practically be my homepage if my company didn’t lock me to www.nameofdayjob.com to increase our access count — I offered to write them a robot to hit the page 100 times a day to allow me to set mine to Google or something but noooooo they said that would be cheating). So I’ve got to click one of the firefox windows from the task bar (2 clicks), open up a new tab, and load the bookmark.

No longer! dicBANG and my functional illiteracy is successfully hidden for another 5 minutes!

Do you have a Start Menu which is overflowing with programs which you use once in a blue moon but can’t get rid of because you would then have to fish them out of Program Files or God knows where else? Just assign them shortcuts. PadGenerator is an excellent candidate for this — I only need it once for every Bingo Card Creator update — padBANG, done, one program group saved. I’m addicted to the old Windows-R, calc/notepad/cmd/mspaint trick. Now I don’t have to Windows-R anymore, and can extend that to programs which aren’t in the system path. paintBANG now brings up Paint.NET (oh, love that program). ftpBANG brings up Filezilla.

Do you have 432 web services you have to check on a regular basis? I’m sort of obsessive-compulsive about having access to data, and yet I underuse bookmarks hideously (never liked them because they were never portable between computers). Which means to get to Google Sitemaps, for example, I generally go to Google (via typing it out in my address bar, no less — a habit which I will never break) and then Get Lucky with “Google Sitemaps”. Now its sitemapsBANG, from anywhere. adwordsBANG. wsjBANG. instaBANG (instapundit, my “got 5 minutes to kill” blog of choice). josBANG. blogBANG (I’ll give you one guess). ffBANG (I shortened “fireBANG” to “ffBANG” for my favorite web browser, since I use this one so often).

Then I got started thinking of ways I could abuse this with my IDEs. I don’t know about you but on a scale of 1-10 I probably use all my IDEs at about a 3, because I never put in enough time to learn the guts of them. As a result, what should be simple like “Use autocomplete to throw out a try/catch block” is just beyond my capabilities for most of them. And I often end up editing programs in non-IDEs just for convinience (my favorite being nano, a pico clone — laugh all you want). Now I’ve got nice portable macros like #intconvBANG. Java mavens might recognize this one:

try {

bar = Integer.parseInt(foo);

} catch(NumberFormatException e) { };

Then I just replace bar and foo as appropriate and I’m done.

Here’s another which might be a little quirky: kBANG. k is, in my personal coding convention, always my variable-of-first-choice for iterating through anything other than an array. If I’m doing GAWK, its always (for k in hash). If I’m doing Java, k is my temporary variable that holds the iterator’s next(). Thus, kBANG is:

java.util.Iterator iterator = foo.iterator();

Object k;

while (iterator.hasNext()) {

k = iterator.next();

}

The program is $40 (save 15% with a discount available to most people who know what the acronym JoS/BoS stands for — search for the words “the 13th August”). The first time I saw that, before actually using it, I thought “God, thats a lot of money for a single-use toy”. Now I think it would be cheap at twice the price.

Impressions On Download Sites

Since I had a lot of luck with submitting my PAD file and getting it registered on a bunch of download sites automagically, I decided to try submitting to an awful lot today, via Robosoft.

Here is my view of the transaction that happens between any shareware site and a shareware author.  What I bring to the table: I give you software for free, and this lets you attract visitors to your pages, not necessarily in the search for my software but in the search for an aggregator of lots of software.  What you bring to the table: you help any of those folks who need bingo card creators find me.

Here’s what a lot of software sites seem to think the deal is: I pay them for listing.  They then, possibly, direct people to me.  And if anyone purchases my software after downloading there, then I pay them a cut.

Funny, given that there are hundreds upon hundreds of download sites on the net, and I have no efficient method of evaluating quality of traffic I’ll get, this does not strike me as a good proposition.  I would much rather spend the $20~$100 you guys want on Google ads, where I have 100% control of my advertising and can guarantee that I’ll get X number of downloads for my dollar.  I’m similarly unlikely to link to anybody who asks for it: while I sympathize with your desire to get a higher PageRank there are too many of you and all I need is for one of you to go “bad neighborhood” to screw my business royally.  I see most of you understand this, as the overwhelming majority of you (even the ones with paid registration) refuse to give a standard link to author pages.

Download.com and Tucows are sort of special cases: they have traffic which is just too high to ignore.  I’ve been on Download.com for about 3 weeks.  They’ve tracked over 100 downloads, which is roughly 50% of what I’ve given out myself over the same interval.  In another 2 weeks or so they’ll finally get through processing my submission for 1.03, after which those downloads should start to see much more frequent conversions (although I rather suspect one of my last 2 sales came from them, since that person came to my site the first time through the trial download).  (Tucows says they’ll have my application processed at some point in 2007.  Thanks fellas.  I love you, too.  After seeing what it takes to get a decent rating on your site I think I’ll pass in favor of producing a quality product.)

In any event, free is free.  My site is now available at 89 places more than it was this morning.  Here’s my promise to the RoboSoft author: if I get 4+ sales which originated at those sites in next 30 days, you get your $100 and a hand-written thank-you note.

Peeking Over Your Customers' Shoulders

I’m going to assume there are multiple possible paths to get your your Buy Now button in your trial software.  Pop quiz: which one gets used most often?

Oh, you weren’t tracking that?  Well, it seems like its fairly useful information to you — after all, from your perspective thats the most important mouse click in your program there is.  And if you know that information, you can test the placement of the link — does a nag screen produce appreciable results?  How about an exit screen?  Do people click the button more when the menu item is highlighted in blue (*cough* yes *cough*)?  Is your idea to put a tip-of-the-day to put another opportunity to buy a sound one (nice idea, Peter Muys)?  If your product is feature limited, what feature is the one that people can’t stand not having?
Yeah yeah yeah, nice to know but its excessively hard to implement, right?  You’re probably thinking you need to have some sort of shopping cart application and pass it a parameter and parse the output and and and…   No.  We’re computer programmers because we are too lazy to do things like that when there are 10 second solutions.

Step #1: Append a dummy parameter to your static HTML page which you send folks too.  e.g. Instead of accessing www.bingocardcreator.com/purchasing.htm access www.bingocardcreator.com/purchasing.htm?source=trial&location=menubar.  (Did you know that your web server will happily take any number of parameters to a request for a static HTML file and promptly log and ignore them?  Yeah, who knew.)

Step #2:  Using your favorite Analytics software, take a gander at the “dynamic content” for your file of choice.  Under Google Analytics this is under Content Optimization -> Content Performance -> Dynamic Content.  For example, I can see instantly that roughly half of the hits on my purchasing.htm page come from referals from my application.  My application has 3 paths to get to the purchasing screen (nag screens on two disabled features and the Purchase Now button), and if I wanted I could segment on those.  Something to try for v1.04.

P.S. Keep in mind its generally poor web design to include lots of dynamic parameters, because they confuse search engine spiders.  But since GoogleBot isn’t spidering your application, you can go hog wild with referrals from there and it will never be the wiser.

Bingo Card Creator 1.03 Released

Well, seeing as how I had some time free today I decided to finally get off my duff and start distributing Bingo Card Creator 1.03. The main changes:

  • Vastly improved memory usage while printing. Customers who try printing 50 cards on individual pieces of paper will not see the program die on low-memory machines anymore (I hadn’t anticipated anybody would try to do this and so didn’t test it… doh?)
  • Printing is now threaded. This means that for folks with printers which are getting a little long in the tooth, the interface won’t appear to lock up for two minutes at a time. Its mostly a cosmetic improvement since I’m guessing after printing most people will go straight to the printer, but app responsiveness is generally a nice thing to have. For 1.04 I’ll consider putting in some sort of dialog to indicate the printing is actually currently taking place — maybe popup a progress bar somewhere.
  • No more flickering — I render all the pages to get printed just off the screen in a JWindow, which means that there won’t be an ugly gray flicker in front of the main application window, and it won’t lose focus.

While at least two of these had been on the back burner for a while (“Hmm, that code is ugly and inefficient… I should fix it… sometime…”), they got kicked to the front burner directly after being cited as reasons for my first return. Yay for useful feedback, especially useful feedback that doesn’t technically cost me any money (did you know that processing a return through Paypal is totally free? Yeah, I was pleasantly pleased, too, but they refund your fee after you do one.), although it did cost a sale.

Single Minute Exchange of Dies

I studed Toyota way back during my study-abroad year in Kyoto as a college student, but hadn’t heard about Single Minute Exchange of Dies. The idea is very relevant to uISVs, but we might understand it better as “implementing scaleable systems”.

Briefly, a die is a big nasty piece of manufacturing equipment. As with all equipment, they have faults and failures. As with all equipment on an assembly line, when they are down the assembly line gets held up. As a result, there is a strong temptation to let the faults go to avoid killing the line, which results in slightly malformed components, which results in lower quality of output. Toyota had (and, to my knowledge, has) a corporate culture which was absolutely intolerant of defects, and they invented a system for system improvement. The system improvements they got from their system let them change dies in minutes instead of in days, which gave them the flexibility to yank them any time they performed sub-optimally, which lead to Toyota cars being some of the highest-quality in the world, which helped lead to US politicians campaigning in Michigan being the only people who really enjoy American cars. (OK, I suppose Japanese mobsters count, too.)

This is very relevent to the article which I posted yesterday regarding support and scalability. That is the beautiful thing about systems: systems scale. If you sell a car and the car breaks down, you get to have somebody fix it, and every additional break-down costs you additional fixing. Or, you could just sell cars which don’t break down. If you sell a piece of software that crashes, you have to answer an email “Why did my software crash?” Or, you could stop your software from crashing. Do you have systems in place which make this easy for you? Because you should: work on your system once and you keep getting value out of it for an extended period of time, without inputting more work. Here’s some systems you should probably have working for you (the 3rd one is directly responsive to “Uh oh, I spend too much time on support”, and its something that I could use some serious improve on myself):

1) Order management: For a B2C company I cannot imagine a reason why you would not totally automate the order process. Customer pays you, customer gets license key, you wake up in the morning a little richer. I use e-junkie for this and the service is brilliant: for $5 a month and Paypal fees they take care of the entire problem for me. Setting up e-junkie took an initial investment (about an hour of my time, plus time to research the tradeoffs & etc) and pays me dividends for every order: customers get instantaneous service, which is a selling point, and when my order volume (hopefully) increases from the current one-per-week I won’t be wasting my time checking that Paypal payments were received properly and manually mailing out CD keys.

2) Systems to support marketing: How easy is it for you to get a link to the most linkable page on your website? You’ve probably gotten most of yours from hustling for them — find 5 pages in a related niche, pitch your idea to 5 webmasters, get maybe one link from a PR2 site? Well, thats certainly one way to do things, and when you’re bootstrapping you’ll need to do it. But you can implement a system to get yourself links in 5 seconds. Watch:

Hiya, I hope you like my blog about uISVs. If you do, please feel free to share it with your friends! If you have a web page, blog, or want to send a link via email, just copy and paste the following: <a href=”http://microisvjournal.wordpress.com”>MicroISV on a Shoestring</a> . That will create a clickable link which your friends can follow back to my site. Thanks much for your interest!

One page on my product’s site offers some information of interest to elementary school teachers. It has an exhortation very similar to the one above. 20% of the people who land on that page convert so I rather like it when people see it. Roughly one out of every 200 visitors sends the link out. Multiply that by 1000 visitors per week and I get 5 links, some of them from decently influential sites, for free. Did I have to hustle and write 25 emails? No, the day I got a link from a PR5 ESL site I was busy doing the important things for my uISV’s success: drinking cocoa and reading the best series of books about the Napoleonic Wars fought with dragons ever written.
If you’re willing to spend more than 5 seconds, you can incorporate scripts to mail a friend, buttons which submit your site to digg or one of the other social-bookmarkers, Javascript buttons to bookmark a site automagically, etc etc. I lack the technical skill to do some of these and my target audience does not quite live in the Valley’s Web 2.0-induced echo chamber, but my two sentence HTML tutorial worked wonders.

3) Build systems: Here’s one place where I’m woefully inadequate. Suppose I get it in my head to change the text in a single dialog box in my program. I hit Ctrl-S to save the resource file. Now here’s what I have to do:

1) Run my program and verify that the dialog has not broken (5 clicks).
2) Export the JAR from Eclipse (roughly 6 clicks).

3) Run my obfuscation program on the exported JAR. (4 clicks)

4) Run my wrapper program to turn the JAR into an exe (4 clicks)

5) Copy the exe into the distribution directory (4 clicks).

6) Run my installer build script (2 clicks).

7) Install my program (4 clicks).

8) Visually inspect that nothing has broken (~10 clicks).

9) Copy the new installer to my web server (4 clicks).

10) Delete one file from the webserver and copy two. (6 clicks).

Thats in the vicinity of fifty mouse clicks, taking 15-30 minutes, to make a one-character change to my published executable. As you can reasonably expect, this forces me to make my changes in bunches, where there’s even more likelihood that something goes wrong, and where neat new features which are tested and done sit on my local machine for a week (3 at the moment and counting, include one which fixes the poor architecture choice which caused my first return and which is continuing to spoil customer experiences) because I can’t spare the time at the moment.

What I really need to do is break down and learn how to actually use an ANT build script and unit tests to do this whole thing in one-tenth the time. Build in one click, observe unit-tests function, give it a visual inspection myself, deploy in one click. Then I won’t be producing the computer equivalent of overly-expensive breakdown-prone cars with the fuel efficiency and aerodynamics of aircraft carriers*.

*This metaphor has been brought to you by Dave Barry, in his seminal work Dave Barry Does Japan, which won’t teach you very much about Japan but will cause you to bust a gut laughing.

[Edit: I tweaked a paragraph to make the connection between SMED and the software support scenario more explicit, and linked Dave Barry Does Japan.]

A Month Worth Of Stats

Might as well give out these stats, although since they include rapid ramping up of a business and ceaseless experimentation they don’t mean quite so much going forward.   But if folks wondering if they can make the leap or not want to see some actual numbers, here they are.  From opening my business on July 1st through August 1st (Japan time):

Business stats:

Sales (gross): $74.85

Sales (net): $71.79 (I pay Paypal $1.02 per transaction)

Expenses (subtotal): $68.02

Signup costs: $22 ($5 Google, ~$17 international fax for eSellerate)

Website: $10.02 (that technically pays for 2 months)

Advertising: $35 (I technically haven’t been billed yet)

Profit: $3.77.  Take that, Bill Gates! :)

Labor stats:

Development week: 50 hours (all tasks)
Post-launch development: 5 hours

Post-launch marketing: 25 hours

Post-launch support: 15 minutes (easy-to-use, mostly bug-free program = I write “Thank you for saying thank you” a lot)

Website stats (for my main site, not this blog):
Visits: 1,873

Page views: 4,704

Trial downloads: 270

There should be an asterix on these data: I got a large spike of hits from pirates when my software was cracked.  They accounted for roughly 120 downloads and a couple of hundred visits.

Advertising stats:

Google AdWords campaign:

Cost: $30

Clicks: 315

CTR: 2.45%

Conversion (to demo): 17.61%

CPA (to demo): $.61

Yahoo Search Marketing Campaign

Cost: $5 (its actually $30 but I got a $25 free coupon)

Clicks: 262

CTR: 2.28%

Conversion: 24.8%* (* its actually higher — Yahoo conversion tracking was off for a week or so)

CPA: 44 cents* (* its actually lower, for the same reason)

Organic search stats:

 Google: 154 hits, 17.5% conversion

MSN: 85 hits, 13% conversion

Yahoo: unknown, doesn’t disaggregate well from CPC campaign.

My goal for the rest of August: I’d like to see 10 sales and would be very pleased with 20 (10 sales a month makes this an amusing hobby, 20 sales a month is a meaningful change in my standard of living).  Aside from that, continuous improvement in marketing (.30 CPA and breaking in the top 5 organic results on my favorite 10 keywords), and getting Bingo Card Creator to be as good a product for teaching math (and potentially other subjects) as it is currently for teaching elementary reading.

I'm Profitable

I was worried for a little, particularly after increasing my advertising budget (sure, its only 5 sales worth per month, but was I overly optimistic?), but I got some orders today and I’m now profitable and will continue to be for the forseeable future.  Yay me.  I also like that its one month to the day after opening my business.

Big credit to my friends at JoS (especially those who chipped in with good advice) and the other businesses and software developers without whom none of this would be possible.  And, of course, to all the teachers out there.  I hope you enjoy the last of your summer vacation and have a bang-up school year.  (P.S. If you’re looking for an activity for your first day, can I humbly suggest icebreaker bingo?)

Minor Programming Tweaks

I’m actually cracking open the IDE today.  Nice to get away from marketing for a bit.  I have a bunch of stuff which is neither sexy nor fun but will improve the customer experience:

1)  Currently I pop up a visible JFrame when I print for a split second, which is annoying to the customers (it causes what is perceived as a gray flicker over the application window).  I moved this offscreen, which half solves the problem in one line of code.  The other problem is a new JFrame immediately grabs focus from my window, even if it only lives for a fraction of a second, which causes the title bar to flash a lot.  Going to play around with that some more.

2)  Also related to printing, if you print, say, 30 cards all of them get created before they are spooled out to the print, and they are only garbage collected after the printer reports that it has gotten them.  While this isn’t a problem on my souped-up development machine at least some of my customers are on P3s with 128 MB of ram, so I’ll optimize that (its the only significant use of resources in the program, to my knowledge).

3)  I’m going to give it an icon rather than the default Java cup of coffee.

4)  Maybe, maybe if I have time before dinner I’ll get the math facts thing working.