Archive by Author

Inno Setup + Excelsior JET = Slice MBs Off Download

If you’ve been following the blog recently you know I’m running a split test on a self-contained executable (made with Excelsior JET) versus my standard wrapped JAR (made with Launch4j, requires Java installed).  The idea is to see whether the tradeoff of vastly increased download size of the native version makes up for eliminating the Java dependency.  Launch4j will prompt people to download Java if they don’t have a sufficient version installed, but that is one of those decision points where people might stop using the app.

Previously, the approximate size difference was 13 MB versus about 1 MB.  However, with a little help from Dmitry over at Excelsior, I was able to shave 4.5 MB off of the installer for the native version.  Here’s what I did:

1)  Used the detached package option, described at “Java Runtime Slim-Down” in the User’s Guide. 

2)  I removed all of the packages which were given the green light to remove — this included Cobra, Management, XML, and all that enterprise-y cruft for my application.  Packages which get the green light are always safe to nix.

3)  Then I made a judgement call about packages which got the red light.  Red light means they’re referenced in some code included in your program but, importantly, if they’re never actually loaded you’re in the clear.  I was pretty sure I could nix the JSound and RMI packages, as I don’t use either and I have a very good idea of what my 3rd party libraries needed (certainly not access to the sound card).  

The JET packager thing gives you a test option so that you can actually run through your program and see if you end up needing the detached packages.  If you do, they’re downloaded at need from your website (you get to upload them yourself).  I would strongly prefer avoiding that, so I stepped through all my functionality to make sure it didn’t fire a download.

4)  I used the “deploy as a self-contained folder” option, which let me copy/paste BingoCardCreator.exe and the rt/ folder produced by JET and move them into my folder for InnoSetup to take a stab at.

5)  I used the same InnoSetup script I use for the regular (Java-using version), making sure to modify it so that the rt/ directory was included in the installer and removed by the uninstaller.  This worked fine, functionally, but 13 MBs is a lot.

6)  Dmitry got in touch with me and told me that they have a tool which compresses a particular JAR file that the JET deployment comes with, much much more efficiently than the ZIP algorithm can compress it.  So if you fire that tool once on your system, and then once at install time (to uncompress it), you can save quite a bit of space.  So I packed up the JAR on my system, and then edited my InnoSetup script to call the unpacker right before exiting setup.  Easy peasy.  I can barely tell the difference in install times, but slimming the download 4 MB is easily worth it.

 

How To Pack The Jar (assuming you detached packages): 

cd C:\some\path\to\distribution\directory\rt\lib

c:\jet\directory\goes\here\profile{use tab complete}\jre\bin\pack200 -g rt-0.jar.pack rt-0.jar

As long as we’re at it, you can take a gander at my Inno Setup script if you want.  It is no great shakes but it might help you if you want an example of the whole picture at once.  Feel free to create derivatives from it if that saves you time.  (You’ll note that it is optimized largely to remove as many screens from the installer as I possibly can — no asking where to install, no asking whether to deposit shortcuts or not, etc.  I have non-technical users and don’t want to fatigue them with decisions that they’re largely not qualified to make anyway.)

Bug squashed

Well, after hours of fruitlessly trying to solve the problem in some clean way, I eventually dirty hacked my way around it.  Ironically, the “clean” solution required touching six files, the “diry” solution required touching 2 lines.  I don’t like it from a logical perspective but the extra burden it imposes on customers is minimal and would require them to have non-default settings to even notice, so I guess that is survivable.  (I also checked and out of 560 word lists it affects only 8 of them.)

I think I’ll chalk this one up to “Eh, sometimes you just have to ship it.”

Now to pay my penance for slackadaisical testing earlier: new CDs for six people, who each got one with the bug on it.

Things I Would Prefer Not Discovering At 1:30 AM

I just had my uISV nightmare happen:

If you combine the following two conditions:

  • You have a free space
  • You have exactly as many words as are needed for the card (i.e. 24 for a 5×5 with 1 free space)

and you try to print, the printing thread crashes silently, due to an ArrayIndexOutOfBoundsException.  This shows up to the user as the program simply ignoring the print command.

This is about the worst thing that could happen to me at 1:30 in the morning, short of a crash bug.  Without the capability to print, the application is useless.  Printing is always the thing I spend the most time testing, but I typically test by loading up Wizards and when picking randomly.  I rarely get one that has exactly twenty-four words in it.  

Unfortunately, that behavior (filling the card exactly) is really common in actual use.  Blech.  Memo to self: need to start using JUnit before I touch anything in the bowels of the printing code ever again.

