Amusing Mac Java Niggles and Incompatibilities

Three things to not do the next time you release Java software on a Mac:

  1. Use ./ to refer to the current directory. On Windows, this will refer to the current directory the JAR is on. On Mac, it will refer to a directory internal to the JAR. Since you can’t actually access that, it appears to default to system root. (!?) If, on the other hand, you refer to the directory as . you introduce other problems which I can’t quite recall at the moment (memo to self: “//don’t use . here, causes problems” is not a maximally useful comment).
  2. Exercise caution with using javax.print.PrintServiceLookup. On a Windows machine, you are guaranteed that the default printer will be equivalent (.equals) to one of the printers returned on that list. This might lead you to write code which, for example, pre-selected the default printer from a drop-down list of printers. On a Mac, you are not guaranteed that the default printer will be equivalent to one of the printers on the available printer list. Which means, if you were careless like me and assumed that the default printer was on that list if the default printer wasn’t null, you will have your GUI thread choke and die with an index out of bounds error thrown by the list component. I’m going to recode my default printer selection logic to use least-distance string comparison to get around this little feature.
  3. Fail to test code known to be good. This burned me badly. In a Java application, as opposed to a trivial Hello World program or CS assignment, you’re going to be heavily reliant on the Java libraries working as advertised. As you can see from above, sometimes they have quirks in them. Seemingly innocuous changes to one part of your code can have a ripple effect causing the libraries to break assumptions you have made in other parts of your code, resulting in potential showstoppers. Example: I changed *nothing* about the internal printing logic in 1.05, and just changed the printer used from hardcoding it as the default printer to giving users a choice of other printers as well. Swing is a known good component, the default printer is a known good component, and the printer enumeration methods are known good… but the combination of the three introduced a showstopper on the Mac.
Comments Off

Write Once, Debug Everywhere…

Just when I think its safe to push out a new version I find that the Mac code has been severely compromised somehow and minor features like saving, printing, and displaying no longer work.  Gaaaaaaaaaaaaaaaaarglefraster.  To make matters worse it resulted in a customer needing a refund (annoying a day’s worth of prospects is bad enough — annoying people who pay money for software they haven’t even downloaded yet, thats like kicking yourself firmly in the teeth).  I’ve reverted the Mac version and PAD file on my website and hope to work soon, hopefully by tomorrow.  A big thanks to Andrey for the help in chasing down this problem.

Comments Off

5 things you don't know about me

Andrey started this meme, or more precisely brought it into the uISV/BoS community, and I rather like it.  (Suggestion for next time: name three people you’d like to answer and tag them via trackbacks.  The combination of trackback plus attention leads it to go viral quickly.  It certainly worked in the MMORPG blogosphere, at any rate.)  In particular, his post justifying it on BoS rather speaks to me.  Professional relationships are about more than just accumulating Google juice and career advancement… not that those are bad things!

Alright, five things you know/don’t know about me:

You know: I live in Japan.

You don’t know: I hate Tokyo, with a burning passion in my soul.  I would rather live in Baghdad than Tokyo.  The city is too big (it REDEFINES “too big”), the pace of life is too fast, the cocoon of anonymity (which it even worse if you are a foreigner) makes the isolation people feel on moving to New York pale in comparison.  Every time I go to Tokyo for a business trip I feel depressed even before I make it out of the train station.

You know: I used to work as an order entry operator and English teacher.

You don’t know: I’ve held at least 16 different positions in my young life.  That was the count four years ago, anyhow, and I haven’t updated it since then.  My current day job I have been with almost three years, which is an eternity for me.  Oddly enough, all but one of my jobs ended with my employer and I parting on amicable terms.  That one ended up with a 20 lb weight thrown at my head.  Ask me about that story sometime, its far enough in the past where I can laugh about it.

You know: I do work as a translator/interpreter when needed in addition to consulting and engineering duties.

You don’t know: My single biggest professional failing is that I am a functional illiterate at the Japanese language.  I could translate this post into Japanese without difficulty, given sufficient time and access to a computerized dictionary.  I could not do it by hand without sounding like a slow third grader.  My reading comprehension ability is similarly probably somewhere near that of a Japanese middle schooler, with the wrinkle that I can read oodles of technical jargon and understand most of the Japanese Constitution but would have difficulty deciphering the directions for making a box of Mac and Cheese.  This situation is only gradually improving, since my job only rarely requires me to write and I generally only read documents which are already in my sphere of competence.

You know: I used to play World of Warcraft.

You don’t know: I helped found a guild and put in upwards of 20 hours a week for almost a 2 year period.  I had a reevaluation of priorities which happened right before I founded Bingo Card Creator.  One of my major instigations for doing so was I suddenly had so much free time and nothing I could really sink my teeth into in terms of intellectual problems.  (People who think videogames are mindless entertainment which teach no valuable skills have never attempted to create an equitable DKP system.)

You know: I love fantasy books.  (Well, OK, you could know that if you read my paen to Harry Potter on my product site.)

You don’t know: I was a rather freakish kid back in middle school (before and afterwards, too, although I feel as if I am losing my touch in my old age).  One of the reasons was that I memorized the entire Hobbit, word for word… without intending to.  I didn’t realize this was strange until about sixth grade, when we were doing factual identification questions from the reading during class and I answered them with paragraph-length quotations from memory.  My teacher went all googley-eyed and asked “So what happened next?”, and rather than paraphrasing I repeated the next paragraph.  He then had me recite the rest of the chapter.  (The book was Dragonwings, incidentally, dealing with a white girl, a Chinese boy, and the Boxer rebellion… and flying on a glider.  Sort of mystical realism if I remember correctly.  As I type this snippets of dialogue are floating through my head.)  Anyhow, I don’t have comprehensive recall anymore (and never had for anything other than written words, song lyrics, and anything said to me by a girl I was interested in — I forget names within 45 seconds of hearing them if I don’t repeat them under my breath, for example), but I still love my fantasy books.  (Incidentally: I’m totally incapable of this in Japanese — I’m lucky to be able to keep six words straight or remember a character for more than two minutes.  Let me tell you, that transition bites.)

You know: I enjoy writing.

You don’t know: I once had dreams of becoming a newspaper columnist (my father tells me my very first “what I want to be when I grow up” answer was the Commissioner of Weights and Measures.  I have the vaguest inkling of a memory of voicing this).  I tried it for a while, actually.  The pay is lousy, the deadlines are irksome, editors are a bear to deal with, and the death threats I got caused needless distress for my family, so I found greener pastures.

Comments Off

I'm A Slave To You (Google)

I’m a fan of Google.  Not a fanboy, per se, they can certainly do things poorly (see most of their products which aren’t search- or advertising-driven) and I wouldn’t buy the stock anywhere near where it is right now.  But as a business owner, they’re very useful to me.  I use Analytics to do my analysis of how my changes to the webpage are working, Sitemaps to make sure I’m doing decently on Google searches, AdWords to generate about 10% of my traffic and sales, and Checkout is getting a solid 50% of my customers since I rolled it out.  So that is pretty good.

What isn’t so good?  Well, to be perfectly candid, I’m dependent on Google.   Google properties send me 65% of my web traffic and account for over half of my sales.  That percentage is going up since Microsoft recently tweaked their algorithms and sent my ranking down for many of my most valuable search terms on MSN.  If Google ever tweaks their algorithms in a similar fashion, I’m 31 flavors of screwed.

So where does this leave me?  Fortunately, it leaves me with a day job.  Bingo Card Creator could close up shop tomorrow night and while I’d regret it I’d still be able to pay the rent, buy food, and save for retirement (although less than I am now).  But the idea of having my business at the mercy of one player who is not me is rather disconcerting, and since I have eventual dreams of having my business(es) be my day job, I have to figure out a solution for this.

Some options:

Diversify CPC providers.  I’ve been planning on getting AdCenter up for a while now, might as well start that this weekend if I have a few hours free.  I tried YSM (Yahoo Search Marketing) before their recent update and the experience was beyond terrible — anyone know if they’ve improved?

Have backup plans.   In the event of catastrophic failure at Google Checkout I can be recovered in under 45 seconds, because switching to 100% Paypal would take me 5 seconds in e-junkie’s control panel.  (In the event of a catastrophic failure at e-junkie… I’m probably borked.  I have a script set up to deploy an eSellerate-based website at the touch of a button, but I’d really hate to be in that position.)

Improve Yahoo/MSN’s search marketshare.  Oh, wait, thats not an option because its out of my control.  This is really the crux of my problem: Google is an absolute titan in the organic search market (at least in the US, where most of my customers live).  If there were some secret sauce I could use to improve my ranking on MSN I’d certainly use it, but for equivalent rankings on identical search terms Google gives much, much better traffic than MSN and Yahoo.

Have more ways to aquire customers than search.  Well, I do get a sizeable portion of my customers from download sites.  Aside from that, I get some from teaching sites and some more from word of mouth among my users.  Unfortunately, when my users tell their friends to go download Bingo Card Creator, their friends Google for it.  D’oh!

Comments Off

Effects Of Purchase Page Reorganization

Its only been a week and this might be getting drowned out by the pre-existing positive sales trend in January, but I thought I would comment on what the recent purchasing page overhaul has lead to.

 First of all, I moved the option to buy a CD from purgatory at the bottom of the page to front-and-center.  This has greatly increased the number of CDs bought and the number of people who express interest in it by, say, clicking the add to cart button or sending me an email.  (Yes, I really do get emails saying “I see this option to get a CD.  Will you really send me a CD?  What do I do to order a CD?”  “Click the link or push the button.”  “Thank you!”)  I anticipate shipping more CDs in January than I have in history.  This is making me reevaluate whether I should increase the price of the CD option or not — currently, they cost me $4.50 each and I charge $5.00, and $.50 doesn’t even cover the effort for me to go to cd-fulfillment.com and input the order.  Then again, if the existence of it encourages people who wouldn’t otherwise buy to buy the software, then I’ll subsidize CD orders night and day just to sell the associated license.

People are rather shockingly likely to pick Checkout through Google.  I was thinking I’d get rather little through there for a while.  Nope, they rushed to half of my sales — all of the users seem to have had their account for 0 days so I’m guessing they made the account just to place the order with me.  Good news for Google, bad news for me — that means the ordering pathway is twice as long as it should be!

Comments Off

Perl Makes Me Feel Dirty

I had to code Perl at my day job today… and was productive… and enjoyed it.  Ewwwww.  The task was munging 15,000 mails from a variety of mailing list archives into our email system to test the new spam filter.  Previously, I would have used gawk for that, and spent a good half my morning writing out clever ways to extract the “next” mail from the archive’s web page.  That task took a single regular expression — that whole “matching the stuff in parentheses” is really magic.

Then I got home and had to add a bit of Javascript to all of my webpages to get the new e-junkie cart working.  So I decided “Hey, this will only take a minute in Perl”.  And it actually only did take a minute.  It was sort of fun, too.

Someone please pass me a flail, I need to be beaten before all my code looks like newspaper characters cussing.  (No lie.  That one minute program included the line $_=~s/blahblah/blah/.  Experienced Perl hackers will immediately notice the problem with this line — its four characters longer than it needs to be.

Comments Off

Why I Use Paypal

Responding to a post I made earlier about a temporary error which affected my access to my Paypal balance, a commenter Xanadu said the following :

The solution might be to stop using PayPal-based payment systems (such as e-junkie) and start using a real registration provider, such as Advangate, Plimus, etc.

Yes, their commisions may be higher. However, PayPal introduces an uncertainity factor.

There are hundreads of stories of people who used PayPal, were happy, and then got their accounts closed and funds frozen for no reason at all – and couldn’t do anything about it.

This is a comment point of view among folks running uISVs, and it comes up in the Business of Software boards fairly frequently (as night follows day, so shall PaypalSucks follow Paypal).  I respectfully believe it to be mistaken, and as this is a crucial decision for a business to make, have decided to address it here rather than in a comment.

I have used a “real” registration provider.  The experience was worse for me, and for my customers, than the experience with Paypal has been.  Whereas I have never lost a dime on Paypal in 7 years, I have never successfully recouped a penny off of close to $100 in sales on eSellerate due to obtusely difficult processes to connect me to my money.  Their ordering pathway is also inferior to Paypal’s, and their workflow is tedious and overly complicated for my needs.

My relationship with Paypal (since 2000), like my relationship with my bank, with Google, and with the Java community, is a calculated risk.  I cannot be sure that my Paypal balance will not be frozen tomorrow.  I also cannot be sure that my bank will not suddenly lose my records, that Google will not consign me to PRgatory, and that the Java ecosystem will not evolve in a way iminical to my interests.  In the meanwhile, these calculated risks save me hundreds of dollars versus the next best alternatives.

Why is this a crucial issue?  The dollars make sense.  On my 2006 sales, Avantage would have cost me $270 extra.  Plimus. approximately $150 extra.  etc, etc.  That is on a pre-tax profit of approximately $1,250.  That cost, unlike almost every other cost in my business, scales linearly with sales.  When phenomenally successful Andy Brice asks “What am I getting for an extra $880 per thousand transactions?” that is not a hypothetical question.  (Ahh, a thousand transactions — maybe next year.  My 2007 goal is 400.)

Even if RandomSharewarePaymentProcessor were able to offer me 4.16% processing fees (($24.95 * 2.9% + $0.30)/ $24.95), I would be very hesitant to leave Paypal.  In my market, where non-technical customers abound and eBay is a way of life, customer trust for Paypal is a heck of a lot higher than customer trust is for Patrick McKenzie.  Trust is currency, because without trust I get no currency.  The Paypal name means “Buy here and you’re covered” to the astoundingly high seventy percent of my customers who have an account with them.  Its like the Good Housekeeping Seal of Approval, 2007 Edition.

Finally, speaking of ecosystems, Paypal is big enough to have one.  This has resulted in numerous services springing up around Paypal, such as e-junkie and Payloadz.   I have sung the praises of e-junkie on many occasions.

P.S. If the prospect of having your Paypal account frozen is still too scary to contemplate, consider a) telling them to “auto-sweep” (transfer the entire balance daily into your bank account) or b) sweeping manually, keeping perhaps 2 sales worth to cover any refunds you may need to issue or chargebacks you may need to absorb.  This limits my maximum losses on Paypal to approximately $50, plus whatever damage to my business continuity the freeze would cause before I could type “mv purchasing_esellerate.htm purchasing.htm” into a terminal somewhere.  If you’re particularly paranoid, get an extra account at your bank to link Paypal to, since they can’t then use ACH to muck with the cash in your real bank account.  Most banks will hand out checking accounts like they are candy (although it might cost you a hard inquiry on your credit report).

