My Next Piece of Software

I just got an idea for it yesterday and I’m quite excited, although I still have some design and thought to do before I greenlight the project.  Ah, its nice being my own boss.  As opposed to Bingo Card Creator is, well, radically different in just about every way.

Its much more ambitious than Bingo Card Creator, and would probably take 2+ months of development if I go ahead and do it — likely more, as there is no possible way I can or would do the “full time job on top of a full time job” deathmarch for that long (it nearly hospitalized me the first time).  The budget is still hyper-low, since I get to reuse a lot of what I learned on (and bought for) Bingo Card Creator: I think I can do this for probably $500 for the first 6 months.

This is aimed at a much less price-sensitive customer (although its primarily B2C rather than B2B, although some of my prospects are chucking around close to $500,000), and the target user belongs to a community of 4,000 which is currently experincing a Web 2.0-type growth curve, so I’m guessing by the time I start writing there will be 10,000 prospects or thereabouts.  I’d probably start writing in January, since I’ve got a major ongoing time commitment between now and December (I’m going to get JLPT level 1 this year or perish in the attempt*).

Speaking of Web 2.0, this application screams “Make part of me a web service and charge by the month”, so I’ll probably release a couple of versions targetting various segments within the community: free forever, freemium (free trial for paid version), premium, and premium + subscription.

If course, given that I’d be scarily dependent on a third-party not totally wrecking me by either a) failing or b) radically altering their own software/business to eliminate the pains I’m going to solve, this might not exactly be a sedate experience.  Ah well, its so fun breaking out ye olde project management package (I’m a big fan of Paper v1.0) and sketching out some specs.

Maybe I’ll do this one in Visual C# .NET.  It would be great to add another skill to the list before I go back on the job market at the end of my current contract.

* Explanatory note for the peanut gallery: JLPT stands for the Japanese Language Proficiency Test.  I already have a sufficient oral skill and certifications of oral skill to work pretty much anywhere I darn well please, but I’m functionally illiterate.  I can get myself around a train system, buy a cellphone, navigate Visual Studio, and understand a letter from the apartment super about the water being off on Wednesday… but a memo about the recent accounting scandal in my prefecture might as well be written in Ancient Greek.  (At least I think it was about the accounting scandal… might have been someone’s favorite cookie recipe.)  Note only do I really, really hate it when I get a memo passed around the office and actually have to look at the individual words to understand the meaning (try to recall what it was like for you reading when you were 7 and had to sound out words like “dif, diffy, difficult — what does difficult mean, Mommy?”, now try imagine doing the same as a grown professional in real time with the boss standing over your shoulder), but it will greatly increase my chances that my next job will be one I really enjoy.

Anyhow, the JLPT comes in four flavors, level 4 (“I can order a beer”) through level 1 (“I can read Kirin’s annual shareholder guidance and scoff at their inadequate protection against currency fluctuations”).  Currently, I hold the level 2 certification (“I can tell a hostess that I can’t order a beer because a hereditary condition would make that potentially fatal”
).

Comments Off

Everything You Need To Know About Registration Systems

… but were afraid to ask.

One of the most common questions asked on the Business of Software board by a new aspiring uISV is “How do I protect my software?” This post is meant to be a comprehensive answer to that question, so folks can point to it and say “Alright, now get out of my hair!”. Kidding, kidding, we were all there once.

First, a brief discussion on why you want to protect your software. The only reason you want to protect your software is to enforce the limitations you have put on the trial version. Many people mistakenly come to the table with the assumption that protecting the software will somehow, magically, “protect my intellectual property” or something to that effect. This might be theoretically true but you will have an easier time conceptualizing your registration scheme if you think of it as primarily a marketing, rather than technical, measure. Its your salesman that encourages folks to pay you money.

Why is it important to remember your registration scheme is a salesman? Because salesmen do not typically kick their prospective customers where the sun doesn’t shine, and many registration schemes do. Aside from some clubs in Tokyo (and the less you know about them, the better, really), people generally don’t pay money for the privilege of being kicked. Yet many software developers keep including Nutcracker Suite protection systems, such as Starforce, which severely harm the user experience, out of the mistaken belief that this will eventually increase profits.