I tried fruitlessly to fix it, but there is little that can be done at 3 AM.  Thank God for Capistrano.  The whole shebang of my website, including the executables, can be rolled back to a known good version at the touch of a button.  And, while it is annoying as all heck, I had to push the button — the 2.5 executable is just an accident waiting to happen for anyone who downloads it, so I need to contain that and get to work on fixing it.

Memo to self: get ready to FedEx replacements to all four people who got CDs with 2.5 on it, and write passle of apologies to anyone who downloaded the trial in the last 24 hours.

Problem Solving At My Job and My Business

One of my customers just got in touch with me to express their dissatisfaction with my Mac support, in particular how long it took me between updates, and asked when I was planning to release an update and if not how quickly I could have their money back.

Three thoughts went through my head:

  1. Happily, I just released a new version and am putting out the inevitable minor brushfires to prove it.
  2. Oh well, its perfectly reasonable that he hasn’t heard about the update yet, its only been out for 20 hours.  And my last major addition to the software  was almost a year ago.
  3. My Mac support is, compared with my PC support, rather lackluster.  I don’t own a Mac, I have to rely on my blog readers to pull me out of the bacon for it, and while I think I’m probably the best bingo card creator on the platform I have plenty of room for improvement.

Then I looked up his registration details, because I was giving him instructions on how to install an update and I always read people their Registration Key when I tell them to install anything (just in case — shouldn’t be needed).  

Now, if you open up my Rails console and type in Customer.find_by_any_identifying_information(“whatever”), which I used instead of the web version (I had a shell open and am lazy like a fox), you get back an array of records.  Which, in Rails, includes all the fields in each record — including timestamps on when the record was created.  This customer’s timestamp was from March, 2008.  

Wow, that is an interesting take on the 30-day guarantee, I though.  Then I remembered, wait, I only started tracking these things in Rails back in March… which means his record might have been one of the ones created when I loaded the database with all my previous transaction records.

So I typed “customer.sale.time”, which gets the actual time of the sale rather than the time the record was written to the DB.

Tue Dec 26 04:27:28 UTC 2006

Wowza.  I really had not been expecting that one.  And then banged out  the following:

Hello $NAME.  You might be interested in knowing that I released version 2.5 of Bingo Card Creator for both the Mac and PC yesterday.  It includes approximately 500 word lists and a few new features that people have requested.

You can upgrade to it by going to http://www.bingocardcreator.com and …

Please tell me if you’re not satisfied with the new version.  I wouldn’t want to keep your money unless you’re happy.

One minor brushfire put out, two more to go.  Though it may seem unlikely in light of the instant circumstances, I mean it when I say it: I love this job.  In comparison with my day job, which is generally a pretty nice place to work don’t get me wrong, I have the absolute right to change anything I want to solve problems for myself and the customer, and oh is that intoxicating.  

It is particularly intoxicating after having to fight for authority to schedule myself to write design documentation in English to hand over to one of our outsourcing teams.  “Your time is too valuable to use on translation” is a lovely thing to hear, but I’m closer to the opinion that my time is too valuable to spend the next 6 months dealing with code that is totally orthogonal to the customer’s actual needs.  

This was richly demonstrated when, following the traditional “figure out what the designed behavior of the system is by pushing buttons and seeing what happens” documentation method, our outsourcing team filed a bug about the system being configured improperly, because they attempted to login with the credentials which we provided (after a week of laboriously setting up a copy of the system — without reference to English documentation, mind you) caused them to see a screen full of red text.

This resulted in my most amusing conversation ever about designed behavior:

“Are you seeing the error message above or below the weather report?”

“Why is the login screen showing a weather report?  That is probably a bug, too.”

“No, the weather report is not a bug.  If you flag an announcement with announcement_type = 5, then it shows up in big red text on the login screen.”

“That is the error message!  The big red text!”

“Oh, then this is expected behavior for the system.  The administrator has chosen to share it with the users, and it is in the test data and being displayed appropriately.”

“But why is it in huge red letters?!”

“Because the weather report reads

Typhoon Warning

 Closing this bug as ‘by design’.”

Bingo Card Creator 2.5 Released!

Thanks much for all the help guys.  After several days of plugging away at outstanding little niggles I think both the PC and Mac versions are in a releasable state — and particularly with regards to the Mac folks in the audience, I couldn’t have done it without you.

I’m pumped about seeing my results in the coming months — with 400+ new cards, improved functionality (including one of my most-requested features), and general improvements, I think this could quite possibly kick me up another notch or three.  I’m also interested in seeing whether natively compiled .exes beat Java-requiring versions in a head to head test.