Comments Off

If you haven't seen it yet…

… you should really, really read Andrey’s post about time trials.  I’m afraid I don’t have any constructive comment aside from “Yes”.  It also dovetails with some of the observations I made about feature-limited trials versus time trials some months ago.

Comments Off

Already Confirmed Paypal Email Address But Can't Withdraw Money

I had a bit of a situation this weekend and decided to post the resolution here because God knows a Paypal customer with a problem has not a friend in the world.  Hopefully the magic of Google will get it to the right people.

This weekend I tried to withdraw money into my bank account and I got an error: “You must confirm your primary email address before you can withdraw money”.  Which, of course, I had already done.  Trying to reconfirm my primary email address caused the error “You have already confirmed this email address”.  I faced the unpleasant prospect of having to communicate with Paypal customer service — oh no!  Luckily before that terror came to pass I tried adding a new disposable email account to the Paypal account, which worked like a charm (without needing to be set as my primary address, so no disruption happened with my IPNs or e-junkie).  I’ll let the disposable email address sit there a while, as I have the totally unsubstantiated worry that adding and removing addresses in a rapid fashion could cause a fraud review.

Comments Off

e-junkie Does It Again

Like many computer programmers, I have a weird fascination with bright, attractive, modern-looking interfaces.  Its almost unhealthy.  GMail and Sharebuilder and many of the other sites I visit on a daily basis have good use of AJAX (well, OK, Sharebuilder’s is obnoxious — but it sure is shiny!) and I think it, in general, adds to the experience.  Unfortunately, I have the web-programming ability of a newborn squirrel, so I was resigned to always having my website look and feel a wee bit frumpy.  Granted, the open source design at least lets me have coordinating colors and an attractive look, but the ordering pathway, for example, is rather abrupt.

