Archive | Uncategorized RSS feed for this section

572 day uptime…

11:59:49 up 572 days, 20:07, 1 user, load average: 0.00, 0.00, 0.00

Sadly, I just had to resize the slice that has been running bingocardcreator.com for the last 572 days. This requires about a minute of downtime. Drats, my perfect record!

Hard to get motivated some days

I’m wrapping up day two out of the five-day vacation I have for Golden Week, and have not quite gotten as much accomplished on getting the new version out as I had hoped.

Task list to embarass myself into working hard tomorrow:

Bingo Card Creator 3.0

  • Client connects to server, validates license key
  • Server accepts connection from client, validates and if necessary reissuses license key
  • Client contacts server, server saves word list to database
  • Client-side GUI for saving word list to server
  • Client contacts server, server responds with word list
  • Client-side GUI for loading word list from server
  • Client contacts server, server responds with list of client’s word lists
  • Client-side GUI for loading word list from server
  • Client contacts server, server responds with PDF of specified word list
  • Client-side GUI for configuring PDF
  • Client-side GUI for saving PDF
  • Update license agreement to clarify usage of server
  • Client requires acceptance of updated agreement to use server
  • Set e-junkie to use automatically generated license keys instead of saved ones to stop reissuing the same key (sidenote: my fault, not theirs — I used the same key list for the CD version and download version)
  • Update PAD file to reflect Bingo Card Creator 3.0
  • Recruit Mac testers for BCC 3.0

Bingo Card Creator.net (my internal name for the web app version)

  • Set up staging.bingocardcreator.com for testing
  • User account page — edit name, email, password, Registration Key, etc
  • User dashboard — display existing lists, printouts
  • Word list editing workflow
  • Printing workflow
  • Generation of bingo cards PDFs
  • Cache saved PDFs to disk
  • Rewrite content publication to use Prawn & ImageMagick instead of laptop automation
  • DelayedJob integration to remove PDF generation from HTTP request/response cycle
  • Lightbox to present download BCC or sign up for BCC.net choice
  • Lazy logins (no login for guest mode, upsell to free trial)
  • Free trial upsells to $$$

Random tasks

  • Integrate signup with MailChimp API to do autoresponder series for hints & tricks
  • Set up mailing list for newsletter
  • Resize Slicehost slice to 512MB to accomodate anticipated need for DelayedJob instances and extra Mongrels
  • Blog about why I’m finally spending time to make a web version

Major Progress on BCC Web Application

I did some more work on the upcoming BCC 3.0 this weekend, which is going to coexist on the desktop and the Internet.  (Feel the power of Web 2.0… several years late!)  

The biggest challenge with BCC coding-wise has always been laying out the bleeping cards.  Mostly, this is because Java has very primitive printing facilities.  I render everything to a Swing canvas and then essentially print the canvas, and Swing is most definitely not designed as a printable format.  This exacerbates some issues which are always going to be hard, such as “How do I automatically size text so that it looks visually appealing without requiring user input?”

Since printing in a web application is sort of hard to control (CSS and usability issues galore), I’ve opted to generate PDFs, which is a quite common choice.  The Prawn library (a new-ish alpha-quality Ruby library for PDF printing) is an absolute lifesaver — I’ve got better behavior out of it in 8 hours of playing around then I’ve been able to coax out of BCC in 2 years.  There is still some ugly spaghetti code hiding in the bowels of it, but its literally a quarter of the size of the stuff in BCC itself, and much, much more comprehensible.  

Feast your eyes: 

(I know, Roald Dahl’s name is screwed up due to some sort of encoding issue.)

Here’s the same card printed in Bingo Card Creator:

I really prefer the Prawn version to the Java version for out of the box behavior:

  • prettier autosizing (particularly for the column headers)
  • better line breaking logic
  • better centering of the words in the squares
  • capability to add titles (often requested by customers, never implemented in Java because it would essentially require a rewrite of code that I scarce dare to tread in)
  • capability to add watermarks/footers (often requested by, erm, me)

