<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>MicroISV on a Shoestring</title>
	<atom:link href="http://www.kalzumeus.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.kalzumeus.com</link>
	<description>B2C stands for "Bingo To Customer"</description>
	<lastBuildDate>Sun, 28 Jun 2009 14:37:44 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Bingo Card Creator Goes Web 2.0</title>
		<link>http://www.kalzumeus.com/2009/06/28/bingo-card-creator-goes-web-2-0/</link>
		<comments>http://www.kalzumeus.com/2009/06/28/bingo-card-creator-goes-web-2-0/#comments</comments>
		<pubDate>Sun, 28 Jun 2009 14:37:44 +0000</pubDate>
		<dc:creator>Patrick</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.kalzumeus.com/?p=623</guid>
		<description><![CDATA[Three years ago, on July 1st 2006, I released version 1.0 of Bingo Card Creator.  It was ugly, underfeatured, and bug-ridden.  Now, it is ugly, underfeatured, and bug-ridden&#8230; with&#160;AJAX!
Feast your eyes at this very, very early sneak peak.  You&#8217;ll want to click one of the various &#8220;sign up now&#8221; text links rather than the download [...]]]></description>
			<content:encoded><![CDATA[<p>Three years ago, on July 1st 2006, I released version 1.0 of<a href="http://www.bingocardcreator.com"> Bingo Card Creator</a>.  It was ugly, underfeatured, and bug-ridden.  Now, it is ugly, underfeatured, and bug-ridden&#8230; with&nbsp;AJAX!</p>
<p>Feast your eyes at this very, very early <a href="http://staging.bingocardcreator.com">sneak peak</a>.  You&#8217;ll want to click one of the various &#8220;sign up now&#8221; text links rather than the download a free trial ones.  I haven&#8217;t gotten around to sitting down with my design guy and redoing the buttons and the sales pitch for the free download&nbsp;yet.</p>
<p>Featurewise, it isn&#8217;t quite competitive with the downloadable Bingo Card Creator, to be honest.  A few of the power-user features, particularly design-focused things like picking fonts, are <em>shockingly</em> difficult to implement in a good way in a web application.  Others, like consistent columns and call lists, I just quite haven&#8217;t had time to integrate&nbsp;yet.</p>
<p>I was really impressed that I got the live preview of the bingo cards to work as well as it does.  Check it out&thinsp;&#8212;&thinsp;I am <em>very</em> proud of that work, although it is rough around some edge cases.  It took probably half of the development time of the site but I think getting users super-responsive feedback to their actions is worth every minute of&nbsp;it.</p>
<h2>AJAX Technical&nbsp;Detail</h2>
<p>How does it work?  While users are typing words into their text box, Prototype periodically checks it for changes and, if there are any, serializes the contents of the form and calls an AJAX function on the server.  The server takes the contents of the form and saves it to a &#8220;scratch&#8221; record in the database, which is not otherwise visible to the user.  The return value from this function overwrites part of the calling web page, including replacing the previous preview image with a new image if the scratch value has changed (same url, new query parameter&thinsp;&#8212;&thinsp;this tricks browsers into always requesting the image anew rather than checking their&nbsp;cache).</p>
<p>The path to the image on the server is actually just more Rails code, which checks to see if the scratch record has changed since the last time it produced an image.  If not, Rails tells Nginx &#8220;give them the last image we wrote, straight from the disk&#8221;.  If yes, then Rails uses Prawn plus a boatload of custom formatting logic to create a PDF, then calls out to ImageMagick to turn that into a GIF and resize it, then writes that to the storage area on the disk and tells Nginx to serve it.  Total time per request: on order of 300 to 800 ms.  My back of the envelope math suggests that my server, with two Mongrels, can probably support about 20 teachers simultaneously editing cards as fast as their fingers can go&#8230; after that I need to get worried (or upgrade to a bigger slice, which I might do&nbsp;anyway).</p>
<h2>Still To&nbsp;Come</h2>
<p>I still have&nbsp;to:</p>
<ul>
<li>rewrite my copy to address the existence of the web&nbsp;version</li>
<li>get Bingo Card Creator 3.0 tested, in particular the features where it links to the&nbsp;website</li>
<li>give the user workflow a graphical upgrade, because pretty buttons sell B2C&nbsp;software</li>
<li>rewrite my page templates to push both the trial and the online service&thinsp;&#8212;&thinsp;I sense a lightbox coming&nbsp;up&#8230;</li>
<li>improve usage stats collection (can be pushed after&nbsp;release)</li>
<li>test integration with the purchasing funnel to make sure it works&nbsp;right</li>
<li>give some spit-and-polish to some usability&nbsp;issues</li>
</ul>
<p>I&#8217;d love if you have any comments on it.  Take it for a spin and  let me know.  This sneak-peak is not using the production database, which means when the sneak-peak ends <strong>you&#8217;ll lose anything you did with it</strong>.  In the unlikely event you want to use this for something important, make sure you save your cards&nbsp;locally.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kalzumeus.com/2009/06/28/bingo-card-creator-goes-web-2-0/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Why does cron hate me so?</title>
		<link>http://www.kalzumeus.com/2009/05/19/why-does-cron-hate-me-so/</link>
		<comments>http://www.kalzumeus.com/2009/05/19/why-does-cron-hate-me-so/#comments</comments>
		<pubDate>Tue, 19 May 2009 08:11:14 +0000</pubDate>
		<dc:creator>Patrick</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.kalzumeus.com/2009/05/19/why-does-cron-hate-me-so/</guid>
		<description><![CDATA[Once *again*, cron decided that it would stop deleting my Rails cached files after I upgraded to Hardy.  I&#8217;m totally stumped as to why it happened&#8201;&#8212;&#8201;the logs say that the rf -rm happened at the scheduled times for the last two weeks, and I was able to successfully do it by sudoing into the [...]]]></description>
			<content:encoded><![CDATA[<p>Once *again*, cron decided that it would stop deleting my Rails cached files after I upgraded to Hardy.  I&#8217;m totally stumped as to why it happened&thinsp;&#8212;&thinsp;the logs say that the rf -rm happened at the scheduled times for the last two weeks, and I was able to successfully do it by sudoing into the appropriate user, but the files were still on disk and being happily served by Nginx, oblivious to the fact that Mother&#8217;s Day and Cinco de Mayo had long since&nbsp;passed.</p>
<p>Argh, I hate computers some&nbsp;days&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kalzumeus.com/2009/05/19/why-does-cron-hate-me-so/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Dropbox is saving my bacon</title>
		<link>http://www.kalzumeus.com/2009/05/11/dropbox-is-saving-my-bacon/</link>
		<comments>http://www.kalzumeus.com/2009/05/11/dropbox-is-saving-my-bacon/#comments</comments>
		<pubDate>Mon, 11 May 2009 16:23:29 +0000</pubDate>
		<dc:creator>Patrick</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.kalzumeus.com/?p=614</guid>
		<description><![CDATA[About a month and change ago a Japanese coworker asked me &#8220;Hey, Patrick, have you ever heard of Dropbox?&#8221;  All I knew is that they were some vaguely storage-in-the-clooooooooooooooooooooooud startup, but not really the specifics.  But since he and another coworker were interested in it I did some checking to tell them what they would [...]]]></description>
			<content:encoded><![CDATA[<p>About a month and change ago a Japanese coworker asked me &#8220;Hey, Patrick, have you ever heard of <a href="https://www.getdropbox.com/home">Dropbox</a>?&#8221;  All I knew is that they were some vaguely storage-in-the-clooooooooooooooooooooooud startup, but not really the specifics.  But since he and another coworker were interested in it I did some checking to tell them what they would need to press to sign up &amp; etc.  And, yep, storage in the cloud, painless backup, blah blah.  So I grabbed an account for the heck of it and decided I would get around to backing up my files one of these&nbsp;days.</p>
<p><em>Sigh</em>.  You think we would know by now, right?  &#8221;I&#8217;m going to start a backup any day now&#8221; ranks right up there with &#8220;Hmm, well, we haven&#8217;t heard from that freaky serial killer in a while.  I think I&#8217;ll stay in the&nbsp;house.&#8221;</p>
<p>This is despite <a href="http://benjismith.net/index.php/2009/01/13/calamity/">Benji</a> and <a href="http://successfulsoftware.net/2008/02/04/your-harddrive-will-fail-its-just-a-question-of-when/">Andy Brice</a> both having recent hard drive failures.  (Andy&#8217;s, which was a year ago so I suppose not so recent, even came with the title &#8220;Your harddrive *will* fail&#8221;.  Yeah yeah, sure, and I bet you think there is a machete-wielding maniac over in the next room.  Bah, I think I&#8217;ll take a&nbsp;bath.)</p>
<p>Thankfully I was sufficiently moved by their advice to start keeping backups of my servers at Slicehost, which has the added benefit of protecting my source code (since I have my repositories on those servers).  Most of my critical business data is already off of my laptop&thinsp;&#8212;&thinsp;its at a Google server farm, or chilling on a Slicehost server, or over at Paypal, but there is still quite a bit of sentimental value in my photos and nuisance in having to reconfigure, e.g., Eclipse to match my personal setup again when I reinstall&nbsp;it.</p>
<p>Anyhow, today the inevitable happened: my Vista-using laptop decided to start the sputter and die deathspiral.  Thankfully, after an hour of fruitless restarts, I was able to boot into safe mode, where I am right now.  I think the hard disk covering some of the code loaded by all the bells&amp;whistles that autoload when the machine boots is toast.  Luckily untoasted is my ability to read the rest of the disk and run&nbsp;Dropbox.</p>
<p>Which is currently streaming my last few folders of Really Don&#8217;t Want To Lose That to safer pastures.  Here&#8217;s $100, Dropbox&thinsp;&#8212;&thinsp;thanks a&nbsp;million.</p>
<p>Fun tip for Vista users: mklink /D name-of-your-symlink C:\Users\blahblah\Documents\whatever will create a symlink between two places on a Vista OS.  If you have a symlink pointing out of your Dropbox folder, dropbox will perceive the stuff outside (say, a full Cygwin installation) as being inside of the Dropbox, and automatically sync it for you.  I really appreciate that trick, as it meant I didn&#8217;t have to copy/paste the files I need to update and risk more harddrive activity at the&nbsp;moment.</p>
<p>2 hours until the last of the files are off the disk.  Go Dropbox,&nbsp;go!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kalzumeus.com/2009/05/11/dropbox-is-saving-my-bacon/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Yay for A Productive Hour</title>
		<link>http://www.kalzumeus.com/2009/05/08/yay-for-a-productive-hour/</link>
		<comments>http://www.kalzumeus.com/2009/05/08/yay-for-a-productive-hour/#comments</comments>
		<pubDate>Sat, 09 May 2009 06:36:51 +0000</pubDate>
		<dc:creator>Patrick</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.kalzumeus.com/2009/05/08/yay-for-a-productive-hour/</guid>
		<description><![CDATA[I finally killed that little permissions error (protip: if you symlink a to b, and are wondering why you can&#8217;t access a/c, a/d, and a/e despite the preferences on a, c, d, and e all being right, check to make sure you&#8217;ve chmod-ed b/.&#160;properly.)
I also did my very first push out to github, which was [...]]]></description>
			<content:encoded><![CDATA[<p>I finally killed that little permissions error (protip: if you symlink a to b, and are wondering why you can&#8217;t access a/c, a/d, and a/e despite the preferences on a, c, d, and e all being right, check to make sure you&#8217;ve chmod-ed b/.&nbsp;properly.)</p>
<p>I also did my very first push out to github, which was slightly on the painful side (Windows user&thinsp;&#8212;&thinsp;I&#8217;m used to Rails programming having its share of pain) but cleared up fairly fast.  I think I&#8217;m really going to like git for source control, although since I already have a SVN repository I&#8217;ll probably keep that as my main&nbsp;method.</p>
<p>Here&#8217;s what I did: took (a particular version of) Delayed::Job and extended it so that it can accommodate multiple workers at once.  You can see the details&nbsp;<a href="http://github.com/patio11/delayed_job/tree/master">here</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kalzumeus.com/2009/05/08/yay-for-a-productive-hour/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>That too ENTIRELY too long</title>
		<link>http://www.kalzumeus.com/2009/05/06/that-too-entirely-too-long/</link>
		<comments>http://www.kalzumeus.com/2009/05/06/that-too-entirely-too-long/#comments</comments>
		<pubDate>Wed, 06 May 2009 14:19:22 +0000</pubDate>
		<dc:creator>Patrick</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.kalzumeus.com/?p=610</guid>
		<description><![CDATA[Well, on the plus side, the last three days have probably been my most productive programming spring ever.  On the minus side, a lot of it was spinning my wheels fighting against problems rather than making forward progress.  I blame&#160;fatigue.
What I Have&#160;Done:
Bingo Card Creator 3.0.  Whee.  It can interact with the server to save user&#8217;s [...]]]></description>
			<content:encoded><![CDATA[<p>Well, on the plus side, the last three days have probably been my most productive programming spring ever.  On the minus side, a lot of it was spinning my wheels fighting against problems rather than making forward progress.  I blame&nbsp;fatigue.</p>
<h2><span style="font-weight: normal;">W</span>hat I Have&nbsp;Done:</h2>
<p><strong>Bingo Card Creator 3.0</strong>.  <em>Whee</em>.  It can interact with the server to save user&#8217;s word lists in <em>the </em><em>cloooooooooooud</em>.  Which is apparently the $10 buzzword for a client-server application these days.  For extra bonus points I threw in PDF generation on the server&thinsp;&#8212;&thinsp;<em>How hard can it be? </em>&thinsp;&#8211;&thinsp;and then got to rediscover the joys of heavy duty fat client Java application development.  Did you know that there is no way in Java&#8217;s standard library to copy a file from point A to point B?  Or that if you open the desktop in a Java open/save window it will show you some GUIDs as possible folders?  Fun&nbsp;stuff.</p>
<h2>What I Have Mostly&nbsp;Working</h2>
<p><strong>Delayed Job integration</strong>.  If somebody tries to generate a thousand bingo cards on Prawn, that essentially takes one of my Mongrels and ties it up for a minute.  Behind that, requests start piling up and not getting executed.  Plus, should they have a connection hiccup, well, guess I lose.  So rather than generating PDFs in the request/response cycle, they get queued up for execution in the near future, using <a href="http://github.com/collectiveidea/delayed_job/tree/master">Delayed Job</a>.&nbsp; </p>
<p>Why is it only &#8220;mostly&#8221; working?  Well, following standard Linux best practices, the user that is supposed to execute the jobs has very little in the way of privileges.  Apparently too little to actually touch his directory.  I have tried everything I can think of to fix this, with no dice, so its time to walk away and come back fresh&nbsp;later.</p>
<h2>What Isn&#8217;t Even Started&nbsp;Yet</h2>
<p>The web version of the software.  (Well, OK, technically the PDF-ification and most of the existing infrastructure will get reused, but I still have to actually make the screens for it, and then tie them into the purchasing&nbsp;pathway.)</p>
<p>I hope to get the web stuff mostly working this weekend and then open 3.0 up for beta testing.  If you&#8217;re interested in helping out, please drop a comment, particularly you Mac freaks out there.&nbsp; </p>
<p>You can see the newly redone PDFs and GIFs for most cards at http://staging.bingocardcreator.com .  Still got some bugs to iron out of that, though&#8230;  (Prawn + Imagemagick is literally fifty times faster than rendering through the Windows printer and then screenscraping Adobe Acrobat reader then pasting into Paint&thinsp;&#8212;&thinsp;automated, naturally&thinsp;&#8212;&thinsp;for cropping out a GIF screenshot,&nbsp;incidentally.)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kalzumeus.com/2009/05/06/that-too-entirely-too-long/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>572 day uptime&#8230;</title>
		<link>http://www.kalzumeus.com/2009/05/03/572-day-uptime/</link>
		<comments>http://www.kalzumeus.com/2009/05/03/572-day-uptime/#comments</comments>
		<pubDate>Sun, 03 May 2009 12:01:08 +0000</pubDate>
		<dc:creator>Patrick</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.kalzumeus.com/2009/05/03/572-day-uptime/</guid>
		<description><![CDATA[11:59:49 up 572 days, 20:07,  1 user,  load average: 0.00, 0.00,&#160;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&#160;record!
]]></description>
			<content:encoded><![CDATA[<p>11:59:49 up 572 days, 20:07,  1 user,  load average: 0.00, 0.00,&nbsp;0.00</p>
<p>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&nbsp;record!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kalzumeus.com/2009/05/03/572-day-uptime/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Hard to get motivated some days</title>
		<link>http://www.kalzumeus.com/2009/05/03/hard-to-get-motivated-some-days/</link>
		<comments>http://www.kalzumeus.com/2009/05/03/hard-to-get-motivated-some-days/#comments</comments>
		<pubDate>Sun, 03 May 2009 10:39:03 +0000</pubDate>
		<dc:creator>Patrick</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.kalzumeus.com/?p=604</guid>
		<description><![CDATA[I&#8217;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&#160;hoped.
Task list to embarass myself into working hard&#160;tomorrow:
Bingo Card Creator&#160;3.0

Client connects to server, validates license&#160;key
Server accepts connection from client, validates and if necessary reissuses [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;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&nbsp;hoped.</p>
<p>Task list to embarass myself into working hard&nbsp;tomorrow:</p>
<p>Bingo Card Creator&nbsp;3.0</p>
<ul>
<li><span style="text-decoration: line-through;">Client connects to server, validates license&nbsp;key</span></li>
<li><span style="text-decoration: line-through;">Server accepts connection from client, validates and if necessary reissuses license&nbsp;key</span></li>
<li><span style="text-decoration: line-through;">Client contacts server, server saves word list to&nbsp;database</span></li>
<li><span style="text-decoration: line-through;">Client-side GUI for saving word list to&nbsp;server</span></li>
<li><span style="text-decoration: line-through;">Client contacts server, server responds with word&nbsp;list</span></li>
<li><span style="text-decoration: line-through;">Client-side GUI for loading word list from&nbsp;server</span></li>
<li><span style="text-decoration: line-through;">Client contacts server, server responds with list of client&#8217;s word&nbsp;lists</span></li>
<li><span style="text-decoration: line-through;">Client-side GUI for loading word list from&nbsp;server</span></li>
<li>Client contacts server, server responds with PDF of specified word&nbsp;list</li>
<li>Client-side GUI for configuring&nbsp;PDF</li>
<li>Client-side GUI for saving&nbsp;PDF</li>
<li>Update license agreement to clarify usage of&nbsp;server</li>
<li><span style="text-decoration: line-through;">Client requires acceptance of updated agreement to use&nbsp;server</span></li>
<li>Set e-junkie to use automatically generated license keys instead of saved ones to stop reissuing the same key (sidenote: my fault, not theirs&thinsp;&#8212;&thinsp;I used the same key list for the CD version and download&nbsp;version)</li>
<li>Update PAD file to reflect Bingo Card Creator&nbsp;3.0</li>
<li>Recruit Mac testers for BCC&nbsp;3.0</li>
</ul>
<p>Bingo Card Creator.net (my internal name for the web app&nbsp;version)</p>
<ul>
<li><span style="text-decoration: line-through;">Set up staging.bingocardcreator.com for&nbsp;testing</span></li>
<li>User account page&thinsp;&#8212;&thinsp;edit name, email, password, Registration Key,&nbsp;etc</li>
<li>User dashboard&thinsp;&#8212;&thinsp;display existing lists,&nbsp;printouts</li>
<li>Word list editing&nbsp;workflow</li>
<li>Printing&nbsp;workflow</li>
<li><span style="text-decoration: line-through;">Generation of bingo cards&nbsp;PDFs</span></li>
<li>Cache saved PDFs to&nbsp;disk</li>
<li>Rewrite content publication to use Prawn &amp; ImageMagick instead of laptop&nbsp;automation</li>
<li>DelayedJob integration to remove PDF generation from HTTP request/response&nbsp;cycle</li>
<li>Lightbox to present download BCC or sign up for BCC.net&nbsp;choice</li>
<li>Lazy logins (no login for guest mode, upsell to free&nbsp;trial)</li>
<li>Free trial upsells to&nbsp;$$$</li>
</ul>
<p>Random&nbsp;tasks</p>
<ul>
<li>Integrate signup with MailChimp API to do autoresponder series for hints &amp;&nbsp;tricks</li>
<li>Set up mailing list for&nbsp;newsletter</li>
<li><span style="text-decoration: line-through;">Resize Slicehost slice to 512MB to accomodate anticipated need for DelayedJob instances and extra&nbsp;Mongrels</span></li>
<li>Blog about why I&#8217;m finally spending time to make a web&nbsp;version</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.kalzumeus.com/2009/05/03/hard-to-get-motivated-some-days/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Major Progress on BCC Web Application</title>
		<link>http://www.kalzumeus.com/2009/04/05/major-progress-on-bcc-web-application/</link>
		<comments>http://www.kalzumeus.com/2009/04/05/major-progress-on-bcc-web-application/#comments</comments>
		<pubDate>Sun, 05 Apr 2009 16:29:56 +0000</pubDate>
		<dc:creator>Patrick</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.kalzumeus.com/?p=601</guid>
		<description><![CDATA[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&#8230; several years late!)&#160; 
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. [...]]]></description>
			<content:encoded><![CDATA[<p>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&#8230; several years late!)&nbsp; </p>
<p>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 &#8220;How do I automatically size text so that it looks visually appealing without requiring user&nbsp;input?&#8221;</p>
<p>Since printing in a web application is sort of hard to control (CSS and usability issues galore), I&#8217;ve opted to generate PDFs, which is a quite common choice.  The <a href="http://prawn.majesticseacreature.com">Prawn library</a> (a new-ish alpha-quality Ruby library for PDF printing) is an absolute lifesaver&thinsp;&#8212;&thinsp;I&#8217;ve got better behavior out of it in 8 hours of playing around then I&#8217;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.&nbsp; </p>
<p>Feast your&nbsp;eyes: </p>
<p><a href="http://www.bingocardcreator.com/blog-images/print-comparison-prawn.gif"><img class="aligncenter" title="Prawn Print Sample" src="http://www.bingocardcreator.com/blog-images/print-comparison-prawn.gif" alt="" width="361" height="511" /></a></p>
<p><a href="http://www.bingocardcreator.com/blog-images/print-comparison-prawn.gif"></a>(I know, Roald Dahl&#8217;s name is screwed up due to some sort of encoding&nbsp;issue.)</p>
<p>Here&#8217;s the <a href="http://www.bingocardcreator.com/bingo-cards/literature/children-authors">same card</a> printed in Bingo Card&nbsp;Creator:</p>
<p><a href="http://www.bingocardcreator.com/images/literature/children-authors.gif?1236266553"><img class="aligncenter" title="Print Sample (Java)" src="http://www.bingocardcreator.com/images/literature/children-authors.gif?1236266553" alt="" width="320" height="320" /></a></p>
<p>I really prefer the Prawn version to the Java version for out of the box&nbsp;behavior:</p>
<ul>
<li>prettier autosizing (particularly for the column&nbsp;headers)</li>
<li>better line breaking&nbsp;logic</li>
<li>better centering of the words in the&nbsp;squares</li>
<li>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&nbsp;in)</li>
<li>capability to add watermarks/footers (often requested by, erm,&nbsp;me)</li>
</ul>
<p>Printing is, by my estimation, about 90% accomplished.  (I still need to work out some internationalization kinks and then figure out how I&#8217;m going to generate the PDFs and store them outside of the web request/response cycle&thinsp;&#8212;&thinsp;I don&#8217;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&nbsp;case.)</p>
<p>After I get printing done I still need&nbsp;to:</p>
<ul>
<li>Code GUIs for word entry, loading/saving lists,&nbsp;etc.</li>
<li>Figure out user management (usernames/passwords, forgot password, restricting access appropriately,&nbsp;etc)</li>
<li>Extend my admin interface so that I can address issues that people have, should they have&nbsp;any.</li>
<li>Figure out how to integrate the web app into my site without confusing the heck out of&nbsp;people.</li>
<li>Rewrite a whole lot of copy.  (See the above&nbsp;point.)</li>
<li>Sprinkle my pages with copious sign-up-for-webapp-now calls to&nbsp;action.</li>
<li>Adjusting the BCC client for close-to-seemless integration with the website (save to/load from&nbsp;Internet)</li>
</ul>
<p>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 &#8220;web sites&#8221; are worth paying money for?  This is one of the main reasons I&#8217;m not planning on deprecating the downloadable version anytime&nbsp;soon.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kalzumeus.com/2009/04/05/major-progress-on-bcc-web-application/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Bad Places To Have Bugs: Pricing Logic</title>
		<link>http://www.kalzumeus.com/2009/03/30/bad-places-to-have-bugs-pricing-logic/</link>
		<comments>http://www.kalzumeus.com/2009/03/30/bad-places-to-have-bugs-pricing-logic/#comments</comments>
		<pubDate>Mon, 30 Mar 2009 13:13:58 +0000</pubDate>
		<dc:creator>Patrick</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[bugs]]></category>

		<guid isPermaLink="false">http://www.kalzumeus.com/2009/03/30/bad-places-to-have-bugs-pricing-logic/</guid>
		<description><![CDATA[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 [...]]]></description>
			<content:encoded><![CDATA[<p>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&#8217;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,&nbsp;right?</p>
<p>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&#8217;d get taken to e-junkie&#8217;s fallback hosted cart, where you&#8217;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&nbsp;cart.</p>
<p>But still the $20.00 units kept coming.  Then it hit me&thinsp;&#8212;&thinsp;it wasn&#8217;t actually that edge case, it was a different edge case&thinsp;&#8212;&thinsp;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&nbsp;behavior.</p>
<p>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&#8217;s pricing and the pricing at Paypal/Google Checkout.  Not that I blame them.&nbsp;Grr.  </p>
<p>Memo to self: self, you&#8217;ve said it before, but avoid doing 5 minute changes at&nbsp;midnight.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kalzumeus.com/2009/03/30/bad-places-to-have-bugs-pricing-logic/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Working on Bingo Card Creator 3.0</title>
		<link>http://www.kalzumeus.com/2009/03/28/working-on-bingo-card-creator-30/</link>
		<comments>http://www.kalzumeus.com/2009/03/28/working-on-bingo-card-creator-30/#comments</comments>
		<pubDate>Sat, 28 Mar 2009 12:19:45 +0000</pubDate>
		<dc:creator>Patrick</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.kalzumeus.com/?p=595</guid>
		<description><![CDATA[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&#8217;s on the&#160;agenda:

Fixing a display bug when editing the Free Space! under certain conditions.  (Done&#160;already.)
Moving the default Save/Open directory to the OS-dependent default save directory (i.e. My Documents) rather than the BCC [...]]]></description>
			<content:encoded><![CDATA[<p>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&#8217;s on the&nbsp;agenda:</p>
<ul>
<li>Fixing a display bug when editing the Free Space! under certain conditions.  (Done&nbsp;already.)</li>
<li>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&nbsp;use.</li>
<li>Moving the location of the license file to the user&#8217;s home directory, rather than the BCC program directory.  This is for Vista compatibility and, as an added bonus, it will eliminate the &#8220;reenter your license key&#8221; headache for upgrading Mac users from here on&nbsp;out.</li>
<li><strong>Big feature</strong>: Bingo Card Creator is going all web 2.0 and storing its information in the clooooooooooooud.  Just kidding.  Tentatively labeled &#8220;Save to Internet&#8221; and &#8220;Open from Internet&#8221;, 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&#8217;m going to launch.  (Three guesses as to&nbsp;what.)</li>
<li>Import: While BCC can technically import from a plain text file already, I&#8217;d like to give users an easy cut/paste option to get words into&nbsp;it.</li>
</ul>
<p>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&nbsp;birthday.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kalzumeus.com/2009/03/28/working-on-bingo-card-creator-30/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