Until now.  e-junkie, who I use to handle payment processing (Paypal takes the money, e-junkie sends out the key), has made some significant improvements recently.  First, they started taking Google Checkout, which as I mentioned earlier greatly increased my interest in Google Checkout, since it would greatly decrease the costs to switching over from Paypal.  Then quite recently (I got an email about it within the last 48 hours) they rolled out what they call a Fat Free Cart

Its actually much more fun to play with the cart than it is to have me describe it to you.  Run on over to their page or to my test purchasing page which incorporates it and have a looksie.  (That link will go bad within 48 hours.  If it has already gone bad, try my normal purchasing page.)

Anyhow, here is me trying to describe it in words: the cart is a very, very slick interstitial popup over your website.  You can clearly see the original site’s branding in the background, but you can’t interact with it while the cart is up.  The cart seemlessly integrates both Paypal and Google Checkout — just click the checkout button on the bottom and you’re wisked over to the appropriate page to complete your transaction.  e-junkie handles all the email sending and key generation (assuming you use that option) in the background.  At the end of the transaction, your customer ends up back at your website at whatever page you’ve specified.

The best part: it took me 45 seconds to integrate the cart with my page.  Take Javascript code, copy-paste.  Update Buy Now URLs.  Done.  Everything else is accomplished by their significant web-programming wizardry, allowing me to get back to the important business of getting Bingo Card Creator 1.05 ready.