If you want to go to http://www.bingocardcreator.com and check to make sure I haven’t done anything stupid for your system, I would be obliged.  Here is an example of something stupid: four days ago, I used svn update to upload a  controller (the C in “MVC framework”) file to my site to fix a bug on one of my sidebars.  I neglected to notice that the same controller also implemented the split test for windows downloaders, which broke downloading the free trial for 4 days.  Argh.  Oh well, no sense crying over spilled milk.

I also went ahead and did something I’ve been threatening for a long time now: raised prices.  Or, rather, announced that I will be raising prices in about a month.  We’ll see how that works out.  And, as always, I’ll keep you posted.

Now after 14 hours of day job and pushing out a release in the same day I richly deserve a nice warm shower and a few minutes of the new Naruto game before bedtime.  (It’s awesome.)  Good night!

Quick (Final) Request For Beta Testers

Hideho everybody.   Thanks for the help with the beta testing.  This is a quick list of the issues that were reported and which I have confirmed fixed.  I’d be obliged if Mac users could try executing the app again and see if the permissions got kept by the zip file this time.  If Windows users want to kick in any comments, I’m always obliged.

Windows version (requires Java 1.4+ installed)

Windows version (native — doesn’t require Java)

Mac version (shouldn’t require anything you don’t have)

  • Purpose of plus/minus buttons is unclear.  Rewrote description of functionality on main page of app.  (Both buttons were already mentioned, but if you guys didn’t see it that is my fault.)
  • Two included bingo cards, written in Spanish and Japanese, could not be loaded properly.  Fixed.
  • Mac menu bar does not appear where Mac users expect it to be.  I believe this to be fixed.
  • Windows resize when wizards are selected.  I appreciate the feedback, but this is by design.
  • Resizing the window such that the sample card is not totally visible, then resizing it again, causes text on the sample card labels.  This is related to the Swing library’s implementation.  I will study the feasibility of fixing it later, but at the moment it is a cosmetic issue which is easily recovered from and happens only in edge cases.
  • Changing word wrap causes the sample card to shuffle.  I appreciate the feedback, but this behavior is by design.
  • Mac users do not expect to use the Ctrl key, but the program does.  I believe this to be fixed.  
  • Mac users do not expect mnemonics.  I’m sort of loathe to remove functionality, particularly functionality that a few hundred paying customers may be using already.  I’m not exactly a Mac UI partisan and most of my users aren’t, either, so I’m going to put off changing this one.
  • “Upgrade to full version now?” dialog is wider than my screen.    Fixed.
  • The text in the Advice frame is selectable with the mouse.  Hard to fix due to Java implementation of text boxes, no impact on customers, postponing until I am very bored.
  • Small screen + extraordinarily long words on card (e.g. names of famous plays) = card extends off screen.  Low impact and rare circumstances, but I will address this eventually.
  • Save/Open defaults to application folder, should be elsewhere.  Suboptimal but kept for backwards compatibility.  You may be interested in knowing that applications can write to Program Files in Vista.  Really, try it — MS hacked around their own security system to avoid breaking legacy apps.

nota bene to Ant users: the zip tasks discards permissions.  If you need them to come out intact, you need to put the files requiring extra permissions in <zipfileset filemode=”755″> blocks.  In particular, if you are zipping a distribution which includes a jar wrapped up as a Mac application, the JavaApplicationStub file needs to be marked as filemode=”755″.  Much love to the testers that discovered this before my users did.

Head Slapper of an Oversight

So for the last several years, I’ve had a free trial which generated the majority of my sales.  The free trial includes the following three restrictions:

  1. It can’t import text files (except the free cards provided by me).
  2. It can’t save files.
  3. It can’t print more than 15 cards.

New in BCC 2.5, which should be out in the next few days, I’m adding a new difference between the free trial and the registered version: the registered version entitles you to automatically download new bingo cards as I release them.

So that’s the background.  What is the oversight?  I have, for a long time, tracked whether people get to my purchasing page via coming from the trial or not — but I have never tracked from where in the trial.  It could be because they hit the Purchase Now button, or it could be at one of the prompts which pops up every time they hit one of the restrictions.  It would be very, very helpful for me to know which of those restrictions are most effective at driving the sales… but I never thought of tracking it before, at least not enough to spend the 8 minutes it took me to add that in.

Do you know what drives people to upgrade from your trial?

Could Use A Bit Of Beta Testing Again

Hideho everybody.  After a week of being truly swamped at work I’ve managed to get back to my computer and, hopefully, fixed the errors that borked the Mac and (native) Windows builds last time.  If you could take a moment and confirm that they run as expected, that would be great.