If you will permit be a bit of amateur psychoanalysis, I think this is because software developers in general, and uISVs in particular, feel violated when someone is using their software illegally. I know the feeling, it has happened to me (and, mark my words, it will happen to you). Someone who downloads your software and cracks it hasn’t cost you any more money than someone who picks your door and walks around your apartment for 20 minutes without touching anything, yet the feeling that your rights have been violated is the same. And perhaps in a fit of less-than-rational anger you might demand your apartment upgrade its security system to include dead-locks, pitbulls, a batallion of US Marines with shoot-to-kill-orders, and some cleverly disguised booby-traps involving acid or flaming oil, or perhaps just flaming acid. Of course, the local Girl Scout troop selling cookies will probably not react too well to the fortifications (aside from the “cute wittle puppy!”), so if you like having cookies delivered to your door this is probably not a good idea.

So lets talk about four classes of users and how they interact with your registration scheme.

The first type of user is perfectly honest and will always comply with your licensing scheme to the letter, even if ways to circumvent your registration scheme are obvious. Approximately everyone thinks they are this kind of user. To this kind of user, your registration scheme (a salesman for your software) can be only a hindrance in getting to use the software which he happily paid for.

The second type of user is mostly honest. He’s not a pirate, after all, he has a wife and kids and works at an insurance company. He scoffs at the kids on Napster who feel entitled to free music. And yet he also will happily buy one license of your software when your license tells him he really requires five, install and uninstall a time-limited trial version every two weeks, and perhaps even reset his system clock to get around a time limitation. But he won’t download a crack, no. A crack would be stealing, and stealing is wrong. This second type of user is where your protection (a salesman for your software!) will make most of his keep. How many of these users relative to totally honest users you have depends on your market, but sadly, they’re a lot more common than most non-developers would think.

The third type of user wants to use your software, but will pirate it given half the chance. Its too expensive, it doesn’t do quite what he needs, he doesn’t have the money, for-profit software development is evil, piracy is wrong but oh well… he has a lot of mental excuses. Some of this user group is very technically adept at finding cracks — they know what IRC channels to go to and what shady connections to excercize. Some of them rely on Google searches. You can potentially wheedle a small number of sales from this group with your protection scheme, and they’ll hate you for every minute of it.

The fourth type of user… “Do what you want ’cause a pirate is free, YOU ARE A PIRATE!” He flies the Jolly Roger and you will never, ever make a legitimate sale to him. Even if he does “buy” your software it will be with a stolen creditcard or chargebacked within 24 hours. You’ll find that there are countries on earth (*cough* China *cough*) where there are few users from any other type. Your protection system is not really relevant to this type of user, since he’ll be using the crack anyway.

Oh, yeah, lets talk about cracks a little bit. You. Will. Be. Cracked. I really strongly recommend you read that post, because its true: no protection scheme will survive indefinite contact with the adversary. Your goal in instituting a protection scheme is not to achieve 0 utilization of your software by the Jolly Rogers of the world. It is primarily to keep circumvention methods obscure enough that it will take dedicated effort to discover either a way around your software or find someone who has found a way around your software.

There are several varities of cracks which you have to worry about. We are now crossing into the technical portion of this article, and will be discussing implementation details rather than philosophy, so pay attention.

1) A single good key. The cracker discovers, either via a “legitimate” purchase or analyzing your code, one single good key, and publishes it. This is the least damaging type of crack, because you can just ban that key in further updates to your software, and because if you use keys which are tied to other user data it will prevent someone from using the good key without otherwise impersonating the user it is tied to.

2) Keygen, or “key generators”. You have one of these lying around on your PC or server which generates good keys for your software. The cracker’s goal is not to replicate your system, but instead write one which produces at least some subset of the keys your system will produce. Many crackers prefer to write keygens because they get a psychological thrill out of “beating” you, but to most user groups there is no difference between one download and another.

3) A patch/crack which strips off your protection. For example, if you leave in a debug mode (if (!debug) {checkRegistrationKey();} else {registered = true;}), all the patch has to do is modify your executable to flip the debug bit and then your software is locked into the registered version. Creating a patch requires that your executable be a stable binary, as if the offsets of the bits to flip change applying an old patch will be impossible.

4) A cracked executable. This is the cracker’s least favorite method, because then he has to spend non-trivial amounts of bandwidth hosting the executable, and since he wants to host literally tens of thousands of executables this is irksome to him. However, remember, bandwidth is cheap — this is a speed bump, not a security mechanism.

In general, it is to your advantage to force the adversary to use countermeasures which are higher up that list. This means that your protection scheme should:

1) Require user-specific data so that a single good registration key does not break your software everywhere. The most obvious choice is username, but this is not very secure. Other popular choices include hard drive serial numbers, MAC addresses, GUIDs, etc. Remember, this will inconvinience legitimate users — you will have users who spell their name differently on their Paypal accounts versus in your software (example: McKenzie != Mckenzie has gotten my mother a few times, Bob Smith versus Robert Smith), you will have users who expect (and are perhaps, depending on your license, entitled) to use the software both at work and at home, you will have users whose hard drive dies and your software will cease to work on the new one. All of these become support issues for you, because your salesman is busy trodding on the toes of people who have already given you money. Consider carefully how much pain you will authorize him to inflict. For myself, I thought the risk of a serial key leaking was less than the amount of difficulty I would have policing unique serials, so while I ask folks for their name to generate my keys they’ll actually work for any name you put in (Shh, don’t tell the crackers :) ).

2) Obfuscate your code. Especially if you are using an interpreted language, such as .NET or Java, decompilers exist which will print out your protection routines in their entirety. This was how my very first hacked in version 1.0 happened, and that resulted in a keygen (i.e. total tactical victory for the bad guys). I’ve since started using ProGuard, a lovely OSS utility which takes your nice, easily decompileable JAR file and returns gibberish which still executes. This plus a (partial, backwards compatible) fix for the earlier keygen has kept me from getting hit with another wave of me hearties from China, although I know of at least one functioning keygen out there — but its buried beyond the reach of my casual pirate customers, which is a total strategic victory for me. Obfuscation is nice in that unless you need reflection or debugging stack traces it can’t hurt a legitimate user.

3) Change binaries early and often . Frequently changing your binary, via any method you want (obfuscation utilities can often do this — so can minor patches to your code), forces pirates to either host the executable themselves or deal with “customer support” requests like “Waaaaaah your patch doesn’t work anymore lol”.

OK, now, finally, on to license key generation algorithms. Some design considerations:

1) Are you going to run this offline, or are you going to run this on a server?

2) How much information from your customer does the algorithm require? How are you going to get this? e.g. if you require their hard drive serial number, you suddenly add the requirement “Customers can only purchase my application through my application”, which may be less than desireable.
3) Are you going to roll your own, or use an off-the-shelf system like Armadillo? In general, you’re not paying for security (although its likely that their system is more secure than yours, its not totally secure), you’re paying for convinience. Armadillo has been broken before and will be broken again, like every other security system.

4) How do you get the registration key to the user? Do you want to display it on a website, display it on an email, or update the application directly (sometimes called “automatic key injection”? A lot of the payment processors (including e-Sellerate, as I recall) promote systems that have this as a feature. Its quite nice, as it reduces customer support headaches (what was my registration key? How do I input it again?), particularly with non-technical customers. I didn’t do this myself, primarily because it required more development effort than my schedule had time for.

OK, if you’re still with me, lets talk some strategies for key generation if you want to do it yourself.

1) Public key encryption. Basically, your registration key sends a message: “Bob Smith, I hereby give you the right to use my software, in exchange for the consideration you have given me”. The problem is that Jolly Roger wants to be able to forge the message and replace Bob Smith with Jolly Roger, thus bamboozling your program into functioning for him. Luckily, there is a solution to this: public key cryptography. Public key cryptography works like this: you have a pair of keys. One of them is public and you can give it out to everybody, including the adversary. One of them is private and you guard it with your life. Since your trial version will be in the hands of the adversary, the only thing the trial version can know is your public key.

Practically speaking, you first take the hash value of all the identifying information you have. Then, you encrypt this with your private key: the output of this encryption is your “registration key/serial number”. Your software then performs the same calculation of the hash value in parallel, and decrypts your serial number using your public key, which results in a hash value. If the two hash values match, you unlock the software. If not, you display a nicely worded message to contact support (remember, your protection mechanism is a salesman).

If you are interested in the math behind encryption, which gets kind of heady, Wikipedia has a nice article on RSA. I’ll give you my dirty little secret: I’ve got a very incomplete understanding of a lot of the number theory involved, and I don’t trust myself to implement encryption. Neither should you. Really, trust Bob Schneider, you’ll probably just end up breaking something. Instead, take the crypto library which comes with your package of choice, and USE IT. Look for “MD5 digest” or “message signing” in your documentation if you’re unfamiliar with the whole field and just want to be done, quickly.