I’m told there will be support for volume licensing added to the cart within 2-4 weeks.  This makes me unspeakably glad because I’ve wanted to offer it (and have offered it), but it was previously incompatible with e-junkie.  As a result, I used eSellerate.  With this coming right around the corner in the cart I have given eSellerate the old heave-ho.  They can keep the $90 or so in sales (I never made it up to $100 there to trigger them writing a check) — I’m quite glad to be done with their quirky interface and murderously long ordering path.  Plus with the Fat Free Cart (sidenote: does this strike anyone else as a silly name?) I get Google Checkout as another payment option “for free” in terms of marginal effort, so I no longer have to keep prices/keys/product descriptions/emails synched around two payment providers.  From the POV of my customers, Paypal and Google Checkout are distinct.  From my point of view, I control both through my e-junkie control panel (which, if you haven’t seen it, is one sweet AJAX app if I do say so myself).

I continue to advise anybody and everybody just starting out on their uISV to use e-junkie.  Its cheap ($5/month) and it gets you back to doing your business in a matter of minutes, rather than worrying about boring payment processing trivia.  Their customer support is also fantastic.  Obligatory disclaimer: although I probably praise them enough to be an honorary member of their marketing staff, I’m not compensated in any way for it.  Well, aside from the fact that they help me make a couple hundred dollars every month.

Comments Off