The easiest way to check is to install the program, run, select any Wizard, and then print one bingo card.  If everything works, great.

With particular regards to the Mac version: I’m in the very unenviable position of having to release Mac software without a) having touched a Mac in 10 years and b) without having access to a Mac to test on.  That fact that this is even possible is near miraculous (yay for Java), but if you notice any niggles (window opens at wrong place, etc) I’d love to hear of them from you prior to hearing of them from my customers.

Windows version (requires Java 1.3+ installed)

Windows version (native — doesn’t require Java — and a honking 13 MB install means that this time I actually included the right stuff!)

Mac version (shouldn’t require anything you don’t have)

 

What is new:

1)  Windows version only: shell integration with .BCF files (finally!)

2)  A few improvements under the hood  (“write once, debug everywhere” oriented)

3)  Everything from previous post

Bingo Card Creator 2.5 Coming Soon

On Friday a customer reported a bug with UTF-8 files, which had creeped in literally months ago.  Since that was blocking her from getting work done I had a fire lit under my behind this weekend, and spent all three days of it coding like mad.  And wow, I was more productive than I’ve ever been in my life:

  • It is now possible to put words under consistent columns, a common user request.  Previously it you were playing, say, US States bingo, Alabama could appear under any one of the five columns, which in my professional opinion is better as a teaching tool in most cases.  But some of my customers had less proficient readers (younger kids and ESL students, etc) so they want to only have them search a single column — thus, you should be able to call “Alabama — its under the B!”  Which took a bit of effort to accomplish.
  • The Wizards menu got totally reworked.  I’m psyched about this improvement, because it includes my best 200 lines of code ever in terms of cleverness and it produces massive value to my customers and I.  Previously BCC shipped with a few dozen word lists, so as to not overwhelm the user looking at the Wizards menu.  However, I’ve paid for 507 (and counting) lists to be written, so why not ship them all?  However, just splitting them into categories just doesn’t cut it when you have 60+ categories, and I didn’t want to have to change my website’s architecture just to support subcategorization.  So instead I made some pretty nifty, configurable logic which conglomerates categories together and then automatically decides whether they need to be further aggregated into subdirectories or not.  Hopefully this will make the Wizards menu easier to use and increase the perceived value of the program.
  • I’ve improved the updating functionality.  Previously I forced users to do a reinstall to get new word lists from me, which is a) inefficient in terms of my time (I have to keep making new builds) and b) total overkill.  So I incorporated the ability for the program to connect to my website and collect new lists by itself, as needed, after my freelance writers have written them.  Tada!  Double the bang for the buck out of money I was spending on marketing anyhow.  Plus now I am able to sell updates to the word lists — currently I’m just using that as a bullet point for the $25 program but I think I might eventually charge folks something nominal ($10 a year or so) for updates.  
  • Shamelessly stolen from inspired by my friends at Skybound, who make the best visual CSS editor on the planet: if you copy/paste your Registration Key at any time when you have the Enter Registration Key menu open, even if you’ve got it copied with a lot of other things, the program will register itself.  This lets me give simpler directions and cuts down on errors in users fumble-fingering registration keys.
  • A fairly uncommon request finished at last — you can actually type in the number of cards wanted on the print page, rather than selecting it with that scrolling control.  (Finally I join the 1960s of user interface design.)
  • Bug fix for saving and then loading UTF-8 files.
  • Native version in the works.  The folks at Excelsior got in contact with me and asked if I’d be interested in doing a case study with them to see whether eliminating the dependency on Java increases sales.  I’m always willing to  do an A/B test in the service of making me money, and if it helps them out so much the better.

If you’re interested in being a beta tester I’d appreciate the help — test if you can actually open the sucker up and print a bingo card from a Wizard, that excercises almost everything except the update feature:

Windows version (requires Java 1.3+ installed)

Windows version (native — doesn’t require Java)

Mac version (shouldn’t require anything you don’t have)

Football Bingo… Who Knew?

I’m kind of scratching my head at this one so if anyone has any insight, please, I’d love to hear it: several hundred people have started downloading Football Bingo all of a sudden.  Not that I mind, of course, but I can’t square it with what I know about my target users.  I can’t seem to find any inlinks that would account for the traffic, either — like when a Jane Austen fan found my page and her readers went gaga for it.  It seems to just be organic search traffic, and a whole mess of it.

I only noticed this because I’m writing one of my longer, “evergreen content” pieces on the nature of the Long Tail (and how to extract money from it) and I’ve been chasing down some of the anomalies in my data.