Printing is, by my estimation, about 90% accomplished.  (I still need to work out some internationalization kinks and then figure out how I’m going to generate the PDFs and store them outside of the web request/response cycle — I don’t want someone printing 800 cards for a Fortune 500 retreat to lock up the server accidentally, but I do want to support that use case.)

After I get printing done I still need to:

  • Code GUIs for word entry, loading/saving lists, etc.
  • Figure out user management (usernames/passwords, forgot password, restricting access appropriately, etc)
  • Extend my admin interface so that I can address issues that people have, should they have any.
  • Figure out how to integrate the web app into my site without confusing the heck out of people.
  • Rewrite a whole lot of copy.  (See the above point.)
  • Sprinkle my pages with copious sign-up-for-webapp-now calls to action.
  • Adjusting the BCC client for close-to-seemless integration with the website (save to/load from Internet)

Now that printing is mostly working the technical issues are all downhill from here.  My biggest worry is the perinneal one for web applications: can I convince non-technical users that “web sites” are worth paying money for?  This is one of the main reasons I’m not planning on deprecating the downloadable version anytime soon.

Bad Places To Have Bugs: Pricing Logic

About a week ago I noticed a deficiency in my understanding of how my shopping cart actually worked for purchases of 2+ units: specifically, e-junkie thought they were mispriced and was bouncing the transactions, resulting in a customer getting charged but not getting their key automatically. I only get about one of these orders a year, so I hadn’t seen the behavior yet. *sigh* So I did something I thought I would fix it: turn on variable pricing, then set prices manually through my cart. Done, right?

Wrong. The next day, I started getting orders at $20.00, the new price floor. I looked around for the possible cause and figured that if you had Javascript disabled or clicked through my cart before its Javascript could load, you’d get taken to e-junkie’s fallback hosted cart, where you’d be given the option of modifying the price. For some reason it defaulted to $20, despite $29.95 being set as the default price. Not quite sure why. So I fixed it, by making the default item be a single copy at $29.95 and only having the pricing logic apply when buying through my cart.

But still the $20.00 units kept coming. Then it hit me — it wasn’t actually that edge case, it was a different edge case — involving an ugly mess of Google Checkout, e-junkie, and my code. Grr. So I went back to Plan A: reverted to the cart which charges 1,499 customers a year correctly and causes 1 guy to wait a bit while I decide how to address this in a more long-term fashion, rather than having half of the purchases this week get screwy behavior.

I lost about $120 that I know about in arbitrary discounts, plus more if anyone was scared off by the weird inconsistency between my site’s pricing and the pricing at Paypal/Google Checkout. Not that I blame them. Grr.

Memo to self: self, you’ve said it before, but avoid doing 5 minute changes at midnight.

Working on Bingo Card Creator 3.0

Well, I spent 1.5 hours today working on the newest version of Bingo Card Creator, after hoping to spend 6 or so.  Drats.  What’s on the agenda:

  • Fixing a display bug when editing the Free Space! under certain conditions.  (Done already.)
  • Moving the default Save/Open directory to the OS-dependent default save directory (i.e. My Documents) rather than the BCC program directory.  This is mostly for Vista compatibility and general ease of use.
  • Moving the location of the license file to the user’s home directory, rather than the BCC program directory.  This is for Vista compatibility and, as an added bonus, it will eliminate the “reenter your license key” headache for upgrading Mac users from here on out.
  • Big feature: Bingo Card Creator is going all web 2.0 and storing its information in the clooooooooooooud.  Just kidding.  Tentatively labeled “Save to Internet” and “Open from Internet”, this lets BCC users work on files at home, work, school, or wherever without having to drag the files along with them.  It also paves the way for an upcoming new product I’m going to launch.  (Three guesses as to what.)
  • Import: While BCC can technically import from a plain text file already, I’d like to give users an easy cut/paste option to get words into it.

I hope to have something to show you guys by, oh, say next weekend, and am aiming to release this by my birthday.  (April 16th)  Funny trivia: 3.0 raised to the 3.0 power is 27, which will be my age on my birthday.

