<?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>Preston L. Bannister  { random memes }</title>
	<atom:link href="http://bannister.us/weblog/feed/" rel="self" type="application/rss+xml" />
	<link>http://bannister.us/weblog</link>
	<description>A personal viewpoint about software, the web, and anything else of note.</description>
	<lastBuildDate>Mon, 30 Aug 2010 17:24:14 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title></title>
		<link>http://bannister.us/weblog/2010/08/30/1867/</link>
		<comments>http://bannister.us/weblog/2010/08/30/1867/#comments</comments>
		<pubDate>Mon, 30 Aug 2010 17:24:14 +0000</pubDate>
		<dc:creator>Preston</dc:creator>
				<category><![CDATA[Humor]]></category>

		<guid isPermaLink="false">http://bannister.us/weblog/?p=1867</guid>
		<description><![CDATA[No joke.]]></description>
			<content:encoded><![CDATA[<p><img src="http://imgs.xkcd.com/comics/exoplanets.png" /><br />
No joke.</p>
]]></content:encoded>
			<wfw:commentRss>http://bannister.us/weblog/2010/08/30/1867/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Strict mode for Javascript &#8211; continued</title>
		<link>http://bannister.us/weblog/2010/08/15/strict-mode-for-javascript-continued/</link>
		<comments>http://bannister.us/weblog/2010/08/15/strict-mode-for-javascript-continued/#comments</comments>
		<pubDate>Mon, 16 Aug 2010 02:08:11 +0000</pubDate>
		<dc:creator>Preston L. Bannister</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://bannister.us/weblog/?p=1864</guid>
		<description><![CDATA[Seems the prior post gathered some response. To set expectations &#8211; this is my personal weblog. What I put here is the bits that (to my mind) might be otherwise missing. I am not interested in repeating material covered elsewhere. &#8230; <a href="http://bannister.us/weblog/2010/08/15/strict-mode-for-javascript-continued/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Seems the <a href="http://bannister.us/weblog/2010/07/31/strict-mode-for-javascript/">prior post</a> gathered <a href="http://www.reddit.com/r/javascript/comments/cw0n8/strict_mode_for_javascript/">some response</a>.</p>
<p>To set expectations &#8211; this is my personal weblog. What I put here is the bits that (to my mind) might be otherwise missing. I am not interested in repeating material covered elsewhere. If you are already well-read, then I hope these bits will nudge your thinking forward a bit (even if you do not entirely agree with my conclusions).</p>
<p>On the other had, if you are seriously short of clues, I am not going to help you. Spent enough time on USENET News (long ago) to note the point of diminishing returns. Since I write these bits as an entertainment (of sorts), I am not going to invest a lot of time with folk who are too many laps behind. </p>
<p>Javascript is at heart a dynamic, prototype-based sort of object-oriented language. Most folk coming to Javascript are acquainted with static, class-based languages &#8211; and have little or no experience with anything different. The natural inclination is to transfer learned habits from the old to the new language &#8211; and that is a mistake.</p>
<p>Back in the late-1980&#8242;s or early-1990&#8242;s one writer came up with a classification scheme for object-oriented languages. There were many variations proposed and explored in that time, so a scheme that enumerated the important aspects was very useful. (Wish I knew how to find the article &#8211; it was in an ACM or IEEE publication of that period, I believe.) As a guess, I suspect that most of the current generation of programmers is not aware of the possible variations, and assume all object-oriented languages must be like Java / C++ / C#, and expect the same learned habits to still make sense with Javascript.</p>
<p>Disregarding the usual noise, there is one bit which it is worth responding, as it (quite unintentionally) illustrates my point.<br />
<blockquote>
<b>New</b> gives you prototype inheritance, performance benefits, and it&#8217;s about language semantics.</p></blockquote>
<p>That is <b>exactly</b> my point! &#8230; only the reality differs from the assumptions of the guy making the comment (and I suspect he has a <b>lot</b> of company). Back in the late 1980&#8242;s / early 1990&#8242;s the pragmatic consensus was to move forward with object-oriented languages that could be made to run efficiently on the then-current hardware. How to generate optimal code for static class hierarchies was fairly well understood, at that time. More dynamic object-oriented languages were simply too hard to optimize.</p>
<p>The v8 Javascript engine offers a good example. The combined memory and CPU footprint of an efficient Javascript engine was simply impossible on circa-1990 computers. What is practical and reasonable on current-generation computers was &#8211; twenty years back &#8211; completely not practical.</p>
<p>My reading of the articles on the current-generation Javascript engines was that the toughest problem &#8211; and main aim of implementors &#8211; was to optimize in the absence of static-class hierarchies, and that quasi-static classes are not particularly optimized. </p>
<p>This makes sense. Writing script for web pages is programming in the small. The number of entities on a web page is small, as are the number of repeated instances. Static classes with efficient support for huge numbers of behavior-identical instances are essentially useless in a web page. If you are creating large numbers of instances for a web page, you are almost certainly doing it wrong. (Note the &#8220;flyweight&#8221; class pattern is useful here.)</p>
<p>My assumption (from what I have read) is that &#8220;static&#8221; class hierarchies yield no particular benefit in client-side Javascript.</p>
<p>Assumptions should be checked &#8230; so I wrote a micro-benchmark.</p>
<p><a href="http://bannister.us/examples/js-benchmark-methods/">Method dispatch &#8211; Microbenchmark &#8211; Javascript</a><br />
The aim was to measure method-dispatch for three cases:
<ol>
<li>The method is bound to the instance.</li>
<li>The method is bound to the &#8220;class&#8221; (via the <b>__proto__</b> member).</li>
<li>The method is bound to the &#8220;class&#8221; (via the <b>function</b> invoked via <b>new</b>).</li>
</ol>
<p>What I see (in terms of exact results) will likely vary as each browser vendor tweaks their Javascript engine. The point &#8211; in the case of the current discussion &#8211; is that static class hierarchies yield no significant advantage. It does make perfect sense that static-class languages can deliver bare-hardware performance numbers (which I do expect to use). For web page script, I expect static-like class usage to yield no significant benefit.</p>
<p>For programmers coming from C++/Java/C#, the notions that made sense no longer apply. Thus the emphasis on <b>denying</b> any semblance to static-class languages. This was exactly my point.</p>
]]></content:encoded>
			<wfw:commentRss>http://bannister.us/weblog/2010/08/15/strict-mode-for-javascript-continued/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Is Tivo still a good bet?</title>
		<link>http://bannister.us/weblog/2010/08/08/is-tivo-still-a-good-deal/</link>
		<comments>http://bannister.us/weblog/2010/08/08/is-tivo-still-a-good-deal/#comments</comments>
		<pubDate>Mon, 09 Aug 2010 00:54:38 +0000</pubDate>
		<dc:creator>Preston L. Bannister</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://bannister.us/weblog/?p=1861</guid>
		<description><![CDATA[I have a Tivo Series 2 that I bought when the model was new. For the most part, I have been very satisfied with the Tivo service &#8230; but not so much lately. There are now many sources for video &#8230; <a href="http://bannister.us/weblog/2010/08/08/is-tivo-still-a-good-deal/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I have a <a href="https://www3.tivo.com/store/clearance-80hourseries2dt.do">Tivo Series 2</a> that I bought when the model was new. For the most part, I have been very satisfied with the Tivo service &#8230; but not so much lately. There are now many sources for video that I would like to watch on the TV, and the Tivo box is not useful for those new sources.</p>
<p>Still &#8230; my Tivo box is relevantly old, and you might expect new features to be introduced mainly on new boxes. This is not a complete excuse &#8211; the Tivo is basically a small computer with a hard disk and a network connection. A software upgrade on the old boxes could do quite a lot, within the hardware capabilities of the box &#8230; and I was paying a subscription fee.</p>
<p>My old non-HD TV finally died, and bought a new HDTV. Time to upgrade the DVR. Do I want to buy a new Tivo? The new Tivo seems a bit &#8230; limited? If I buy the full-up version with the most cost-effective service, the cost is a bit under $900 (without discounts). Do I trust the Tivo company and brand enough to spend that money of their box? Maybe.</p>
<p>When the <a href="http://www.google.com/tv/">Google TV</a> announcement came out, that was enough to defer upgrading the Tivo until I saw Google&#8217;s product.</p>
<p>In the time between, the (not so) good folks at Tivo changed my mind.</p>
<p>Near two months back, the Tivo folk starting sending nasty emails, claiming my credit card was about to expire, and &#8230; let&#8217;s just say I did not appreciate the tone. Somehow they had decided my credit expired, two months before the actual expiration. The updated credit card arrived at the usual time, but by then the Tivo folks had sent a month&#8217;s worth of nasty emails. Just after I got the updated card, I went to the Tivo site, and updated my credit card information with the new expiration. </p>
<p>About a week later I got another nasty email from Tivo. I sent a response.</p>
<p>Guessing I might have made a mistake, somehow, I went back to the Tivo site, and updated my credit card information &#8230; again. Noticed all the fields on the web form offered auto-complete, so obviously I had been to the site recently. (I reset all the saved information in the web browser a couple months back, as a part of testing some of my software.) After submission, I checked the result carefully to be sure that their web application reported success &#8211; and it did.</p>
<p>About a week later, I got an even less pleasant email from Tivo. I sent a response, then I called their support phone number.</p>
<p>Has the Tivo company has gone sour? I have noted a pattern where a business with substantial cash flow is bought out, and the new owners cheapen the product and/or service (presumably with the hope of boosting profits). Customers eventually notice, and start to go elsewhere. In response, the owners further cheapen the product (in hope of maintaining profits on smaller revenue?) &#8230; and the business does badly.</p>
<p>Has the Tivo company been bought out, or adopted the same philosophy? That would explain the slow change in technology, and the unpleasant customer service. </p>
<p>As a good customer, I did exactly what I should, when I could. Personally, I would rather not do business with a rude company. On the phone with Tivo support, I did not appreciate the assumption that the mistake was mine. (I suspect most customers surrender on this point.) I want Tivo to fix the problem, and to not be rude to good customers. I refused to update my credit card information over the phone. Instead they could tell me when they fixed their broken web application, and I would (for the third time) update my information there.</p>
<p>Today it seems they turned off my Tivo service. The fault is theirs for losing a good customer. Probably not a loss. For now, I can wait to see what the Google folk (and associates) deliver.</p>
]]></content:encoded>
			<wfw:commentRss>http://bannister.us/weblog/2010/08/08/is-tivo-still-a-good-deal/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Status check</title>
		<link>http://bannister.us/weblog/2010/08/06/status-check/</link>
		<comments>http://bannister.us/weblog/2010/08/06/status-check/#comments</comments>
		<pubDate>Sat, 07 Aug 2010 06:21:04 +0000</pubDate>
		<dc:creator>Preston L. Bannister</dc:creator>
				<category><![CDATA[Personal]]></category>

		<guid isPermaLink="false">http://bannister.us/weblog/?p=1860</guid>
		<description><![CDATA[A human being should be able to change a diaper, plan an invasion, butcher a hog, conn a ship, design a building, write a sonnet, balance accounts, build a wall, set a bone, comfort the dying, take orders, give orders, &#8230; <a href="http://bannister.us/weblog/2010/08/06/status-check/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<blockquote><p>A human being should be able to change a diaper, plan an invasion, butcher a hog, conn a ship, design a building, write a sonnet, balance accounts, build a wall, set a bone, comfort the dying, take orders, give orders, cooperate, act alone, solve equations, analyze a new problem, pitch manure, program a computer, cook a tasty meal, fight efficiently, die gallantly. Specialization is for insects.</p></blockquote>
<p> &#8212; from <a href="http://en.wikiquote.org/wiki/Robert_A._Heinlein">Robert A. Heinlein</a></p>
<p>Refactoring &#8230; to what I want yet to do.
<ul>
<li>Design and build a house that <i>works well</i>.</li>
<li>Practical knowledge of firearms.</li>
<li>Learn to hunt, and butcher the animal, after.</li>
<li>Learn to fly an airplane.</li>
<li>Design and build an airplane.</li>
</ul>
<p>In roughly the above order.</p>
]]></content:encoded>
			<wfw:commentRss>http://bannister.us/weblog/2010/08/06/status-check/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Strict mode for Javascript</title>
		<link>http://bannister.us/weblog/2010/07/31/strict-mode-for-javascript/</link>
		<comments>http://bannister.us/weblog/2010/07/31/strict-mode-for-javascript/#comments</comments>
		<pubDate>Sun, 01 Aug 2010 02:09:54 +0000</pubDate>
		<dc:creator>Preston L. Bannister</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://bannister.us/weblog/?p=1858</guid>
		<description><![CDATA[A small item&#8230; Javascript is a hash (pun not entirely intended). There are good parts to Javascript, and bad parts. For folk attempting to learn Javascript for the first time, they could use some help avoiding the icky bits. My &#8230; <a href="http://bannister.us/weblog/2010/07/31/strict-mode-for-javascript/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>A small item&#8230;</p>
<p>Javascript is a hash (pun not entirely intended). There are <a href="http://javascript.crockford.com/javascript.html">good parts</a> to Javascript, and bad parts. For folk attempting to learn Javascript for the first time, they could use some help avoiding the icky bits.</p>
<p>My first cut at rules for a &#8220;strict&#8221; mode for Javascript:
<ul>
<li>No use of &#8220;function name(){}&#8221; declarations</li>
<li>No use of &#8220;document.write()&#8221;</li>
<li>No use of &#8220;new&#8221;</li>
</ul>
<p>No doubt I could come up with more rules, with a bit more reflection, but this is a start.</p>
<p><b>No use of &#8220;function name(){}&#8221; declarations</b><br />
There are two means of declaring functions, and I strongly prefer the second form. Programmers coming from other languages tend most often to use this form:</p>
<pre>
function foo() {
}
</pre>
<p>For an entire collection of reasons I prefer this form:</p>
<pre>
var foo = function() {
};
</pre>
<p>The second form is better suited for later refactoring, and offers subtle emphasis to the learning programmer of the <i>difference</i> offered by Javascript. The first form can also lead to subtle bugs (which I do not want to explain) &#8211; certainly not what you need when first learning a rather different language.</p>
<p>As a partial hint, I tend to make rather a lot of use of namespaces, so my function declarations most often look like this:</p>
<pre>
var ZOT = {};
ZOT.foo = function() {
};
</pre>
<p>Or in the more elaborate use:</p>
<pre>var ZOT = (function() {
    var foo = function() {
    };
    return {
        foo: foo
    };
})();</pre>
<p>This last form makes full use of closures, and allows for private data and functions.</p>
<p><b>No use of &#8220;document.write()&#8221;</b><br />
Programmers tend to want to generate HTML from program code. This is a huge mistake. </p>
<p>To me this is a classic application of separation of concerns. HTML describes page structure. CSS describes page presentation. Script describes dynamic behaviors. Best to keep each concern separate.</p>
<p><b>No use of &#8220;new&#8221;</b><br />
On this point I am certain others will differ. They might even be right. Certainly the &#8220;new&#8221; operator is of huge advantage in static languages. But that is not the domain of Javascript &#8211; certainly in the web browser, and possibly even for server-side usage.</p>
<p>The &#8220;new&#8221; operator misleads programmers when first learning Javascript. The pattern of usage most appropriate to a static-class language is not the same as the most appropriate usage in an entirely dynamic language.</p>
<p><b>Conflicted over Crockford</b><br />
There is a measure of irony in the last point. <a href="http://en.wikipedia.org/wiki/Douglas_Crockford">Douglas Crockford</a> has consistently served to promote better usage of Javascript. Crockford was hired by Yahoo. The quite elaborate user interface library in Javascript developed by Yahoo, is first invoked with &#8220;new YUI()&#8221;. <a href="http://developer.yahoo.com/yui/">YUI</a> obviously represents a substantial body of work, at least partially in what seems the right direction. Yet I cannot yet quite get past the beginning.</p>
]]></content:encoded>
			<wfw:commentRss>http://bannister.us/weblog/2010/07/31/strict-mode-for-javascript/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Perfect Pineapple Pizza</title>
		<link>http://bannister.us/weblog/2010/07/30/perfect-pineapple-pizza/</link>
		<comments>http://bannister.us/weblog/2010/07/30/perfect-pineapple-pizza/#comments</comments>
		<pubDate>Sat, 31 Jul 2010 04:56:51 +0000</pubDate>
		<dc:creator>Preston L. Bannister</dc:creator>
				<category><![CDATA[Personal]]></category>

		<guid isPermaLink="false">http://bannister.us/weblog/?p=1856</guid>
		<description><![CDATA[Bit of nonsense&#8230;. Have experimented occasionally but steadily on how to make really good pizza. I do not have a massive coal-fired brick oven, so I have to make do with a slightly fancy counter-top oven. Note also that I &#8230; <a href="http://bannister.us/weblog/2010/07/30/perfect-pineapple-pizza/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Bit of nonsense&#8230;.</p>
<p>Have experimented occasionally but steadily on how to make really good pizza. I do not have a massive coal-fired brick oven, so I have to make do with a slightly fancy counter-top oven. Note also that I am allergic to tomato, onion, and garlic &#8211; so the most common recipes are not useful.</p>
<p>Early on I made mushroom and sausage pizzas, and got decent results. Turns out a simpler(?) pineapple pizza is harder to get right. My kids have many likes and dislikes, but they all like pineapple pizzas.  So the occasional challenge &#8211; every week or so &#8211; is to make a better pineapple pizza. Got results my kids happily accept a long time back, but I was not satisfied.</p>
<p>Tricks that get closer to that perfect pizza:</p>
<ul>
<li>Empty a can of crushed pineapple into a sieve, dump yeast and a bit of flour into the juice, and put the mix into a warm (120&deg;F) oven for an hour. The yeast go nuts, and add a bit to the flavor of the eventual crust.</li>
<li>Add a bit of fresh-ground black pepper to the pineapple. My daughter did not notice the pepper, but liked the result (as did I).</li>
<li>Dry out/caramelize the pineapple a bit &#8211; one hour at 250&deg;F seems a good start.</li>
<li>Add the shredded mozzarella to the pineapple, before topping the pizza.</li>
<li>Add sliced (and drained) olives to the topping. The saltiness of the olives nicely accentuate the sweetness of the pineapple.</li>
<li>Add a bit of olive oil to the topping.</li>
<li>Add lemon juice to the topping. The sweetness and acidity boosts the pineapple.</li>
<li>Add flour to the starter to make a dough, spread on a pizza pan, add topping, and put in a 120&deg;F oven for 30 minutes. The sugar from the lemon juice seems to boost the yeast in the dough, and adds a bit of lemony flavor.</li>
<li>Set the oven to 425&deg;F for 15 minutes (or less &#8211; watch carefully).</li>
<li>&#8230; and I am still working on this. Results are good, and improving.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://bannister.us/weblog/2010/07/30/perfect-pineapple-pizza/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Vodka and Lime</title>
		<link>http://bannister.us/weblog/2010/07/24/vodka-and-lime/</link>
		<comments>http://bannister.us/weblog/2010/07/24/vodka-and-lime/#comments</comments>
		<pubDate>Sun, 25 Jul 2010 05:35:25 +0000</pubDate>
		<dc:creator>Preston L. Bannister</dc:creator>
				<category><![CDATA[Personal]]></category>

		<guid isPermaLink="false">http://bannister.us/weblog/?p=1855</guid>
		<description><![CDATA[Random bit&#8230; The cover of &#8220;Hazy Shade of Winter&#8221; by the Bangles is one rare instance where the copy surpasses the original. The original is great. The cover by the Bangles is better. (Even minus the &#8220;babe&#8221; factor.) My only &#8230; <a href="http://bannister.us/weblog/2010/07/24/vodka-and-lime/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Random bit&#8230;</p>
<p>The cover of <a href="http://www.youtube.com/results?search_query=hazy+shade+of+winter+bangles&#038;aq=0">&#8220;Hazy Shade of Winter&#8221; by the Bangles</a> is one rare instance where the copy surpasses the original. The <a href="http://en.wikipedia.org/wiki/A_Hazy_Shade_of_Winter">original</a> is great. The cover by the Bangles is better. (Even minus the &#8220;babe&#8221; factor.)</p>
<p>My only wish is for a longer version.</p>
]]></content:encoded>
			<wfw:commentRss>http://bannister.us/weblog/2010/07/24/vodka-and-lime/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>VirtualBox as free software</title>
		<link>http://bannister.us/weblog/2010/07/16/virtualbox-as-free-software/</link>
		<comments>http://bannister.us/weblog/2010/07/16/virtualbox-as-free-software/#comments</comments>
		<pubDate>Fri, 16 Jul 2010 20:23:35 +0000</pubDate>
		<dc:creator>Preston L. Bannister</dc:creator>
				<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://bannister.us/weblog/?p=1853</guid>
		<description><![CDATA[File this under &#8220;Missing the Obvious&#8221;. I bought VMware Workstation several years back. Used virtual machines quite a lot in developing and testing software. The company I work for licensed the enterprise version of VMware, at least in part due &#8230; <a href="http://bannister.us/weblog/2010/07/16/virtualbox-as-free-software/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>File this under &#8220;Missing the Obvious&#8221;.</p>
<p>I bought VMware Workstation several years back. Used virtual machines quite a lot in developing and testing software. The company I work for licensed the enterprise version of VMware, at least in part due to developer experience using VMware. A few of the VMs currently hosted under the enterprise version of VMware started out running under VMware on my desktop.</p>
<p>A few years back &#8211; well after EMC acquired VMware &#8211; I got the distinct impression that the desktop version of VMware was somewhat neglected. I was losing increasing amounts of time to locked-up VMs, messed up keymaps, and even main desktop lockup. This provided an incentive to try Sun&#8217;s VirtualBox, which proved more reliable for my usage.</p>
<p>Oracle gained ownership of the VirtualBox software with the Sun acquisition. Is there any strong reason for Oracle to offer and develop the &#8220;free&#8221; version of VirtualBox, or will the desktop version of VirtualBox suffer the same apparent neglect as did the the desktop version of VMware? </p>
<p>Of late I was reviewing the documentation we sent to our customers with the last software release, as we are rolling up to a small update in the near future, and a larger release a bit later. In the documentation we send to customers, we have a prominent declaration of support for running under VMware. This was an easy declaration to make, as developers used VMware heavily in development and testing. We knew our product ran under VMware.</p>
<p>Now this is somewhat less true. Certainly the more elaborate test setups (mine) are all run under VirtualBox. I expect things all still work under VMware, but I personally no longer have a basis to make that assertion. For the next release, we will likely add an statement of support for VirtualBox.</p>
<p>As to the obvious bit I had missed: </p>
<p>Many of our customers are still not using virtualization software. Generally customers move from a physical machine to a VM at the time of a major version upgrade. At the next major version upgrade, we will offer a recommendation for VirtualBox.</p>
<p>Oh. Right. I had forgotten about that multiplier. Selling enterprise virtualization to our customers represents <b>many</b> more opportunities than any in-house usage at our development outfit. Nevermind my misgivings &#8211; offering free software to developers is about the best advertising Oracle could buy. </p>
<p>Does Oracle know this?</p>
]]></content:encoded>
			<wfw:commentRss>http://bannister.us/weblog/2010/07/16/virtualbox-as-free-software/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Odds and ends in testing with Active Directory</title>
		<link>http://bannister.us/weblog/2010/07/12/odds-and-ends-in-testing-with-active-directory/</link>
		<comments>http://bannister.us/weblog/2010/07/12/odds-and-ends-in-testing-with-active-directory/#comments</comments>
		<pubDate>Tue, 13 Jul 2010 03:03:26 +0000</pubDate>
		<dc:creator>Preston L. Bannister</dc:creator>
				<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://bannister.us/weblog/?p=1852</guid>
		<description><![CDATA[Of late, I have needed to test against Microsoft&#8217;s Active Directory &#8211; so I setup a virtual machine hosting Windows 2003 Server and configured as a domain controller. The domain controller is connected to small number of machines (also VMs) &#8230; <a href="http://bannister.us/weblog/2010/07/12/odds-and-ends-in-testing-with-active-directory/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Of late, I have needed to test against Microsoft&#8217;s Active Directory &#8211; so I setup a virtual machine hosting Windows 2003 Server and configured as a domain controller. The domain controller is connected to small number of machines (also VMs) on a private network &#8211; pretty much what you would expect for a tightly controlled test setup.</p>
<p>One surprise in the experience was the difficulty in getting the domain controller (and DHCP setup) properly working. Admittedly, setting up a domain controller is a somewhat unusual task. As a rare task perhaps not so important to Microsoft as a process that needs the user experience optimized. Still, given I have long been well-acquainted with how this all works at a network level, I ended up wasting a surprising amount of time trying to find the right knobs to turn. (Much searching with Google to get a key Microsoft product to work &#8230; the irony.)</p>
<p>Oddly, all the nice GUI interfaces to administering a domain server actually make the process <b>more obscure</b> than the equivalent activity on Unix (where I am accustomed to configuration kept in text files). I do now better understand my past conversations with network administrators who did not know how to do (what I considered) simple tasks with Microsoft&#8217;s domain controller &#8230; and why they often got it wrong. </p>
<p>Since my aim was testing, I wrote programs to populate Active Directory with large/variable numbers of users and groups, and to cleanup after. Though you could make direct Active Directory or LDAP calls, I find Microsoft&#8217;s <b>ldifde</b> utility is quite useful for this purpose. Note that Active Directory uses tombstones to support distributed replication (which is good), and that scripted changes will leave behind many tombstones &#8211; which may perturb your testing. You can limit the scope of the impact by changing the <a href="http://msdn.microsoft.com/en-us/library/ms680306(VS.85).aspx">tombstone lifetime</a> &#8211; the period of time tombstones are kept before cleanup &#8211; from the default down to 2(?) days. (Finding and <a href="http://www.petri.co.il/changing_the_tombstone_lifetime_windows_ad.htm">changing</a> that single setting ate up the large part of day.)</p>
<p>(Had a flashback to the old original text-based <a href="http://en.wikipedia.org/wiki/Colossal_Cave_Adventure">Adventure</a> game. &#8220;You are in a maze of twisty passages, all alike.&#8221;)</p>
<p>Another approach is to take a snapshot of the VM when Active Directory is in a &#8220;clean&#8221; state, and restore the snapshot later. In principle this could be simpler/faster than the scripted restore (using delete operations fed via <b>ldifde</b>). Found a quite thorough article on <a href="http://blogs.technet.com/b/askds/archive/2010/06/10/how-to-virtualize-active-directory-domain-controllers-part-1.aspx">virtualizing Active Directory</a>, and ran across the <a href="http://www.google.com/search?sourceid=chrome&#038;ie=UTF-8&#038;q=USN+ROLLBACK">USN ROLLBACK</a> problem.</p>
<p>To aid in distributed replication, Active Directory keeps a count of local changes (the USN number) to track replication of remote changes. All quite usual and normal for this problem domain. Given that Active Directory has been around for a decade, you would expect the obvious use-cases to be covered, but not quite&#8230;.</p>
<p>Turns out if you distribute changes among more than one Active Directory controller, you have a problem in the not-unusual case of taking a backup (or a snapshot) and restoring it later. Thus the many items returned by the above web search, including <a href="http://msexchangeteam.com/archive/2005/11/30/415345.aspx">developers at Microsoft</a>.</p>
<p>Um &#8230; what?!? Seems to me this is a pretty common case. That Microsoft would have got this wrong in the first version back in 2000 is only slightly disappointing. That this is still a problem a decade later is very surprising indeed.</p>
<p>Given that I may for future test purposes need to add a second domain controller VM, this looks to be another problem to avoid.</p>
]]></content:encoded>
			<wfw:commentRss>http://bannister.us/weblog/2010/07/12/odds-and-ends-in-testing-with-active-directory/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java for Business = Zinger from Oracle</title>
		<link>http://bannister.us/weblog/2010/06/22/java-for-business-zinger-from-oracle/</link>
		<comments>http://bannister.us/weblog/2010/06/22/java-for-business-zinger-from-oracle/#comments</comments>
		<pubDate>Wed, 23 Jun 2010 06:08:13 +0000</pubDate>
		<dc:creator>Preston L. Bannister</dc:creator>
				<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://bannister.us/weblog/?p=1851</guid>
		<description><![CDATA[Last year Marsh Ray found a potential vulnerability in TLS renegotiation. The Oracle Java folk responded by disabling renegotiation entirely in the Java Runtime. This is not a fix, as it breaks usage for a large class of security-oriented sites. &#8230; <a href="http://bannister.us/weblog/2010/06/22/java-for-business-zinger-from-oracle/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Last year Marsh Ray found a <a href="http://extendedsubset.com/?p=8">potential vulnerability in TLS renegotiation</a>. The Oracle Java folk responded by <a href="http://java.sun.com/javase/javaseforbusiness/docs/TLSReadme.html">disabling renegotiation entirely in the Java Runtime</a>. This is not a fix, as it breaks usage for a large class of security-oriented sites. A rather large group of folk now find that their once-secure applications no longer work &#8211; and are not happy.</p>
<p>At first, there was no word from Oracle on a real fix &#8230; then I received this email. </p>
<blockquote><p>
Hi Preston,<br />
Good to hear from you. Have I told you what a fine group of folks there is at Oracle Java? No? That&#8217;s because there isn&#8217;t.<br />
<i>[snip]</i></p>
<p>Anyway I ended up talking with some people in Oracle (our SES in DC called the president of Oracle) and several people later a VP of security called me. Anyway the fix will contain 3 implementations low, medium and high security and he claims it will take a significant amount of work in the application software to implement any of them. The release is expected by September. <b>The gotcha is the VP told me that they will only release the JRE to licensed JRE users.</b> I told him the JRE has always been a free download and he responded with &#8220;free download not free use&#8221;. In order to use the JRE you must have a support contract in place and it appeared to him the DoD was a couple million licenses out of compliance. Apparently it was only free until they came up with this Java for Business thing they have now. In my experience it&#8217;s a very Oracle response. Quite the opposite to my dealings with Microsoft.</p>
<p>I guess time will tell&#8230;.<br />
<i>[snip]</i></p></blockquote>
<p>(Emphasis is mine. All identifying information removed.)</p>
<p>Well, we have an answer. Yikes.</p>
<p>To be clear, I believe Oracle is entitled to do whatever they want to make money from Java. Oracle bought Sun, and now they own Java. Sun had a different approach, but Sun failed. Also what Oracle does in the long term may or may not be different from what the above message indicates.</p>
<p>On the flip side, I have to re-consider whether it makes sense to write code for the Java platform. If Oracle is fragmenting the Java platform, and changing the cost to customers &#8230; using Java may no longer make sense. This may be the point where I start planning to move all future work off Java and away from the JVM.</p>
<p>Of course, there is open-source Java, but I am not convinced there is the critical mass of interest required to make open-source Java a viable option. I would very much like to be wrong on this point, but for now, I am skeptical.</p>
<p>Is Google&#8217;s Dalvik VM potentially a viable option? Might IBM&#8217;s investment in Java translate into backing for open-source Java? Is it time to move off the Sun/Oracle JVM entirely?</p>
<p>Time to re-visit choices made long ago&#8230;.</p>
]]></content:encoded>
			<wfw:commentRss>http://bannister.us/weblog/2010/06/22/java-for-business-zinger-from-oracle/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Odd fragment</title>
		<link>http://bannister.us/weblog/2010/06/16/odd-fragment/</link>
		<comments>http://bannister.us/weblog/2010/06/16/odd-fragment/#comments</comments>
		<pubDate>Wed, 16 Jun 2010 16:46:26 +0000</pubDate>
		<dc:creator>Preston L. Bannister</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://bannister.us/weblog/?p=1850</guid>
		<description><![CDATA[Ran across this when reading a product description on Amazon. This item is not for sale in Catalina Island What?!? Note that Catalina Island is a modest-sized inhabited island off the coast of the most populated part of southern California. &#8230; <a href="http://bannister.us/weblog/2010/06/16/odd-fragment/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Ran across this when reading a product description on Amazon.</p>
<blockquote><p>This item is not for sale in Catalina Island</p></blockquote>
<p>What?!?</p>
<p>Note that Catalina Island is a modest-sized inhabited island off the coast of the most populated part of southern California. About the only industry on the island is catering to tourists. There is nothing special about Catalina. My measure of a clear day is when I can see Catalina when coming down the hill from my house.</p>
<p>Turns out, there are <a href="http://www.google.com/search?q=%22This+item+is+not+for+sale+in+Catalina+Island%22">quite a lot of mentions</a>, all in advertisements and product descriptions, and no apparent explanation.</p>
<p>Something smells funny.</p>
<p>As a guess, it looks as though this could all have a common source. All the references I found are roughly similar structure &#8211; as though somewhere the odd item were getting inserted into a stream of product information, which was in turn transformed and piped to a variety of destinations.</p>
<p>Someone trying to be clever?</p>
]]></content:encoded>
			<wfw:commentRss>http://bannister.us/weblog/2010/06/16/odd-fragment/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Anachronisms: Icon for &#8220;Save&#8230;&#8221; is a floppy, HDTV sized in inches</title>
		<link>http://bannister.us/weblog/2010/05/20/anachronisms-icon-for-save-is-a-floppy-hdtv-sized-in-inches/</link>
		<comments>http://bannister.us/weblog/2010/05/20/anachronisms-icon-for-save-is-a-floppy-hdtv-sized-in-inches/#comments</comments>
		<pubDate>Fri, 21 May 2010 07:23:02 +0000</pubDate>
		<dc:creator>Preston L. Bannister</dc:creator>
				<category><![CDATA[Humor]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[user interface]]></category>

		<guid isPermaLink="false">http://bannister.us/weblog/?p=1848</guid>
		<description><![CDATA[Went looking for an icon to represent the &#8220;Save&#8230;&#8221; or &#8220;Save As&#8230;&#8221; operation in an application. The icons I am finding are all images of a floppy disk. For long-time GUI users, this image is familiar and requires no thought. &#8230; <a href="http://bannister.us/weblog/2010/05/20/anachronisms-icon-for-save-is-a-floppy-hdtv-sized-in-inches/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Went looking for an icon to represent the &#8220;Save&#8230;&#8221; or &#8220;Save As&#8230;&#8221; operation in an application. The icons I am finding are all images of a floppy disk. For long-time GUI users, this image is familiar and requires no thought. For newer users &#8230; they may never have seen a floppy disk. The image has become antique. </p>
<p>When was the last time you used a computer with a floppy disk drive? When did you last save a file to a floppy disk? </p>
<p>Seems rather past time for a new icon. <img src='http://bannister.us/weblog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Funny bit is that the square-with-notched-corner shape of a floppy looks rather like an SD memory card. Still not a good choice for file-save, as more likely use is to copy files <i>from</i> the memory card.</p>
<p>Checked to see if Microsoft had any good ideas. Office 2007 uses a image of a floppy for &#8220;Save&#8230;&#8221; and &#8220;Save As&#8230;&#8221; &#8211; adding a pencil writing on the floppy label (an antique behavior) for the &#8220;Save As&#8230;&#8221; icon. Internet Explorer changes &#8220;Save As&#8230;&#8221; so the pencil is writing on the sliding metal cover that protected the magnetic film (not really a good idea).</p>
<p>Went searching through GUI Style Guides looking to see if Microsoft (nope) or Apple (nope) had an updated replacement. Along the way ran across the style guide sections on designing for differing display resolutions. Display resolution is measured in DPI (dots-per-inch) and display sizes are measured in inches. Because both Microsoft Windows and Apple Macintosh software were originally developed on the west coast of the United States, entire generations of programmers and users have learned to think about screen sizes in inches.</p>
<p>Have you noticed that all the HDTVs sold have sizes measured in inches, not in Metric System units?</p>
<p>This is odd, as only the United States still holds firmly to the old &#8220;British Imperial System&#8221; of measures, and HDTVs are not made here. Even odder, in countries that do use the Metric measures, the HDTV sizes are still expressed in inches. (Don&#8217;t believe me? Check out the <a href="http://amazon.fr/">Amazon site in France</a> &#8211; home of the Metric System.)</p>
<p>If only the French had developed Windows &#8230; then the Metric System would have had a chance. <img src='http://bannister.us/weblog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://bannister.us/weblog/2010/05/20/anachronisms-icon-for-save-is-a-floppy-hdtv-sized-in-inches/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WordPress hacked (again)</title>
		<link>http://bannister.us/weblog/2010/05/19/wordpress-hacked-again/</link>
		<comments>http://bannister.us/weblog/2010/05/19/wordpress-hacked-again/#comments</comments>
		<pubDate>Wed, 19 May 2010 22:47:46 +0000</pubDate>
		<dc:creator>Preston L. Bannister</dc:creator>
				<category><![CDATA[Personal]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://bannister.us/weblog/?p=1846</guid>
		<description><![CDATA[On around May 13 someone subverted my weblog to serve pharmacy ads. Annoying, but not otherwise a big deal, given regular backups. This hack was more clever than prior incidents Took me longer to find and remove the problem. I &#8230; <a href="http://bannister.us/weblog/2010/05/19/wordpress-hacked-again/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>On around May 13 someone subverted my weblog to serve pharmacy ads. Annoying, but not otherwise a big deal, given regular backups. This hack was more clever than prior incidents Took me longer to find and remove the problem.</p>
<p>I expect WordPress to be insecure. Looked at the source code early on. Like most PHP applications, the potential attack surface is very large.</p>
<p>Will be a bit before things are entirely in order. (Ick. Using a stock WordPress theme.)</p>
]]></content:encoded>
			<wfw:commentRss>http://bannister.us/weblog/2010/05/19/wordpress-hacked-again/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Stepped on someone&#8217;s gravy train?</title>
		<link>http://bannister.us/weblog/2010/04/21/stepped-on-someones-gravy-train/</link>
		<comments>http://bannister.us/weblog/2010/04/21/stepped-on-someones-gravy-train/#comments</comments>
		<pubDate>Thu, 22 Apr 2010 06:31:29 +0000</pubDate>
		<dc:creator>Preston L. Bannister</dc:creator>
				<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://bannister.us/weblog/?p=1829</guid>
		<description><![CDATA[About five years back I wrote an article with my colorful speculations about a locally advertised business &#8211; Model Quality Introductions. To my slight annoyance, that one article is consistently popular. I was strongly tempted to delete the article, as &#8230; <a href="http://bannister.us/weblog/2010/04/21/stepped-on-someones-gravy-train/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>About five years back I wrote an <a href="http://bannister.us/weblog/2005/07/24/model-quality-introductions/">article</a> with my colorful speculations about a locally advertised business &#8211; <a href="http://www.modelqualityintroductions.com/">Model Quality Introductions</a>.  To my slight annoyance, that one article is consistently popular. I was strongly tempted to delete the article, as I was not comfortable with slightly tawdry speculations as the motivation for folk to visit my weblog.</p>
<p>If you type &#8220;model quality introductions&#8221; as a search string into Google or Bing (but not Yahoo &#8211; oddly), you get the site of the original business, followed immediately by my old weblog article.</p>
<p>This week I got an email (which I promised not to publish without consent) claiming to be from someone personally connected to the business, with the claim I was causing harm to their business. The writer was asking that I remove my old weblog article.</p>
<p>On reading the email there were two apparent possibilities. First, the email could be honest, and an attempt to rectify the unfair harm done by my article. Second, the email could be a lie &#8211; and an attempt by a marketeer (of some form) to eliminate unfavorable mention.</p>
<p>If the first were true, then I very much regret any harm I may have done. I offered to add the sender&#8217;s story, and hopefully offer some balance to readers who might be interested in their business.</p>
<p>If the later were true, then the email is lie, and a simple attempt to suppress any highly visible unfavorable information. </p>
<p>I should add that one of my very first jobs was with a guy who considered himself a super-salesman (Hello, Eric!), and would regularly offer <s>bullshit</s> persuasion on one topic or another. As a result, I tend to detect and reject very early the pattern of expression offered by sales/marketing critters. I should also add that while a teenager &#8211; and as a personal interest &#8211; I read rather a lot about Semantics and Psychology. </p>
<p>You can often tell a lot about a writer&#8217;s background from phrasing and how they express ideas. The initial email sounded rather more like the expressions of a marketeer, and rather less like the claimed source. Still &#8230; this was an uncertain judgement. In my response, I offered to encourage and protect the sender &#8211; if honest (and meant <b>exactly</b> what I wrote). I was &#8211; very carefully &#8211; honest in everything I said. At the same time I dropped in cues that I expected a marketeer would try to interpret as in their interest.</p>
<p>The subsequent responses fit exactly with what I would expect if the writer were a marketeer, and a third-rate mind. With each exchange, my conviction increased that the writer was a marketeer (and a liar).</p>
<p>Still &#8230; I could be wrong. The writer could be exactly as claimed. On that chance, I will honor my promises. On the other hand, my current bet is 10:1 that the writer is a marketeer.</p>
<p>As the exchange aroused my curiosity, I went searching, and found:
<ul>
<li>The online dating business must be hugely profitable, as the number of consultants and related businesses indicate.</li>
<li>The dating-service-with-rich-guys model must be very profitable, as &#8220;Model Quality Introductions&#8221; expanded to more locations &#8211; and there are many imitators.</li>
</ul>
<p>The odds of a hired marketeer &#8211; outside the content of the exchange &#8211; seem rather high. </p>
<p>By analogy, I was playing chess, and the marketeer was playing checkers.<br />
Bit amusing, this. <img src='http://bannister.us/weblog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://bannister.us/weblog/2010/04/21/stepped-on-someones-gravy-train/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Odd &#8230; how is this spam?</title>
		<link>http://bannister.us/weblog/2010/04/18/odd-how-is-this-spam/</link>
		<comments>http://bannister.us/weblog/2010/04/18/odd-how-is-this-spam/#comments</comments>
		<pubDate>Mon, 19 Apr 2010 01:42:39 +0000</pubDate>
		<dc:creator>Preston L. Bannister</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://bannister.us/weblog/?p=1823</guid>
		<description><![CDATA[Attempted to comment on Gosling&#8217;s post. Not that you likely have any shortage of suggestions &#8211; but if in your shoes I would take a close look at the zoo that includes RepRap, CupcakeCNC, and a host of related devices. &#8230; <a href="http://bannister.us/weblog/2010/04/18/odd-how-is-this-spam/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Attempted to comment on <a href="http://nighthacks.com/roller/jag/entry/next">Gosling&#8217;s post</a>.<br />
<blockquote>Not that you likely have any shortage of suggestions &#8211; but if in your shoes I would take a close look at the zoo that includes RepRap, CupcakeCNC, and a host of related devices. Feels very much like the experimentation with small microprocessor-based computers of the late 1970&#8242;s. Maker&#8217;s Faire is next month (in the SF area), so there will be lots to see first-hand. Whether you are interested in building small fabricators, or in the software (and these devices are very software-intense) &#8230; this is very, very interesting stuff. Just as small computers transformed the world over a couple decades, I expect this smart, small-scale, on-demand fabrication will transform manufacture.
</p></blockquote>
<p>The automated response:<br />
<blockquote>
Your comment was marked as spam and will not be displayed.<br />
Comment contains blacklisted/ignored words
</p></blockquote>
<p>What exactly in the above comment is likely to be taken as spam, and/or blacklisted??</p>
<p>After a bit of experimentation &#8230; it seems Gosling does not like <b>me</b>. Guess that is an achievement of sorts.</p>
]]></content:encoded>
			<wfw:commentRss>http://bannister.us/weblog/2010/04/18/odd-how-is-this-spam/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Rude tax-time gift from past Republicans</title>
		<link>http://bannister.us/weblog/2010/04/16/rude-tax-time-gift-from-past-republicans/</link>
		<comments>http://bannister.us/weblog/2010/04/16/rude-tax-time-gift-from-past-republicans/#comments</comments>
		<pubDate>Fri, 16 Apr 2010 16:23:36 +0000</pubDate>
		<dc:creator>Preston L. Bannister</dc:creator>
				<category><![CDATA[Personal]]></category>
		<category><![CDATA[taxes]]></category>

		<guid isPermaLink="false">http://bannister.us/weblog/?p=1815</guid>
		<description><![CDATA[Having just done my taxes (oh so early), thought I should note one really nasty zinger left behind from the Bush years, and the supposedly tax-adverse Republican Congress. When one of your dependents hits 17 years old, they no longer &#8230; <a href="http://bannister.us/weblog/2010/04/16/rude-tax-time-gift-from-past-republicans/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Having just done my taxes (oh so early), thought I should note one really nasty zinger left behind from the Bush years, and the supposedly tax-adverse Republican Congress.</p>
<p>When one of your dependents hits 17 years old, they no longer count as an exemption at tax time. Best name I can think of for this is the &#8220;Fuck-You Middle Class Parents of Teenagers&#8221; change in the tax law. If you are poor enough, or rich enough, this change in exemptions probably does not make a noticeable difference. </p>
<p>A 17-year old is in reality still very much a dependent. As parent, I can assure you that the expenses for 17-year olds are higher (much!) than at any other time &#8211; so there is no logical sense to this. </p>
<p>There is another even nastier interpretation &#8211; the aim was to put economic stress on families so as to pump more kids into the military. Need more bodies to fight those post-9/11 wars! (But not kids of politicians or rich Republicans.) When my oldest (now 21) hit 17, the change was new enough that the IRS website was only partly-updated, and I got very confused trying to figure out what was right. </p>
<p>What a nice <s>turd</s> parting gift left behind by the Republicans. Either the Republicans did not care about pissing off that part of the demographic, or they hoped it would be forgotten by election time.</p>
]]></content:encoded>
			<wfw:commentRss>http://bannister.us/weblog/2010/04/16/rude-tax-time-gift-from-past-republicans/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Less noise</title>
		<link>http://bannister.us/weblog/2010/04/10/less-noise/</link>
		<comments>http://bannister.us/weblog/2010/04/10/less-noise/#comments</comments>
		<pubDate>Sat, 10 Apr 2010 09:29:25 +0000</pubDate>
		<dc:creator>Preston L. Bannister</dc:creator>
				<category><![CDATA[Personal]]></category>

		<guid isPermaLink="false">http://bannister.us/weblog/?p=1812</guid>
		<description><![CDATA[After a good long trial, I went through and deleted a bunch of &#8220;social&#8221; accounts. Found my time and attention taken, to no significant end. I tend to go through this exercise, regularly. Listen to lots of things for a &#8230; <a href="http://bannister.us/weblog/2010/04/10/less-noise/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>After a good long trial, I went through and deleted a bunch of &#8220;social&#8221; accounts. Found my time and attention taken, to no significant end. I tend to go through this exercise, regularly. Listen to lots of things for a while, then prune heavily. </p>
<p>Time to prune.</p>
<p>Twitter never really made sense. Too much idle chatter. Clearly some like the short-snippet format. Clearly some like a noisy, distraction-filled environment. Not me.</p>
<p>Google Buzz seems an improved variant of Twitter. Good for Google. Good for chatty folk. Not for me.</p>
<p>Getting rid of MySpace was a relief. Always found both the quality of construction, and the (unstated) premise &#8230; revolting. Good riddance.</p>
<p>Friendster was never useful. There are likely a bunch of other tertiary &#8220;social&#8221; sites where I poked around, but found no use. Will kill when they bug me. </p>
<p>Facebook is the most recently-popular. Had an account there since it was mostly college kids. A year or so back, a bunch of folk I knew suddenly started showing up. Spent a lot of time there. Did not accomplish much.</p>
<p>Will keep Flickr (for sharing photos) &#8211; at least for now. Google Reader is immensely useful for tracking many things, and finding longer more thoughtful communications.</p>
]]></content:encoded>
			<wfw:commentRss>http://bannister.us/weblog/2010/04/10/less-noise/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Do you trust Oracle?</title>
		<link>http://bannister.us/weblog/2010/03/31/do-you-trust-oracle/</link>
		<comments>http://bannister.us/weblog/2010/03/31/do-you-trust-oracle/#comments</comments>
		<pubDate>Thu, 01 Apr 2010 05:45:53 +0000</pubDate>
		<dc:creator>Preston L. Bannister</dc:creator>
				<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://bannister.us/weblog/?p=1809</guid>
		<description><![CDATA[The death of Sun, and the submission to Oracle &#8211; as a developer &#8211; leaves me with doubts about Java. Sun was always a bit of a mixed bag. Some of their work was absolutely brilliant, and some &#8211; especially &#8230; <a href="http://bannister.us/weblog/2010/03/31/do-you-trust-oracle/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>The death of Sun, and the submission to Oracle &#8211; as a developer &#8211; leaves me with doubts about Java.</p>
<p>Sun was always a bit of a mixed bag. Some of their work was absolutely brilliant, and some &#8211; especially with software &#8211; was amazingly dumb. Never did really understand why this was the case. (Lots of theories, of course, but no certain grasp.)</p>
<p>Oracle is a very different mixed bag. The Oracle database is both a very solid piece of work, and old not-quite-irrelevant to the present and future (an intentional over-simplification.) The Oracle database is core to Oracle the company. On the other hand, Oracle (the company) is also heavily invested in applications and software that cluster around the Oracle database. Much of this software is written in Java (for very logical reasons). This would seem to guarantee the future of Java (as a platform).</p>
<p>But &#8230; the Oracle-core has a diminishing (if very fat) future. That fat future can stretch out quite a while &#8211; beyond obvious reason &#8211; as the IBM mainframe market proved.</p>
<p>As a developer, I find that I crossed a threshold some time back, and am impatient with Java when I can express more elegant solutions (to complex problems) in Javascript. (Yes, really &#8211; Javascript. May have something to do with early heavy exposure to Lisp in school.) Hearing that C# incorporates lambdas &#8230; is C# a better base than Java (with appropriate wariness of stealth Microsoft patents), or rather an extraneous step before bundling a Javascript interpreter? </p>
<p>Do you trust Oracle?</p>
]]></content:encoded>
			<wfw:commentRss>http://bannister.us/weblog/2010/03/31/do-you-trust-oracle/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Re-thinking the IDE &#8211; a starting point</title>
		<link>http://bannister.us/weblog/2010/03/15/re-thinking-the-ide-a-starting-point/</link>
		<comments>http://bannister.us/weblog/2010/03/15/re-thinking-the-ide-a-starting-point/#comments</comments>
		<pubDate>Tue, 16 Mar 2010 05:27:37 +0000</pubDate>
		<dc:creator>Preston L. Bannister</dc:creator>
				<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://bannister.us/weblog/?p=1753</guid>
		<description><![CDATA[Time for another user-interface rant. Use of multi-column lists One of my favorite annoyances is multi-column lists. When they first appeared in the early 1990&#8242;s, multi-column lists were cool. Add in user-sortable and re-sizable columns, and your application could offer &#8230; <a href="http://bannister.us/weblog/2010/03/15/re-thinking-the-ide-a-starting-point/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Time for another user-interface rant. <img src='http://bannister.us/weblog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h3>Use of multi-column lists</h3>
<p>One of my favorite annoyances is multi-column lists. When they first appeared in the early 1990&#8242;s, multi-column lists were cool. Add in user-sortable and re-sizable columns, and your application could offer better eye-candy than the competitors.</p>
<p>The usual problem with multi-column lists was that the columns came up the wrong size. Some applications were smart enough to auto-size columns &#8211; but not all &#8211; and auto-sizing was not always what the user wanted. The next logical enhancement was to save user preferences for column sizes, so that the next time the application came up, the user&#8217;s prior manual adjustments to column width were preserved. If the most-useful column widths change with different data, the users spend a lot of time manually fiddling with column widths.</p>
<p>As an example, we have the (really lame) Services view in Microsoft Windows. When this first appeared (in the mid-1990&#8242;s) the columns both (1) came up the wrong size, (2) in the wrong order (another topic), and (3) did not save user preferences. At the time, I figured this was a work in progress, and the Microsoft folk would fix this in a couple years.  </p>
<p>The screenshot below is from Windows 7, so &#8230; apparently not.</p>
<pre><a href="http://bannister.us/weblog/wp-content/uploads/2010/03/windows-services.png"><img src="http://bannister.us/weblog/wp-content/uploads/2010/03/windows-services-300x219.png" width="300" height="219" /></a></pre>
<p>The Eclipse IDE uses multi-column lists for compiler error messages (and the like). Eclipse might be my current-favorite IDE, but this is one of my least-favorite aspects. </p>
<pre><a href="http://bannister.us/weblog/wp-content/uploads/2010/03/eclipse-big-1-console.png"><img src="http://bannister.us/weblog/wp-content/uploads/2010/03/eclipse-big-1-console-300x187.png" width="300" height="187" /></a></pre>
<p>Note that basically all the columns are the wrong size. The error message text is most important, and is too small, with only a fraction visible. That makes any less-important column too-large, by definition. The column with the most excess whitespace &#8211; &#8220;Type&#8221; &#8211; is one of the least important. The &#8220;Path&#8221; column occupies a lot of space, but is of at best secondary importance. </p>
<p>The most important bit of the &#8220;Problems&#8221; panel is tiny.</p>
<pre><a href="http://bannister.us/weblog/wp-content/uploads/2010/03/eclipse-big-1-console-effective.png"><img src="http://bannister.us/weblog/wp-content/uploads/2010/03/eclipse-big-1-console-effective-300x187.png" width="300" height="187"  /></a></pre>
<p>Note also that in the above screenshot, the overhead elements in the panel eat up about half the vertical space &#8211; far more space than the most-meaningful message texts. </p>
<p>This is not efficient &#8230;  on a large 1920&#215;1200 panel. On smaller panels, things are much worse.</p>
<h3>Presenting program texts</h3>
<p>The main payload in an IDE is the display of program text. An IDE may put up supplemental panels to help discover structure and aid navigation within the program, but the central bit is the program text. In Eclipse only a fraction of the screen is usable for the display of program text.</p>
<p>Current screens are more than wide enough for pretty much all program texts, but those same texts are far taller than they are wide. As screens are far shorter than program texts, you want to make the best use of the vertical space available. Only about 2/3 of the screen height is text, in the typical example below.</p>
<pre><a href="http://bannister.us/weblog/wp-content/uploads/2010/03/eclipse-big-1-text1.png"><img src="http://bannister.us/weblog/wp-content/uploads/2010/03/eclipse-big-1-text1-300x187.png" width="300" height="187" /></a></pre>
<p>With Eclipse you can &#8220;maximize&#8221; the text panel, but there is still substantial vertical space lost to overhead elements.</p>
<pre><a href="http://bannister.us/weblog/wp-content/uploads/2010/03/eclipse-big-2-text.png"><img src="http://bannister.us/weblog/wp-content/uploads/2010/03/eclipse-big-2-text-300x187.png" width="300" height="187" /></a></pre>
<p>Note also that while there is a shortage of vertical space, there is an excess of unused horizontal space. </p>
<p>This is not efficient &#8230;  on a large 1920&#215;1200 panel. On smaller panels, things are much worse.</p>
<h3>Alternate presentations</h3>
<p>To make the best use of scarce vertical space &#8211; especially on smaller panels &#8211; you want to excise vertical overhead. Program texts tend to be dense on the left edge, and sparse on the right. For the display of error messages or navigation aids, if you place panels on the right, there is good chance you will overlap little or no program text. If you use fly-away panels, you can quickly view even very long lines of program text on the smallest-current laptop displays.</p>
<p>There is a simple/clever way around the presentation of variable-sized columns &#8211; concatenate all the variable size bits into one column. You can keep the fixed sized bits as columns (or not). If the resulting text is too wide for the available column space, allow the text to wrap. Excise the less-useful fields, and present on explicit user action (like hovering or clicking on the row).</p>
<p>Note that too-wide message texts can be hard (or slow) to read. (Ever lose track of the line you are on when looking across a very wide display?) There is a good argument for limiting the width of message texts to about the width of a typical piece of paper. (Funny how that works out &#8211; common paper width tends to be about the efficient maximum for text width.)</p>
<p>Combine the notions for maximal program text and complete-but-constrained message texts, and you might end up with something like this <a href="http://bannister.us/examples/concept-demo-1/">simple IDE mock-up</a>. (Note this is very much a quick-and-dirty first iteration.)</p>
<p>At 1920&#215;1200 &#8211; on a 24&#8243; desktop panel.</p>
<pre><a href="http://bannister.us/weblog/wp-content/uploads/2010/03/ide-concept-demo-1-full-large.png"><img src="http://bannister.us/weblog/wp-content/uploads/2010/03/ide-concept-demo-1-full-large-300x187.png" width="300" height="187" /></a></pre>
<p>(Best to pull this up in Google Chrome, as only Chrome does a really good maximum size full-screen. Works in Safari. Renders in Firefox, though event handling is wrong. IE is pretty much hopeless. As this is a mockup, my aim was not to make it work across web browsers.)</p>
<p>Note that as the screen size drops, the use of screen space becomes radically better than conventional IDEs.</p>
<p>At 1440&#215;900 &#8211; the resolution of my 17&#8243; laptop panel.</p>
<pre><a href="http://bannister.us/weblog/wp-content/uploads/2010/03/concept-demo-1440x900.png"><img src="http://bannister.us/weblog/wp-content/uploads/2010/03/concept-demo-1440x900-300x187.png" width="300" height="187"  /></a></pre>
<p>(Imagine the vertical overhead of Chrome as a part of the text-space.)</p>
<p>At 1280&#215;800 &#8211; the resolution of common basic laptop panels.</p>
<pre><a href="http://bannister.us/weblog/wp-content/uploads/2010/03/concept-demo-1280x800.png"><img src="http://bannister.us/weblog/wp-content/uploads/2010/03/concept-demo-1280x800-300x187.png" width="300" height="187" /></a></pre>
<p>Note that on this smallish laptop we are getting both more vertical program text, and more complete message texts, than on my big 1920&#215;1200 panel using Eclipse.</p>
<p>At 1024&#215;600 &#8211; the resolution of a netbook panel.</p>
<pre><a href="http://bannister.us/weblog/wp-content/uploads/2010/03/concept-demo-1024x600.png"><img src="http://bannister.us/weblog/wp-content/uploads/2010/03/concept-demo-1024x600-300x175.png" width="300" height="175" /></a></pre>
<p>With the fly-away message panel toggled off, even a netbook screen shows a good amount of program text.</p>
<pre><a href="http://bannister.us/weblog/wp-content/uploads/2010/03/concept-demo-1024x600-max.png"><img src="http://bannister.us/weblog/wp-content/uploads/2010/03/concept-demo-1024x600-max-300x175.png" width="300" height="175" /></a></pre>
<h3>Topic for later &#8211; navigation</h3>
<p>After using Eclipse for several years, I have become pretty comfortable. Oddly, I have come to realize that in <b>one</b> aspect &#8211; navigation &#8211; Eclipse is inferior to my old use of Emacs with ctags/mkid/calls/grep. Under the hood, the functions for introspecting program texts are a dream compared to what I had twenty years back &#8230; but navigation still feels a bit clunky.</p>
<p>The next exercise will be to try and map out what is different, and take a stab at how to do better.</p>
]]></content:encoded>
			<wfw:commentRss>http://bannister.us/weblog/2010/03/15/re-thinking-the-ide-a-starting-point/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Magnetic propulsion?</title>
		<link>http://bannister.us/weblog/2010/03/08/magnetic-propulsion/</link>
		<comments>http://bannister.us/weblog/2010/03/08/magnetic-propulsion/#comments</comments>
		<pubDate>Mon, 08 Mar 2010 09:44:16 +0000</pubDate>
		<dc:creator>Preston L. Bannister</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://bannister.us/weblog/?p=1749</guid>
		<description><![CDATA[Airplanes have always always been an interest, since I was a kid (though theoretic, not actual). Simple basic facts about aeroplanes: long thin wings tend to more efficient (aerodynamically, not structurally) than wider/thicker/shorter wings. For much the same reason &#8211; &#8230; <a href="http://bannister.us/weblog/2010/03/08/magnetic-propulsion/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Airplanes have always always been an interest, since I was a kid (though theoretic, not actual).</p>
<p>Simple basic facts about aeroplanes: long thin wings tend to more efficient (aerodynamically, not structurally) than wider/thicker/shorter wings. For much the same reason &#8211; propellers are more efficient than jets. Ducted fans are less efficient than propellers, but more efficient than pure-jet engines. Turbofan engines are basically ducted fan turboprops. Gains in jet efficiency over than past few decades are in part due to higher bypass turbofans (basically moving from pure jets closer to propellers).  </p>
<p>Even propellers are not ideal. Swirling a couple curved sticks of metal through the airstream at high speeds is going to chew up energy without adding to propulsion. Many-bladed turbofans chewing through the airstream have got to be worse. Lots of energy wasted &#8211; could there be a more efficient way? Nothing especially obvious &#8230; or something better would be in practice.</p>
<p>Ideally we would like a way to throw back the bulk of an airstream without lots of extraneous physical churning. The only certain way we know is to use propellers &#8211; like oars in water. Could there be another way?</p>
<p>There is a well-known phenomena in Physics known as <a href="http://physics.kenyon.edu/EarlyApparatus/Static_Electricity/Electric_Wind/Electric_Wind.html">&#8220;electric wind&#8221;</a>, that moves air without physical contact, but is by no measure efficient. Is there any way this could be used?</p>
<p>Is there any way to efficiently push an airstream without physical contact?</p>
<p>The &#8220;electric wind&#8221; is a stream of charged particles. A magnetic field deflects an charged particle moving through. The deflection exerts a force on the magnet (assuming the force is not sufficient to capture the charge). Movement against that force consumes energy. That energy presumably could accelerate the charged particles. </p>
<p>The mean free path of a charged particle at normal atmospheric pressures is short. Any accelerated ion would give up about half it&#8217;s energy at each collision. Short mean free paths mean many collisions. The net result would be (presumably) to accelerate a bulk of the airstream. Maybe.</p>
<p>Magnetic fields deflect charged particles. Strong magnets rotating on opposite directions could deflect and accelerate, then re-deflect and further accelerate charged particles &#8211; maybe. Would the result be significant? Would the result be efficient? I have no idea.</p>
<p>This might be an approach only possible if the &#8220;controller&#8221; is sufficiently smart, and with quite intense magnets (superconducting?). Matching the acceleration and deflection of charged particles through alternating magnetic fields through changing atmospheric conditions may not be possible with simpler control.</p>
<p>Is a &#8220;magnetic propeller&#8221; is practical possibility?</p>
]]></content:encoded>
			<wfw:commentRss>http://bannister.us/weblog/2010/03/08/magnetic-propulsion/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Using GMail for mailto: links in Ubuntu</title>
		<link>http://bannister.us/weblog/2010/03/04/using-gmail-for-mailto-links-in-ubuntu/</link>
		<comments>http://bannister.us/weblog/2010/03/04/using-gmail-for-mailto-links-in-ubuntu/#comments</comments>
		<pubDate>Fri, 05 Mar 2010 02:02:49 +0000</pubDate>
		<dc:creator>Preston L. Bannister</dc:creator>
				<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://bannister.us/weblog/?p=1745</guid>
		<description><![CDATA[Create the file $HOME/bin/mailto with the contents: #!/bin/sh gnome-open "https://mail.google.com/mail?extsrc=mailto&#038;url=$*" Make the file executable. On Ubuntu Linux (using the Gnome desktop), go to: System > Preferences > Preferred Applications Under Internet / Mail Reader select &#8220;Custom&#8221; and enter the command: &#8230; <a href="http://bannister.us/weblog/2010/03/04/using-gmail-for-mailto-links-in-ubuntu/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Create the file <b>$HOME/bin/mailto</b> with the contents: </p>
<pre>
#!/bin/sh
gnome-open "https://mail.google.com/mail?extsrc=mailto&#038;url=$*"
</pre>
<p>Make the file executable.</p>
<p>On Ubuntu Linux (using the Gnome desktop), go to:</p>
<pre>System > Preferences > Preferred Applications</pre>
<p>Under Internet / Mail Reader select &#8220;Custom&#8221; and enter the command:</p>
<pre>/home/preston/bin/mailto %s</pre>
<p>(Replace &#8220;/home/preston&#8221; with your $HOME.)</p>
<p>This should open GMail in your default web browser, composing a new message, with the recipient set.</p>
]]></content:encoded>
			<wfw:commentRss>http://bannister.us/weblog/2010/03/04/using-gmail-for-mailto-links-in-ubuntu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Between Marketing and Engineering</title>
		<link>http://bannister.us/weblog/2010/02/24/between-marketing-and-engineering/</link>
		<comments>http://bannister.us/weblog/2010/02/24/between-marketing-and-engineering/#comments</comments>
		<pubDate>Wed, 24 Feb 2010 21:00:02 +0000</pubDate>
		<dc:creator>Preston L. Bannister</dc:creator>
				<category><![CDATA[Humor]]></category>

		<guid isPermaLink="false">http://bannister.us/weblog/?p=1740</guid>
		<description><![CDATA[Brought up a command window in Windows 7, and saw: Microsoft Windows [Version 6.1.7600] Copyright (c) 2009 Microsoft Corporation. All rights reserved. Yep. Windows 7 is in fact Windows version 6. Gotta love those Marketing folk.]]></description>
			<content:encoded><![CDATA[<p>Brought up a command window in Windows 7, and saw:
<pre>
Microsoft Windows [Version 6.1.7600]
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.
</pre>
<p>Yep. Windows 7 is in fact Windows version 6. Gotta love those Marketing folk.</p>
]]></content:encoded>
			<wfw:commentRss>http://bannister.us/weblog/2010/02/24/between-marketing-and-engineering/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Multiplexed FastCGI connections?</title>
		<link>http://bannister.us/weblog/2010/01/31/multiplexed-fastcgi-connections/</link>
		<comments>http://bannister.us/weblog/2010/01/31/multiplexed-fastcgi-connections/#comments</comments>
		<pubDate>Sun, 31 Jan 2010 20:22:16 +0000</pubDate>
		<dc:creator>Preston L. Bannister</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://bannister.us/weblog/?p=1736</guid>
		<description><![CDATA[Does anyone use FastCGI with FCGI_MPXS_CONNS set to &#8220;1&#8243; (for multiplexed connections)? Most FastCGI backends seems to be written for non-multiplexed connections. (Much simpler, so understandable.) The IIS FastCGI connector apparently does not support multiplexed connections. Writing a FastCGI backend &#8230; <a href="http://bannister.us/weblog/2010/01/31/multiplexed-fastcgi-connections/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Does anyone use FastCGI with <a href="http://www.fastcgi.com/devkit/doc/fcgi-spec.html#S4.1">FCGI_MPXS_CONNS</a> set to &#8220;1&#8243; (for multiplexed connections)?</p>
<p>Most FastCGI backends seems to be written for non-multiplexed connections. (Much simpler, so understandable.) The IIS FastCGI connector apparently <a href="https://forums.iis.net/p/1154348/1890231.aspx#1890231">does not support multiplexed connections</a>. </p>
<p>Writing a FastCGI backend that allows for multiplexed connections. Would be a waste of time  if not supported by a frontend, or if existing frontends are buggy.</p>
<p>(Not really expecting a response, but have to state the question.)</p>
]]></content:encoded>
			<wfw:commentRss>http://bannister.us/weblog/2010/01/31/multiplexed-fastcgi-connections/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Giving up HTML@W3C</title>
		<link>http://bannister.us/weblog/2010/01/17/giving-up-htmlw3c/</link>
		<comments>http://bannister.us/weblog/2010/01/17/giving-up-htmlw3c/#comments</comments>
		<pubDate>Mon, 18 Jan 2010 06:00:46 +0000</pubDate>
		<dc:creator>Preston L. Bannister</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[html@w3c]]></category>

		<guid isPermaLink="false">http://bannister.us/weblog/?p=1729</guid>
		<description><![CDATA[Got the &#8220;status as Invited Expert in HTML Working Group&#8221; email. This I will let expire. Spent my time tilting at windmills, and do not see any point in continuing. The HTML Working Group at W3C is &#8230; far too &#8230; <a href="http://bannister.us/weblog/2010/01/17/giving-up-htmlw3c/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Got the &#8220;status as Invited Expert in HTML Working Group&#8221; email. This I will let expire. Spent my time tilting at windmills, and do not see any point in continuing.</p>
<p>The HTML Working Group at W3C is &#8230; far too much noise. The HTML5 &#8220;standard&#8221; is going to be a bloated monster, and there is no chance I can change that. Time to stop the pretense of trying.</p>
<p>Not that all the work is bad, or that there is any shortage of well-intentioned folk. What the group lacks is any sense of minimalism, and enough strong voices able to say &#8220;no&#8221;. What we will get is going to be even harder to digest than HTML4. This is sad. Future developers are going to have an even harder time, for no good reason.</p>
<p>The wildcard here is that the mainstream browser implementations may not follow all the half-thought ideas thrown in by the HTML5 Working Group. No idea how this will work out.</p>
<p>At the core HTML is pretty damn simple &#8211; or could be. HTML4 got stuffed with a bunch of half-thought notions, most of which have since proved of no value, and were ignored by developers. Ideally we would learn from experience, omit the fuzzy disused bits, and trim HTML down to the useful core. There are well-known (though not universally known) means to achieve this aim. This is not going to happen.  </p>
<p>I cannot keep up with the herd of Energizer-bunnies eager to make their mark, and with too-limited experience.<br />
Time to stop pretending.</p>
]]></content:encoded>
			<wfw:commentRss>http://bannister.us/weblog/2010/01/17/giving-up-htmlw3c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Efficient UTF-8 recoding and secure processing</title>
		<link>http://bannister.us/weblog/2010/01/16/efficient-utf-8-recoding-and-secure-processing/</link>
		<comments>http://bannister.us/weblog/2010/01/16/efficient-utf-8-recoding-and-secure-processing/#comments</comments>
		<pubDate>Sat, 16 Jan 2010 21:20:20 +0000</pubDate>
		<dc:creator>Preston L. Bannister</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://bannister.us/weblog/?p=1717</guid>
		<description><![CDATA[An attempt to make a point&#8230; The use of UTF-8 on the web is common and increasing. Lots of data comes in as UTF-8, and inefficiency in UTF-8 data handling is going to have pretty pervasive impact. On the flip &#8230; <a href="http://bannister.us/weblog/2010/01/16/efficient-utf-8-recoding-and-secure-processing/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>An attempt to make a point&#8230;</p>
<p>The use of <a href="http://en.wikipedia.org/wiki/UTF-8">UTF-8</a> on the web is common and increasing. Lots of data comes in as UTF-8, and inefficiency in UTF-8 data handling is going to have pretty pervasive impact.</p>
<p>On the flip side, the creators of UTF-8 did a good job. There is nothing really complicated about the UTF-8 format, and processing is simple. </p>
<p>So I was surprised (or rather shocked) to find <a href="http://bannister.us/weblog/2009/10/05/example-general-purpose-trie-in-java/">in an earlier experiment</a> that Java performed UTF-8 conversion slowly. In fact, I was able to write a faster UTF-8 decoder <b>in Java</b> than the stock decoder. This is just plain wrong. Conversion between encodings is a primitive/simple operation best written in C/C++ and run as native code (and this is the sort of processing where C/C++ is probably always going to be much faster than Java). </p>
<p>There is a problem in that malicious external parties can send oddly-encoded UTF-8, and bypass simple-minded malware detection software. Ordinary ASCII characters can coded as an alternate multi-byte sequences, and simple scanners miss the alternate encoding.</p>
<p>This is a problem. There is a simple solution. One of a set of <a href="http://bannister.us/weblog/2009/02/02/long-term-compatible-protocols/">principles</a> I adopted a long time ago is <a href="http://bannister.us/weblog/2008/03/21/convert-at-the-edges/">&#8220;convert at the edges&#8221;</a>. If you have data coming in from an untrusted source, then you perform conversion and validation at the &#8220;edge&#8221; where the data is first received.</p>
<p>In the case of UTF-8 coming from an untrusted source, to make all later processing simpler, you must <b>recode</b> to eliminate any alternate encodings. This is quite simple, as recoded UTF-8 will always be the same size or smaller, and so can be done in-place. The <a href="http://bannister.us/weblog/2010/01/12/utf8ucs-conversion-benchmark/">prior experiment</a> measured the cost of UTF-8 recoding. Looks like we can drive a 1-Gbit network link at full speed (with efficient code), while recoding the entire contents. Since UTF-8 data usually represents a smaller portion of traffic, and since other processing tends to take the larger part of the load, there is no reason to not perform recoding on any UTF-8 data coming from an untrusted source. </p>
<p>Combine &#8220;convert at the edges&#8221; with UTF-8 recoding, and we lose the basis for the requirement in <a href="http://www.apps.ietf.org/rfc/rfc3629.html">RFC 3629</a> for detection of &#8220;illegal&#8221; UTF-8 code sequences. In addition we allow all downstream processing to be simpler and more efficient &#8230; and we also can be tolerant of imperfect upstream software. (Yes, I am going to invoke <a href="http://bannister.us/weblog/2005/11/05/postel%e2%80%99s-law-liberal-in-what-you-accept-conservative-in-what-you-generate/">Postel</a>, again.)</p>
<p>The basis is good (secure processing with untrusted sources), but the requirement for detection of &#8220;illegal&#8221; sequences is not necessary and (most definitely!) not optimal. </p>
<p>Example of UTF-8 recoding (from <a href="http://svn.bannister.us/public//json-c/sources/String.cpp">String.cpp</a>).</p>
<pre>
void UTF8::String::recode() {
    // Iterate until all UTF8 characters are normalized.
    // UTF8 in canonical form can only be smaller, so work in-place.
    char* p1 = pBuffer;
    char* p2 = pBuffer;
    char* pEOS = pBuffer + nContent;
    while (p1 < pEOS) {
        int c = 255 &#038; *p1++;
        if (c < 0x80) {
            *p2++ = c;
            continue;
        }
        if (c < 0xE0) {
            c = (31 &#038; c) << 6;
            c |= 63 &#038; *p1++;
        } else if (c < 0xF0) {
            c = (15 &#038; c) << 12;
            c |= (63 &#038; *p1++) << 6;
            c |= 63 &#038; *p1++;
        } else if (c < 0xF8) {
            c = (7 &#038; c) << 18;
            c |= (63 &#038; *p1++) << 12;
            c |= (63 &#038; *p1++) << 6;
            c |= 63 &#038; *p1++;
        } else if (c < 0xFC) {
            c = (3 &#038; c) << 24;
            c |= (63 &#038; *p1++) << 18;
            c |= (63 &#038; *p1++) << 12;
            c |= (63 &#038; *p1++) << 6;
            c |= 63 &#038; *p1++;
        } else {
            c = (1 &#038; c) << 30;
            c |= (63 &#038; *p1++) << 24;
            c |= (63 &#038; *p1++) << 18;
            c |= (63 &#038; *p1++) << 12;
            c |= (63 &#038; *p1++) << 6;
            c |= 63 &#038; *p1++;
        }
        if (c < 0x80) {
            *p2++ = c;
        } else if (c < 0x800) {
            *p2++ = 0xC0 | (c >> 6);
            *p2++ = 0x80 | (63 &#038; c);
        } else if (c < 0x10000) {
            *p2++ = 0xE0 | (c >> 12);
            *p2++ = 0x80 | (63 &#038; (c >> 6));
            *p2++ = 0x80 | (63 &#038; c);
        } else if (c < 0x200000) {
            *p2++ = 0xF0 | (c >> 18);
            *p2++ = 0x80 | (63 &#038; (c >> 12));
            *p2++ = 0x80 | (63 &#038; (c >> 6));
            *p2++ = 0x80 | (63 &#038; c);
        } else if (c < 0x4000000) {
            *p2++ = 0xF8 | (c >> 24);
            *p2++ = 0x80 | (63 &#038; (c >> 18));
            *p2++ = 0x80 | (63 &#038; (c >> 12));
            *p2++ = 0x80 | (63 &#038; (c >> 6));
            *p2++ = 0x80 | (63 &#038; c);
        } else {
            *p2++ = 0xFC | (1 &#038; (c >> 30));
            *p2++ = 0x80 | (63 &#038; (c >> 24));
            *p2++ = 0x80 | (63 &#038; (c >> 18));
            *p2++ = 0x80 | (63 &#038; (c >> 12));
            *p2++ = 0x80 | (63 &#038; (c >> 6));
            *p2++ = 0x80 | (63 &#038; c);
        }
    }
    nContent = (int) (p2 - pBuffer);
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://bannister.us/weblog/2010/01/16/efficient-utf-8-recoding-and-secure-processing/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>UTF8/UCS conversion benchmark</title>
		<link>http://bannister.us/weblog/2010/01/12/utf8ucs-conversion-benchmark/</link>
		<comments>http://bannister.us/weblog/2010/01/12/utf8ucs-conversion-benchmark/#comments</comments>
		<pubDate>Wed, 13 Jan 2010 05:12:39 +0000</pubDate>
		<dc:creator>Preston L. Bannister</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://bannister.us/weblog/?p=1709</guid>
		<description><![CDATA[Point of reference&#8230; UCS (Unicode) to UTF8 conversion, and the reverse, when efficiently coded in C++ clocks in well above 100MB/s on current generation CPUs. If you are getting something much less &#8211; enough to be a problem &#8211; then &#8230; <a href="http://bannister.us/weblog/2010/01/12/utf8ucs-conversion-benchmark/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Point of reference&#8230;</p>
<p>UCS (Unicode) to UTF8 conversion, and the reverse, when efficiently coded in C++ clocks in <b>well above</b> 100MB/s on current generation CPUs. If you are getting something much less &#8211; enough to be a problem &#8211; then there are questions you should ask. The following run spans 1 to 6 byte UTF8 encodings.</p>
<p>Recoding a UTF8 string to a normalized form is a bit slower at 122-87 MB/s.</p>
<pre>
preston@athena:~/workspace/json-c$ time Release/json
base 00000010 :  <b>229.9 MB/s UCS to UTF8 conversion</b>
base 00000010 :  <b>253.7 MB/s UTF8 to UCS conversion</b>
base 00000010 :  <b>122.0 MB/s UTF8 recode</b>
base 02000010 :  196.8 MB/s UCS to UTF8 conversion
base 02000010 :  177.1 MB/s UTF8 to UCS conversion
base 02000010 :  100.6 MB/s UTF8 recode
base 04000010 :  173.8 MB/s UCS to UTF8 conversion
base 04000010 :  157.1 MB/s UTF8 to UCS conversion
base 04000010 :   89.2 MB/s UTF8 recode
base 06000010 :  174.0 MB/s UCS to UTF8 conversion
base 06000010 :  158.5 MB/s UTF8 to UCS conversion
base 06000010 :   89.2 MB/s UTF8 recode
base 08000010 :  174.0 MB/s UCS to UTF8 conversion
base 08000010 :  154.5 MB/s UTF8 to UCS conversion
base 08000010 :   89.6 MB/s UTF8 recode
base 0a000010 :  174.1 MB/s UCS to UTF8 conversion
base 0a000010 :  156.5 MB/s UTF8 to UCS conversion
base 0a000010 :   89.8 MB/s UTF8 recode
base 0c000010 :  174.0 MB/s UCS to UTF8 conversion
base 0c000010 :  155.1 MB/s UTF8 to UCS conversion
base 0c000010 :   89.6 MB/s UTF8 recode
base 0e000010 :  174.0 MB/s UCS to UTF8 conversion
base 0e000010 :  158.8 MB/s UTF8 to UCS conversion
base 0e000010 :   87.4 MB/s UTF8 recode
base 10000010 :  170.8 MB/s UCS to UTF8 conversion
base 10000010 :  158.2 MB/s UTF8 to UCS conversion
base 10000010 :   89.7 MB/s UTF8 recode
base 12000010 :  174.0 MB/s UCS to UTF8 conversion
base 12000010 :  158.8 MB/s UTF8 to UCS conversion
base 12000010 :   86.5 MB/s UTF8 recode
base 14000010 :  171.5 MB/s UCS to UTF8 conversion
base 14000010 :  153.9 MB/s UTF8 to UCS conversion
base 14000010 :   87.1 MB/s UTF8 recode
base 16000010 :  172.1 MB/s UCS to UTF8 conversion
base 16000010 :  158.1 MB/s UTF8 to UCS conversion
base 16000010 :   87.5 MB/s UTF8 recode
base 18000010 :  172.1 MB/s UCS to UTF8 conversion
base 18000010 :  158.2 MB/s UTF8 to UCS conversion
base 18000010 :   86.9 MB/s UTF8 recode
base 1a000010 :  171.3 MB/s UCS to UTF8 conversion
base 1a000010 :  158.2 MB/s UTF8 to UCS conversion
base 1a000010 :   86.5 MB/s UTF8 recode
base 1c000010 :  169.5 MB/s UCS to UTF8 conversion
base 1c000010 :  158.5 MB/s UTF8 to UCS conversion
base 1c000010 :   86.5 MB/s UTF8 recode
base 1e000010 :  173.0 MB/s UCS to UTF8 conversion
base 1e000010 :  157.8 MB/s UTF8 to UCS conversion
base 1e000010 :   86.1 MB/s UTF8 recode
base 20000010 :  173.1 MB/s UCS to UTF8 conversion
base 20000010 :  158.4 MB/s UTF8 to UCS conversion
base 20000010 :   87.2 MB/s UTF8 recode
base 22000010 :  173.1 MB/s UCS to UTF8 conversion
base 22000010 :  158.2 MB/s UTF8 to UCS conversion
base 22000010 :   88.2 MB/s UTF8 recode
base 24000010 :  173.3 MB/s UCS to UTF8 conversion
base 24000010 :  158.8 MB/s UTF8 to UCS conversion
base 24000010 :   87.6 MB/s UTF8 recode
base 26000010 :  173.8 MB/s UCS to UTF8 conversion
base 26000010 :  158.1 MB/s UTF8 to UCS conversion
base 26000010 :   87.9 MB/s UTF8 recode
base 28000010 :  172.0 MB/s UCS to UTF8 conversion
base 28000010 :  158.7 MB/s UTF8 to UCS conversion
base 28000010 :   87.6 MB/s UTF8 recode
base 2a000010 :  172.0 MB/s UCS to UTF8 conversion
base 2a000010 :  158.1 MB/s UTF8 to UCS conversion
base 2a000010 :   86.1 MB/s UTF8 recode
base 2c000010 :  172.1 MB/s UCS to UTF8 conversion
base 2c000010 :  158.5 MB/s UTF8 to UCS conversion
base 2c000010 :   86.3 MB/s UTF8 recode
base 2e000010 :  173.8 MB/s UCS to UTF8 conversion
base 2e000010 :  158.2 MB/s UTF8 to UCS conversion
base 2e000010 :   89.3 MB/s UTF8 recode
base 30000010 :  170.0 MB/s UCS to UTF8 conversion
base 30000010 :  158.7 MB/s UTF8 to UCS conversion
base 30000010 :   87.2 MB/s UTF8 recode
base 32000010 :  173.8 MB/s UCS to UTF8 conversion
base 32000010 :  158.4 MB/s UTF8 to UCS conversion
base 32000010 :   87.8 MB/s UTF8 recode
base 34000010 :  173.5 MB/s UCS to UTF8 conversion
base 34000010 :  158.5 MB/s UTF8 to UCS conversion
base 34000010 :   88.0 MB/s UTF8 recode
base 36000010 :  173.1 MB/s UCS to UTF8 conversion
base 36000010 :  158.4 MB/s UTF8 to UCS conversion
base 36000010 :   88.4 MB/s UTF8 recode
base 38000010 :  172.5 MB/s UCS to UTF8 conversion
base 38000010 :  158.5 MB/s UTF8 to UCS conversion
base 38000010 :   88.7 MB/s UTF8 recode
base 3a000010 :  170.5 MB/s UCS to UTF8 conversion
base 3a000010 :  158.4 MB/s UTF8 to UCS conversion
base 3a000010 :   87.4 MB/s UTF8 recode
base 3c000010 :  169.3 MB/s UCS to UTF8 conversion
base 3c000010 :  154.7 MB/s UTF8 to UCS conversion
base 3c000010 :   86.3 MB/s UTF8 recode
base 3e000010 :  172.0 MB/s UCS to UTF8 conversion
base 3e000010 :  156.9 MB/s UTF8 to UCS conversion
base 3e000010 :   87.9 MB/s UTF8 recode
base 40000010 :  171.8 MB/s UCS to UTF8 conversion
base 40000010 :  148.9 MB/s UTF8 to UCS conversion
base 40000010 :   83.7 MB/s UTF8 recode
base 42000010 :  173.1 MB/s UCS to UTF8 conversion
base 42000010 :  149.3 MB/s UTF8 to UCS conversion
base 42000010 :   88.1 MB/s UTF8 recode
base 44000010 :  173.7 MB/s UCS to UTF8 conversion
base 44000010 :  157.7 MB/s UTF8 to UCS conversion
base 44000010 :   87.4 MB/s UTF8 recode
base 46000010 :  172.1 MB/s UCS to UTF8 conversion
base 46000010 :  152.2 MB/s UTF8 to UCS conversion
base 46000010 :   87.3 MB/s UTF8 recode
base 48000010 :  174.0 MB/s UCS to UTF8 conversion
base 48000010 :  142.7 MB/s UTF8 to UCS conversion
base 48000010 :   87.8 MB/s UTF8 recode
base 4a000010 :  173.5 MB/s UCS to UTF8 conversion
base 4a000010 :  150.2 MB/s UTF8 to UCS conversion
base 4a000010 :   87.7 MB/s UTF8 recode
base 4c000010 :  174.0 MB/s UCS to UTF8 conversion
base 4c000010 :  158.4 MB/s UTF8 to UCS conversion
base 4c000010 :   88.4 MB/s UTF8 recode
base 4e000010 :  174.0 MB/s UCS to UTF8 conversion
base 4e000010 :  156.9 MB/s UTF8 to UCS conversion
base 4e000010 :   88.4 MB/s UTF8 recode

real	2m0.751s
user	2m0.540s
sys	0m0.190s
</pre>
<p>The above run is on a <b>AMD Phenom(tm) II X4 955 Processor</b> running at the stock clock rate. </p>
<p>Code is in: <a href="http://svn.bannister.us/public/json-c/">http://svn.bannister.us/public/json-c/</a><br />
(A start on an experiment in fastest-possible JSON conversion.)</p>
<p>Note that I intentionally allow proper conversion of &#8220;invalid&#8221; UTF8 code strings. I completely understand the reason for the disallowed conversions, and I disagree.</p>
<p><b>Update:</b> Converted to use pointer arithmetic, rather than array and index. Was not sure pointer math was still a win on current CPUs and compilers. Got a big boost in throughput, so it is!</p>
]]></content:encoded>
			<wfw:commentRss>http://bannister.us/weblog/2010/01/12/utf8ucs-conversion-benchmark/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Musing about cumulative impact</title>
		<link>http://bannister.us/weblog/2010/01/08/musing-about-cumulative-impact/</link>
		<comments>http://bannister.us/weblog/2010/01/08/musing-about-cumulative-impact/#comments</comments>
		<pubDate>Fri, 08 Jan 2010 20:52:45 +0000</pubDate>
		<dc:creator>Preston L. Bannister</dc:creator>
				<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://bannister.us/weblog/?p=1705</guid>
		<description><![CDATA[About 15 years back I was working on a C++ GUI application with a cyclic workload and a lot of string manipulation. For both performance and reliability I came up with a lightweight string class that did allocations off a &#8230; <a href="http://bannister.us/weblog/2010/01/08/musing-about-cumulative-impact/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>About 15 years back I was working on a C++ GUI application with a cyclic workload and a lot of string manipulation. For both performance and reliability I came up with a lightweight string class that did allocations off a free list. The class benchmarked well, and performed very well in practice. About 10 years back I started writing a C++ back-end bulk processing application with <b>massive</b> string manipulation, and re-used the same lightweight string (with excellent results). Five years back I again ran benchmarks (with good results) and <a href="http://bannister.us/weblog/2005/01/17/how-to-build-a-better-string-class-and-a-surprise/">wrote up the results</a>.</p>
<p>The lightweight string class is simple enough to be reproduced from memory (nothing over-complicated), but can make quite a difference in performance. I had hoped to make a point.</p>
<p>Since posting, after the initial burst, the articles have collected what looks like a few new hits, <b>every</b> day, for the past five years. Counting hits is a pretty foggy indicator, but it seems possible quite a few folk have read the article (though a relatively small fraction of the programming community). Some may have copied the C++ string class in their code. (What I hoped!) </p>
<p>But there is no sure way of knowing. What is the cumulative impact of this steady trickle of readers?</p>
]]></content:encoded>
			<wfw:commentRss>http://bannister.us/weblog/2010/01/08/musing-about-cumulative-impact/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>&#8230;  status as Invited Expert in HTML Working Group</title>
		<link>http://bannister.us/weblog/2009/12/31/status-as-invited-expert-in-html-working-group/</link>
		<comments>http://bannister.us/weblog/2009/12/31/status-as-invited-expert-in-html-working-group/#comments</comments>
		<pubDate>Fri, 01 Jan 2010 07:23:29 +0000</pubDate>
		<dc:creator>Preston L. Bannister</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[html@w3c]]></category>

		<guid isPermaLink="false">http://bannister.us/weblog/?p=1703</guid>
		<description><![CDATA[At one time I had hoped there was a small chance I might be able to nudge the HTML working group in a constructive direction. Over time, what I found is that there are a small number of individuals that &#8230; <a href="http://bannister.us/weblog/2009/12/31/status-as-invited-expert-in-html-working-group/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>At one time I had hoped there was a small chance I might be able to nudge the HTML working group in a constructive direction. Over time, what I found is that there are a small number of individuals that are able to invest an inordinate amount of time to this same working group, and I cannot possibly invest the time to construct thoughtful responses to the flood ill-considered notions.</p>
<p>There is almost no chance I can move the working group is a useful direction. Time to disconnect.</p>
<p>This is all rather discouraging. The HTML working group will proceed. Some of the work is worthwhile. Much (measured by volume of email list traffic) is not. What mix will make it into the generated proposed &#8220;standard&#8221; is sure to be a mess. Not sure how to change any of this.</p>
<p>My status as an &#8220;Invited Expert&#8221; is up for renewal. With extreme reluctance &#8230; my judgement is that I cannot make a useful contribution, and should disassociate from the HTML working group. Of course, they will continue on the present course, in my absence. My withdrawal makes no difference of significance. There is a fair chance the body of work from this working group will be adopted, imperfect as it is. The existing body of work is &#8230; badly skewed by an imperfect process.</p>
<p>Nothing meaningful I can do. The result will be a mess, and will create a mess for years after. Time to disengage.</p>
<p>Funny bit &#8211; I do not see a way to force a disconnect.</p>
]]></content:encoded>
			<wfw:commentRss>http://bannister.us/weblog/2009/12/31/status-as-invited-expert-in-html-working-group/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Almost but not quite &#8230; server-side JavaScript</title>
		<link>http://bannister.us/weblog/2009/12/30/almost-but-not-quite-server-side-javascript/</link>
		<comments>http://bannister.us/weblog/2009/12/30/almost-but-not-quite-server-side-javascript/#comments</comments>
		<pubDate>Thu, 31 Dec 2009 04:05:14 +0000</pubDate>
		<dc:creator>Preston L. Bannister</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://bannister.us/weblog/?p=1678</guid>
		<description><![CDATA[Bit over three years back I looked at server-side Javascript, and was not enthused with the available choices. Three distinct usages I&#8217;d like to cover: optimal performance,Windows web server (IIS) interoperable, and webhosting. In addition, there are three interesting aspects &#8230; <a href="http://bannister.us/weblog/2009/12/30/almost-but-not-quite-server-side-javascript/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Bit over three years back I looked at <a href="http://bannister.us/weblog/2006/12/19/revisiting-server-side-javascript/">server-side Javascript</a>, and was not enthused with the available choices. </p>
<p>Three distinct usages I&#8217;d like to cover: optimal performance,Windows web server (IIS) interoperable, and webhosting.</p>
<p>In addition, there are three interesting aspects of optimal performance: throughput, scalability, and stability.</p>
<p>For serving static content, I really like the model of a single-threaded non-blocking web server, of which <a href="http://www.acme.com/software/thttpd/">thttpd</a> was an early example, and for which the <a href="http://www.kegel.com/c10k.html">C10K</a> question clarified the need. A small/simple web server has a much better chance to being very reliable. With the single-threaded non-blocking model, massive scalability is possible.</p>
<p>For serving dynamic content, I really like the isolation and load distribution possible with the <a href="http://en.wikipedia.org/wiki/FastCGI">FastCGI</a> model (or the like). Dynamic code tends to be complex. Javascript interpreters are complex. Complex code tends to fail more often. Complex code can use more compute throughput than possible on a single box. For intranet applications, a single front-end web server is often preferable, and load distribution via FastCGI offers more headroom. All of which tends to argue for the FastCGI model, with isolation from the front-end web service, and potential distribution of load across more than one machine.</p>
<p>For the widest possible usage, in additional to optimal deployments (when there is no restriction on the front-end web server), the engine on which the application runs should be deployable behind IIS (for Windows-only organizations), and at common web-hosting services (like <a href="http://dreamhost.com/">Dreamhost</a>). Microsoft&#8217;s recent support of <a href="http://www.iis.net/expand/FastCGI">FastCGI with IIS</a> is a big help.</p>
<p>At that time (three years back), none of the solutions were really optimal &#8211; and in fact were pretty far from optimal. The Java-based <a href="http://www.mozilla.org/rhino/">Rhino</a>Javascript interpreter was easiest to embed, but failed the webhosting case. The C++ based JavaScript interpreters were a pain to embed, and offered good (but not great) performance. </p>
<p>Fast forward to the present, and Google offers the <a href="http://code.google.com/p/v8/">V8 JavaScript Engine</a> that offers <b>great</b> performance, and is easy to embed. (Google as the good guys, riding to the rescue once again &#8230; you&#8217;d think they have white hats superglued to their brains.) Suddenly we have lots of <a href="http://code.google.com/hosting/search?q=label:v8">projects embedding the V8 engine</a>. In addition, seems most all the single-threaded non-blocking web servers have picked up support for FastCGI.</p>
<p>Oh &#8230; and I am pretty much fed up with the <a href="http://en.wikipedia.org/wiki/Java_Servlet">Java Servlet</a> model. After considerable time with the problem, I am of the opinion that the servlet model chose the wrong abstractions, and this makes for awkward solutions. (Of course, the servlet model appeared very early in the history of web applications, so the mistake is easy to understand.)</p>
<p>Which means the model offered by <a href="">node.js</a> makes a lot of sense. I <i>like</i> the notion of a naked node (running JavaScript on the V8 engine) performing request dispatch without any extra layers or abstractions. The main lack with <b>node.js</b> is the ability to work via FastCGI (and thus no means to be deployed behind IIS on Windows).</p>
<p>But there are as yet items unresolved and/or unclear.</p>
<ul>
<li>Projects like <a href="http://code.google.com/p/v8cgi/">v8cgi</a> offer the V8 JavaScript Engine connected via FastCGI.</li>
<li>The <b>node.js</b> project offers a single-threaded non-blocking web server &#8230; but can it work behind FastCGI?</li>
<li>Is the environment for server-side JavaScript the same (or sufficiently similar) between <b>node.js</b> and <b>v8cgi</b>?</li>
<li><a href="http://en.wikipedia.org/wiki/Comet_(programming)">Comet</a> is still a question. Can FastCGI work well with long-outstanding requests from applications?</li>
</ul>
<p>The good news is that we seem a lot closer to attractive and well-supported server-side JavaScript for web applications &#8230; but it seems we are not quite fully there, as yet.</p>
]]></content:encoded>
			<wfw:commentRss>http://bannister.us/weblog/2009/12/30/almost-but-not-quite-server-side-javascript/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Wireless network and Linux</title>
		<link>http://bannister.us/weblog/2009/12/24/wireless-network-and-linux/</link>
		<comments>http://bannister.us/weblog/2009/12/24/wireless-network-and-linux/#comments</comments>
		<pubDate>Fri, 25 Dec 2009 03:40:33 +0000</pubDate>
		<dc:creator>Preston L. Bannister</dc:creator>
				<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://bannister.us/weblog/?p=1672</guid>
		<description><![CDATA[A signpost of sort &#8211; wireless network support on Linux, at least for the Intel 4965AGN adaptor &#8211; sucks. Went with the Intel adaptor when I ordered this notebook, in part as Intel seems to be actively supporting the development &#8230; <a href="http://bannister.us/weblog/2009/12/24/wireless-network-and-linux/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>A signpost of sort &#8211; wireless network support on Linux, at least for the <a href="http://www.intel.com/network/connectivity/products/wireless/wireless_n/overview.htm">Intel 4965AGN adaptor</a> &#8211; sucks.</p>
<p>Went with the Intel adaptor when I ordered this notebook, in part as Intel seems to be actively supporting the <a href="http://intellinuxwireless.org/">development of Linux drivers</a>. In practice, my laptop wireless connection is mostly unreliable, and often near-useless.</p>
<p>I used to think the problem was interference from other nearby wireless routers, but my daughter&#8217;s laptop seems to work well when mine does not. I have a simple <a href="http://bannister.us/examples/json/bounce.html">&#8220;bounce&#8221;</a> test for network performance. My daughter&#8217;s cheap Toshiba, on the same &#8220;bounce&#8221; page, gets steady/fast performance when side-by-side to my laptop &#8230; which gets slower/unsteady/unreliable performance.</p>
<p>Not specific to the wireless router or crowded neighborhood either &#8211; I get similar poor performance when at my father&#8217;s place in Colorado (different brand and generation of router, and fewer/further neighbors).</p>
]]></content:encoded>
			<wfw:commentRss>http://bannister.us/weblog/2009/12/24/wireless-network-and-linux/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Trie in Java &#8211; revisited</title>
		<link>http://bannister.us/weblog/2009/12/23/trie-in-java-revisited/</link>
		<comments>http://bannister.us/weblog/2009/12/23/trie-in-java-revisited/#comments</comments>
		<pubDate>Thu, 24 Dec 2009 01:12:51 +0000</pubDate>
		<dc:creator>Preston L. Bannister</dc:creator>
				<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://bannister.us/weblog/?p=1666</guid>
		<description><![CDATA[An earlier attempt at writing a fast general purpose Trie in Java gave huge memory use, and disappointing results. Seems a Trie implementation that is both fast and general purpose is not possible. (Translation: For most use a Trie cannot &#8230; <a href="http://bannister.us/weblog/2009/12/23/trie-in-java-revisited/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>An earlier attempt at writing a fast <a href="http://bannister.us/weblog/2009/10/05/example-general-purpose-trie-in-java/">general purpose Trie in Java</a> gave <b>huge</b> memory use, and disappointing results. Seems a Trie implementation that is both fast and general purpose is not possible. (Translation: For most use a Trie cannot replace a hash table.)</p>
<p>After the prior results, I wanted to see if a less general-purpose implementation would perform better. Given enough advantages, could a Trie out-perform a hash table? (Again, this visits to some extent the question asked in a <a href="http://www.daniel-lemire.com/blog/archives/2009/10/02/sensible-hashing-of-variable-length-strings-is-impossible/">prior discussion</a>.)</p>
<p>For the current exercise I built two Trie implementations. The <a href="http://svn.bannister.us/public/Trie/sources/us/bannister/structures/trie2/LinkedTrie.java">LinkedTrie</a> is cheap to build, minimal in use of memory, but not especially fast to access. The <a href="http://svn.bannister.us/public/Trie/sources/us/bannister/structures/trie2/FixedTrie.java">FixedTrie</a> implementation should be pretty close to optimal in access time (for a Trie), but expensive to build (in fact the <a href="http://svn.bannister.us/public/Trie/sources/us/bannister/structures/trie2/FixedTrieBuilder.java">FixedTrieBuilder</a> transforms a LinkedTrie into an optimized FixedTrie).</p>
<p>As before, the sources are in (as an Eclipse project): <a href="http://svn.bannister.us/public/Trie/">http://svn.bannister.us/public/Trie/</a>.</p>
<p>The performance numbers make sense. The older <b>TallTrie</b> and <b>WideTrie</b> implementations (that traded increased memory use for speed) are indeed faster, though the <b>LinkedTrie</b> uses much(!) less memory. The new <b>FixedTrie</b> is fastest (hurrah!) and uses the least memory (a shade less than <b>LinkedTrie</b>). </p>
<p>But even the <b>FixedTrie</b> is slower than a generic hash table, with read-only access about 3 times as expensive.</p>
<p>Sample measurements&#8230;
<pre>
=== words
21 ms - 98569 words loaded

=== hash
3935/second - hash map loaded {4007 ms, 15771040 operations = 254 ns/op}
8554/second - hash map re-loaded {4010 ms, 34302012 operations = 116 ns/op}
<b>10768/second</b> - access each item in hash map {4000 ms, 43074653 operations = 92 ns/op}

=== trie (linked)
870/second - loaded trie (linked) {4078 ms, 3548484 operations = 1149 ns/op}
1204/second - re-loaded trie (linked) {4010 ms, 4829881 operations = 830 ns/op}
<b>1431/second</b> - access each item in trie (linked) {4063 ms, 5815571 operations = 698 ns/op}
98569 slots of trie (linked)
225791 nodes of trie (linked)

=== build fixed trie

=== trie (fixed)
85779/second - loaded trie (fixed) {4000 ms, 343118689 operations = 11 ns/op}
87652/second - re-loaded trie (fixed) {4000 ms, 350609933 operations = 11 ns/op}
<b>3438/second</b> - access each item in trie (fixed) {4013 ms, 13799660 operations = 290 ns/op}
98569 slots of trie (fixed)
225791 nodes of trie (fixed)

=== trie (wide)
65/second - loaded trie (wide) {4502 ms, 295707 operations = 15224 ns/op}
1659/second - re-loaded trie (wide) {4040 ms, 6702692 operations = 602 ns/op}
<b>1672/second</b> - access each item in trie (wide) {4007 ms, 6702692 operations = 597 ns/op}
41533124 slots of trie (wide)
225890 nodes of trie (wide)

=== trie (tall)
682/second - loaded trie (tall) {4043 ms, 2759932 operations = 1464 ns/op}
1733/second - re-loaded trie (tall) {4036 ms, 6998399 operations = 576 ns/op}
<b>1913/second</b> - access each item in trie (tall) {4019 ms, 7688382 operations = 522 ns/op}
6982694 slots of trie (tall)
446075 nodes of trie (tall)

=== string to UTF8 conversion
1393/second - word to UTF8 (stock) {4033 ms, 5618433 operations = 717 ns/op}
9585/second - word to UTF8 (fast) {4000 ms, 38343341 operations = 104 ns/op}
</pre>
<p>(Note that the <b>FixedTrie</b> ignores re-load, so the times for load and re-load are bogus.)</p>
<p>I suspect a C++ Trie implementation could do a bit better &#8230; but not necessarily outperform &#8230; compared to hash tables.</p>
<p>Looks very much like even a specialized read-only Trie cannot match the performance of a generic hash table (at least in Java).</p>
]]></content:encoded>
			<wfw:commentRss>http://bannister.us/weblog/2009/12/23/trie-in-java-revisited/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Identifying and documenting bugs in Sun Java Printing</title>
		<link>http://bannister.us/weblog/2009/11/30/identifying-and-documenting-bugs-in-sun-java-printing/</link>
		<comments>http://bannister.us/weblog/2009/11/30/identifying-and-documenting-bugs-in-sun-java-printing/#comments</comments>
		<pubDate>Mon, 30 Nov 2009 21:26:57 +0000</pubDate>
		<dc:creator>Preston L. Bannister</dc:creator>
				<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://bannister.us/weblog/?p=1645</guid>
		<description><![CDATA[I have had a fair amount of trouble with odd behaviors and bugs in printing with Java. The time I have had to spend at work to eliminate troublesome behavior in a heavily used Java application (both before customers see &#8230; <a href="http://bannister.us/weblog/2009/11/30/identifying-and-documenting-bugs-in-sun-java-printing/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I have had a fair amount of trouble with odd behaviors and bugs in printing with Java. The time I have had to spend at work to eliminate troublesome behavior in a heavily used Java application (both before customers see the problem, and after customers report problems) &#8230; is embarrassing.</p>
<p>After getting stuck on the latest problem, I finally built a &#8220;PrintExplorer&#8221; test program. The sources are up on <a href="http://kenai.com/projects/print-explorer">Kenai</a>, and on <a href="http://hg.bannister.us/public/PrintExplorer/">my website</a>. In both cases the sources are in a Mercurial repository, and I &#8220;push&#8221; changes to both (one of the nice features of Mercurial). The project was built using NetBeans 6.7, and you can download the built <a href="http://hg.bannister.us/public/PrintExplorer/file/d5468266772f/dist/PrintExplorer.jar">PrintExplorer.jar</a> file. </p>
<p>Run as usual:
<pre>
java -jar PrintExplorer.jar
</pre>
<p>(On Windows you can just double-click the JAR file.)</p>
<p>I filed two reports (so far, with review ids: 1660182 and 1660234) with <a href="http://bugs.sun.com/">bugs.sun.com</a>, though for all I know that may be a black hole (or not &#8230; I have no idea). With the <a href="http://openjdk.java.net/">OpenJDK</a> and <a href="https://jdk7.dev.java.net/">JDK7</a> work there may be better places to report/record this &#8230; I do not know. (If you know a better path, please <a href="mailto:preston@bannister.us">let me know</a>.)</p>
<p>Found so far:
<ul>
<li>PrinterJob.getPageDialog() makes invalid change to page size. <a href='http://bannister.us/weblog/wp-content/uploads/2009/11/print-test-log.html'>(log)</a></li>
<li>Toolkit.getPrintJob() changes JobAttributes.getPrinter() to default(?) printer. <a href='http://bannister.us/weblog/wp-content/uploads/2009/11/print-test-log1.html'>(log)</a></li>
<li>Quarter-sized pages sometimes printed on an HP DeskJet 5550 on Windows 7. <a href='http://bannister.us/weblog/wp-content/uploads/2009/11/print-test-log2.html'>(log)</a></li>
</ul>
<p>I am sure there are more. :/</p>
<p>Note that PrintExplorer always generates a log file. The log file contains the parameter values and print operations performed. (You need to be acquainted with Java Printing, otherwise the test program will be entirely obscure.) If you can reproduce a problem, then you can see in the log file <b>exactly</b> what you did, and what was returned. (Useful when you lost track of the exact sequence of steps.) When you send a log file, anyone can verify the exact sequence of steps you followed (a mistake in the problem description can be caught).</p>
<p>At this point the <b>DocPrinterJob</b> works for an empty Doc and a Pageable Doc, but not for a Reader Doc. (Unclear if the last is my bug, or a Java bug.)</p>
<p><b>Update &#8211; 2010.02.01</b><br />
Today the filed reports became public-visible bugs <a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6921596">6921596</a> and <a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6921597">6921597</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://bannister.us/weblog/2009/11/30/identifying-and-documenting-bugs-in-sun-java-printing/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tilting at windmills</title>
		<link>http://bannister.us/weblog/2009/11/23/tilting-at-windmills/</link>
		<comments>http://bannister.us/weblog/2009/11/23/tilting-at-windmills/#comments</comments>
		<pubDate>Tue, 24 Nov 2009 07:10:13 +0000</pubDate>
		<dc:creator>Preston</dc:creator>
				<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://bannister.us/weblog/?p=1635</guid>
		<description><![CDATA[Bought a Canon MX860. Did my research beforehand, and was able to force-install the 32-bit Canon drivers (for printing) on my 64-bit Ubuntu desktop. Getting scanning to work is another exercise as yet not done. The fact that Canon has &#8230; <a href="http://bannister.us/weblog/2009/11/23/tilting-at-windmills/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Bought a Canon MX860. Did my research beforehand, and was able to force-install the 32-bit Canon drivers (for printing) on my 64-bit Ubuntu desktop. Getting scanning to work is another exercise as yet not done. The fact that Canon has published sources that (with the exception of a missing library) could be compiled as 64-bit native, lead me to poke Canon USA support.</p>
<p>My original query as represented in Canon&#8217;s support system (and trimmed):</p>
<blockquote><p>
Original Message Follows:<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
Email Support Form Message<br />
Product Type: PIXMA MX860<br />
Product Serial Number: absx22394<br />
Date of Purchase: 11/18/2009<br />
First Name: Preston<br />
Last Name: Bannister<br />
Address: 14 Vallecito<br />
City: Foothill Ranch<br />
State: CA<br />
Zip: 92610<br />
Phone Number: 9495880872<br />
Email Address: preston@bannister.us<br />
INQUIRY: Need drivers for 64-bit Ubuntu (Debian Linux).<br />
Found the 32-bit drivers and sources on the Canon European site, but the sources are incomplete, so I cannot compile a 64-bit version.<br />
Either compiled 64-bit drivers, or a complete set of sources would be acceptable.
</p></blockquote>
<p>The response was pretty predictable, if not exactly addressing the question as posed.</p>
<blockquote><p>
On Fri, Nov 20, 2009 at 5:09 AM, Canon Support &#8211; MFP &lt;mfp @cits.canon.com&gt; wrote:</p>
<p>Dear Preston Bannister:</p>
<p>Thank you for contacting Canon product support.  We value you as a Canon customer and appreciate the opportunity to assist you.  We regret the issues experienced with locating Linux drivers for the MX860.</p>
<p>Canon USA does not support Linux with its consumer products.  The only recommendation I can offer would be to check the various Linux enthusiast websites to see if anyone has successfully attempted writing a third party driver.</p>
<p>We apologize for any inconvenience.  Please let us know if we can be of any further assistance with your MX860.</p>
<p>Sincerely,</p>
<p>James<br />
Technical Support Representative
</p></blockquote>
<p>Since there is always a chance (if small) of a constructive outcome, I tried again.</p>
<blockquote><p>
What I did was find that the Canon Europe and Canon Australia sites distribute Canon-developed Linux drivers for the MX860 (and other printers).</p>
<p>The software is pretty well done, has an active documented development history that goes at least to the year 2000, and is distributed as both binaries and source.</p>
<p>Odd that Canon USA does not distribute Canon-developed drivers (in which Canon has made a significant investment).</p>
<p>This is a case of so-close-but-not-quite there. The effort required for Canon to have a complete offering is pretty small, if someone can find the right branch of the company hierarchy to nudge.</p>
<p>Any chance of finding who within Canon sponsored development of the existing drivers for Linux?
</p></blockquote>
<p>The last response, which sounds dangerously close to &#8220;Fuck you. Go away.&#8221; (Though I would gladly be proven wrong.)</p>
<blockquote><p>
Dear Preston Bannister:</p>
<p>We appreciate your continued correspondence regarding Linux drivers for your PIXMA MX860.</p>
<p>I have forwarded your comments to Canon USA through our Customer Feedback process.  This process allows us to capture important feedback from our valued customers.  As we constantly strive to improve our products and services, your comments are vital to our continued success.</p>
<p>We hope this information is helpful to you.  Please let us know if we can be of any further assistance with your PIXMA MX860.</p>
<p>Thank you for choosing Canon.</p>
<p>Sincerely,</p>
<p>George<br />
Technical Support Representative
</p></blockquote>
<p>Had to try&#8230;.</p>
]]></content:encoded>
			<wfw:commentRss>http://bannister.us/weblog/2009/11/23/tilting-at-windmills/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Apples iTunes store hacked?</title>
		<link>http://bannister.us/weblog/2009/11/20/apples-itunes-store-hacked/</link>
		<comments>http://bannister.us/weblog/2009/11/20/apples-itunes-store-hacked/#comments</comments>
		<pubDate>Fri, 20 Nov 2009 08:00:05 +0000</pubDate>
		<dc:creator>Preston</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://bannister.us/weblog/?p=1626</guid>
		<description><![CDATA[Just arrived in email. Billed To: preston@bannister.us Preston&#160;Bannister 14 Vallecito Foothill Ranch, CA 92610 Order Number: MGLN2G836G Receipt Date: 11/19/09 Order Total: $4.99 Billed To: MasterCard&#160;&#8230;.&#160;1234 Item Number 1 Description 변환기, v1.0, Seller: Wang Xi&#124;299225365 (4+) Unit Price $4.99 Write &#8230; <a href="http://bannister.us/weblog/2009/11/20/apples-itunes-store-hacked/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Just arrived in email.</p>
<blockquote><p>
<b>Billed To:</b><br />
          <a href="mailto:preston@bannister.us" target="_blank">preston@bannister.us</a><br />
          Preston&nbsp;Bannister<br />
          14 Vallecito<br />
          Foothill Ranch, CA 92610</p>
<p><b>Order Number:</b> MGLN2G836G<br />
          <b>Receipt Date:</b> 11/19/09<br />
          <b>Order Total:</b> $4.99<br />
          <b>Billed To:</b> MasterCard&nbsp;&#8230;.&nbsp;1234</p>
<p><b>Item Number</b><br />
1</p>
<p><b>Description</b><br />
변환기, v1.0, Seller:  Wang Xi|299225365 (4+)</p>
<p><b>Unit Price</b><br />
              $4.99</p>
<p><a href="https://userpub.itunes.apple.com/WebObjects/MZUserPublishing.woa/wa/addUserReview?type=Purple+Software&amp;id=337689079&amp;o=i" target="_blank">Write a Review</a><br />
<a href="https://buy.itunes.apple.com/WebObjects/MZFinance.woa/wa/reportAProblem?p=36000004208556&amp;o=i" target="_blank">Report a Problem</a></p>
<p>Subtotal: $4.99<br />
Tax: $0.00<br />
Order Total: $4.99</p>
<p><b>Please retain for your records.</b><br />
Please See Below For Terms And Conditions Pertaining To This Order.</p>
<p><b>Apple Inc.</b><br />
             You can find the iTunes Store Terms of Sale and Sales Policies by launching your iTunes application and clicking on <a href="http://www.apple.com/legal/itunes/us/sales.html" target="_blank">Terms of Sale or Sales Policies</a></p>
<p>             Answers to frequently asked questions regarding the iTunes Store can be found at <a href="http://www.apple.com/support/itunes/store/" target="_blank">http://www.apple.com/support/<wbr>itunes/store/</wbr></a>
</p></blockquote>
<p>I do not have iTunes installed. Both my desktop and laptop are running Ubuntu Linux. Also I cannot read <s>Chinese</s> Korean, so I do not know what was ordered. The &#8220;Report a Problem&#8221; link asks me to install iTunes.</p>
<p>I am guessing the iTunes store has a (big!) problem.</p>
<p><b>Update:</b><br />
No charges have appeared on my credit card (so far). </p>
<p>I eventually found a &#8220;support&#8221; link for the iTunes site where you fill out a form to send email. Had to lie a bit as you cannot complete the form without indicating the OS on which you are running iTunes. Linux is not offered as a choice. The first email from Apple was not useful (&#8220;run iTunes to check on your account&#8221;, grrr). I replied with a copy of the receipt, and they did &#8230; something.</p>
<p>If no credit card charge appears, my guess is the Apple caught the problem part-way through.</p>
<p>Got an email from another iTunes customer who also got a receipt with the exact same mysterious item. Interesting.</p>
<p><b>Update (2):</b><br />
The charge just appeared on my credit card, so it is not clear the exchange with iTunes Support addressed the problem.</p>
<p><b>Update (3):</b><br />
Shortly after <i>my</i> last email (where I again described the problem, and added the other guy&#8217;s receipt), Apple Support sent an unexpected email refunding the charge <i>to the other guy!</i> Right. Half-successful?</p>
]]></content:encoded>
			<wfw:commentRss>http://bannister.us/weblog/2009/11/20/apples-itunes-store-hacked/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Shallow or deep?</title>
		<link>http://bannister.us/weblog/2009/11/10/shallow-or-deep/</link>
		<comments>http://bannister.us/weblog/2009/11/10/shallow-or-deep/#comments</comments>
		<pubDate>Tue, 10 Nov 2009 13:59:48 +0000</pubDate>
		<dc:creator>Preston</dc:creator>
				<category><![CDATA[Politics]]></category>

		<guid isPermaLink="false">http://bannister.us/weblog/?p=1619</guid>
		<description><![CDATA[The current trade dispute between China and the US &#8211; on the surface &#8211; really makes no sense. China to investigate U.S. car subsidies China is preparing to launch a trade investigation into whether US carmakers are being unfairly subsidised &#8230; <a href="http://bannister.us/weblog/2009/11/10/shallow-or-deep/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>The current trade dispute between China and the US &#8211; on the surface &#8211; really makes no sense.</p>
<blockquote><p>
<a href="http://edition.cnn.com/2009/BUSINESS/10/29/china.us.car.trade.ft/index.html">China to investigate U.S. car subsidies</a><br />
China is preparing to launch a trade investigation into whether US carmakers are being unfairly subsidised by the US government, according to people familiar with the matter.</p>
<p>The move comes at a time of heightened trade tensions between the two countries after the US imposed duties on Chinese tyres last month. Many warned this would prompt Beijing to retaliate.
</p></blockquote>
<p>Interesting. Is this shallow, or deep?</p>
<p>China is using extraordinary measures to keep the dollar high and the yuan low. This has huge effect on trade. Words from the US to China have no leverage, at least compared to China&#8217;s near-term benefit from continued exports.</p>
<p>What has leverage? An import duty on tires &#8230; <i>really</i> &#8230; why tires? Is there some shallow US domestic political motivation? Or is this an opening move with enough lead time prior to Obama visiting China?</p>
<p>The Chinese government used to subsidize all sorts of industries, and they probably still do to some degree. At least some of that goes into exports. Tagging the US for subsidizing an industry &#8211; one that likely does more imports from China than exports to China &#8211; is odd. If the yuan rises relative to the dollar, then US exports to China become more competitive. Bit of a doubled impact on the Chinese economy (less exports and more imports). Discouraging imports from the US through import duties could lessen that impact. Is this a pretext for the logical counter-move (but not a strong move). Again, is this shallow or deep?</p>
<p>In this game, China is on the wrong end of the lever. Less trade between the US and China is likely to hurt China far more than the US. There may be some point in the future when they can absorb the loss of exports to the US. Is China at that point now? Or more relevant, do the Chinese leadership believe China is at that point?</p>
<p>My bet is that the Chinese leadership is too conservative, too cautious to want to risk too much change. China is a country of &#8220;rule by men&#8221;, not &#8220;rule by law&#8221;. Obama meeting with the Chinese leaders would be the point where &#8211; privately &#8211; the game is made plain &#8230; if this the deeper game. If China allows the yuan to rise after the meeting &#8211; that would be a <b>big</b> clue. (Likely China will keep buying dollars, but at a lesser rate &#8211; a sort of compromise.)</p>
<p>Is this shallow, or deep?</p>
]]></content:encoded>
			<wfw:commentRss>http://bannister.us/weblog/2009/11/10/shallow-or-deep/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>GTK bug in Ubuntu 9.10</title>
		<link>http://bannister.us/weblog/2009/11/08/gtk-bug-in-ubuntu-9-10/</link>
		<comments>http://bannister.us/weblog/2009/11/08/gtk-bug-in-ubuntu-9-10/#comments</comments>
		<pubDate>Sun, 08 Nov 2009 20:35:59 +0000</pubDate>
		<dc:creator>Preston</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://bannister.us/weblog/?p=1615</guid>
		<description><![CDATA[Upgraded my desktop from Ubuntu 9.04 to 9.10. That was a mistake. I could really use an &#8220;undo&#8221; button right about now (as ZFS users have for large scale file system changes). The problem is buttons. A change in GTK+ &#8230; <a href="http://bannister.us/weblog/2009/11/08/gtk-bug-in-ubuntu-9-10/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Upgraded my desktop from Ubuntu 9.04 to 9.10. That was a mistake. I could really use an &#8220;undo&#8221; button right about now (as ZFS users have for large scale file system changes).</p>
<p>The problem is buttons. A change in GTK+ 2.18 broke Eclipse, and anything based on Eclipse.</p>
<p>There are a number of bug reports tracking this problem. On the Eclipse site look at:<br />
<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=291257">Bug 291257</a> &#8211;  [Widgets] Buttons functionality problem with GTK+ 2.18  </p>
<p>There is a work-around offered on the above ticket (setting the GTK_NATIVE_WINDOWS environment variable). It seems to work for some. For others &#8211; myself included &#8211; it causes another severe problem (for which there are other bug reports).
<pre>
#
# A fatal error has been detected by the Java Runtime Environment:
#
#  SIGSEGV (0xb) at pc=0x00007f30eb1e7f7a, pid=4766, tid=139848919398672
#
# JRE version: 6.0_16-b01
# Java VM: Java HotSpot(TM) 64-Bit Server VM (14.2-b01 mixed mode linux-amd64 )
# Problematic frame:
# C  [libpango-1.0.so.0+0x24f7a]  pango_layout_new+0x2a
#
</pre>
<p>Strictly speaking, this is a bug in GTK. A new version of GTK shipped that was meant to be compatible, but instead broke existing applications (at the very least those based on Eclipse). The application use of GTK might (or might not) be considered in some way improper, but practical considerations should be dominant.</p>
<p>Fixing this in GTK will in one step remove the problem in <b>all</b> currently impacted applications. Fixing this in Eclipse will only help new and newly updated Eclipse installations. Existing Eclipse-based applications will continue to be impacted until (and if) updated by their respective developers.</p>
<p>Other related/duplicate bug reports:<br />
<a href="https://bugs.launchpad.net/gtk/+bug/442078 ">Buttons in Eclipse not working correctly with GTK+ 2.18.1-1</a><br />
<a href="https://bugs.launchpad.net/ubuntu/+source/swt-gtk/+bug/463086">Eclipse loses button events with swt-gtk in karmic</a><br />
<a href="https://bugs.launchpad.net/ubuntu/+source/eclipse/+bug/458703">GDK_NATIVE_WINDOWS=1 still required for some dialogs</a><br />
<a href="http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=550183">Breaks Default button in some eclipse dialogs (and rcp apps)</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bannister.us/weblog/2009/11/08/gtk-bug-in-ubuntu-9-10/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>What&#8217;s Wrong with the Culture of Wall Street? &#8211; TIME</title>
		<link>http://bannister.us/weblog/2009/10/30/whats-wrong-with-the-culture-of-wall-street-time/</link>
		<comments>http://bannister.us/weblog/2009/10/30/whats-wrong-with-the-culture-of-wall-street-time/#comments</comments>
		<pubDate>Fri, 30 Oct 2009 19:26:56 +0000</pubDate>
		<dc:creator>Preston</dc:creator>
				<category><![CDATA[Society]]></category>

		<guid isPermaLink="false">http://bannister.us/weblog/?p=1611</guid>
		<description><![CDATA[Reflections of an Anthropologist on the Wall Street mindset. What&#8217;s Wrong with the Culture of Wall Street? &#8211; TIME Before this crazy crash of 2008, bankers always landed on their feet, almost always. Job insecurity isn&apos;t the same thing for &#8230; <a href="http://bannister.us/weblog/2009/10/30/whats-wrong-with-the-culture-of-wall-street-time/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Reflections of an Anthropologist on the Wall Street mindset.</p>
<blockquote><p>
<a href='http://www.time.com/time/business/article/0,8599,1912085,00.html'>What&#8217;s Wrong with the Culture of Wall Street? &#8211; TIME</a><br />
Before this crazy crash of 2008, bankers always landed on their feet, almost always. Job insecurity isn&apos;t the same thing for the average American worker. They often experience downward mobility or don&apos;t land on their feet.
</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://bannister.us/weblog/2009/10/30/whats-wrong-with-the-culture-of-wall-street-time/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Moon rocks and a bit of math</title>
		<link>http://bannister.us/weblog/2009/10/28/moon-rocks-and-a-bit-of-math/</link>
		<comments>http://bannister.us/weblog/2009/10/28/moon-rocks-and-a-bit-of-math/#comments</comments>
		<pubDate>Thu, 29 Oct 2009 02:43:20 +0000</pubDate>
		<dc:creator>Preston</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://bannister.us/weblog/?p=1605</guid>
		<description><![CDATA[Ran across a copy/article on extracting oxygen from moon rocks. The interesting bit: New Device Extracts Oxygen from Moon Rocks &#124; Universe Today Fray anticipates that three reactors, each a meter high, would be enough to generate a ton of &#8230; <a href="http://bannister.us/weblog/2009/10/28/moon-rocks-and-a-bit-of-math/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Ran across a copy/article on extracting oxygen from moon rocks. The interesting bit:</p>
<blockquote><p>
<a href='http://www.universetoday.com/2009/08/11/new-device-extracts-oxygen-from-moon-rocks/'>New Device Extracts Oxygen from Moon Rocks | Universe Today</a><br />
Fray anticipates that three reactors, each a meter high, would be enough to generate a ton of oxygen per year on the Moon. Three tons of rock are needed to produce a ton of oxygen, and in tests the team saw almost 100% recovery of oxygen, he says.
</p></blockquote>
<p>The comments got the math badly wrong. Poking around the web I got some rough numbers:
<ul>
<li>~0.25 liters / minute &#8211; oxygen consumed for human at rest.</li>
<li>~5 liters / minute &#8211; oxygen consumed for athlete / heavy exercise.</li>
<li>~1.43 grams / liter &#8211; oxygen gas at Earth sea level pressure.</li>
</ul>
<p>Barring any dumb math errors on my part, that translates to&#8230;.</p>
<ul>
<li>~636,000 liters / year &#8211; the ton of oxygen produced by the above-mentioned generator.</li>
<li>~131,500 liters / year &#8211; oxygen consumed by a person at rest.</li>
<li>~4.8 person-at-rest-years of oxygen generated every year.</li>
</ul>
<p>Assuming that a &#8220;real&#8221; space habitat would also have the means to recycle oxygen from exhaled CO<sup>2</sup>, that is a lot of oxygen!</p>
<p>What is the real need for that much oxygen? Outside use as rocket fuel (or other manufacturing process), the main need would be to supply air for expanded living space. Assuming ~3 meter ceilings, we need ~3000 liters air for each square meter of living space. So one generator would allow expanding the living space by ~2000 square meters / year. </p>
<p>Not bad. And that is just one reactor (and essentially a prototype, at that). </p>
<p>Only one part of the equation (for habitat supply needs), of course. For practical purpose, would be nice to also have some nitrogen in the air. Not sure where that would come from. Do any moon rocks contain nitrogen? Water is also needed. Barring any fortunate discovery of water on the moon, we could synthesize water given a source of hydrogen. Do any moon rocks contain hydrogen?</p>
]]></content:encoded>
			<wfw:commentRss>http://bannister.us/weblog/2009/10/28/moon-rocks-and-a-bit-of-math/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>First impressions &#8211; Google Wave</title>
		<link>http://bannister.us/weblog/2009/10/24/first-impressions-google-wave/</link>
		<comments>http://bannister.us/weblog/2009/10/24/first-impressions-google-wave/#comments</comments>
		<pubDate>Sat, 24 Oct 2009 19:09:03 +0000</pubDate>
		<dc:creator>Preston</dc:creator>
				<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://bannister.us/weblog/?p=1584</guid>
		<description><![CDATA[Basically, Google Wave is a full and natural merger of messaging, on the web. Before you say &#8220;oh, only that&#8221;, think this through. This is a pretty big deal. Put differently, this is messaging where: Conversations are a first-class concept, &#8230; <a href="http://bannister.us/weblog/2009/10/24/first-impressions-google-wave/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Basically, Google Wave is a full and natural merger of messaging, on the web. Before you say &#8220;oh, only that&#8221;, think this through. This is a pretty big deal. Put differently, this is messaging where:</p>
<ul>
<li>Conversations are a first-class concept, and each message is a part of a conversation.</li>
<li>Each message can be presented by a different application.</li>
</ul>
<p>Because Wave is on the web, the set of applications is come from <i>all applications in the world</i> (on the web).</p>
<p>E-mail clients can present &#8220;threads&#8221; that are something like conversations, but this requires a bit of guessing and fakery on the part of the client, and is easily confused. IM clients can present a log of messages &#8211; that looks something like a conversation &#8211; but does not work when you switch between devices. Given that email and IM servers know nothing about conversations, the clients do pretty much the best they can. If you know about conversations on the server, you can do a better job on the client.</p>
<p>When conversations are a first-class concept, there are lots of new possible functions. </p>
<p>On the flip side, the Google Wave folk have made some (common) missteps. </p>
<ul>
<li>Using new names for existing notions is sometimes useful, but more often not. Calling a conversation a &#8220;wave&#8221;, calling items (messages) within a conversation &#8220;blits&#8221; &#8230; I find this more confusing than useful. This reminds me more of talk from marketing folk than engineers.</li>
<li>It&#8217;s <a href="http://en.wikipedia.org/wiki/Talk_(software)">Talk</a>, on the web. As a programmer, I get it &#8211; this is <i>kewl!</i> Writing a web application that allows all participants to see each character typed &#8211; is tricky. As a demo of tricky programming, this is sure to impress. As a useful feature in a general use application &#8211; not so much. Character-at-a-time message traffic is a huge load increase on the server, and a disservice to the users. Think about:
<ul>
<li><b>Locus of attention</b> &#8211; the on-screen activity from updates to other users&#8217; incomplete messages is sure to distract.</li>
<li><b>Quality of expression</b> &#8211; how often have you started writing a message, then revised what you said and how you said it, before sending? Do you really want everyone to see your missteps &#8230; always?</li>
</ul>
<p>Note that both are a disservice to <b>all</b> participants &#8211; cool in a programming demo, not cool in a deployed application.
</li>
</ul>
<p>Other bits&#8230;.</p>
<ul>
<li>It looks like Outlook. This was new and cool in 1997, but not so much now.  Not at all sure this layout is efficient, especially given the changes in most-common screen layouts. In 1997 you would target 640&#215;480, 800&#215;600, and 1024&#215;768 on 14&#8243; to 17&#8243; as most common screen sizes. Today you are looking 1280&#215;800 on 14&#8243; or 15&#8243; as your minimum size, and 1920&#215;1080 at 20&#8243; or bigger as common. Present and future screens have not so much new height, with lots of new width &#8211; in fact too much new width for text content. Seems a different presentation is in order.
</li>
<li>Mixed applications in one web page is cool and exciting as <a href="http://en.wikipedia.org/wiki/ActiveX">ActiveX</a> was in the web browser in 1996. Viewed in terms of the good things it can do, ActiveX allows an open-ended mix of applications to present within a web page &#8211; very cool. The Microsoft folk were blindsided (as constructive, well-intentioned folk) as they did not consider all the bad things that could be done (and with ActiveX, <i>very</i> bad things are possible). The Google folk have lots of history to make them wary, and the scope for harm is much smaller, so likely little bad stuff get through. Still &#8211; do not underestimate the black hats. There are bound to be some exploits (though likely few and quickly suppressed).</li>
</ul>
<p>In sum, a decent start on a great idea. I&#8217;d want to be pretty ruthless about overhead that takes height away from the conversation view. I&#8217;d drop the per-character updates. I&#8217;d drop the use of funky names for existing ideas. None are fundamental problems, and all are easy to address.</p>
]]></content:encoded>
			<wfw:commentRss>http://bannister.us/weblog/2009/10/24/first-impressions-google-wave/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PrinterJob.pageDialog() in Java is broken?</title>
		<link>http://bannister.us/weblog/2009/10/16/printerjob-pagedialog-in-java-is-broken/</link>
		<comments>http://bannister.us/weblog/2009/10/16/printerjob-pagedialog-in-java-is-broken/#comments</comments>
		<pubDate>Sat, 17 Oct 2009 06:05:33 +0000</pubDate>
		<dc:creator>Preston</dc:creator>
				<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://bannister.us/weblog/?p=1579</guid>
		<description><![CDATA[More specifically, the handling of margins, PageFormat, and the PrinterJob.pageDialog(PageFormat) seems to be broken. Fixing up an old Java desktop application for viewing old &#8220;green-bar&#8221; reports. Should be pretty simple &#8211; the reports are all fixed pitch text. Given I &#8230; <a href="http://bannister.us/weblog/2009/10/16/printerjob-pagedialog-in-java-is-broken/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>More specifically, the handling of margins, PageFormat, and the PrinterJob.pageDialog(PageFormat) seems to be broken.</p>
<p>Fixing up an old Java desktop application for viewing old &#8220;green-bar&#8221; reports. Should be pretty simple &#8211; the reports are all fixed pitch text. Given I like to do things that &#8220;just work&#8221; (from the users perspective), I&#8217;d added live &#8220;smart&#8221; definition of controllable font-auto-sizing, empty page suppression, and margins. Given that old printed reports may be formatted for paper sizes different than in your desktop (or network) printer, this was slightly tricky, but only that. </p>
<p>Of course, many of those old reports &#8211; meant for old line-printer green-bar paper &#8211; are best printed in landscape orientation. To my surprise, I find when in landscape orientation, the return from PrinterJob.pageDialog(PageFormat) consistently alters the margins, even when no changes were made, and the error is cumulative.</p>
<p>Um, what?</p>
<p>At first I assumed the error was in my code, but this bit of logged output caught the problem:
<pre>
PageFormat validate::
	paper dx: 792.0 dy: 612.0
	margins top: 72 left: 72 bottom: 72 right: 72
	orientation : LANDSCAPE
PageFormat after pageDialog::
	paper dx: 794.0 dy: 613.0
	margins top: 72 left: 74 bottom: 73 right: 72
	orientation : LANDSCAPE
</pre>
<p>The first is the contents of the PageFormat before calling PrinterJob.pageDialog(PageFormat), and the second is the new PageFormat returned. Note the +1 dy bump and +2 dx bump to the page extents (and the matching errors introduced to the left/bottom margins).</p>
<p>The code I used to remove the error:
<pre>
            controller.pageFormat = job.pageDialog(controller.pageFormat);

            // Work around an interesting(?) bug in PrinterJob.pageDialog().
            // For some reason the returned Paper is over-sized. (Why? Dunno.)
            // Use the Paper returned from PrinterJob.defaultPage() to get a proper size.
            // If the Java folk remove the bug, this code should change nothing.
            PageFormat pf = job.defaultPage();
            Paper paper1 = controller.pageFormat.getPaper();
            Paper paper2 = pf.getPaper();
            double x = paper1.getImageableX();
            double y = paper1.getImageableY();
            double dx = paper1.getImageableWidth();
            double dy = paper1.getImageableHeight();
            paper2.setImageableArea(x,y,dx,dy);
            controller.pageFormat.setPaper(paper2);
</pre>
<p>The bug was encountered using Java 1.6.0_15 (64-bit) on Ubuntu (Linux 2.6.28-15-generic #52-Ubuntu SMP Wed Sep 9 10:48:52 UTC 2009 x86_64 GNU/Linux).</p>
]]></content:encoded>
			<wfw:commentRss>http://bannister.us/weblog/2009/10/16/printerjob-pagedialog-in-java-is-broken/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic page generated in 0.701 seconds. -->
<!-- Cached page generated by WP-Super-Cache on 2010-09-03 12:01:56 -->
<!-- Compression = gzip -->