2) Everything else. Any other mechanism is insecurity which you’re tolerating for the sake of preserving your time as a developer. With that in mind, for preventing casual piracy you don’t need to go as far as public key crypto, although I would oh-so-strongly suggest doing so. I ignored my own advice though, and did something similar to the following: take two random constants A and B, which are “secret” in the sense that you have to actually decompile my program to find them (“But Patrick, thats not very secret is it. After all, the program is in the hands of the adversary.” EXACTLY). if (serial ^ A) % B == 0, then the serial is good. Note this doesn’t allow for any use of identifying information, and was chosen totally because I could implement it in 30 seconds. If I did another product today, I would spend 30 minutes instead and use Java’s excellent crypto libraries. The weaknesses of my approach are obvious: with access to the code breaking it takes a matter of seconds, one serial number will work for any number of computers, etc etc. But it was sufficient to my purposes because my target customer has enough difficulty getting a legitimate version installed, to say nothing of navigating the dark corners of the Internet where the keygens flourish.

Where/when to check the serial number: I check once on startup. A lot of people say “Check in all sorts of places”, to make it harder for someone to crack by stripping out the check. If you want to be particularly nasty to the cracker, check in all sorts of places using inlined code (i.e. DON’T externalize it all into SerialNumberVerifier.class) and if at all possible make it multi-threaded and hard to recognize when it fails, too. But this just makes it harder to make the crack, not impossible, and remember your goal is generally not to defeat the cracker. Defeating the cracker does not make you an appreciable amount of money. You just need to defeat the casual user in most instances, and the casual user does not have access to a debugger nor know how to use one.

Alright, that about wraps it up. This article is a work in progress, so I might beef it up some more, perhaps with code samples or techniques to impose, e.g., time limitations. Someday. In the meanwhile, I hope you learned something.

[Edit: Yo ho, me hearties.  If ye be wantin’ to stick it to a pirate without having to program a thing, cast yer glass over this way.]

Comments Off

Yay, 1.04 Out The Door

Its actually going out right now (go go gadget Robosoft!  I love not having to submit to half a zillion places by myself)

New features of note:

  • Mac version (side note: make one PAD file for Windows, one for Mac.  It will make submitting with Robosoft a lot easier for you.  Trust me on this.)
  • Beautiful new look and feel courtesy of stock icons
  • Word wrap within cells
  • Font family and size are now selectable
  • Ability to center a single card on the page (Remember Sally?  She asked for this.  What Sally wants, Sally gets.)
  • A few minor bug fixes (all display related).

If you want to try out Bingo Card Creator 1.04 why don’t you mosey on over to my website or check your favorite download site over the next couple of days.

Comments Off

What Should Starbucks Do

I spotted this on Seth Godin’s blog.  Starbucks had an incredibly ill-conceived promotion where they mailed some fraction of their employees with an email coupon for a free iced drink, then told them to mail friends and family members.  Oh boy, a chain letter, no possible way that could get out of hand, right?  Well, it did, and as a result Starbucks canceled the promotion.

Seth opines that, were it his call, he would have notched the driver’s license of anyone who used the promotion and given them the free drink.  The business problem this solves is that it prevents someone from going to the 46 Starbucks within walking distance from, say, the Sears Tower and getting 46 free ice lattes or whatever it is Starbucks sells.  His rule #3 (“We never accept online promotions.  However, if you were scammed by one, have *a free premium which the company can give out almost at will*.”) is, in my opinion, a brilliant solution to this problem for a chain which doesn’t have it yet.  But it doesn’t help Starbucks since they can’t force the cat back into the bag.

Here’s my solution: for every customer who comes in asking for their free iced fraparamadingdong, tell them “We’re very sorry, that promotion has been abused so we have to ask you this: what’s your first name and the last four digits of your telephone number?”  Then make a show of writing it down, and give them the product.  The only purpose of this system is to keep honest men honest and to remind folks that there is no presumptive right to free Starbucks, the way that many college students have come to believe that there is a presumptive right to free music.  The information collected can’t be enough to make a person hesitate for fear of their privacy, but that plus the fact that it is recorded is just enough to make them remember “Oh, thats right, I’m being watched”.

Here’s the rationale: the impact of one scammer who realizes he can beat the system (and, if you think of it, there is no system to beat here) is one ice drink per store.  The stores are franchises so you basically evaluate the damage to their profits on an individual level, where 1 or a 100 ice drinks is pocket change (here’s the secret to Starbucks: no matter how much they charge you, making the drink didn’t cost more than 10 cents!).  The damage to the brand from having to put that sign up everywhere, on the other hand, is at literally many orders of magnitude above the individual store.