オープンソース・ソフトウェアとうまく勝負するにはどうするか

[Editor’s note: this is the Japanese translation of “How To Successfully Compete With OSS“, which I prepared because some Japanese blogs were apparently interested in the topic.]

[備考:自分が書いたHow to Successfully Compete With OSSがいくつかの日本のブログからリンクされましたので、和訳してみました。母国語ではないですから、おかしい言い方があれば教えてください。仕事外あんまり書かないので練習しないと行けないですけどね。]

時々、Business of Software (ソフト業界の掲示板)で「オープンソースソフトウェア(以下、OSS)に勝負するに意味あるか?ただだから勝ち目はないだろう?」との意見が出ます。もちろん、Joel Spolskyさんなどが説明したように、OSSにでも勝てるのです。特にHacker News (他のソフト業界の掲示板)で書かれた「Enterprise系ソフトで当然に勝てる」とのコメントが気に入りました。ただ、B2Cに関する議論がほとんどなかったです。無理無理無理と言われたことは少なくないが、B2C(Bussiness To Consumer,つまり、企業が素人に売ること)でも、値段が0円であるOSSに勝てます。

資格とは言いえないが、少し経験あり:両親や先生のためにビンゴカードを作成するソフト Bingo Card Creatorをやっています。B2C中のB2Cです。去年度の売上は2百万円程度で、今年は増加して、4月末まで給料を超えるだろうと思います。始めた2006年7月に、同じ問題を解決しようとする二つのOSSがもう存在しました: BingoCardMaker とbingo-cards.  (相変わらず、我らプロぐラマー達は意味深い名前を付けるのに上手でしょう。)

よって、下記のOSSに関する議論はFirefoxなどの一流なプロジェクトではなくて、OSSの残りの99%です。人が使っているのに、一度も聞いたことのないソフトです。すべての有料ソフトはMicrosoft Officeじゃあないと同じように、OSSはFirefoxには限らないのです。

OSSも好きですからあんまり怒らないでください!:私的活動でも仕事でもOSSを使っています。コードを共有したり、自分のプロジェクトを時々開封したり(私のshopping cart を使えますよ)します。OSSが好きです。OSSか有料ソフトかどちらかが生き残るなんて思えません。

したがって、「OSSにするのに、こうすればいい」とアドバイスを書くとき、残忍冷酷戦略会議なんてないですよ。ユーザのニーズに応じて相応しいツールを見つけてほしいのみです。(時々それによって儲かったら、まあ、いいでしょう。)

OSSよりうまくできるものと言いえば

1)  マーケティング

ユーザには問題があります。ソフトは問題を解決するツールです。と言っても、ユーザは「ソフト不足」との問題を意識していません。

1%以下のユーザが「問題はソフトが足りない」と意識している:あなたのソフトがビンゴカードの作成のためであろうか何のためであろうか、ユーザにすでにあった問題を解決するものしかすぎません。もう解決しようとしたはずです。失敗を繰り返して、イライラして、検索エンジンでソフトを示さない「how do I make bingo cards」とか単純な質問を聞いたでしょう。数学的にいうと、去年度検索してくれた14.5万人のお客さんの中、800人しかソフトを検索しなかったです。「ダウンロード」などの専門用語を使った人を入れても、97%以上はソフトを問題としなかったのです。

OSS活動はソフトに注目し、ソフトでできることを無視する:OSSのサイトを開いてみてください。どれでもいいです。うちのソフトはどのこの、ソフトの実装方法、ソフトのバグトラカー、ソフトのML、ソフトなんてうんざりほど書かれているでしょう。problem domain (ユーザが苦しんでいる問題範囲)に関してなにひとつも書いていないでしょう。「このサイトを見ているなら、もうソフトが要としている」という非常識のせいです。

もし、あなたのプロジェクトのユーザがソフトが要としているとのスタンスでマーケティングすれば、problem domain向けのSEOを行わないでしょう。ソフトが好きなオタク同士ではなしていて、ソフトがただ家電商品に近いと思う一般人には広報しないでしょう。(自分のソフトを好評してくださったお客さんはソフトがイヤです。パソコンに興味があるから使うひとではなくて、ご家族と再会するのにパソコンが一番はやいという人なんです。)