Comments Off

How NOT to do your license key checking

Proving once again that encryption/hashing by itself will not make your system secure.

Comments Off

August Numbers

First, a disclaimer: Due to my own lax recordkeeping, the issues with running a business with the International Date Line between me and most of my customers/suppliers, currency exchange issues, and other reasons, these numbers may be off by a little bit.  I’m sorry to give you analog accuracy in a digital world, but its the best I can do without spending too much time playing accountant.  And, after all, I have a release to finalize :)

There’s a recurring issue here: do I count expenses based on when they are charged or when they are incurred?  i.e. if I prepay for 3 months of GoDaddy, like I did, do I count that whole expense in August or spread it out?  Where possible, I’m going to divide out recurring costs over the length of the term.  While this means you can’t see my exact bank statement/cash flow, suffice it to say that it stays positive and thats all you really needed to know, right?

Sales:

Through Paypal: 13 (+1 return)

Through eSellerate: 1 (didn’t trust Paypal)

Gross sales:  $349.30

Net sales:  $333.54 (subtracted out payment processor charges: $1.02 for each Paypal, $2.50 for eSellerate)

Expenses:

Recurring expenses:

Web site hosting: $10 (Linux hosting + Traffic Facts through GoDaddy)

e-junkie (payment processing): $5

Yahoo Search Marketing: $30 (since canceled)

Google AdWords: $90

Subtotal recurring expenses: $135

One-time Expenses:

Stock icons from icons-icons.com: $29.95

RoboSoft Registration: $99

2 postcards to RoboSoft authors: $1.50 (the first got returned today due to my atrocious handwriting, so I have to resend one)

Allume’s Stuffit: $29.99 (thought I would need it for shipping Mac orders.  My mistake.  Whoops.  Ah well, I feel better about using their Stuffit Expander for the last 10 years now.)

Rentacoder port to Mac version: $40 ($25 bid + $15 tip)

Subtotal for one-time expenses: $200.44

Total expenses: $335.44

Profit: -$1.90 (Wahoo!)

Well, honestly, I thought I was going to post a minor paper profit.  Hmm, I guess thats why we write things down.  In terms of cash flow, as mentioned above, I am minorly positive, because this shows me booking about $50 of AdWords expenses many weeks ahead of being billed them (weeks in which I will, obviously, have additional sales).

If I knew earlier what I do now, I would have gotten the Mac thing done for free by an microISV contact, and not paid for the Stuffit registration.  Ahh well.  Small beer, in the opinion of somebody who can’t drink for fear of killing himself.

OK, back to the fun statistics:

I’m going to discontinue giving the Yahoo stats.  I just don’t find them credible after doing the auditing for the last month, which is the proximate cause of me discontinuing my subscription with them.  That plus the fact that I’ve finally succeeded in pushing my AdWords spending down to my target.

As with last month I have two AdGroups.  The first is pitching vocabulary bingo, the second Bingo Card Creator itself.  I’m going to show you the full monthly stat summary and also the last week’s stat summary so you can see an indication of how things are improving through periodically shifting bids, ad texts, and landing pages.  Unfortunately I can’t tell you exactly how effective they were at driving sales because I just realized the last time I touched my thanks-for-your-purchase page I borked the Javascript on it, costing me the last week work of data.  D’oh.

Incidentally, results for the vocabulary group are heavily depressed by the long experiment with that “give teachers free lists” thingee. It worked great for getting me inbound links but not so great from a conversion perspective (that one add has like a 10% CR and 20% CTR, costing me a lot of money for not a lot of gain.  Basically it ended up being $30 given to charity for PR value.)

This Month / This Week:

Vocabulary Bingo:

Impressions: 27,000

CTR: 2.54%

Avg. Position: 2.7
CR: 16.86%

CPA: $.34

Bingo Card Creator:

Impressions: 7,700

CTR: 5.80%

Avg. Position: 2.0

CR: 22.76%

CPA: $.45

 

Although you can’t tell it from the whole month’s stats at a glance, recently I have made my $.30 a download target.  Yay me.  The secret: continuous improvement of ad texts and landing pages, plus a recent ruthless culling of every keyword which wasn’t performing well enough to justify keeping.

Alright, how about some website stats:

Visits: 4,175

Trial downloads (from site):670

Trial downloads (download sites which hotlink, so they show up in server logs — this is a guesttimate at best due to the cruddiness of my logging): 500

Confirmed trial downloads (someone selected a link within the application): 100

Download.com trial downloads: 150

Major sources of hits (trial demo CR in % following):

Google CPC:1,000 (21.6%)

This blog:  894 (5.7%) — N.B. I was Slashdotted once, which accounts for most of them.

Google Organic: 587 (16.18%)

Microsoft Organic: 526 (17.3%)

Single Post On Teacher Bulletin Board: 150 (27%) — I love my adoring fans.

Major Download Sites:

Download.com: 130

AllApp: 40

SurfPack: 40

FreeDownloadCenter: 25* (also sent a good deal of traffic directly to site — in the hundreds)

FreeDownloadManager: 25

Incidentally, the next 40 download sites on the list sum to about 60% of the total of these.  Yep, Long Tail in action.

Comments Off

How much content does your website have?

Sometimes I visit uISV websites which are very minimalist: they have about 5 pages total.  One page about the product, one for ordering, one for support, one about the company, etc.  My website isn’t exactly a monster (probably on the order of 25 pages at the moment), but I have significantly more content than websites organized like this.  And it makes me probably $50 a week, which is not a bad return for writing a few extra pages about elementary school bingo variants.

Why do these free articles and free resources make me $50 a month?  Because they bring in traffic and, more importantly, they bring in my niche on generic search engine terms.  I currently do obscenely well on MSN and Google in terms of organic search traffic, and the overwhelming majority of it is for Long Tail queries which you just won’t get if you don’t have the content to justify it.