2)  デザイン

[翻訳は思ったより時間かかったので明日終わらせます。よろしくお願いします。]

My Favorite WordPress Plugin

Now that my blog is chilling on my server and I can actually install plugins, I’m starting to add some of the ones I’ve used for other projects, such as my brother’s blog about the superhero novel.  My favorite plugin, which also has my favorite name, is What Would Seth Godin Do?.  

Answer: he would cookie everyone who came to the blog, so that you could show different views of it to people who had been following for years and people who just arrived fresh off a Google search for software marketing tips and don’t have any idea who the heck I am.  

In keeping with my general preference for unobtrusiveness, I’ve put the links in a nice, subtle box beneath posts.  Most people would opt for above the post for maximum visibility, but I don’t need the distraction for the (several thousand people) who get here for some variant of I want to pay someone money to make bingo cards please tell me oh great Google where I can do this.

kalzumeus.com (Not www. Version) Down For A While

Hiya guys.  I misconfigured my DNS when I moved the blog here, resulting in a CNAME record (i.e. “The named server is actually on this domain name over here”) pointing to Google rather than a MX record (i.e. “The named server’s email is processed by Google Apps, please send mail to him there”).  As a consequence the http://kalzumeus.com alternative for accessing the blog is going to be down for about a week while the TTL for that record expires.  Fun stuff, DNS, fun stuff.  Some places on the Internet might see it earlier than others.

I’ve told Google to redirect the domain on their end (search for Google Webmaster Console) but that will probably take a day or to to take as well.  

Sorry for the mixup!  Thanks for those folks who mentioned it.

Moved Blog From WordPress.com to Own Server

Hideho everybody.  Two years after getting the notion to do it, I have finally completed the move of my blog to my own server.  The main reasons is to make me the captain of the blog’s destiny, as opposed to WordPress.  (Non-poetic version: I want to manage my own plugins, themes, and general look for the site — particularly important as my business expands and I might use this for something other than just writing about BCC.)

Process to move a blog from WordPress.com to your own server:

1)  Register domain name

2)  Go to WordPress.com and set your blog’s domain as the one you’ve just registered.  This will cost you $10 a year.

3)  Wait several months while Google gradually gets the notion that yourblog.wordpress.com is really www.yourdomain.com (WordPress will 301 redirect to your new domain IF AND ONLY IF you continue paying them the $10 a year — its a steal, do it).

4)  At your hosting provider of choice, install the WordPress software.  You’ll probably want to configure it under a test subdomain for the moment (I used a domain I keep lying around for just such an occasion).

5)  From WordPress.com, export a dump of all your posts & etc.

6)  Import the dump into your self-hosted blog.  If your blog export was over 2 MB (mine weighed in at 2.1), you can have the import succeed by finding your php.ini file and changing the max_upload_size setting line — it should read “max_upload_size = 10MB;”

7)  Test blog, see that most stuff continues to work.

8)  Go to your domain registrar and change the DNS entries for your domain from ns1.wordpress.com, etc, to the DNS entries for your hosting provider.  Wait a few minutes.

9)  Turn on Akismet for your new blog or you’ll be spam city before you know it.  I got 50 lovely comments welcoming me to my new digs within the first 15 minutes.  They all seemed to be by people who work in the pharmaceutical industry.

And, of course, you can play around with your settings, themes, plugins, and etc.  I’ve gone ahead and used the Leviathan theme (customized very mildly with a custom title image — 5 minutes in Paint.NET, will probably replace it with a real image done by my art guy later) and installed a plugin to finally allow me to do some decent syntax highlighting here.  Hopefully that will induce me to post code more often.

Tell me if you notice anything greviously wrong about the blog!

Testing out code highlighting

   def testing_method
     #testing to see if ruby code highlighting works
     User.count(:some_option)
   end