For example, I wrote about 200 words on one of my pages about icebreaker bingo.  That content was picked up by 12 searchers in the last seven days and generated 4 downloads.  Four downloads is worth in excess of a dollar to me (at my current CPC prices, about $1.20 actually), and that content keeps paying me a dollar week after week.  (Yeah, minor niggle: if folks never buy, then its not really worth a dollar.  But they do.  I got two sales this week from customers who came in from organic search traffic.)  However, without the search engine being told a couple of times that icebreaker bingo is a use case for Bingo Card Creator, it won’t infer it on its own.  Which is why programs which trounce me on the search engine rankings for generic queries like “Bingo Card Creator” (grr, Google, how long until I can be the #1 result for the name of my company?!) show up exactly nowhere.

Another thing content does is that it performs SEO for keywords you haven’t thought of yet.  In the last 7 days, I got approximately 400 hits and 80 downloads from organic Google and MSN.  The most common search term there was Bingo Card Creator, with approximately 5% of the total queries.  The rest were, in general, a veritable deluge of once-in-a-lifetime queries… the kind that natural English snaps up like hotcakes and all the SEO in the world won’t get you.  You know, queries like “free download word bingo literacy” (sidenote: she evidentally cared a lot more about “word bingo literacy” than “free”) or “dolch preprimer home cards”.  (Quick comparison: I also spent approximately $20 for 260 hits and 50 downloads from AdWords.  Which has not generated a sale yet this week, I think.  D’oh.)
Content also has a nice property called linkability.  Very few people are going to say “Wow, check out this trial demo download” (if they do about your software, mazeltov, you are going to be rich like a king).  However, if you put up, say, a page about how to use bingo to assess reading difficulties, teachers will swap it via email, link it on their blogs, and chat about it around the water cooler.   Which brings in more eyeballs, more PageRank, and more downloads.  Yay, a positive cycle.  Plus you’re providing a service of use to people and thats always a good thing, even if they don’t end up buying from you.

A suggestion, though, since you do want to encourage people to eventually buy from you: aside from the obvious Download Free Trial link that you should have on every page of your website, have the text of your content plug your product wherever it is natural to do so.  If its not natural to do so, maybe you should be writing different content.  I like plugging Bingo Card Creator once early in the text (“If you don’t have a set of bingo cards, you can generate one in seconds with the free trial of Bingo Card Creator”) and then once after the end (“Looking to do something else with sight word bingo?  Why don’t you make yourself some cards with the free trial of Bingo Card Creator”).

So, if you’ve got a website which looks spartan at the moment, consider sprucing it up with some content of use to your target user.  More of them will come visit your page, and hopefully some of them will stick around to see what you have to offer.  (And remember, serving pages is essentially free at the margin.  For the 80% of folks who visit my Dolch sight word lists and leave without viewing another page on my website I pay, well, absolutely nothing.)

Comments Off

Feature Creep!

A customer convinced me to throw another one on the barbie, as it were.  Here’s whats coming in version 1.04.

  • A fresh new look (stock icons and changing the preview card to more accurately reflect the actual printed card).
  • Choice of fonts.
  • Choice of word wrap (or not).
  • Choice of where to position the printed card on the page (not sure this will make it in).
  • Printing calling cards.
  • Column headings (Doubtful that this will make it in in time but we’ll see.)
  • Card titles (Doubtful that this will make it in in time but we’ll see.)
  • Some minor improvements under the hood.

One of the features on this list took 4 solid hours to implement.  Another took 5 minutes.  Any guesses which was which?

Comments Off

Another Hosted Services Success Story

Sorry, just nearly had a laughing fit at work:

There is a recent fad for Japanese schoolgirls to send each other messages in basically Japanese schoolgirld l33tsp34k.  The problem is that, despite this being very trendy, its very annoying difficult to do well on a cellphone.  Enter a web service which, if you send it a mail, will l33tify it for your friend without having to do any work.  They then charge your phone bill about 5 cents.  (Figure on 2 cents going to the phone company, incidentally).

Sounds like a complete waste of time, right?  Yeah, probably… unless you process 20 million messages a month.  Which apparently one of these companies is doing.  For a service which is, approximately, a 15 line Perl script and a 100 line Japanese-to-gibberish table of rules.

I was *particularly* impressed by the for-pay option to decrypt what your friend was trying to say to you in case you were in no mood to parse it yourself.

Comments Off

Porting to Mac OS X

Roughly a month and a half after I first, foolishly, promised to have an OS X version of Bingo Card Creator, I’m actually close to releasing one.  Two major factors propelled me towards this:

I have one extremely dedicated customer who absolutely had to have Bingo Card Creator to teach her son reading.  She asked me whether I would have the Mac version done soon and I told her “Well, I certainly hope so”.  And then she went ahead and bought it, sight unseen.  I tried to refund her money because I can’t take money for a product which doesn’t officially exist yet but she would have none of it, so I quickly cobbled together a distribution which would work on a Mac (which basically meant zipping up my install directory and including instructions on how to double-click a JAR file) and rushed it out to her.  Apparently it worked pretty well, aside from a few niggles (not being associated with the file types it creates — the Windows version isn’t, either, as thats been somewhat low on the totem pole), and she sends me updates on how her son is loving reading and math nowadays.

So, given that I’m about to release v1.04, I thought it was as good a time as any to officially roll out the Mac version.  This is problematic because I wanted Bingo Card Creator to function as a native program does (i.e. no “find the coffee cup icon, then double click!” business).  I could accomplish that in about an hour of research and tinkering with the Mac Java SDK but, whoops, no Mac to actually use.  So I decided to outsource.

Enter RentACoder.  I offered the project up at $25 to port Bingo Card Creator (where “port” means “spend five minutes creating a native wrapper”).  It got accepted by somebody in Western Europe (I was sure it was going to be Eastern Europe or India at that price, as even if it is 10 minutes of work its not enough money to wake a programmer up in the West), and he’s busily working on it now.  He even managed to figure out how to do it such that I can do the update from v1.04 to 1.05, etc, on a Windows PC, which is great because it saves me money having to request the same service again (and will earn him a bonus).

Is there a market for Bingo Card Creator on the Mac?  Well, even if there wasn’t, I’ve got one customer who bought it already and so I’m rather committed. :)  Roughly 2% of my site’s visitors are using Macs, and every once in a (long) while I get a Mac specific search string.  I know a good portion of teachers and parents use Macs, although I suspect their share in that market is falling over time, so we’ll see if it generates any significant amount of sales.

Side note: Number of lines of codes changed for the Mac version?  Erm, zero.  I like being a Java Success Story (TM).  I will need to change my download page, though — probably use Javascript to detect whether its a Mac or PC and then redirect to the distribution as appropriate.

Version 1.04 is otherwise humming along.  I’ve got roughly 3 of my 5 slated features completed, and added 3 word lists (US presidents, states, and state capitals).  If anybody has suggestions for more word lists which aren’t math related (thats features 4 and 5), feel free to post them in the comments or drop me a line.  I’m thinking of including about 10 new ones concentrated outside of math/reading since my program should have those two fairly well covered.

Comments Off