Random memesWhatever comes to mind.2023-09-01T00:00:00Zhttps://bannister.us/weblog/Preston L. Bannisterpreston@bannister.usConstitution as base2023-09-01T00:00:00Zhttps://bannister.us/weblog/2023/linux-distributions-and-airliners%20copy
<p>The founding document for our country is the <strong>Constitution of the United States</strong>.
As a <em>Writer</em> the first line establishes the frame from everything that follows, after.</p>
<pre><code>We the People of the United States, in Order to form a more perfect Union, establish Justice, insure domestic Tranquility, provide for the common defence, promote the general Welfare, and secure the Blessings of Liberty to ourselves and our Posterity, do ordain and establish this Constitution for the United States of America.
</code></pre>
<p>Assuming you are not a well-educated 18th century gentleman, the above needs some explanation.</p>
<ul>
<li>Keep in mind that our "United States" were founded from a "Revolutionary War".</li>
<li>The underlying notions were a radical departure from the past.</li>
<li>Western Civilization is based on a foundation from ancient Greek Philosophy.</li>
<li>Those old Greeks had some good ideas, familiar to well-educated folk from the Enlightment.</li>
</ul>
<p>Break this down:</p>
<ul>
<li>We the People of the United States ... do ordain and establish this Constitution for the United States of America.
<ol>
<li>in Order to form a more perfect Union
</li><li>establish Justice
</li><li>insure domestic Tranquility
</li><li>provide for the common defence
</li><li>promote the general Welfare
</li><li>and secure the Blessings of Liberty to ourselves and our Posterity
</li></ol>
</li></ul>
<p>Keep (5) "the general Welfare" firmly in mind.
Pretty much everything else derives from this one central principle.</p>
Linux distributions as airliners2023-07-03T00:00:00Zhttps://bannister.us/weblog/2023/constitution
<p>Progress in technology is marked by plateaus and jumps.
We find this pattern in everything from beer to airliners.</p>
<p>In the year 1958 the Boeing 707 airliner defined the form for commercial passenger aircraft.
Every widely used airliner since follows the same general form.
In the decades between, every aspect of modern airliners are improved in design.
Engines are vastly improved.
Avionics are vastly improved.
Materials and structure are much improved.
Details in aerodynamics are refined, but the overall design is much like a 707.</p>
<p>The prior maxima in airliners is the Douglas DC-3 from 1935.
The Douglas DC-3 was a jump from what came before, and remains in service to this day.
Only twenty-odd years between the DC-3 and 707.
In the twenty-odd years between the DC-3 and 707,
the jump in design is large.
In the sixty-odd years between the 707 and the present,
we see a plateau of only incremental improvements.</p>
<p>In the 1980s, microprocessors made possible small personal-use computers.
(This was my departure from Physics into software,
on the premise that small personal computers,
and then-radical notions in user-interface design could transform society.)
Took a decade for the promise of Smalltalk-80 to translate into mass-market desktops
with graphical user interface.
Microsoft Windows owned (and earned) this time, and is the 707 of the desktop to this day.</p>
<p>Since the 1990s, we see only incremental improvement in the desktop.
(Yes, this means for young folk entering the workforce, the current desktop metaphor has existed for their <strong>entire lives</strong>.)
Radical became normal and conventional and ... <em>boring</em>.</p>
<p>(Also, when forced to use Microsoft Windows, am <em>unbelievably</em> annoyed when 1990s faults are active in present day.)</p>
<p>The desktop metaphor seems to have hit a plateau, maybe decades back.
(This is <em>so weird</em> from my perspective.)
Maybe innovation is not longer to be expected.</p>
<p>Which leads to present Linux.
<a href="https://groups.google.com/g/comp.os.minix/c/oWsC7Ts18II/m/hQ-7z0mjzwcJ">Voted for Linux</a> early on.
In the 1990s, the Linux desktop lagged behind innovations in Windows.
Past the 1990s, Microsoft lost the clue.
In retrospect, nothing convincing happened in the desktop space.
By 2010, the rise of smartphones was large, but ... the present is fragmented and unconvincing.</p>
<p>Choosing a new Linux desktop.
In the early 2000s, bought the Redhat desktop until it broke (they went <em>enterprise</em>).
After, Ubuntu was (and is) pretty cool.
But their desktop efforts were ... <em>murky</em>.</p>
<p>Of late, ran Centos for/at work.
Not bad, but clearly Redhat/IBM has their own agenda.
Not a good long-term bet.</p>
<p>About to load Debian as the primary Linux distribution on my second (primary) desktop.
Have we reached that 707 moment, when innovations on a plateau are not meaningful?</p>
Slow motion train wreck2023-06-24T00:00:00Zhttps://bannister.us/weblog/2023/slow-motion-train-wreck%20copy
<p>Watching the self-destruction of for-profit public companies is like watching a very-slow motion train wreck.
In the beginning stages, you can see where the train came off the rails, yet the gruesome end is far away.
The train heads generally in the same direction, and has all the same speed and energy as before.</p>
<p>You can read stories of companies gone wrong in past, yet folk running companies continue to make the same mistakes.
As though there were some common factor in human nature that comes repeatedly into play.</p>
<p>You can follow these patterns back to the beginnings of the Industrial Revolution.
With the rise of large-scale industrialization came the rise of large human organizations.</p>
<p>As history shows, we have not really figured this out.</p>
<h2>Vanished giant</h2>
<p>A few years out of University, worked at one of the largest computer companies on the planet.
Burroughs was second in the industry, behind IBM.
Burroughs offices and factories were scattered around the world.
The history of advancements in computer technology pioneered by Burroughs was impressive.
Got to work on and lead one of the most interesting and advanced projects in the company.</p>
<p>In the end, the project and the company came to naught, for largely the same reason.</p>
<p>Early hint came on first walk through the factory.
Saw board-level technology a couple generations behind, used to build current computers.
Odd, but not a clue I could then interpret.</p>
<p>Turns out, severals years earlier Burroughs made large bet on a new chip-level technology.
Took years for the project to play out, before final failure became clear.
Burroughs was left building current-computers with slightly antique technology.</p>
<p>A history of innovative work meant Burroughs had attracted quite a pool of bright engineers.
On visit to various Burroughs plants, found groups of engineers bubbling with clever ideas.
Yet somehow this all came to an end.</p>
<p>Turns out, there was a chronic malfunction in management.
Badly burned by the large recent failure, Burroughs management developed the habit of avoiding risk.
Given the all advancement in high-technology work involves risk, this killed the company.</p>
<p>Took customers a few years to notice.
The year I joined Burroughs, they were growing steadily in excess of 20% per year.
When I left, two years later they were shrinking at an equal rate.</p>
<h2>Watching Google</h2>
<p>Google started with an Internet search engine better than the rest.
They found a modest amount of advertising made embarrassing amounts of money.
Rather than take immediate profit and walk away, Google invested in other services of benefit to users.</p>
<p>In the beginning, for an end-user Google services were a great deal.
Google was in this time playing to one of the oldest and most often forgot lesson in business:</p>
<blockquote>
<p>Keep your customers happy, and it is possible to make a profit.
Good service to customers is how you keep customers happy.</p>
</blockquote>
<p>Fast forward a couple decades, and Google has new management.
New management is judged against performance under old management.
To earn their bonus, new management wants to show growth like the past.
This is simple "lines goes up" thinking, and not unreasonable if the context is the same.</p>
<p>The context is <em>not</em> the same.
The market for advertising is not unlimited.
Once you saturate a market, "lines goes up" is not a useful model.</p>
<p>You can see the shift in the management-mind.
<br />Easy to shift to seeing advertisers as the customers, and end-users as the product.
<br />Easy to put the interests of advertisers and short-term profit over the interests of end-users.
<br />Easy to go from modest and useful advertising,
to instead shovelling an unpleasant heap on the end-user.</p>
<p>Which takes us to the present.</p>
<p>Google was once the smartest and most useful search engine.
Google of the present is noisy and occasionally infuriating.
First is the noise of injected ads both above and within the actual search results.
In past, Google injected ads were useful often enough to not be a bother.
Once Google was selective in the ads presented (maximizing value to the end-user).
In present, you can see the shift in Google-mind with the shift in the presented ads.
In the present, Google presents ads if even vaguely related (maximizing value <em>from</em> the advertiser).
At the least, you have to scroll through a stream of useless ads.
When the first search yields no useful result, and you refine your search,
<em>Google tends to present <strong>pages</strong> of the same useless ads.</em></p>
<p>This last can be infuriating.
Google has become annoying.</p>
<p>Beyond search results, Google cannot make useful choices.
Much like Burroughs of old, Google is stuck in an unproductive pattern.
In an attempt to "put more word behind one arrow", Google lost any coherent approach.
Google services appear and go away for no good reason.
This is the opposite of good service, and makes Google an unreliable provider.</p>
<p>Once dominant companies have faded before:
Burroughs, Lotus, Sun, MySpace, AOL, Yahoo, and IBM - to name a few.
Google has setup the pre-condition - unsatisfied users - for a competitor to appear and grow.</p>
<p>Just the slightest bump, and this train will be off the tracks.</p>
Cloud is Fierce2023-06-16T00:00:00Zhttps://bannister.us/weblog/2023/cloud-is-fierce
<p>Presented to a military customer.
After, a co-worker observed that military/government folk
did not understand references to cloud and security.
Offer the following for clarity.</p>
<h2>Clouds are Fierce</h2>
<p>A cloud-datacenter is the <strong>high-ground</strong> on the Internet.
A cloud-datacenter is thousands of computers, terabytes of network, and exabytes of storage.
Gain control of a cloud-datacenter, and you command huge resource in network, compute, and data.</p>
<h3>You will <em>not</em> get in.</h3>
<p>Cloud-datacenters are under attack, 24-hours a day, 365 days a year.
Attackers range from millions of script-kiddies, to thousands of highly skilled hackers sponsored by nation-states.
The big cloud providers hire the best cyber-security folk on the planet - <em>as there is no other option</em>.
(We can tell this from research papers and security conference presentations.)</p>
<p>With the rise of Internet over the past thirty years, mistakes were made, and much was learned from those mistakes.
The very best cyber-security folk are <em>very keen</em> on not repeating mistakes.</p>
<p>The most battle-hardened cyber-security folk <em>on the planet</em> run cloud data-centers.</p>
<h2>Government was the problem</h2>
<p>The fundamental research papers underlying modern cyber-security were written by the early 1980s.
We have in theory known how to do proper cyber-security for over forty years,
but government stood in our way.</p>
<p>In the early decades, Cold War regulations gave the National Security Agency (NSA) much power over the use of encryption.
This <em>somewhat</em> made pragmatic sense in the 1940s, 50s, 60s and 70s (but was always somewhat at odds with the principles of the United States Constitution).
The Cold War era <a href="https://en.wikipedia.org/wiki/International_Traffic_in_Arms_Regulations">International Traffic in Arms Regulations</a> (ITARs) treated encryption like nuclear bomb parts.</p>
<p>In the mid-1980s, I read up on network security, made the required calls, and got a surprise visit from three pleasant (then) young folk from the NSA.
They agreed that my planned use of encryption was entirely proper.</p>
<p>Net effect of NSA policy was to slow adoption of proper cyber-security defense.
Old folk at NSA wanted to preserve their offensive capability.</p>
<p>That required weakening our cyber-defense.
In present, that means our present national security is less, as for decades we were prevented from adopting proper cyber-security.
So the NSA has in past action much-weakened our present security.</p>
<h2>Renting in the Cloud</h2>
<p>Moving your applications and data into the cloud, is like renting a house.
This cloud-house comes with all the latest security-features.
(As a reminder, the cloud-folk are <em><strong>very serious</strong></em> about security.)
This house is surrounded by high fence, with video cameras all around.
The doors and windows are reinforced and alarmed.</p>
<p>But if you leave the key under the front mat, all of this is for naught.</p>
<p>About half the articles in the popular press, once you dig past the fluff,
are exploits possible only as the key was under the mat.</p>
<p>Note that gaining access to this cloud-house gets you <em>exactly</em> nothing else.
The street leads out to the Internet, but you have <strong>no access at all</strong> to the surrounding houses,
or to the underlying cloud infrastructure.
Extreme measures engineered into the cloud infrastructure ensure security.</p>
<p>Network topology in a cloud is complex.
Decades of research and development have made software-defined networking tough and performant.
This means you cannot see your cloud-neighbors on the network.</p>
<p>Even further, modern server CPUs are capable of applying strong encryption
<em>at astonishing rates</em> to data stored in computer memory.
This means that even if you got access to your cloud-neighbor's data (which you cannot),
even then you would be unable to read the encrypted contents.</p>
<p>These cloud-folk are <em>fierce</em> about security.</p>
<h2>The best Cyber-Security folk are <em>massively</em> proactive</h2>
<p>The other half of articles in the popular press are exploits that have no practical use.
Yes, you read that right.
The best cyber-security folk are <strong>very serious</strong> about eliminating even <em>theoretical</em> threats.</p>
<p>Read past the popular-press fluff, and often you find that the Sun might die of old-age before a newly-discovered exploit is of practical use.
This is entirely proper.
On the outside-chance of better future exploits,
the cyber-security community wants to eliminate
even threats that in present are <em>wildy</em> impractical.</p>
<p>Again, these folk are <em>fierce</em>.</p>
<h2>Cloud datacenters drive technology</h2>
<p>In the present, cloud datacenters and cell phones are the main drivers of computing technology.
Dense and power-efficient compute are driven by cell phones (on the low end) and datacenters (on the high end).</p>
<h3>Precise World Time</h3>
<p>One remarkable technology from the datacenter becoming generally available
is Ethernet-hardware based time synchronization.
Where older Ethernet hardware designs may lack support,
as we move to past 1Gbps Ethernet, support for
<a href="https://en.wikipedia.org/wiki/Precision_Time_Protocol">PTP (IEEE 1588 - Precision Time Protocol)</a>
becomes more common.</p>
<p>If your hardware reports the capability, then with a bit of tuning you can synchronize
a group of computers within a few nanoseconds (or better).</p>
<pre><code>$ sudo ethtool -T enp8s0
Time stamping parameters for enp8s0:
Capabilities:
hardware-transmit (SOF_TIMESTAMPING_TX_HARDWARE)
software-transmit (SOF_TIMESTAMPING_TX_SOFTWARE)
hardware-receive (SOF_TIMESTAMPING_RX_HARDWARE)
software-receive (SOF_TIMESTAMPING_RX_SOFTWARE)
software-system-clock (SOF_TIMESTAMPING_SOFTWARE)
hardware-raw-clock (SOF_TIMESTAMPING_RAW_HARDWARE)
PTP Hardware Clock: 0
Hardware Transmit Timestamp Modes:
off (HWTSTAMP_TX_OFF)
on (HWTSTAMP_TX_ON)
Hardware Receive Filter Modes:
none (HWTSTAMP_FILTER_NONE)
all (HWTSTAMP_FILTER_ALL)
</code></pre>
<p>If you happen to have an atomic clock, or access to GPS time, then with PTP
you can synchronize an the entire group to within a few nanoseconds of world time.</p>
<p>Back in the 1990s, it was pretty amazing when with the
<a href="https://en.wikipedia.org/wiki/Network_Time_Protocol">Network Time Protocol (NTP)</a>
we could synchronize computers all over the world to within a few seconds
(and often over dial-up modems).
In the present, we can synchronize within nanoseconds.
(Heck, it is hard to build <em>hardware</em> that well synchronized.)</p>
<p>Wide hardware support for PTP was driven primarily by the needs of large data-centers.</p>
<p>If you are looking for advances in computing technology, look at the clouds.</p>
<figure>
<img src="https://bannister.us/images/no-bull-912x684.png" loading="lazy" />
<figcaption align="center"><b>"no bull" - also a cloud</b></figcaption>
</figure>
Predictions2023-05-19T00:00:00Zhttps://bannister.us/weblog/2023/predictions
<p>I seem to have a habit of making guesses around technology,
on scarce evidence,
which turn out to be right.
Past guesses that I may not have written down before.</p>
<h2>Anti-Ballistic Missile Defense</h2>
<p>Back in the 1980s,
when Reagan spent much money on the "Star-Wars" programs,
I thought anti-ballistic missles defense was possible
... but <strong>very hard</strong>.
When (late-80s / early-90s) read they were building the missiles
too early, <strong>I assumed the program had failed</strong>.</p>
<p>Nothing since has changed that early judgement.</p>
<p>When approaching a <strong>very-hard</strong> problem,
you have to divide the problem into series of smaller problems.
(Call this divide-and-conquer, to which we should return.)
Solve the smaller problems, and you can solve the larger problem.
If you want to intercept intercontinental ballistic missiles,
you start by intercepting tennis balls
thrown across a football field.
Then you scale up.</p>
<p>If the intermediate problems were solved, we would have had
lots of intermediate products.
Since no-one was (then) intercepting mortar rounds,
I assumed the anti-ballistic missiles were a failure.
(In case you think these problems are entirely unrelated,
they are not.
If there is no one on your staff to explain, that is a problem.)</p>
<p>Now as then, I believe this is a solvable problem,
but not solved.</p>
<h2>Boeing</h2>
<p>When Boeing announced in the late-1990s that they were moving their headquarters to Chicago,
I thought that Boeing was in trouble.</p>
<p>I am an Engineer, but had read enough ... even then ...
to know that a business that lost track of their core did badly.
Boeing used to build great airliners (1950s, 1960s, and into 1970s).
When the folk running a business start to think their core is
making money,
not making a product, the product suffers, and customers notice.
Even folk in the business-literature seem to know this bit.
There is a paid-fabric of excuses around Boeing,
but cannot hide the core fault.</p>
<p>The current faults in the Boeing 737 can be traced back to bad choices made in Boeing/Chicago.
(No. Not any of the offered distractions.)</p>
<p>Our best hope is to spin-off Boeing/Chicago from Boeing/Seattle.</p>
<h2>Railguns</h2>
<p>The promise of railguns has always been to get more energy on target,
and this was a <strong>hard problem</strong> from the start.
Early railguns tended to self-destruct as stray energy
destroyed the gun.
So the big challenge was to control that stray energy
(as clear in the 1980s).</p>
<p>When I saw the recent Navy video of a railgun with giant fireball,
I assumed the program had failed.</p>
<p>Again, divide and conquer.
There should be a series of smaller working railguns,
before the larger.
There is not any of the intermediate products,
so we can assume failure.</p>
Unexpected job2023-05-07T00:00:00Zhttps://bannister.us/weblog/2023/unexpected-job
<p>Was looking around at jobs in south Orange County, several years back.</p>
<ul>
<li>Could write software for computer games.</li>
<li>Count write software for health insurance outfits.</li>
<li>Could write software to help rich folks acquire more.</li>
<li>Count write software to sell advertising.</li>
</ul>
<p>Was not much interested in the above.</p>
<p>Then got a random call from a smallish outfit in Brea.
Talked to Jim Williams (owner and president), and liked the guy.
Capable folk feel little need for pretense, and I could see both.
Seems thirty-odd years ago, Jim started a company with a notion of a different way to build radars.</p>
<p>Turns out his notion works very well.</p>
<p>Once again, jumped into an area in which I had very little specific knowledge.
Never worked on radars, before.
Never worked on military contracts, before.
Never had any interest in either.
Also suddenly need to recall my forty-years-rusty math for Physics.</p>
<p>But helping an engineer with a clever idea win ... yeh. I can do that. :)</p>
<p>Went from working state-of-the-art software projects (usually network-centric),
to state-of-the-art military radar projects.
Went from work I can largely talk about in public,
to work of which large parts are secret.
Makes sense, but still odd.</p>
<p>The odd part is that this work might be in use for decades, and long after I am gone.</p>
Risky business2023-05-06T00:00:00Zhttps://bannister.us/weblog/2023/risky-business
<p>Got fired from a EMC/Avamar in 2016, just days shy of five years there. How I got there:</p>
<ul>
<li>
<p>Was asked to do a proof-of-concept for backup of OpenStack instances to EMC/Avamar.
Was interested in OpenStack, but knew very little, so spent a couple of weeks studying the problem.
Figured it would take six months to build a working proof-of-concept.
In six months, I was at AT&T in Atlanta to demonstrate.</p>
</li>
<li>
<p>The customer was satified, and wanted to put the demo into production. :/</p>
</li>
<li>
<p>Also <a href="https://bannister.us/weblog/2016/presented-at-openstack-conference">presented</a> at an OpenStack conference.</p>
</li>
<li>
<p>Figured it would take three folk about 18 months to build a minimum-viable-product.
At this time, OpenStack had no suitable application interfaces for backup,
so spent quite a while digging through the OpenStack source code to find a viable approach.
(Also likely got a QEMU developer in trouble with the big storage vendors.)</p>
</li>
<li>
<p>As promised, 18 months later we delivered the first OpenStack instance backup support for EMC/Avamar.</p>
</li>
</ul>
<p>Yeh. Nailed <em>two</em> risky hail-mary projects.</p>
<p>Then I got fired.</p>
<p>The problem was I had twice demonstrated delivering on-time with very risky projects.
This was not what management wanted.
They had no risk in their other projects, so their chance of failure was near to none.
The last thing they needed was a new/risky highly visible project that exposed them to chance of failure.</p>
<p>There was more nonsense, but that was the gist.</p>
<p>Big companies are weird. :)</p>
Converted to 11ty2023-05-05T00:00:00Zhttps://bannister.us/weblog/2023/conversion-too
<p>Once again, moved to a new website tool.</p>
<ol>
<li>Started with static hand-written HTML.</li>
<li>Started using WordPress (when new) ... and kept backups for when hacked. Not a fan of PHP.</li>
<li>Converted to <a href="http://blog.getpelican.com/">Pelican</a> (in Python).</li>
<li>Converted to <a href="https://jekyllrb.com/">Jekyll</a> (in Ruby).</li>
<li>Converted to <a href="https://gohugo.io/">Hugo</a> (in Go).</li>
<li>And now to a Javascript static site generator - <a href="https://www.11ty.dev/">11ty</a></li>
</ol>
<p>Do rather prefer Javascript.
Maybe not years between posts, now. :/</p>
Minimum wage2017-02-02T00:00:00Zhttps://bannister.us/weblog/2017/minimum-wage
<p>The discussion around the minimum wage usually gets confused over whether the market can somehow magically find the right amount.
The market-based rationale is incomplete. To help make this clear, we should consider a couple of examples.</p>
<p><strong>Work worth $50/hour</strong></p>
<p>Imagine an hour of work yields $50 of value to the business (after subtracting capital and other costs).
How much should you pay the worker? Assume the minimum wage is $10/hour.</p>
<ul>
<li>If you pay the worker more than $50/hour, you are losing money and the business could fail.</li>
<li>If you pay the worker the entire $50/hour, there is no profit to the business, and no income for the owner(s).</li>
<li>If you pay the worker less than $50/hour, there is profit to the business and the owner(s).</li>
</ul>
<p>How much should you pay the worker(s)?
Clearly less then $50/hour, as the business should make a profit.
Clearly at least the minimum wage, as required by law.</p>
<p>If the business cannot hire workers at $50/hour, the business will fail.</p>
<p>If the business can hire enough workers at $10/hour, there is no reason to pay more.
With $40/hour in profit, the business owners will be <em>very</em> happy.</p>
<p>This is the scenario for the majority of working folk in the United States (and many other developed countries).
When there are more folk looking for work, and fewer jobs, offered wages will be low.
At the same time, company profits will be high - which is what we see today.</p>
<p>In this case, if the minimum wage is raised to (say) $25/hour, the business is still quite profitable.</p>
<p><strong>Work worth $200/hour</strong></p>
<p>Now imagine a case where work is worth more to the business, but there is a limited number of workers with the needed skills.
(This in fact describes my profession - writing software - as only a small portion of workers have the needed skills and aptitude.)</p>
<p>In this scenario, minimum wage is irrelevant, as the business must offer higher wages to attract workers.</p>
<p><strong>Where we are today</strong></p>
<p>Increasing automation means more wealth from less human work. This is a <em>wonderful</em> thing!</p>
<p>Increasing automation also means fewer hours of human work are needed to produce the same amount.
In the normal run of human activity, we can produce everything we need with fewer folk working, or folk working fewer hours.
This becomes a problem, as we do not know how to organize our society and economy in a way that (to us) makes sense.
As a result, wages are low for the bulk of the population.
This leads to weak demand, which impacts business, and then business pays less to workers, which leads to even weaker demand...</p>
<p>The above is an unstable equation. We have an unstable economy.
The usual dogma about how to organize our economy is simply not working.</p>
<p>As automation continues to progress (again - a <em>wonderful</em> thing), we need to adjust by allowing folk to work fewer hours.
Increasing automation means a steady and growing surplus of workers.
We will need to steadily raise the minimum wage, so fewer hours of work are sufficient to human needs.</p>
<p>Yes, this means that marginal businesses will fail - as is entirely proper.</p>
<p>Taken together, the above means a steadily rising minimum wage is essential both for a stable economy, and to have an economy that is good for humanity.</p>
Nameless beasts2016-09-18T00:00:00Zhttps://bannister.us/weblog/2016/nameless-beasts
<p>About personality type, and how we reason...</p>
<p>I started with trying to understand everything, and knowing I understood little.</p>
<p>Early, I studied science, philosophy and psychology.
At University, I majored in Physics, minored in Psychology and Art, but in the end spent most of my time with software.
Software became my profession.</p>
<p>I became very good at my profession ... as I am a bit odd.</p>
<p>Oddly, I am very bad at names - a recurring theme.
My memory for the names of other folk is amazingly poor.
I hiked through the local wilderness thousands of times, but have names for few animals and plants.
In my profession, I can clearly see bodies of work and trends - for which I do not have a name.</p>
<p>Being odd, I am comfortable with nameless beasts.
Sometimes a body of work or a focus of interest has no easy name.
This is true especially true in software, as software is a product of the human mind.
There is much we do not understand about the human mind.
There are many things for which we do not find good names.</p>
<p>Recently, I ended up watching a social group of young folk learning Psychology.
I found this group curious, as they had an odd fascination with names.
These folk wanted reality to conform to an assigned name.
Pretty much the exact opposite of "the Map is not the Territory"
from <a href="https://en.wikipedia.org/wiki/Alfred_Korzybski">General Semantics</a>.</p>
<p>Folk attracted to Psychology seem to prefer their maps to reality.
Not sure if this observation can be generalized.</p>
Private clouds and the future2016-08-30T00:00:00Zhttps://bannister.us/weblog/2016/private-cloud
<p>I used to work for EMC. I was hired into EMC to build a backup product for VMware's attempt at a cloud - vCloud. After I had time to take a close look, this was a bit awkward. Simply put - vCloud was crap. The architecture was crap. The implementation was embarrassing.</p>
<p>Once long ago, as a developer, I was an early VMware customer and found their products useful. A few years later, their developer products became unusable, and I switched to using VirtualBox. Naturally I did not mention this in the EMC interview.</p>
<p>In a larger sense, I could understand VMware choosing "enterprise" customers over developers. The enterprise customers pay more.</p>
<p>At EMC, I came to understand that VMware had followed the Microsoft Windows model. In the late 1990's, after the first overwhelming success of Windows, Microsoft tried to again re-invent the world ... and <em>repeatedly</em> failed. VMware followed the Microsoft model.</p>
<h2>VMware as the first virtualization wave</h2>
<p>VMware had adopted a model of regular software releases with major new features. The problem was these new releases were richly laced with bugs and obscure behaviors.</p>
<p>This model worked well for IBM, for rather a long time. Until lately.</p>
<p>This model worked for Microsoft, for a time. Not so much now.</p>
<p>For VMware, the model is expiring quickly. Very quickly.</p>
<p>I am sure there are customers who - deeply invested in VMware - will continue buying VMware products. A small fraction.</p>
<p>I stepped away from using VMware for a couple years (doing OpenStack work). When I stepped back, and tried to use our local VMware infrastructure, I lost a day (and more) running into a forest of VMware bugs.</p>
<p>Talk to folk who are using VMware in production, and you find folk (mostly) all on different paths. Once through the VMware forest of bugs, they were able to deliver value to their employers, but on different paths. Some want to preserve the value of that investment. More want less noise in their work.</p>
<p>In the present, VMware has piles of money and can afford to invest in the space presently needed by private clouds - network virtualization (OpenFlow) - as they will otherwise become quickly irrelevant. This investment does buy them a bit of time, but they will still become irrelevant.</p>
<p>VMware was at the first wave of virtualization, and did well. We are well past that.</p>
<p>The second wave was Amazon's AWS - which remains amazingly competitive. But there will always be use-cases that require cost/performance/control measures that public clouds cannot meet.</p>
<h2>Amazon as the second virtualization move</h2>
<p>Amazon built a cloud for their own purpose, and chose to sold excess capacity. They did well. Aggressive prices and smart APIs made their offering attractive. They collected rich metrics, and were able to build out their clouds in cost-effective manner.</p>
<p>Be fully aware of the value of metrics. The hardware you put into a cloud should depend entirely on the pattern of use you are trying to meet. You find the pattern of use through metrics. Good metrics allow you to be efficient. AWS did <em>very</em> well building out their clouds based on collected metrics.</p>
<p>But the most-efficient global case is not the most-efficient local case.</p>
<h2>Private clouds as the third virtualization wave</h2>
<p>Public clouds cannot overcome Physics. Local compute resources can be both cheaper and more performant than remote public clouds.</p>
<p>This is not easy. For local clouds you need to determine baseline loads (better local), and compute what fraction of transient load should be local or on public clouds.</p>
<p>To make that computation, you need metrics. The planet-scale public clouds have rich metrics. The private clouds are still in gestation, and not as focused on matrics.</p>
<p>A vendor whose offerings cross a universe of private clouds could develop a razor-focus on loci of use. Lacking metrics, vendors are reduced to wild guessing.</p>
<p>Private clouds can (and will) become optimal, but require a change in model by both customers and vendors. In the end, Physics wins.</p>
<p>Vendors to private clouds are still in the wild-guessing stage.</p>
<h2>The optimal solution</h2>
<p>Most variable load will end up on remote/public clouds. Most baseline load will end up on local/private clouds.</p>
<p>Note there is a huge ... <em>gigantic</em> wildcard here.</p>
<p>In theory, public cloud vendors <em>could</em> identify load that should be local, and deploy local hardware. So far, they have failed.</p>
<p>In theory, hardware vendors <em>could</em> identify load that should be local, but so far have failed. (Metrics are not in their DNA.)</p>
<p>This is the story of the next decade. Variable load will land in the public cloud. Baseline load will land in private/local clouds.</p>
<h2>Mutating hardware</h2>
<p>The mega-scale public clouds demand and acquire custom hardware, based on collected metrics, and predicted usage. The vendors acoss private clouds need similar metrics to drive their designs. This change in behavior is going to filter out out old-school hardware vendors. The ability to collect and act on common metrics is key.</p>
<p>Hardware in private clouds will eventually be driven by well-collected metrics, but this transition will take time. Our present hardware needs to be re-factored for the cloud. Once again, our present/common choices do not make sense. Time to move forward.</p>
<p>Private clouds can and will be built from custom hardware based on horizontal-metrics, collected across customers. Vendors and sites that fail this exercise will do poorly. Site/vendors that meet this new model will do well. The model is changing.</p>
Prelude to an experiment, and down the rabbit-hole2016-07-27T00:00:00Zhttps://bannister.us/weblog/2016/experiment-prelude
<p>Have an experiment in mind, and ended up going down a rabbit-hole. :)</p>
<h3>Problem</h3>
<p>Use of deduplication in storage has become somewhat common.
But there are problems.</p>
<p>Fixed-size hashed blocks are easiest, but have problems with <a href="https://bannister.us/weblog/2016/explosive-deduplicated-storage">explosive decompression and scale</a>.</p>
<p>One of the bits of learned customer-site "wisdom" I read on the web was to keep your deduplicated storage at 30-50% usage especially if you are seeing high deduplication rates.
My guess is experienced sites have seen occasional explosive growth in usage.
While the site might be seeing 80-90% deduplication, because they have to keep large free space, the effective deduplication rate is more like 60-70%.
So if you can offer 60-70% deduplication with stable usage, this would be more than competitive.</p>
<p>Fixed-size blocks are fragile - at least that is my guess from theory.
(I do not have any vendor's secret numbers, and would not expect to see those numbers published.)
Bit of a reading-between-the-lines exercise.
Seem to see the same story, repeated:</p>
<ol>
<li>Vendor starts with 4K block-size. Works well. Good bet.</li>
<li>Runs into problems scaling up.</li>
<li>Increases block-size - a major disruptive update.</li>
<li>Lots of unhappy noises from customers.</li>
</ol>
<p>Keep in mind - implementing fixed-size hashing is simpler.
You get a working product with good performance in short time.
I bet there are quite a number of attempts at variable-size hashing that failed to become a viable product.
(Harder problem and easy to get wrong, in some aspect.)</p>
<h3>Insight - minimize I/O first</h3>
<p>Thinking about storage at scale - eventually realized deduplication is more about minimizing I/O, and less about saving space.</p>
<p>Storage space is relatively cheap.
Even flash storage is under $0.50/GB, currently, and headed lower.</p>
<p>I/O operations are <em>not cheap</em>, especially when the storage is remote, and especially in a cloud.
Flash storage offers <em>much</em> higher rates than spinning disks, but with many applications running against the same storage, I/O can become the bottleneck.</p>
<h3>Insight - waste space to make an efficient hybrid</h3>
<p>The main advantage of deduplication is to reduce I/Os, not to save space.
What if we could combine the simplicity and performance of fixed-size hashing, with the stability of variable-size hashing?
What if the base implementation was fixed-size (but larger blocks, so lower overhead).
What if we used a rolling-hash to occasionally re-align the stream, but not too often?
To re-align the stream, simply insert zeros from the point the rolling-hash fires, to the end of the block.</p>
<p>This was another flash of insight. Maybe I save space by wasting space! :)</p>
<p>The majority of the implementation retains the simplicity and speed of fixed-size hashing.
You do not get deduplication rates as high, but actual usage is much less fragile.
You can be comfortable running with higher actual usage.</p>
<h3>Experiment needed</h3>
<p>The above is all a guess.</p>
<p>As a first try, I would choose 64KB fixed-size blocks and a rolling hash that forces re-aligns every ~1MB (or much more).
Aim is to try a range of sizes - I expect there is a "knee" in the curve ... somewhere.</p>
<h3>Down the rabbit-hole</h3>
<p>I need to collect numbers.</p>
<p>Which leads to a <a href="https://bannister.us/weblog/2016/rolling-hash">measuring a cheap rolling hash</a>.
Roughly good enough.</p>
<p>Which leads to measuring a (hopefully) efficient <a href="https://bannister.us/weblog/2016/skein-nist">fingerprinting hash</a>.
Skein is not as fast as I would like.
Really want throughput similar to SSD storage, so ~1GB/s would be nice.
Alternatives?</p>
<p>Interesting that the NIST competition for SHA3 has a bit of a tail effect.
The competition to improve hash functions continued after the NIST SHA3 competition ended.</p>
<p>Seems <a href="https://blake2.net/">Blake2</a> might(?) be a likely interesting result.
Blake2 makes (some?) use of SIMD, and offers (some?) use of multiple CPUs through <a href="http://openmp.org/wp/">OpenMP</a>.
(Insert pause to grok those two subjects.)
For my application ... I might want to use SIMD within Blake2, but use OpenMP not within the fingerprinting hash but at the application level.</p>
<p>Note that using a crypto-grade hash is <em>probably</em> overkill for this usage.
If I were doing this for a product, I would spend the weeks needed to invent and prove a faster fingerprinting hash.
(Be clear this is not a trivial exercise.)
For the purposes of this experiment, I want to spend less time.</p>
Explosive decompression of de-duplicated storage2016-07-22T00:00:00Zhttps://bannister.us/weblog/2016/explosive-deduplicated-storage
<p>Thinking about storage, and the cloud (OpenStack) took me ... a bit sideways.</p>
<p>Storage for backup is write-mostly, read <em>almost</em> never, and potentially massively deduplicated.</p>
<p>Storage for general cloud usage tends to be - at times - read-mostly, and potentially deduplicated.</p>
<p>The joker with backup is the disaster-recovery (DR) scenario.
In the DR case, the critical majority usage becomes <em>massively</em> read-mostly.</p>
<p>Can we optimize for both cases?</p>
<h2>Deduplication bet</h2>
<p>Deplication for storage is now a common offering.
This is a good thing, so far as it offers better performance and economics.
This is also a risk that you need to understand.</p>
<p>High quality large-value hash functions, and abundant inexpensive CPU cycles - combined mean we can optimize our use of storage.
Representing a block of data by a smaller string of bits is a bet.
If the string of bits is long enough, a failed hash (collision) is less likely than failures due to cosmic rays - or the Sun dying.
(A very good bet.)</p>
<p>The problem is not the hash. The problem is the chunk size.</p>
<p>Most of the storage-vendors use 4K block sizes.
Why? As 4K is the most commonly used smallest filesystem allocation unit for both Unix and Windows.
When you chunk data at 4K boundaries, most of the time, you win the bet.</p>
<p>Also note that Oracle tends to use 8K as a block size.
If much of your use is Oracle, with 8K chunk size in storage - again you most always win the bet.</p>
<h2>Site perspective</h2>
<p>From the perspective of an individual site, betting on deduplicated storage should make you <em>nervous</em>.</p>
<p>A small update to the applications running on your site could possibly have a <em>large</em> effect on the deduplication ratio.
You might want to keep your storage utilization (in excess of capacity), fairly small.</p>
<h2>Vendor role</h2>
<p>From the perspective of the vendor, the deduplication bet is spread across the <em>entire</em> customer base.</p>
<p>If you bought your storage from a high-end vendor (like EMC), they like to monitor your usage.
If your usage starts to spike ... a polite guy shows up at your door, with a new box of storage.
You drop in the new box, with little or no disruption to your operations.</p>
<p>From the vendor's perspective, betting across the entire customer base is a good bet.</p>
<p>A bit later ... when things have settled ... the polite guy from your vendor asks whether you want to buy the new storage, or reduce you usage.
Not really unfair, as you are using more. Also the vendor reduced a crisis to a slight discomfort.
Quite literally - you got what you paid for.</p>
<p>If you bought from a low-end vendor, and you ran out of storage ... your life is <em>not</em> fun.</p>
<h2>Problem of scale</h2>
<p>Using 4K blocks for fixed-sized hashed storage is a <em>big</em> problem.
The overhead for tracking each 4KB block of data is huge.
As you try to scale-up the size of storage, the overhead of (tiny) 4KB blocks is a problem.
Your vendor starts to run into problems, scaling up.</p>
<p>Quite logically, your vendor wants to scale up the block size.
Perhaps you are not especially bothered by the software update from your vendor, and you wonder why they appear nervous.</p>
<p>Problem is, your usage might <em>explode</em>.</p>
<p>Say your application-load changes, so that the same data is stored, but the offsets change by 1KB.
If your storage hashes on 4KB boundaries ... suddenly you may need 4x as much storage.
If your storage hashes on 8KB boundaries ... suddenly you may need 8x as much storage.</p>
<p>Your deduplicated storage has exploded.</p>
<p>Fixed-sized hashed blocks are vulnerable to this explosion.
Variable-sized hashed blocks are more robust to such changes, but have much more overhead.</p>
<h2>Variable versus fixed blocks</h2>
<p>Fixed size deduplicated block storage is a lot easier - which is why this is the base of most deduplicated storage.
Variable block size - with boundaries chosen by a rolling hash - is <em>much</em> <strong>much</strong> harder.
The overhead per chunk is higher.</p>
<p>Unless your vendor is very <em>very</em> good at algorithms, you will take a huge hit, somewhere in the range of performance.</p>
<h2>Lazy hybrid - and key insight</h2>
<p>At scale, the key insight is that storage is cheap, but I/O is expensive.</p>
<p>Flash storage is (becoming) cheap, but the I/O activity between nodes is expensive.
That equation does not look likely to change.</p>
<p>Taken together that means the primary purpose of deduplication is to minimize I/O.</p>
<h2>Solution?</h2>
<p>Fixed-size blocks are fragile. Variable-sized blocks are heavy.
What if you could realize the advantages of both?
What if you could cheat?</p>
<p>What if you could use fixed size blocks, but bump up size enough to get vendors past problems?</p>
<p>If the primary aim of deduplication is to minimize I/O, then the choice of algorithms on both client and server side become somewhat simple.
If you want to chunk on pattern-dependant boundaries, to strongly constraint explosions in de-duplication, but not force highest possible de-duplication ... is the end sum better?</p>
<h2>Reality check</h2>
<p>All the above is theory.
Meaningful experimental measure might lead to a different result.
Or not.</p>
VMware is doomed2016-07-15T00:00:00Zhttps://bannister.us/weblog/2016/vmware-is-doomed
<p>As a developer, I was an early VMware Workstation customer.
Once, VMware was the best/only outfit going for virtualization, and as desktop PCs grew past 1GB of memory, virtual machines became a useful developer tool.</p>
<p>Until VMware Workstation became unreliable.
Fair enough.
The money is in the "Enterprise" products, not stuff for developers.
I switched from VMware to VirtualBox, for my purpose.</p>
<p>Wind forwards a few years.
Hired by a company that owns VMware.</p>
<p>Bit odd.</p>
<p>VMware took a page from the late 1990's Microsoft book.
Lots of half-baked ideas, that did not go anywhere.
A focus on new features, but not on quality.
Rather a lot of crap software released.</p>
<p>Add in the cloud.</p>
<p>Developers started building tools for the cloud.
For good reason.
The cloud makes a lot of sense.</p>
<p>But VMware was not a target.</p>
<p>At the abstract, this is all about hosting virtual machines.
In the abstract, VMware should be as good a target as any other.</p>
<p>Years ago, the development community simply walked away from VMware.</p>
<p>More recently, VMware tried to re-brand as a "cloud software" company.
They are not (almost giggled).
You could make a software-for-the-cloud checklist.
VMware pretty much fails the entire list.
(Had more than usual occasion to visit this topic.)</p>
<p>The future for developers and virtual machines is OpenStack (private cloud), and AWS/Google (public cloud).
Developers simply no longer care about VMware.</p>
<p>VMware's future is legacy business.
Ask IBM how the mainframe market is working.</p>
Measure of rolling hash2016-07-14T00:00:00Zhttps://bannister.us/weblog/2016/rolling-hash
<p>Looking for a fast <a href="https://en.wikipedia.org/wiki/Rolling_hash">rolling hash</a> for a later experiment.
Tried a few variations - this gave the best throughput.
The sources are up on Github as <a href="https://github.com/pbannister/rolling-hash">rolling-hash</a>.</p>
<pre><code>$ make clean ; make
rm -rf o
mkdir o
cc -O3 -c -o o/main.o sources/main.cpp
cc -O3 -c -o o/ZRollingHash.o sources/ZRollingHash.cpp
cc -O3 -lc++ -o bin/rate o/main.o o/ZRollingHash.o
bin/rate
sizeof char: 1 unsigned: 4 long: 8 char*: 8
Prime buffer (256 MB)...
405 (ms) - prime buffer
Prime rolling hash 1...
Scan buffer for at least 30 seconds...
29562 (ms) - passes: 171 chunks: 11628 total: 45902462976 average: 3947580 rate: 1480 MB/s
$ make
bin/rate
sizeof char: 1 unsigned: 4 long: 8 char*: 8
Prime buffer (256 MB)...
389 (ms) - prime buffer
Prime rolling hash 1...
Scan buffer for at least 30 seconds...
29384 (ms) - passes: 170 chunks: 11560 total: 45634027520 average: 3947580 rate: 1481 MB/s
</code></pre>
<p><strong>~1480MB/s</strong> on a late-2013 MacBookPro (2.3Ghz i7 CPU).</p>
<p>I am looking to slice bulk data at variable data-dependent boundaries for de-duplication of storage.</p>
Back where I started2016-07-08T00:00:00Zhttps://bannister.us/weblog/2016/back-where-i-started
<p>Occurs to me that my present is in some ways not different from my past. :)</p>
<p>Recently posted a take on <a href="https://bannister.us/weblog/2016/building-a-cloud-2">putting together a cloud</a>.
There is a lot of educated guesswork in such an exercise, as there are a lot of unknowns.</p>
<p>Back when in college, I could not afford to go directly to University, so spend a couple years working.
Started working at a ratty local bike shop, and was later recruited to work at perhaps one of the best in the country.
(I was ... a bit <em>intense</em> as club rider. Later found my training buddies were UCSF category 2 racers.)
The shop ("Two Wheel Transit Authority" in Huntington Beach) specialized in high-end touring bicycles and gear.
Imagine as a 19-year-old kid, advising customers on what in current prices is $10K-30K worth of custom-built bicycles and gear.
Further imagine those customers are going to spend weeks or months in Europe, living with the gear you recommended.</p>
<p>Thought at the time: <em>If I get this wrong, they are going to</em> hate <em>me.</em></p>
<p>Know further that none of this was exact.
What is their current level of fitness?
What is their character (easy-going or hard-chargers)?
How much experience did they have with bicycle touring?
What sort of terrain is on their route (mustly flat, or serious mountains)?
On a strictly deterministic basis, I was making <em>wild</em> guesses on entirely insufficient data.</p>
<p>Yet somehow, it worked, and worked well.</p>
<p>One of my customers walked in with a department-store bike, and asked my opinion.
Told the exact truth - it was unusually good for a department-store bike, but very basic.
He came back a few weeks later, and asked me to build him a bike.
Usually, I asked that the customer come back after a few weeks, to make sure everything is still properly adjusted.
In this case, I did not get the chance.
The week he took delivery, he rode down to Mexican border, then turned around and rode up the Pacific coast to the Canadian(!) border.
Came back very happy - and told me about his trip.</p>
<p>Point is - I never had an unhappy customer.</p>
<p>Today I am chewing on the problem of how to build a cloud.
There are a lot of unknowns, and a lot of guesswork.
Clouds are a lot more complex than bicycles.
And not.</p>
<p>Point of information - the big vendors are nearly as much at sea as sites trying to deploy clouds.
Clouds are <em>new</em>.
The hockey-stick growth curve means there are a small number of folk with substantial cloud-expertise, and much larger group with little expertise, scrambling to catch up.
(As a customer, in part you do not care - as long as the vendor keeps ahead of your needs. Or appears to be ahead.)</p>
<p>This is a new area with a lot of unknowns, and a lot of guesswork.
Not unlike my job building custom bicycles for touring, when in college.</p>
Building a Cloud - futures2016-07-07T00:00:00Zhttps://bannister.us/weblog/2016/building-a-cloud-2
<p>This is more of a futures question.
Say you have an empty rack (or racks) in your datacenter, and are going to build a cloud.
How do you know what to buy or build?</p>
<p>I have this long-running [Gedankenexperiment][gedanken] (thought experiment)[^1] in the back of my mind.
If I were to design hardware for a cloud, how would I proceed?</p>
<p>This is my take on what makes sense when building out a cloud.</p>
<p>My opinion, not any pretense at absolute truth. :)</p>
<h2>Learn from the best</h2>
<p>If you are doing to build hardware for the cloud, learn from the best.
Amazon, Google, Facebook (and more recently Apple and Microsoft) - all have <em>massively</em> more experience than just about anyone else.
The <em>Open Compute Project</em> (see <a href="https://en.wikipedia.org/wiki/Open_Compute_Project">Wikipedia</a> and <a href="http://www.opencompute.org/">site</a>) is a <em>huge</em> hint.</p>
<p>Also visited this aspect in a <a href="https://bannister.us/weblog/2016/building-a-cloud-1">prior post</a>.</p>
<h2>Learn from the past</h2>
<p>The needs of hyper-scale public clouds are <em>not</em> the needs of the private cloud.</p>
<p>If you have re-written all your applications for the public-cloud model, you can use public-cloud hardware.
You are <strong>not</strong> going to re-write <em>all</em> your applications.
That means you need some hardware more resistant to failure - more in the direction of "enterprise" hardware.
In the private cloud, you are going to find many legacy applications, with need for varying levels of protection from hardware failure.</p>
<p>End of the day - developers want a single model for deploying applications.
The cloud is that model.</p>
<h2>Tiers - base</h2>
<p>Protection from failure can be factored into tiers, and factored by cost - lowest tier is lowest cost.</p>
<ul>
<li>A single network connection.</li>
<li>A single power supply.</li>
<li>A single (or dual) CPU/memory with no fail-over.</li>
<li>A local pool of storage.</li>
</ul>
<p>Failure of any of these means local state is lost.
Applications written for the cloud do not keep any critical data on the local node.
If your application does not keep any critical data locally, it is a candidate to run on this lowest-cost tier.</p>
<h2>Tiers - in-rack storage</h2>
<p>Lots of applications were designed for "crash-consistency".
Windows boxes tended to crash - from either hardware or software glitches.
If your application could recover in good order, you could work well on Windows boxes of the 1990's and 2000's.</p>
<p>Applications written to this model are tolerant of hardware failures, with the exception of storage.</p>
<p>This is an argument for moving storage off compute nodes to attached in-rack storage.
The in-rack storage needs better protection from failure, so is more costly, but the cost is amortized across the entire rack.</p>
<p>Specialized in-rack storage can be designed for redundancy.
How that redundancy is implemented does not matter.
What matters is cost, and that no single failure means lost data.</p>
<h3>Zinger - fast-enough connection(s) to storage</h3>
<p>The zinger here is the connection between compute nodes and storage.
1Gb/s ethernet connections are cheap, but not remotely fast enough.
A single 10Gb/s network connection is almost fast enough (compared to local flash storage) but - at least at present - rather expensive.
If you have to gang 10G/s ethernet connections, the cost over a rack is going to add up rather a lot.</p>
<p>Keep in mind, when a packet leaves a box over ethernet, it can be routed <em>anywhere</em> on the planet (and perhaps beyond).
That generality has a cost.
The connection to in-rack storage is point-to-point, and only has to travel a few feet.</p>
<p>As best I can tell, the cost of a single 10GB/s ethernet connection (counting both on the switch and compute node) is about the cost of a terabyte of local flash.</p>
<p>A cheaper connection, with more bandwidth is needed, to compete with local flash storage.</p>
<p>Keep in mind, cloud hardware was originally built around the economics of mass-market hardware.
The mass market is stuck on 1Gb/s ethernet, and this looks unlikely to change any time soon.
What is the mass market using for faster connections?
At present (thanks to Apple) the faster/cheaper choice is [Thunderbolt][thunderbolt].</p>
<p>As best I can tell, Thunderbolt 2 is (currently) about a tenth the cost of 10Gb/s ethernet (and at twice the throughput).</p>
<p>Thunderbolt is a point-to-point connection, which is all and exactly what you need for in-rack storage.</p>
<p>This is a bet.
Some daring vendor is going to offer both compute nodes and storage nodes connected by Thunderbolt, and offer better performance at a lower price.
This matters a <em>lot</em> in the cloud.
With computing at large scale (where everyone is headed), efficiencies matter.</p>
<h2>Tiers - fault-tolerant compute nodes</h2>
<p>The reason "enterprise" hardware exists is there are some applications that simply <em>cannot</em> fail.
The cost of failure to the business is <em>very</em> high.
That means purchase of (expensive) extremely redundant hardware is well justified.</p>
<p>This use-case does <em>not</em> go away with the cloud.
The programmer-model and the APIs used do not change.
What changes is the "flavor" used to deploy applications.</p>
<p>What is now counted as "enterprise" grade hardware will be rolled into the cloud.
Clouds - especially private clouds - will offer an extremely fault-tolerant tier.</p>
<p>Keep in mind, buying better hardware - however expensive - can be <em>much</em> cheaper for a business than rewriting software.</p>
<h2>Hyperconverged</h2>
<p>The hyperconverged model is simpler for the site deploying a cloud.
All nodes have storage, all nodes are equal.
Need to scale up?
Deloy more nodes.</p>
<h3>Zinger - the cost of I/O</h3>
<p>The problem is that past the base tier, this model depends on replication of storage between nodes.
Replication at scale requires hyper-fast ethernet - and hyper-fast ethernet is <em>very</em> expensive.</p>
<p>The approach of using cheap/fast point-to-point links (as is practical with in-rack storage), is not suitable for the hyperconverged model.
Point-to-point connections between each and every compute node in a rack is not especially practical.</p>
<p>Hyperconverged nodes as a solution for anything above the base tier are expensive.
Faster ethernet is expensive compared to the low cost of local or in-rack connection to storage.
When the overly-general connection costs you the same as a <em>terabyte</em> (or more) of local flash storage, the trade-off is not good.</p>
<h3>Where hyperconverged works</h3>
<p>There are cases where hyperconverged does well.</p>
<ol>
<li>Premium / "enterprise" grade / cost is (almost) no object tier.</li>
<li>Base tier where replication/redundancy is not needed.</li>
<li>Sites where average rate of volume writes is low.</li>
<li>Sites where a small proportion of applications do a <em>lot</em> of volume I/O.</li>
</ol>
<p>If you are building a first cloud, and you know the cloud is going to host critical applications that require reliable hardware, then (1) is a good choice.
You get first-class support from your vendor.
You can safely run all your applications on the cloud.
As you gain experience - and collect metrics - you can plan for building more cost-effective tiers ("flavors" in the cloud) to exactly fit your usage.</p>
<p>If you are building a first cloud, and want to keep costs minimal, then (2) is a good choice.
Keep in mind some of your applications should not run on such a cloud, as failures are expensive.
While somewhat painful, experience running your suite of applications on such a cloud will - over time - help identify applications that need better reliability.</p>
<p>(Note that <em>at present</em> it is not clear if hyperconverged hardware is well supported in OpenStack - at least without help from your vendor.)</p>
<p>If your applications do relatively little I/O to storage (especially writes), then (3) applies.
With a small-enough rate of writes, replication (for redundancy) is much less of an issue.
You might even be able to scale back the network connections to cheap 1Gb/s ethernet.
There likely are some fairly large segments of your applications that fit this model.</p>
<p>If the bulk of your applications fit (3), and a small segment fit (4), then the I/O intense applications can spread the load across a larger number of (lightly used) nodes.</p>
<p>As your experience and use of the cloud matures, you will know enough to build out racks with the right balance and placement of compute and storage.
Well-balanced racks are going to give you better performance for less money.</p>
<p>If the cost of 10Gb/s (and up) ethernet drops <em>radically</em> in cost, then hyperconverged nodes will make sense in more cases.
At present, the high cost of ethernet fast enough for connection to storage strongly tilts the balance toward local flash storage.</p>
<h2>Futures</h2>
<p>There are of course lots of hybrids of the above.</p>
<p>I expect a private cloud will offer flavors for each tier.
The proportion to each tier will be specific to the site, and will change over time.</p>
<p>The vendor that can get their collective head around what is needed by the customer, and can offer optimal hardware, will win.
This is a different game than the past.
As history has shown, a large fraction of current vendors will fail to adapt.</p>
<p>This is all fairly straightforward.</p>
<br />
[gedanken]: https://en.wikipedia.org/wiki/Thought_experiment
[openstack]: https://www.openstack.org/
[flapping]: https://cloudplatform.googleblog.com/2015/03/Google-Compute-Engine-uses-Live-Migration-technology-to-service-infrastructure-without-application-downtime.html
[thunderbolt]: https://en.wikipedia.org/wiki/Thunderbolt_(interface)
<hr />
See also: [building a cloud](/weblog/2016/building-a-cloud-1)
<p>[^1]: As you might guess, my degree from University was Physics, and quite a number of my professors were German.</p>
Building a Cloud2016-07-06T00:00:00Zhttps://bannister.us/weblog/2016/building-a-cloud-1
<p>Say you have an empty rack (or racks) in your datacenter, and are going to build a cloud.
How do you know what to buy?</p>
<p>I have this long-running <em><a href="https://en.wikipedia.org/wiki/Thought_experiment">Gedankenexperiment</a></em> (thought experiment)[^1] in the back of my mind.
If I were to put together a cloud, how would I proceed?</p>
<h2>Amazon - an exact answer</h2>
<p>If I were at Amazon, obtaining the answer would be fairly straight-forward.
Amazon keeps lots (and <em>lots</em>) of metrics.
I could crunch through the numbers, looking for patterns of usage.
If I were building out a general-purpose datacenter:</p>
<ol>
<li>Look for the biggest cluster in the metrics.</li>
<li>Design a collection of hardware to efficiently and exactly suit that pattern of use.</li>
<li>Assign a named <em>flavor</em> such that instances deployed with that flavor are preferentially deployed to that collection of hardware.</li>
<li>Subtract the cluster from the metrics, and repeat from (1).</li>
</ol>
<p>The collection of hardware for each <em>flavor</em> would be sized proportionate to the amount of usage in past metrics.</p>
<p>If I were adding to an existing datacenter, I would look for clusters of usage, not efficiently served by the existing flavors.</p>
<p>If you are Amazon - with excellent metrics - building out new hardware is a fairly exact exercise.</p>
<h2>Building a first cloud</h2>
<p>If you are building the first cloud at your site, you do not have metrics.
The exact/Amazon approach does not apply.
You know only roughly what applications will first land in your cloud, and in what size.
You know even less how usage will change over time.</p>
<p>This is a truly hairy problem.
While setting up <a href="https://www.openstack.org/">OpenStack</a> becomes easier every year, building an OpenStack cloud is already a formidable exercise.
Add to this selecting and configuring the hardware for your cloud, and finding (and debugging) the appropriate drivers.</p>
<h3>Do it yourself</h3>
<p>You could try and build out a cloud using your in-house (limited) expertise.
A lot of folk go down this path - and quite a few folk get badly burned.</p>
<p>The best advice here is to keep your first cloud as simple and vanilla as possible.
No exotic hardware. No vendor-specific drivers. No second-class hypervisors. No complex networks.
As simple and as close to a mainstream configuration as is possible.</p>
<p>Once you have your first cloud in production, only then think about adding complexity.</p>
<p>A specific recipe for a low-risk first OpenStack cloud:</p>
<ul>
<li>KVM as the hypervisor.</li>
<li>Cinder storage as LVM volumes.
<ul>
<li>Flash drives to fill the Cinder storage nodes (for Cinder volumes).</li>
<li>Flash drive(s) in each Nova compute node (for ephemeral volumes).</li>
</ul>
</li>
<li>Network as simple as possible. (As suits your existing in-house expertise.)
<ul>
<li>1Gb/s network to "public" access (general access to your site's network).</li>
<li>1GB/s network for "management" (between OpenStack nodes, only).</li>
<li>10Gb/s network for Cinder volume I/O (between OpenStack nodes, only).</li>
</ul>
</li>
</ul>
<p>(This could be an article in itself. Maybe one exists, somewhere?)</p>
<p>Personally, I would spend my time deploying <a href="http://docs.openstack.org/developer/openstack-ansible/">OpenStack-Ansible</a> (OSA), first as all-in-one, later on the full rack.
(There are other worthy alternatives, but at present I would choose OSA.)</p>
<p>This approach which might spend the least money, can also easily spend the most time.</p>
<h3>Buy your first cloud</h3>
<p>If you want get a cloud up in shortest time, with least risk - spend money.
(This is one of those <em>you get what you pay for</em> moments.)
Use a vendor with a lot of OpenStack expertise to build your first cloud.</p>
<p>Keep in mind, currently OpenStack is going through the early <em>hockey-stick</em> rapid growth phase.
That means expertise in OpenStack is limited, and spread pretty thin - even and especially with vendors.</p>
<p>Keep your first cloud as simple and vanilla as possible - even when buying from a vendor.
Better not to be tempted into a more-complex setup.
(You could easily find unexpected behaviors, that will eat time.)</p>
<h2>Where do you go from here?</h2>
<p>Once your first cloud is in production, collect metrics.
Look at your site's usage.</p>
<ul>
<li>Is memory heavily used, but not CPU? (Add memory.)</li>
<li>Is CPU heavily used? (Add CPUs.)</li>
<li>Is the netowrk heavily used? (Add more/faster network links.)</li>
<li>Is Cinder storage a bottleneck? (Add more/faster storage.)</li>
</ul>
<p>In essence, you are using the Amazon approach (above), but with a lot less data. :)</p>
<p>Get used to this practice, as you are going to do this a lot, over time.</p>
<hr />
See also: [futures](/weblog/2016/building-a-cloud-2)
<p>[^1]: As you might guess, my degree from University was Physics, and quite a number of my professors were German.</p>
Catching up on web applications2016-07-04T00:00:00Zhttps://bannister.us/weblog/2016/catching-up
<p>At the beginning of 2007 the old mash of incompatible web browsers had settled out enough I was willing to bet of developing a complex / rich web application.
Before this there were some pretty impressive demos of things you could do in a web browser, but most were massively specific to a particular web browser (and even a particular version) - not suitable for an application that had to work with <em>whatever</em> the customer was using.</p>
<p>Microsoft had pretty much abandoned web browser development.
That meant Internet Explorer 6 (IE6) had time to displace practically all the prior versions of IE.
IE6 was ... not too horrible.</p>
<p>Looking ahead, my guess was that for the small group / niche product I was working on, there was an approaching make-or-break point.
We had to come up with a replacement for a critical (once) licensed third-party Windows application.
Ideally, the replacement should be a web application, to integrate well with our existing backend and web application.</p>
<p>Please understand, when I say "we", I mean "me".
(Our development group was small, and shrinking.)
I had never done a complex / highly interactive web application before.</p>
<p>In that time, I generated a series of public <a href="https://bannister.us/weblog/2007/examples">examples</a>, reflecting bits of my ongoing work.</p>
<p>Also understand that the Javascript frameworks (like jQuery) were at that time still very young, and not useful for my purpose.</p>
<p>In the end, the project took the better part of a year to finish.
I wrote new code for the massively-optimal server-side C++ bulk processing application.
I wrote a Java web application to interact with the browser-based user interface code.
I put together a custom packaging of Apache Tomcat, to be as secure as possible for that application.
(I was once a committer to Apache Tomcat, so familiar with the code.)
I wrote the HTML / CSS / Javascript for the user interface that ran within the web browser.</p>
<p>In the end, I delivered a highly interactive web application, that was better than the Windows application on which we previously dependent.</p>
<p>When the vendor pulled the plug on Windows application, on which we were previously critically dependent, we could offer a better replacement.
Our product survived that crisis.</p>
<p>Also, at the end of the project, I was exhausted.
Spanning so many <em>very</em> different domains as an individual developer, is not fun.</p>
<p>After, I have not done any web application / user interface work.
My skills in that area are very much out of date, and there has been much progress.</p>
<p>Rather pleased with the emergence of AngularJS.
I tried to make a similar argument to the HTML5 working group, but without success.
Lost interest, as my work was elsewhere.</p>
<p>Reading about how recently the web-designer community seems to be headed away from the "cascading" nature of style sheets.
Bit relieved as I was not ever convinced this was a good approach.
(No special insight here. I thought maybe with enough work it might make sense. Then I went off and did other things.)</p>
<p>HTML5 has gone from a hoped-for future, to the living present.</p>
<p>Could spend time coming up to current on the HTML5 / CSS3 / Javascript side, but perhaps not worthwhile.
Do not know (yet) what will be my next development chapter.</p>
<p>Slightly amused the (generally) top-right "menu" icon, driven by smart-phone user interface concerns, has become common.
Three decades later, top-level user interfaces have wrapped back to a notion very similar to what I put into a user interface style guide in the early 1980's (when at Burroughs).</p>
Converted to Jekyll2016-07-01T00:00:00Zhttps://bannister.us/weblog/2016/converted-to-jekyll
<p>Moved my posts from published with <a href="http://blog.getpelican.com/">Pelican</a> to <a href="https://jekyllrb.com/">Jekyll</a>.
(<a href="https://bannister.us/weblog/2014/conversion-of-weblog-to-pelican">Converted from WordPress</a> a few years ago.)
There might be some errors introduced by the conversion(s).</p>
<p><strong>TODO:</strong></p>
<ul>
<li>Need to work on the CSS/style (still).</li>
<li><s>Need to add access to categories.</s></li>
<li><s>Add (selected) support for Disqus comments.</s></li>
<li><s>And (Google) search?</s></li>
<li>And?</li>
</ul>
Backup and OpenStack2016-07-01T00:00:00Zhttps://bannister.us/weblog/2016/backup-and-openstack
<p>Watching OpenStack as an emerging platform, it took some time to sort the various offering for backup.
If you are trying to sort the different offerings for backup, hopefully you can use the following as a something of a guide.</p>
<p>(This is a bit of a background piece, for somewhere I want to go later.)</p>
<p>Before we can talk about backups and the cloud, we need to cover the general case of backup.</p>
<h2>Backup storage by kind</h2>
<p>Factored by present technology choices, there are three primary forms of backup:</p>
<ol>
<li>Backups in primary storage.</li>
<li>Backups in storage specialized for backup.</li>
<li>Backup to the cloud.</li>
</ol>
<p>There are also hybrids of the above three variants.</p>
<p>For (1) your highest performance and highest cost choice is to keep backups in primary storage.
High-end storage uses references and hashes to store volumes, not bare indices to raw blocks.
That level of abstraction at the storage-side means creating a read-only clone of an entire volume (as needed for backup) can be a sub-second operation.
Restores can also be sub-second.
If you need (and can afford) the highest levels of backup/restore performance, keep your backups in smart primary storage.</p>
<p>There are problems with this approach.</p>
<p>The first is cost.
Your smart/primary storage is expensive.
In reality, almost all the data written into backups will never be read.
Even with deduplication (we are assuming smart storage), the larger part of your expensive storage is occupied by data that will never be used.
If you need - and can afford - the <em>highest</em> performance levels, this is what you will use.</p>
<p>The second is fragility.
Failure of primary storage means you lose not just your current data, but also <em>all</em> your backups.
For most folk, this is not acceptable, so you need a hybrid solution, with some form of replication.</p>
<p>Note also if you are not using "smart" storage, performance with this approach is poor.</p>
<p>For (2) the vendor can take advantage of the fact most backups are written, but never read.</p>
<p>Some form of deduplication is a staple.
The algorithms used for both ingest and expiration are critical.
Performance is less than (1), and cost is less as well.</p>
<p>For (3) the cost is lowest, as performance is lowest.</p>
<p>Performance is much less than (1) or (2) ... (or at least should be less).
As the data is off-site, this approach is more robust in the disaster-recovery case.</p>
<p>There are of course an entire assortment of hybrid solutions.</p>
<h2>Quality of implementation</h2>
<p>Whatever the approach, the algorithms chosen, and the quality of implementation - can either meet the optimum, or not.
As backups move a <strong>lot</strong> of data, these algorithms matter.</p>
<h2>Replication</h2>
<p>If all your backups are in one place, and something bad happens to that place, you could lose all your backups.
Most likely, you want to replicate all or some of your backups to a distinct place.
Again, algorithms matter.</p>
<h2>Cloud backup in general</h2>
<p>When cloud backup is mentioned, there are quite distinct cases.</p>
<ol>
<li>Backup from on-premise to the cloud.</li>
<li>Backup of applications in the cloud to on-premise.</li>
<li>Backup of applications in the cloud, within the cloud.</li>
</ol>
<p>You could buy distinct solutions for each of the above cases.
That does not sound like fun.</p>
<p>So the interesting question becomes: Can you design backup that works for all three cases?</p>
<p>Note that (3) in particular constrains the solution.</p>
<h2>Cloud backup in OpenStack</h2>
<p>When backup is mentioned in OpenStack forums, there are distinct cases.</p>
<ol>
<li>Backup of the cloud infrastructure.</li>
<li>Backup of the bulk data in the cloud.</li>
<li>Backup of tenant applications and data within the cloud.</li>
</ol>
<p>You hear (1) and (2) rather a lot from folk who are deploying OpenStack.
Backing up your cloud infrastructure (1) is critical and modest in scope.
Conventional approaches to backup for Linux applications work well.</p>
<p>Bulk data backup (2) is simple, but not very useful.
If you have any active tenant applications, then tenant data is very likely in an inconsistent state.</p>
<p>The more interesting case is (3).
Tenants need an on-demand and scheduled service to backup their applications and data in the cloud.</p>
A measure of Skein2016-06-27T00:00:00Zhttps://bannister.us/weblog/2016/skein-nist
<p>Looking for a fast hash function for generating large (~256 bit) hash values (for another experiment).
Recalled from <a href="https://www.schneier.com/academic/skein/">Schneier's write up</a> that <a href="https://en.wikipedia.org/wiki/Skein_(hash_function)">Skein</a> was relatively fast compared to other entrants in the SHA3 competition.
Needed a number, so pulled down the <a href="http://www.skein-hash.info/downloads">V1.3 NIST submission</a>, and wrote a small program to measure the rate of bulk hashing.
The sources are up on Github as <a href="https://github.com/pbannister/skein-nist">skein-nist</a></p>
<pre><code>$ make
mkdir o
mkdir bin
cc -O3 -c -o o/rate.o sources/rate.cpp
cc -O3 -c -o o/skein.o sources/skein.c
cc -O3 -c -o o/skein_block.o sources/skein_block.c
cc -O3 -lc++ -o bin/rate o/rate.o o/skein.o o/skein_block.o
bin/rate
Size of buffer : 4194304
Size of chunk : 65536
Running for minimum of 30 seconds...
Passes: 2081 elapsed: 30 total: 8324MB rate: 277MB/s
Expected hash bits : 512 bytes: 64
0 1 2 3 4 5
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9
048260482604826048260482604826048260482604826048260482604826048260482604826048260482604826048260482604826048260482604826048260482604826048260482604826
Hash : ea326072100f5bc7eb0c38a64bbb87cf597fa3c2270651979088b6fd95771f909ae1b4069ff6b4b20b5df0cdc92814d41bc93427f1dbe60bed13748b731ce507
</code></pre>
<p><strong>~277MB/s</strong> on a late-2013 MacBookPro (2.3Ghz i7 CPU).</p>
<p>I am looking to "fingerprint" bulk data for de-duplication of storage.
The Skein result is a bit slow for my purpose, but good enough for initial experiments.
There may be faster implementations of Skein.
There may be faster hash functions with the needed properties.
(Something to check, later.)</p>
Presented at OpenStack conference2016-04-27T00:00:00Zhttps://bannister.us/weblog/2016/presented-at-openstack-conference
<p>Presented a session on Backup at the April 2016 OpenStack conference in Austin.</p>
<p><a href="https://youtu.be/9MeOC7MLwWA">EMC - Developing A BackUp & Recovery Solution for Tenancy</a></p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/9MeOC7MLwWA" frameborder="0" allowfullscreen=""></iframe>
<p>After, my oldest son - who took classes on public speaking - had much to say.
First time presenting at a conference.
On rewind, I see all the bits that could have been done better.</p>
<p>There was a time when I would have been nervous presenting in front of a large room.
For some reason, that is no longer the case.</p>
Programming Myths2015-06-28T00:00:00Zhttps://bannister.us/weblog/2015/programming-myths
<ul>
<li>Pair programming</li>
<li>Continuous integration</li>
<li>Superprogrammers</li>
<li>Meetings</li>
<li>Failure</li>
</ul>
<p>Spent more than a decade working remote, from home. Built some significant software. Raised my kids (after a divorce). Became somewhat disconnected.</p>
<p>What is labeled as "Agile" programming became a fashionable thing.</p>
<p><strong>Pair programming</strong>
Pair programming is one of the fashionable myths. Does not work for me. A few minutes thought turns into several times longer explaining what I just did and why. Horribly not efficient.</p>
<p>I do have one example (almost forgotten) where it worked, and well. Joined a research project as an undergraduate at the University of California, Irvine ... simply as it sounded like fun. One weekend, quite by chance, found another member of the group in the computer lab. He was trying to build a parser for (then new) the Ada programming language. He was typing, I was following, close. "Yes". "No." "What about..." was the main exchange. This was not a practice that (then) had a name.</p>
<p>Two bright minds racing in parallel. (Average minds do not find their way into research projects, as undergraduates.)</p>
<p>The next week, we had a large part of a parser for Ada. A few weeks later, we were amused when one of the reviewers for the Ada language proposals claimed a recursive-decsent parser for Ada was not possible. We had built a working recursive descent parser for Ada, so knew he was wrong (though not without difficulty).</p>
<p>As a practical matter, you are never going to get two folk like me in a group. Pair programming is unlikely to work for me.</p>
<p>But most programming groups are built out of more average folk. Get two average folk reviewing their combined work ... might work.</p>
<p><strong>Continuous Integration</strong></p>
<p>Pulling together a groups' work, and applying tests on regular basis, sounds like a good notion. I do not work that way.</p>
<p>As an acquired practice, I always do developer-testing before inflicting my software on other folk. Developer testing is opportunistic and episodic. I test what I have changed, focused to (near) only that. I test for zero, one, and many. I test for basic success and failure. In effect probing a few chosen samples from the entire possible space. Turns out, this limited sample is remarkably effective.</p>
<p>The dogma of continuous integration is that if you drop your changes into the common space, problems will be removed earlier. I do not follow this. I built focused tests along with new code. I dropped my changes into the common pool, only when the tests passed.</p>
<p>At the end of a development episode, only when all my tests were passing, I dropped my code into the common pool. What that meant is I was dropping thousands of lines of new and changed code, near the end of a release window. This freaked out some of my coworkers, as they "knew" large changes meant instability in to common code. A usually-right expectation, that was completely wrong in my case.</p>
<p>As it turned out, my additions made a negative contribution to the bug count. (As I regularly found and fixed regressions in the common code, in advance of all others.) My scary-large commits made the entire codebase more stable. This is not what the common myth predicts.</p>
<p>Developer tests, and a strong emphasis on early quality largely oviate continuous integration.</p>
<p><strong>Superprogrammers</strong>
Read the book "Mythical Man Month" from Fred Brook, quite a while ago. Never really believed in the 10x bit. But <a href="https://bannister.us/weblog/2014/multiplier">recent experience</a> offered a sort of confirmation.</p>
<p>To be clear, I do not write email insanely fast. I do not write "Hello World" ten times as fast. For day-to-day tasks the difference is not large.</p>
<p>Going from the starting point to a working solution is like finding a route across an unknown map. Put simply, I tend to find a more direct route, and get lost less. My day-to-day progress may not be dramatically different, but the more direct route makes a huge difference. The end result, over the longer term, is close to 10x.</p>
<p><strong>Meetings</strong>
Average programmers tend to get lost, on the path from start to solution. Get enough folk together, often enough, and they might get lost less.</p>
<p>I rarely get lost. From the start of my working life, meetings were mostly about sorting out the confusion of others. Tedious.</p>
Sorting House music and Techo2015-04-16T00:00:00Zhttps://bannister.us/weblog/2015/sorting-music-house-and-techno
<p>Feels like a threshold.</p>
<p>Kraftwerk came up with term "Techno-Pop" back in the 1970's. Had everything from Kraftwerk, originally on cassette tapes.</p>
<p>There was a long period in between where I was not finding good "techno". With the rise of the web, there were downloads in 1990's ... but little compelling.</p>
<p>The emergence of SoundCloud was a change. Lots of music. Much in like kind ... but ... something missing.</p>
<p>I am not much for labels. Labels like "house", "EDM" and "techno" ... whatever. There is a larger part of the music I find slightly clever or amusing in parts, but less so in the whole. What is "Deep House"? "Minimal Techno"? Something of that direction...</p>
<p>You have to rewind and unwind a bit. Some of the current folk are composers, in a greater sense than past "DJs" mashing fragments off vinyl. The better folk are building creative complex music, based on current technology.</p>
<p>Centuries ago an orchestra was advanced technology - a group that could play a (relatively) unlimited amount of music, new and old. In that time, the closest equivalent to an iPod. Composers wrote the software for an orchestra, and were highly prized.</p>
<p>An orchestra was cheaper than the past equivalents. Insanely expensive compared to the present.</p>
<p>In the present music makers can compose complex music with far fewer folk. Computers, digital looping, sampling - all allow creative compositions not practical before. We have new kinds of composers enabled by current technology.</p>
<p>There is a great deal of music on SoundCloud that is pleasant. Perhaps slightly clever, but forgettable.</p>
<p>There is a smaller set that is more deeply creative and worthwhile. Also, no clear boundary.</p>
<p>Yes. I am trying to sort the to which I listen and buy. Not clear as yet.</p>
Coffin Corner2015-03-23T00:00:00Zhttps://bannister.us/weblog/2015/coffin-corner
<p>A term from aviation - <a href="http://en.wikipedia.org/wiki/Coffin_corner_(aerodynamics)">coffin corner</a> is rather on my mind. In short, a "coffin corner" is where your range of choices is narrow, shrinking - and anything outside that range is fatal.</p>
<p>Went to a dating-event, where a woman complained that men (nearer my age) do not date women of the same age range. Ran across a study where the range of ages men and women considered most acceptable diverged much over time - to the point they were nearly disjoint at my age.</p>
<p>Went to an age-ranged speed-dating event, as an experiment. Easy conversations, but no interest in anything closer. In theory, you listed who you liked, and the coordinaters would say who liked you in return. At the end, my list returned was empty. The coordinaters - wanting better outcome - gave contact information for the third who expressed interest. (For which no use.) Disjoint.</p>
<p>From recent readings on personality, I might expect 1 in 30 women to prove as personality complements. (A speculation by one writer, that seems to fit my limited experience.) On occasion friends tried to set me up - no success. Other odd episodes do fit. Add this to disjoint expectations ... is anything left?</p>
<p>I very much want, and have always wanted, a meaningful relationship in my life. The first time around, I got it badly wrong. The second time around, I want to get it right, and do not want less. Getting there is just not happening.</p>
<p>Yeh. <a href="http://www.urbandictionary.com/define.php?term=First+World+Problems">First world problems</a>.</p>
<p>Well ... after a morning on Family Court, I know there is an underclass in our society who fuck and reproduce with (by my standards) no concern for their future or children. When tucked away in upper-middle class suburbia, easy to not see this.</p>
<p>Perhaps I should adjust my expectations to reality, and adopt a female counterpart as a pet. Better odds. Not what I want.</p>
<p>Or not. But the odds are much not in my favor. Feels like a corner.</p>
Private subnets - first attempt2015-03-07T00:00:00Zhttps://bannister.us/weblog/2015/private-subnets-attempt
<p>For development I want to route <a href="https://bannister.us/weblog/2015/private-subnets-basis">private subnets</a> over existing networks. From reading about <a href="https://bannister.us/weblog/2015/openflow-start">OpenFlow and SDN</a> it looks as though using Open vSwitch is suitable.</p>
<p>My first attempt <em>almost</em> works...</p>
Private subnets and development2015-03-06T00:00:00Zhttps://bannister.us/weblog/2015/private-subnets-basis
<p>Private isolated subnets are a common practice in datacenters and server deployment. They make sense for both performance and security. Server to server traffic within a group cannot be degraded by outside traffic, if isolated. Traffic on an isolated subnet within a physically secure datacenter can pass unencrypted with minimal concern for security. Also two networks simply have more bandwidth than one. So private subnets improve both performance and security.</p>
<p>This is standard practice in production network deployments, since at least the 1980's. Yet many developers are unfamiliar with this practice. Folk from the desktop world often design applications assuming a single network, and a single IP address / hostname / network interface per machine. (Thus the elaboration above.)</p>
<p>In my current exercise I am building a backend service for a OpenStack cloud. Connectivity is a bit complex in the cloud backend (as it must). I want to be certain my code does not accidentally assume connectivity not present. I want my network topology in testing to emulate a production environment.</p>
<p>Thus the present exercise.</p>
<p>My present work is for a very large company. We have quite a lot of hardware in the software development lab, but not expertise in production deployments. This means a lot of lab irregularities to work around.</p>
<p>As a developer, I just want to get my job done. I need to build a test / development environment with our existing lab environment. If I had an excess of time and resources, I would re-run wires and reconfigure fancy Cisco switches. Becoming expert on quirky gear I might never see again is simply not on my list of priorities. This means I want to route a private subnet - somehow - over the existing networks.</p>
<p>For OpenStack development / testing the host/network configuration I want looks like this:</p>
<p><img src="https://bannister.us/weblog/images/private-subnets.svg" alt="network topology" /></p>
<ul>
<li>Host A runs all the OpenStack services, with the exception of nova-compute and cinder-block, in a VM. The use of a VM allows me to develop with more than one OpenStack version (or variant) with identical network access.</li>
<li>Host B runs just cinder-block, again in a VM so I can test with different OpenStack versions. Access to the underlying storage pool managed by cinder-block is only guaranteed on this host.</li>
<li>In addition there are four hosts that run only nova-compute. These are <em>not</em> VMs as I want realistic performance for the running OpenStack instances. (The four hosts can be partitioned between any OpenStack versions under test.)</li>
</ul>
<p>Only host A has access to both private and public subnets. The remaining hosts are only connected to the private subnet(s).With six hosts I believe this gives a realistic and very flexible development setup.</p>
<p>Thus my <a href="https://bannister.us/weblog/2015/private-subnets-attempt">first attempt</a></p>
House not home2015-02-28T00:00:00Zhttps://bannister.us/weblog/2015/house-not-home
<p>Lived twenty years in this house. More of my life than any other place.</p>
<p>Last weekend, spent time and energy painting my bedroom in Ultra Pure White. First comment, I needed to hang pictures on the wall. No desire.</p>
<p>For me this is just a house, not a home. This is the place where I raised my kids. They have strong positive emotions tied to this place. Becoming adults, they have started to move on - as they should. To my grandson, this is a place where he has always been happy and safe. To me this is just an empty space.</p>
<p>Moved small stuff out of the room before painting. When done, liked the uncluttered look, moved little back. Accumulated odds and ends, and anachronisms did not come back. (Odd to realize an LED clock/radio and a docked iPod were obsolete.)</p>
<p>My five year old grandson asked about and listed every missing item. ("Where is it? Why is it gone? That goes <em>there</em> and ..."). He seems disturbed by the changes.</p>
<p>But I have no fondness for this place.</p>
OpenFlow and SDN2015-02-25T00:00:00Zhttps://bannister.us/weblog/2015/openflow-start
<p>There is something rather nice going on in networks.</p>
<p>If you have (like me) mostly ignored the blizzard of buzzwords, not ready to invest the time to sort hype from substance, this is missive is meant as a shortcut.</p>
<p>(Skip the links I am offering in the middle, at first. I promise to tie this together at the end.)</p>
<p>The acronym SDN (software defined networking) could mean almost anything. This means that vendors and pundits have spun tales to serve their own interests, and all that writing makes for <a href="http://tech.slashdot.org/story/13/04/29/2324200/inventor-of-openflow-sdn-admits-most-sdn-today-is-hype">confusion</a>.</p>
<p>There is a central thread. Once you find the thread, everything makes sense.</p>
<p>Several years back, some folk wanted to do clever things with networks, and proposed a clever factoring. Networks have a certain amount of intelligence, in how packets are routed. The point at which packets are routed can be called either switches or routers. Either term refers to the intelligence of the network. The clever folk took existing switches as example. They partitioned the problem of switching into a simple/fast per-packet (often hardware based) rules engine, and an arbitrarily complex policy engine (much less often used) that could do ... almost anything. Turns out they choose very well.</p>
<p>The central thread is <a href="http://en.wikipedia.org/wiki/OpenFlow">OpenFlow</a> which spins out of a <a href="http://archive.openflow.org/documents/openflow-wp-latest.pdf">research project at Stanford</a>.</p>
<p>As they chose the right factoring, the right API between hardware switching and software ... everything changed.</p>
<p>Turns out Google converted one of the largest planet-scale networks over to OpenFlow with good results, as <a href="http://www.wired.com/2012/04/going-with-the-flow-google/all/1">publicly noted in April of 2012</a> (and <a href="http://opennetsummit.org/archives/apr12/hoelzle-tue-openflow.pdf">PDF</a>).</p>
<p>Existing switches could readily offer OpenFlow APIs, and <a href="http://networkheresy.com/2014/11/13/accelerating-open-vswitch-to-ludicrous-speed/">performance of OpenFlow switches could be optimized</a>.</p>
<p>This natural shift in technology is a threat to the existance of network switch vendors, as reflected in the slightly manic <a href="http://blogs.cisco.com/tag/openflow">postings from Cisco</a>.</p>
<p>Most relevant to virtualization, the <a href="http://en.wikipedia.org/wiki/Open_vSwitch">Open vSwitch</a> code is a software OpenFlow switch very well supported in Linux (with strong backing from Redhat). In cloud environments we have a great need for good support of intelligent switching, to support complex network topologies, and a fraction will be pure software switches within the hypervisor host.</p>
<p>Where do we end?</p>
<p>If you use networks, this is <em>very</em> good news. Your networks are going to get smarter, cheaper, faster, and easier to use.</p>
<p>Expect a lot of noise as existing vendors try to defend their old model. Likely you will deploy <em>more</em> switches, when they become a lot easier to use, and cheaper. Naturally, the existing switch vendors will try to convince you to keep buying their proprietary gear - with steadily less reason. The core is OpenFlow, and supporting products (hardware and software).</p>
<p>Very cool.</p>
<p><em>Update - 2015-03-30</em>:
Looks like Broadcom is building a large new facility in Irvine, along my present commute. Have to wonder if this is driven in part by the rise of "merchant silicon" enabled by OpenFlow.</p>
Analysis Paralysis2015-02-16T00:00:00Zhttps://bannister.us/weblog/2015/analysis-paralysis
<p>Need to paint the upstairs.<br />
Need to replace the (twenty year old) carpets throughout the house.<br />
Need to replace the windows blinds, all through the house.</p>
<p>Will hire a professional painter, when I have enough accumulated.<br />
Seems to make sense to replace the carpets, only after painting.<br />
Will start a cleaning service, only after new carpets and paint.</p>
<p>My house <b>not</b> remotely immaculate.</p>
<p>Could end up with a perfect suburban house ... and not really care.</p>
<p>So my house is ... imperfect. Bugs me. But not that important.</p>
<p>So I stop. My house is a mess. (Well, to my mind.)</p>
<p>Bought paint for the upstairs, long ago. A ladder to reach the upper parts. Power tools to rip down the blinds.</p>
<p>Well, better to wait for warmer weather. Need to keep the windows open, while paint dries.</p>
<p>Meanwhile the once ordered space in my garage becomes increasingly cluttered. Making space for the disorder in my kids and sister's lives is worth something. Yet...</p>
<p>Bounce...</p>
<p>Filled the trash bins. Yard is mostly cleared. Garage is ... better. Blinds are down. Space to paint...</p>
Are Big Companies Odd?2015-02-01T00:00:00Zhttps://bannister.us/weblog/2015/are-big-companies-odd
<p>The last few years I have worked at a very large hardware/software company. First time working at the very large company since working at Burroughs in the early 1980's (then the second largest computer company on the planet). The years between I worked at a number of small to mid-sized outfits.</p>
<p>There is something odd about working at a big company, or more exactly, the folk in the company.</p>
<p>Admittedly my experience is limited. Perhaps other big software companies are different.</p>
<p>Burroughs was a very successful outfit in the process of imploding. Did not know that at the time. (Revenue grew strongly the years I was there, then reversed after I left.) As the second job in my profession, I had no basis to judge. Seems the problem was most projects, after much development, were cancelled before going to customers. So customers saw very little progress from a once highly innovative vendor. Odd management.</p>
<p>Now I work for a very successful company whose offerings are (mainly) various themes around storage.</p>
<p>The company seems to have a very effective Sales organization. After they buy a small company (thus acquiring a new product) the years after see massive sales, far in excess of what the acquired company managed on their own. As a software developer, I do not really understand Sales. Clearly this company's Sales folk are effective.</p>
<p>The company seems to have a very effective Support organization. Customers do a lot of repeat business. Surveys reflect high levels of customer satisfaction. (I do understand support a bit better, as at small companies I had a lot of contact with customers.) Clearly the company is doing something right.</p>
<p>Somehow I cannot quite get my mind around the behaviors of the company Development groups.</p>
<p>The company is highly profitable, and the development groups are quite large. There is a lot going on ... but with so many folk, somehow less gets developed than I would expect. Seems the company acquires major new products mostly by buying other companies. (And then as noted above, sell and support the product very well.)</p>
<p>One recent acquisition was a company with a new all-flash storage array. I would have expected the company - with a long history and whose primary products were disk-based storage - to have developed such a product in-house. Sure, the algorithms are a bit different, so the software design needs to be a bit different, but ... there is a lot of commonality. Why did in-house development not happen?</p>
<p>While I know very little of the other development groups in the company, my time with the local group may provide clues.</p>
<p>There were quite a number of puzzling moments.</p>
<p>Early on, the manager for a prior project talked about "staffing up" the project. I was puzzled. By my estimate the first version of the product should take less than a year, and could be handled by the three folk then in the group. In fact, I could likely build the first iteration on my own in that time, if I were willing to make that my entire life (with the freedom to ruthlessly prioritize).</p>
<p>Though as I did not have experience building a larger software group, I thought perhaps he was right.</p>
<p>During the design and early development phase, the project architect seemed far too eager to add complexity, and to introduce dependencies on other in-development projects. Seemed to me like a lot of added risk, and much that should not be in a first version. (Once a product goes to customers, you learn a lot about what they actually need. Better to go to customers early, so you do not spend time on unneeded features, and learn what you have missed.)</p>
<p>But the architect and manager were both very experienced folk. Perhaps they could manage the risk better than I thought possible. Perhaps development at a large successful company requires a fatter first version than I expected.</p>
<p>As it turned out, the project shipped after three years, required about twenty folk all told, and ... seems to have missed the market. The added complexity and risk all cost time and headcount pretty much as I had expected.</p>
<p>At one point I thought the actions taken by the architect and manager could be explained if the primary aim was building the largest possible development group. Building a product and serving customers were almost non-goals. This seemed excessively cynical, to my mind.</p>
<p>Much later, in a meeting the architect proposed an absurd project, entirely on the basis that funding was available, and a large development group would be required. Suddenly the prior interpretation seemed more likely.</p>
<p>....</p>
<p>Listening to the folk around me ... they are different.</p>
Example - Mersenne Twister random number generator2015-01-05T00:00:00Zhttps://bannister.us/weblog/2015/example-mersenne-twister
<p>Pushed my <a href="https://bannister.us/weblog/2007/mersenne-twister-random-number-generator">prior example implementation of the Mersenne Twister</a> into Github.
Benchmarked on current hardware (2.3 GHz Intel Core i7 in a Macbook Pro).</p>
<pre><code class="language-sh">$ Release/mersenne-twister
Computed 7309 million primes in 30002 MS - 243.6 m/s
</code></pre>
<p>Seems above is about six times faster than an 8-year-old 2200Mhz Athlon. :)</p>
<p>Note there are now faster random number generators, but they tend to be more trouble.
This example is very fast, small, and highly portable - in all less trouble.</p>
<p>Also note there are two optimizations (one "extra" value in <em>MT</em>, and <em>map</em>) that remove code from the inner-most loop.
(So this should be a touch faster than other implementations.)</p>
Example - feed-workers2015-01-01T00:00:00Zhttps://bannister.us/weblog/2014/example-feed-workers
<p><em>(Pulling <a href="https://bannister.us/weblog/2014/examples-moving">prior examples</a> forward)</em></p>
<p>How can you spread out processing of very large logs (or similar sequential texts) over all your CPUs?</p>
<p>That was the question Tim Bray asked in his Wide Finder exercise.
This was <a href="https://bannister.us/weblog/2008/wrapping-up-wide-finder-2">my answer</a>.</p>
<p>Take this as a reflection of my mind.
Rather than write a complex solution exactly specific to the problem at hand,
I looked for the <a href="https://en.wikipedia.org/wiki/KISS_principle">simplest most flexible solution</a>.</p>
<p>Pushed the code into <a href="https://github.com/pbannister/wide-finder">Github</a>.</p>
<p>I put the code in public in hope it might be used by others.
From the emails received in the years since, at least a few folk have found use.
This code also served as a base for an optimal CSV file reader <em>(link:TBD)</em>.</p>
<p>###Test on current hardware</p>
<p>Running on current hardware (MacbookPro w/ quad-CPU, 16GB memory) using as input the logs from my webhost:</p>
<pre><code class="language-sh"> $ wc -lc logs/_access.log
125948 25645720 logs/_access.log
</code></pre>
<p>The input file is small enough for the OS to cache in memory, so this pure single CPU processing:</p>
<pre><code class="language-sh"> $ time wide-finder/scripts/reduce.pl < logs/_access.log | wide-finder/scripts/combine.pl > _out
real 0m0.856s
user 0m0.859s
sys 0m0.021s
</code></pre>
<p>Using the <strong>feed-workers</strong> with a single CPU should be slightly slower than the above.
The increase in time is the (small) overhead.
Note the CPU-bound Perl scripts are the limit.</p>
<pre><code class="language-sh"> $ time wide-finder/Release/feed-workers -n 1 -r `which perl` -s wide-finder/scripts/reduce.pl logs/_access.log | wide-finder/scripts/combine.pl > _2
TIME Thu Jan 1 12:59:15 2015
Scanning: logs/_access.log
Done with: logs/_access.log
Worker #88301 ended with status: 0
TIME Thu Jan 1 12:59:16 2015
Elapsed (ms): 888, total (MB): 24
Scanned 27 MB/s
real 0m0.909s
user 0m0.912s
sys 0m0.043s
</code></pre>
<p>Since the <em>reduce</em> processing is CPU-bound, better to spread over the available CPUs.</p>
<pre><code class="language-sh"> $ time wide-finder/Release/feed-workers -n 4 -r `which perl` -s wide-finder/scripts/reduce.pl logs/_access.log | wide-finder/scripts/combine.pl > _2
TIME Thu Jan 1 12:59:22 2015
Scanning: logs/_access.log
Done with: logs/_access.log
Worker #88308 ended with status: 0
Worker #88307 ended with status: 0
Worker #88306 ended with status: 0
Worker #88305 ended with status: 0
TIME Thu Jan 1 12:59:23 2015
Elapsed (ms): 352, total (MB): 24
Scanned 69 MB/s
real 0m0.373s
user 0m1.193s
sys 0m0.052s
</code></pre>
<p>Note the <em>user</em> time has increased (Perl is not cheap), and the real time is less than half.</p>
<p>###Test on large input</p>
<p>The prior numbers were pure CPU-bound, without any time reading from disk.
With a much larger input file (50GB) the contents cannot be cached.
This is also indicative of real-use processing (where the input is not cached).</p>
<pre><code class="language-sh"> $ time wide-finder/Release/feed-workers -n 4 -r `which perl` -s wide-finder/scripts/reduce.pl logs/O.50gb | wide-finder/scripts/combine.pl > _2
TIME Thu Jan 1 13:10:47 2015
Scanning: logs/O.50gb
Done with: logs/O.50gb
Worker #88348 ended with status: 0
Worker #88347 ended with status: 0
Worker #88346 ended with status: 0
Worker #88345 ended with status: 0
TIME Thu Jan 1 13:18:44 2015
Elapsed (ms): 477083, total (MB): 50098
Scanned 105 MB/s
real 7m57.111s
user 30m59.569s
sys 0m59.584s
</code></pre>
<p>The result is near 4x faster, matching the number of actual CPUs.
(I did try larger and smaller numbers, with lesser performance. Intel's "hyperthreading" does not impact this usage.)</p>
<p>For reference, scanning w/o processing:</p>
<pre><code class="language-sh"> $ time wide-finder/Release/feed-workers -n 4 -r `which cat` logs/O.50gb > /dev/null
TIME Thu Jan 1 13:53:38 2015
Scanning: logs/O.50gb
Done with: logs/O.50gb
Worker #88454 ended with status: 0
Worker #88453 ended with status: 0
Worker #88452 ended with status: 0
Worker #88451 ended with status: 0
TIME Thu Jan 1 13:54:44 2015
Elapsed (ms): 65583, total (MB): 50098
Scanned 763 MB/s
real 1m5.591s
user 0m3.190s
sys 0m57.351s
</code></pre>
<p>The MacbookPro has a fast flash drive.
This shows that <strong>feed-workers</strong> is efficient and I/O bound even on very fast storage.</p>
Moving forward prior examples2014-12-30T00:00:00Zhttps://bannister.us/weblog/2014/examples-moving
<p>Over time I accumulated a number of examples that I placed in public.
Many are no longer especially relevant. A few are worth carrying forward.
Some are still (unexpectedly) popular.</p>
<p>Moving some/all of this to Github.
Have older Subversion and Mercurial repositories I would just as soon not maintain.</p>
<p>The sources for smaller examples are just files on this site.</p>
<p>Examples moved to Github: <em>(will update)</em></p>
<ul>
<li><a href="https://bannister.us/weblog/2015/example-feed-workers">C++/feed-workers</a> - Efficient read of sequential text and feed to parallel workers.</li>
</ul>
<p>Examples stored on the website:</p>
<ul>
<li><a href="https://bannister.us/weblog/2007/simple-base64-encodedecode-javascript">Javascript/simple base64 encode/decode</a> - Continues be popular (though less often needed?).</li>
<li><a href="https://bannister.us/weblog/2007/mersenne-twister-random-number-generator">C++/Mersenne twister random number generator</a> - Fast/small implementation in C++, and <a href="https://bannister.us/weblog/2015/example-mersenne-twister">update</a>.</li>
<li><a href="https://bannister.us/weblog/2009/extending-the-pearson-hash-function-to-larger-values">Extending the Pearson hash function to larger values</a> - In the past I have found much use for the Pearson hash.</li>
<li><a href="https://bannister.us/weblog/2005/how-to-build-a-better-string-class-and-a-surprise">C++/fast string class</a> - Small/fast string class in C++.</li>
</ul>
<p>Examples to move:</p>
<ul>
<li><a href="https://bannister.us/weblog/2008/performance-parsing-csv-data">C++/CSV reader</a> - Took the <strong>feed-workers</strong> code as a base and wrote a fast CSV reader.</li>
</ul>
Security in numbers2014-12-04T00:00:00Zhttps://bannister.us/weblog/2014/security-in-numbers
<p>Security, and more specifically - access control, is all about numbers.</p>
<p>To obtain an object out of secure storage, you need a key. In the software world, this key usually has two parts.</p>
<p>The first part of the key goes by various combinations of modifiers: access, authorization, ticket, token, identity, and security. At base, this key identifies who you are, and is usually deriven from a username/password. The username/password is also just a (big) number, encoded in ASCII (usually). If guessing the first key is hard enough, then the storage is considered secure.</p>
<p>The second part of the key identifies the object within storage, and for ease of use is usually the same for all users. This is the equivalent of a pathname in a filesystem, or an HTTP link (or URL).</p>
<p>But in the end, when put together, the key is simply a big number. If you have the right number, you get access to the stored object. As long as guessing that number is impractical, the storage is secure.</p>
<p>This leads to a <a href="https://bannister.us/weblog/2014/security-by-number">very simple notion for secure web-scale storage</a>.</p>
Security by number2014-12-04T00:00:00Zhttps://bannister.us/weblog/2014/security-by-number
<p>The <a href="https://bannister.us/weblog/2014/security-in-numbers">prior observation</a> leads to a very simple, very high performance design for secure storage.</p>
<p>We could take the abstract notion of a single big number as a key, and omit distinct access-checks. For example, if an object were stored under:</p>
<p><a href="https://bannister.us/weblog/2014/security-by-number">http://bannister.us/storage/7A1DD621-BA6D-414D-9BEC-48F38431314A</a></p>
<p>If you did not already have the number (a UUID in this case), the odds of your guessing the right number are essentially none. So simply storing an object under a big number is secure.</p>
<p>The problem with this scheme is that it leaks over time. You can only "find" objects if you already have the number. You would first get the number only via some authenticated path. But once the number is recorded (in an email for example), there is no control over who else gains access in the future.</p>
<p>This leads to the <a href="https://bannister.us/weblog/2014/security-and-time">next notion</a> where we introduce time.</p>
Security and time2014-12-04T00:00:00Zhttps://bannister.us/weblog/2014/security-and-time
<p>The <a href="https://bannister.us/weblog/2014/security-by-number">prior notion</a> while initially secure, leaks over time.</p>
<p>This consideration (and others) leads to the notion of introducing a sort of <em>view</em> into secure storage.</p>
<p>We can change the URL so the object UUID is prefixed by a view UUID:</p>
<p><a href="https://bannister.us/weblog/2014/security-and-time">http://bannister.us/storage/DBA7FA0A-398D-40AF-962D-18BC3DCEE7CE/7A1DD621-BA6D-414D-9BEC-48F38431314A</a></p>
<p>(The examples use UUIDs. In fact, any big number will serve. SHA hashes are an alternative.)</p>
<p>Where the view UUID is computed when you login, and object UUID(s) are mapped into that space dynamically. Any application-specific access checks need only be computed once - when the object is mapped into the view, and never again. This both simplifies your application, and reduces the load on your server(s).</p>
<p>The number of views would be small (roughly the number of active users), and would expire after some (site and application specific) period of time, or by explicit operator or user action.</p>
<p>This approach also solves another (old) problem with content-management systems - the problem of sharing.</p>
<p>Secure content management systems need to both support and control sharing. If the software does not allow the kind of sharing needed by users site-specific usage, users bypass security (by saving documents/information as unsecured files, and screenshots). This is a problem well-known in content management for decades. At the same time, attempts to allow for and build explicit support for sharing generally fail. Over the years we have seen many complicated schemes that proved hard to implement, hard for users to understand ... and still failed to cover all use cases.</p>
<p>Security is about knowing who to trust. We have to assume that (generally) users know who should have a bit of stored information. We also want an audit trail - the ability to see who has accessed an item - to account for information use, and spot any problems. If users resort to bypassing the application, we lose the audit trail. If we allow users to easily share as they see fit, without bypass, then we will have an audit trail.</p>
<p>So sharing must be easy, and at the disgression of the user. Also if sharing covers all use cases, then the application has the opportunity to add value when the shared item is viewed (which in turn could further encourage users to use this form of sharing).</p>
<p>Combining better security with greater application value and higher user satisfaction is a win!</p>
<p>In addition, the above scheme can be implemented very simply and very efficiently, using stock web servers.</p>
<p>Web servers already have very efficient and well-tested support for authentication. Some web servers (nginx is an example) offer extremely scalable and efficient filesystem access. Basic site-wide standard authentication means standard web server logs contain the information needed to construct an audit log. Creating views as directories in the filesystem, placing links to stored files within the view, means security needs to be computed exactly once (when placed in the view), and never again. (In effect, later per-access checks are performed for free by the web server.)</p>
<p>Simpler application software and more efficient access is also a win!</p>
<p>In the super-computing world this approach was once known as "code-hoisting". In a loop, if an expression always computes the same value, better to compute the expression once outside the loop. In the case described here, the explicit security check is performed exactly once - when the object is linked into the user's view - and not needed when the object is accessed.</p>
<p>I have worked on a number of content management systems over the years, and from that work had a number of not-well-solved problems in the back of my mind. The end result of the above is better security (in practical use), more efficient execution, and less application logic - pretty much addressing all the unsolved problems - and is both simple and extremely efficient. Pretty much a win-win-win-win. :)</p>
Rain Inflection2014-11-30T00:00:00Zhttps://bannister.us/weblog/2014/rain-inflection
<p>Sunny earlier this morning. Was going to take a longer hike up Saddleback Peak. Heavy clouds outside now, offering bits of rain. Paused.</p>
<p>Work is at a similar point. Might solve a problem in a new market segment for a very large company. Spent months building an initial version, recently presented to customers, all of which went very well. The amount of revenue at risk makes anything I might get paid a rounding error.</p>
<p>Or not. Companies are social organizations, at times driven by emotion and ego as much as reason. This could all go to nothing. Which will prove true, I do not yet know.</p>
<p>Given all that needs done, I should be working through to the priority bits needed to gain and keep customers. Or that might be a waste of time. Hard to find motivation, just now...</p>
<p>Should know in a few days.</p>
<p>Cloud base should be low. Hiking up into the clouds is pretty cool. Going to take that hike.</p>
<p><em>{Photos}</em>
<a href="https://www.flickr.com/photos/dreadedhill/sets/72157649138795290/">2014.11.30 - Harding Truck Trail</a></p>
Family Thanksgiving Dinner2014-11-27T00:00:00Zhttps://bannister.us/weblog/2014/family-thanksgiving-dinner
<p>Thought we should make an attempt at a coordinated "family" dinner, this time around, as a practice for the future. Dividing up the work should make the event easier. Also a gathering at my house burns less money, and is far more practical as the number of kids increase.</p>
<p>My middle kid - <a href="https://www.facebook.com/cedric.bannister">Cedric</a> - has learned quite a lot about cooking in the last several years, so he can do much. So Cedric and I went shopping for supplies the day before, and split the load so he could do some prep at his place beforehand. Missed a few bits, but this generally worked.</p>
<p>(I also used the opportunity to "kidnap" my grandson, with which he was entirely fine.)</p>
<p>The last few years, I simply skipped the event altogether. In prior years, I did almost all the preparation and cooking (and cleanup). Rather a lot of work, and as a family assortment, we seem to be growing. Better to divide the work up, especially now that my kids are adults.</p>
<p>Cedric wanted to do roast beef, so threw the spices he wanted into melted butter (to let the flavors infuse), coated the beef in the spiced butter, and sealed in a plastic bag overnight in the fridge.</p>
<p>Prepared a bed of veggies, butterflied the turkey, and basted in a similar spiced butter mix. Started the turkey low and slow (to warm through), long ahead. Pulled out to run all the other bits through the oven, then finished in a 550F oven (for nice skin).</p>
<p>Cedric nailed the roast beef, of course.</p>
<p>(<a href="https://www.facebook.com/mariaelisee">Maria</a> and <a href="https://www.facebook.com/alexander.bannister.7">Alexander</a> did some bits, too.)</p>
<p>Pretty much worked out. Not bad for a first attempt at family dinner.</p>
<p>Later, the family of <a href="https://www.facebook.com/alexxkayy">Alexander's girlfriend</a> came by, in response to my invitation. My son wore a tie ... must be serious.</p>
Keep up2014-11-25T00:00:00Zhttps://bannister.us/weblog/2014/keep-up
<p>Question asked by a coworker:</p>
<blockquote>
<p>"How do you keep up?"</p>
</blockquote>
<p>I was ... puzzled. Perfectly sensible question. I am in my late-50s. He is likely 20 years younger - old enough that technology changed substantially within his time. Lots of older folk get fixed on past patterns, and have trouble adapting to changes ... and my field advances steadily. We met on visit to a (very large) customer, where I was bringing a first, early solution to an domain where most everything was new.</p>
<p>A reasonable question, but why did I have no immediate answer?</p>
<p>I have never felt the need to "keep up". Why?</p>
<p>Ever watched a surfer ride a wave? If you "catch" a wave - match speed with the front of an incoming wave - you can "ride" for a long ways with little effort. If you start too late, you have to work very hard to catch up to the wave.</p>
<p>In much the same way there are "waves" of new technology. If you see the wave, if you are out in front and at pace, catching the front of the wave is easy. Adapting to change is easy when you see the change coming long before it arrives. I have never felt the need to "keep up". Rather it feels more like "Oh, this finally arrived. Cool."</p>
<p>So "keeping up" is easy, when you are always ahead. :)</p>
Inflection point2014-11-23T00:00:00Zhttps://bannister.us/weblog/2014/inflection-point
<p>At an interesting point. Two paths for my near future. One is intense work over a year or more, of benefit. Other is changing jobs. Which is yet unchosen.</p>
<p>The intense path means writing software for new usage, in a very short timeframe, working mostly by myself, with my work going direct to the customer into critical usage.</p>
<p>Also this is pretty much dead center on what I can do. Sounds like fun.</p>
<p>As a part, could end up presenting at a conference, with between a few hundred and a few thousand in the room. Never done the like. In the past, such prospect would have been slightly terrifying. Now, the notion does not bother me at all.</p>
<p>Will also go in front of customers that represent some of the largest companies on the planet, with an enormous amount of my employer's business at risk ... and somehow entirely comfortable with the notion.</p>
<p>Changes.</p>
<p>Listening to the other side of mind...</p>
<p><a href="http://www.lucentdossier.com/">Lucent Dossier</a> is offering another event, in the near future. Love their noise. More of an social explorer than a participant. Costume is what I wear every day. Too long since the last of such. (About the only reason I would go to Vegas ... bought tickets and booked a room, immediately.) Hard to explain the why. <em>Going.</em></p>
Multiplier2014-10-29T00:00:00Zhttps://bannister.us/weblog/2014/multiplier
<p>Read <a href="https://en.wikipedia.org/wiki/The_Mythical_Man-Month">The Mythical Man Month</a> quite a long time ago. One of the assertions in the book, since much repeated, is that "super programmers" are an order of magnitude more productive than average programmers.</p>
<p>While I know that I have always been more than usually effective, an order of magnitude felt like an overstatement.</p>
<p>The last project offered two examples that seem to confirm the multiplier.</p>
<p>At the beginning of the project, I assigned the simplest part of the project to the team member whom I suspected was the least capable (and who later became the group manager). A few months in he was joined by a new hire just out of college. Their assignment was to write a thin adaptor layer to hide version differences in the high-end backup engine we were using.</p>
<p>For several months, I was off doing other tasks. When those were completed, I wrote two exercises. The first exercise was to completely introspect a cloud (VMware vCloud), and log the complete set of responses. (This later proved useful in finding the chain of requests needed to fetch needed items.)</p>
<p>The second exercise, building on the first, was to discover and back up all the virtual machines in a cloud. For that I needed the backup engine adaptor. They had code, but it did not yet work. I found the problems, and filled in the gaps. Made a <strong>lot</strong> of changes. Figured that using their code as a base saved me about two weeks over starting from scratch. After two weeks, I handled back a fully working version of their code.</p>
<p>Collectively they put in about 12 man-months, before I looked at their work, and it was not yet working. Compared to the month I estimated of my time.</p>
<p>Later in the project, I spent a few months writing the REST API for the majority of the objects supported by the service (schedules, templates, application, datacenters, etc.) along with the synchronization logic to efficiently update many backup engines. (Clouds can be large, so you need to scale the number of backup engines along with the cloud size.) Bit tricky, but finished in the time alloted (a few months), and built tests to flush out the majority of problems.</p>
<p>Sketched out, but left incomplete, support for replication objects, as the backend support was not yet ready. I figured the remaining work was about a month, maybe two. Two programmers were assigned to the task. After about a man-year, I merged in their work, and wrote tests to verify ... and the tests failed badly. Took me about a month to rip through their code (ripping out a lot along the way), and make the code pass the tests. In the end, I was not sure if using their work as a base was faster than writing from scratch.</p>
<p>So again, about a month of my time, versus a man-year of others.</p>
<p>Looking through their code, I could see where they lost the thread. While they generally knew what was needed, they got lost on the specifics. They did many things that were not needed, and missed needed bits. As I read through their code, I could feel where they had lost the narrative.</p>
<p>You could argue that I should have done a better job laying out the work, for others, and more closely watched their progress. And I would agree. Not really a part of my past experience, as I much of my past work was large episodes working mostly on my own.</p>
<p>I made the mistake of assuming others could do what I can do, readily. Seemed too much like ego to assume less. Seems now as Fred Brooks was more right than I expected.</p>
Conversion2014-10-27T00:00:00Zhttps://bannister.us/weblog/2014/conversion-of-weblog-to-pelican
<p>Converted my weblog from WordPress to a Pelican (a static site generator), recently.
Did a bit of clean up today. The original conversion (several weeks ago) was very rough.
Better ... but still needs work.</p>
<p>Several years back I bet on WordPress as an intermediate solution.
Looking at the implementation, I never trusted WordPress to be secure ... and it was not.
(Never put your code into the web-addressible / writable space.)
A weblog is not exactly mission-critical. With offline backups, it was good enough.</p>
<p>Still, the poor performance and regular corruption was an annoyance.
The static weblog generators improved over time. Time to move over.</p>
<p>Apologies for any (very likely) broken bits.</p>
Cloud application backup and OpenStack2014-08-21T00:00:00Zhttps://bannister.us/weblog/2014/cloud-application-backup-and-openstack
<p>At work a few months back, was asked to look at backup for OpenStack. Specifically backup of virtual machines running in an OpenStack cloud. My prior project (backup for VMware vCloud) was wrapping up, so the timing was good, and the topic familiar.</p>
<p>Some <a href="https://bannister.us/weblog/2014/coming-up-to-speed-with-openstack">initial observations</a>.</p>
<p>Before going further, we need to be clear on names...</p>
<p>What AWS calls “instances”, OpenStack calls “instances”, or “servers”, or “hosts”. VMware, VirtualBox and KVM use the term “virtual machines” for the same purpose. In the following, I am going to use “instance” to refer to a virtual machine.</p>
<p>We also need to be clear on the need…</p>
<p>Some argue that a built-for-the-cloud application does not need traditional backup. I agree … mostly. The notion is that we rely on a robust versioned and replicated object store to preserve state, and instances are spun up to handle load, but do not have state to preserve.</p>
<p>For some applications, this model can work. No need for traditional backup.</p>
<p>For more traditional sorts of applications, the cloud model may not apply. There are lots (and lots) of existing working useful applications, built to an older model, that we might choose to spin up in a cloud. Frankly, I suspect there are many rich applications where web-scale is not needed, and the “pure” cloud application model is more trouble than it is worth. For those (many) applications, a more traditional sort of backup is needed.</p>
<p>So there is still a need for the backup of applications (instances) in the cloud.</p>
<p>Note also that storage for backups calls for a different performance profile. Backups are write-mostly, read-seldom, and multiple backups can be enormously compressed by deduplication. This profile differs from other cloud storage services.</p>
<p>In outline, efficient cloud application backup is simple. Note that a cloud application may consist of one or more instances, with one or more volumes (virtual disks) attached to each instance.</p>
<p>Given a list of instances, and a list of associated volumes…</p>
<p>Collect the metadata for the instances.
Quiesce the instances (interrupts application activity).
Snapshot all (wanted) volumes in all instances.
Resume the instances (so as to minimize interruption of service).
Collect changed-block lists for all volumes in all instances.
Store the application/instance metadata and changed blocks into backup storage.
Notify of backup completion.
Note particularly that we want the quiesce/snapshot/resume sequence to be as fast as possible, to minimize any interruption of application service. Also scanning and/or copying multi-gigabyte volumes on every backup is expensive and silly. Smart volume storage can keep track of changed blocks, and enormously accelerate backups.</p>
<p>Note also that this is not a one-instance at a time backup!</p>
<p>Given the above outline, the existing OpenStack APIs for backup are … silly.</p>
<p>Cinder allows you to backup a volume … if the volume is not attached to an instance.
Nova allows you to backup a single instance … to Glance (the object store)
Add to this: in testing on “stable/icehouse” branch, if I start more than one “nova backup” in succession, only the first succeeds.</p>
<p>The existing OpenStack APIs for backup are not adequate.</p>
<p>Poking around, it looks like all the pieces are present (or nearly) for efficient backup of applications in the cloud, at scale, but … not assembled as a working whole.</p>
<p>The next few months should prove interesting.</p>
Coming up to speed with OpenStack2014-08-20T00:00:00Zhttps://bannister.us/weblog/2014/coming-up-to-speed-with-openstack
<p>Was asked to look at <a href="http://openstack.org/">OpenStack</a> a few months back. Had read a bit prior, and was impressed with the velocity and vigor of this open source cloud platform and project.</p>
<p>Made the mistake of starting with OpenStack. Read a large chunk of the OpenStack documentation. Stood up instances of <a href="http://devstack.org/">devstack</a> both on virtual and physical hosts. Not everything made sense.</p>
<p>OpenStack exists because of <a href="http://aws.amazon.com/">Amazon Web Services</a> (AWS). Amazon does an excellent job hosting cloud applications, and is the largest player. As a developer, building a cloud application for AWS makes good sense.</p>
<p>Some organizations want to host cloud applications in-house. Hosting an in-house cloud can make sense for a variety of reasons, ranging from performance through cost, control, and legal requirements. If you want to host your own cloud, you want a cloud that works for both existing and newly developed cloud applications. Since cloud application developers are most likely to build for AWS first, you want a cloud as close as practical to AWS.</p>
<p>So OpenStack must be close to AWS from a developers perspective … and is, mostly.</p>
<p>To understand OpenStack, you really need to understand AWS, first. The OpenStack documentation is not bad. The AWS documentation is much better. You can play with AWS very easily, and at very low cost. (Part of the reason AWS is a success is the ease of starting.) Once you are acquainted with AWS, you will find OpenStack easier to understand.</p>
<p>That said, the OpenStack community does at times lose focus.</p>
<p>To be clear, the AWS API can best be viewed as a thin wrapper around Amazon’s cloud services. As AWS evolves, the AWS API evolves. The API is not a set-in-stone independent entity. The Amazon folk are thoughtful in their choices. They change the services and the API carefully, so as to minimize the impact on developers. But the AWS API does change over time.</p>
<p>A few years ago, Mark Shuttleworth (of Ubuntu) made <a href="http://www.markshuttleworth.com/archives/765">an argument about OpenStack and AWS compatibility</a>. While in general I strongly agree … Mark seems to be arguing for an exact emulation of AWS. I think this is a mistake … but not far from right.</p>
<p>The OpenStack API is a wrapper around services offered by a particular instantiation of cloud services. The services offered might vary somewhat. Different projects and vendors want to plug in differing implementations behind the service APIs. I think this is a good thing. An organization might want to stand up a cloud with emphasis on different aspects of performance, to suit their usage of applications in the cloud.</p>
<p>As a cloud application developer, I like AWS quite a lot. If considering an alternate cloud, the effort on my part to move my application should be as small as practical.</p>
<p>Small but not zero.</p>
<p>If a cloud service has differing characteristics, my use of that cloud may need to be different.</p>
<p>The AWS API is exactly designed for AWS. The AWS API is not designed for cloud services of differing character. As such, the AWS API is not well suited for differing clouds.</p>
<p>There are parts of the AWS API that should be exactly emulated - the S3 service and API is an obvious candidate. As a cloud application developer I am almost certain to make extensive use of S3 (as simply an excellent web-scalable object store).</p>
<p>The other AWS APIs … not sure if I care. For operations I use much less, all I want is well-defined and well-documented simple mappings from AWS APIs to OpenStack usage. If the services are of differing character, I might need to make differing usage. If the differences are small, the work on my part may be small enough I do not care.</p>
<p>So I do not care about exact emulation in all cases. I do care about minimal difference.</p>
<hr />
<p>If you are trying to understand OpenStack, start by reading up and playing with AWS.</p>
David Keirsey died2014-06-28T00:00:00Zhttps://bannister.us/weblog/2014/david-keirsey-died
<p>This is about missed connections, absurdly close.</p>
<p>Seems that <a href="http://en.wikipedia.org/wiki/David_Keirsey">David Keirsey</a>
died, about a year ago. He wrote a book on personality types <a href="http://en.wikipedia.org/wiki/Please_Understand_Me">Please
Understand Me</a> that
might well have changed the course of my life.</p>
<p>Of my own interest, I read rather a lot of books on Psychology, in high
school and for a time after. By the time Keirsey's first edition of
"Please Understand Me" came out, I had stopped those readings.</p>
<p>More recently, after what amounts to a prolonged social accident, I
started readings around psychology, again. Read the latest of Keirsey's
books, and suddenly the prior confusing social episode seemed to make
sense.</p>
<p>The year 1978 was when Keirsey's first edition book on personality types
appeared, and the year I started at the University of California, Irvine
(as a third-year student).</p>
<p>My major was in Physics, but one of my "breadth" areas was Psychology. I
took the introductory courses but, because my prior readings were
essentially in advance of the entire first year, I did not have to
study, and did not interact with the other students in the class. After
that I took more specialized courses in Psychology, which the general
run of students avoided.</p>
<p>The joker here is that Keirsey's book, and the more recent social
accident, suggest that my strongest match in personality might have been
among those students of Psychology. Wish I had known...</p>
<p>Add to this Keirsey was at the California State University, Fullerton
for quite a long time. That school is within walking distance of the
house in Placentia, where I grew up. After 1978 - the time of Keirsey's
first book on the subject, I spent very little time there. But in the
time between ... I wonder how many times are paths wove near.</p>
<p>If I had happened to take courses there, might we have met?</p>
<p>At University, I met a girl. Later we married, had kids, and ... were
not remotely suited. I only knew that I had chose poorly, but had not
the slightest clue how to choose well. Divorced. Dated for a time, with
poor result, then stopped.</p>
<p>On the early social web, ran into a woman - thousands of miles away - to
whom emotionally I was very strongly attracted. Made no sense. We seemed
very different. Thought it was whack. We ended up talking quite a lot,
but I did not understand her personality at all ... as I had no prior
experience with that sort. I thoroughly fucked up the conversation. Very
much a glitch.</p>
<p>Bit later, occurred to me that I really did not understand different
sorts of personalities, so started readings on Psychology, again. In
Keirsey's book found my personality sort (easy), found ... and started
to understand ... the glitch-woman's personality sort. In the part of
the book speculating on compatibility, Keirsey thought those two sorts
might be the strongest of all matches.</p>
<p>Oh.</p>
<p>Read his book about a year or so before he died. Would rather we have
overlapped a bit more.</p>
<p><em>[later...]</em></p>
<p>Just to add another layer, chatted briefly with Keirsey's son, who it
turns out was a UCI at the same time as I, and likely much of the time
in the same buildings. Our paths were just enough apart we may never have
met, but only just. Odd echoes.</p>
Observation, delayed2014-05-24T00:00:00Zhttps://bannister.us/weblog/2014/observation-delayed
<p>A regular exercise. Sit in an outdoor patio at a restaurant, for lunch,
and watch. There are patterns. Most for which I do not have names. There
is something about big purses, and small women, not interesting. High
heels worn wobbly, or slow, or fluid. (Reading a book about the <a href="http://en.wikipedia.org/wiki/Red_Queen_hypothesis">Red
Queen</a>, which seems
applicible in this context.) Low modest heels and clothes. Clear
conformity (boring). Awkward mashups. And occasionally a woman walks
past whose appearance and dress seem coherent and well done.</p>
<p>Differing combinations.</p>
<p>From psych readings on personality types, and how appearance reflects
type, could I be picking up on type?</p>
<p>Then there are times when my mind goes back later and asks ... what was
that?</p>
<p>Thursday. Eating at an otherwise empty outside patio. A woman walks
past, around, and enters the restaurant. Very nice. Very attractive. A
sense that her appearance and personality were in concert.</p>
<p>Finished eating. Stood up, looked around, and found that same woman was
the only other person on the patio, and she had taken a table a distance
directly behind me. Male optimism wants that to mean something, but
objectively there is no basis.</p>
<p>Walked across to the coffee shop. In front of me in line, a blonde woman
in cutoffs and backless. Very nice. Puzzling. While I enjoy the display
... this was different. Seemed somehow very coherent, and very
affective.</p>
<p>Later, looked to see where she had gone, and found she took the place
closest to the exit. Again, male optimism wanted that to mean something,
but ... no traction.</p>
<p>Told in hindsight, this is much clearer than at the time.</p>
Great Love Debate, Long Beach2014-04-08T00:00:00Zhttps://bannister.us/weblog/2014/great-love-debate-long-beach
<p>Another random excursion...</p>
<p>Saw an event offered on a MeetUp group: "THE GREAT LOVE DEBATE comes to
LONG BEACH!" Title sounds a bit whack. Never been to that venue, so ...
bought a ticket. No particular qualification needed.</p>
<p>There is a <a href="https://www.facebook.com/events/355282404610536/">Facebook
page</a> ... completely
disused, aside from the promoters. Also, turns out, there is a
<a href="http://www.greatlovedebate.com/">untitled</a>website.</p>
<p>Very odd. Lots of girls. Less than half as many guys. From the
description:</p>
<p>"100 of Southern California's most dynamic SINGLE WOMEN. 100 of its most
ELIGIBLE BACHELORS."</p>
<p>Well, there were certainly more than 100 women present. Some possibly
very nice. (Dim light, mass setting, not much to go on. Apparently could
have gone much earlier, but did not know beforehand.)</p>
<p>Considerably less than half as many men. (What is that?) As to "most
ELIGIBLE BACHELORS", this I very much doubt. A bunch of older guys
looking to get "lucky". Possibly not the brightest. The comments I heard
from the guys ... er, yuck. Really not comfortable sitting with that
group.</p>
<p>Then there was the panel. They all sell something around singles and
dating. Nothing wrong with that in itself, perhaps, but ... just they
all came across as a bit plastic. Bit too daytime TV. Felt like my brain
was melting.</p>
<p>Also there was the girl photographer and guy doing video with an
outdated rig. Lots of flash photography. Clearly the event was very well
documented. Rather intrusive.</p>
<p>Earlier, took a rather nice three hour hike in the hills at midday.
(Green hills, clear air, strong sun, vivid colors, great views.) Drove
up to LACMA, wandered a bit, then drove down to Long Beach. Took a
couple of Monsters to counteract the fatigue from the hike while
driving. Had a pot of coffee in the morning, before.</p>
<p>After about an hour, fatigue and <strong>massive</strong> amount of caffeine in my
system kicked in. Felt too weird. Did not have a reason to stay, so
left.</p>
<p>Have to admit, this event still bothers me. Why the turnout? I heard
about the event via MeetUp and a friend of one of the panelists. But on
social media and the web, the only folk posting are the organizers.
Seems pretty dead, otherwise.</p>
<p>So what brought the girls? Not from the web, apparently. Some link to
TV? (I cancelled cable a couple years back, so that junk is not on my
horizon.)</p>
<p>Tagline from the site:
2014 National Tour to answer the question "Why is Everyone Still
Single?"</p>
<p>Well, one explanation is that we are single as the orbits of our lives
have not brought us close to someone of interest - and it is not obvious
what change will work. In the hyper-social early years - high school and
college - that part was a lot easier. Over time, as folk pair off, and
work is more predominant, things thin out a lot.</p>
<p>Far too much, in fact.</p>
<p>Working at engineering (software) companies, lots more guys than girls,
and interesting girls are quickly claimed.
Before my divorce, I chose to live in a great place to raise kids. Not
a place for single women, so no luck locally.</p>
<p>Events that cross orbits are a good thing. Rather a lot of rather nice
girls at this event. What brought them?
There were a couple of girls ... male optimism or actual interest?</p>
<p>Something that needs attention. Not sure exactly what.</p>
Social mapping/accidents2014-03-16T00:00:00Zhttps://bannister.us/weblog/2014/social-mappingaccidents
<p>Early evening, sitting alone on a restaurant patio at an outdoor mall,
watching girls, looking for patterns. Pretty girl from inside parks in
front of me, holds an entire phone conversation. Waitress comes out,
asks if we(?) are ready to order.</p>
<p>Group of four girls, one very nice, and smiling slightly, walk past in
the direction of a cluster of restaurants. Several minutes later, they
walk past again, leaving. Two of the girls are slightly behind and
closer, one ahead on the far side of the smiling girl ... and watching
me.</p>
<p>Not enough time to shop or dine, so ... ? Just how aware of watching
eyes are a group of girls? And if so, what did they expect?</p>
<p>Friday, went to an event at a hotel in Westwood. Moroccan-themed,
<a href="http://www.sababadance.com/">performers</a>, and nominally a wine-tasting.
Wandered around. Somewhat accidentally ended up at center stage when the
performance started. Took
<a href="http://www.flickr.com/photos/dreadedhill/sets/72157642371250205/">pictures</a>.
Looking through the pictures later, found one girl who was not watching
the performance.</p>
<p>Several, months back at the first event with that group, quite by chance
sat on the <a href="http://www.flickr.com/photos/dreadedhill/13212508983/">main path of the fashion
show</a>. This is
one of their promotional pictures.</p>
<p>A few months back, bought a ticket to a performance with "stage
seating". Ended up ... well, <a href="https://www.youtube.com/watch?v=fdgMoI0pSSw">on the
stage</a>.</p>
<p>At Friday's event, looked around and found two very nice girls, right
behind me. By itself, nothing odd there, since I was in a very good
place to watch the performance. Later, thinking back, this pattern
repeats.</p>
<p>At lunch, walked into Greek restaurant for lunch. Greeter says: "Table
for three?" Look around and find two rather nice, slightly grinning
girls, close behind me. Assumed chance, at the time.</p>
<p>Yeh. I still need a clue.</p>
Gender balance2014-01-30T00:00:00Zhttps://bannister.us/weblog/2014/gender-balance
<p>Interpolate...</p>
<p>Most recently Tim Bray posted about <a href="https://www.tbray.org/ongoing/When/201x/2014/01/28/The-Gender-Thing">Moving the Gender
Needle</a>
relative to the genders in our profession.</p>
<p>Weeks before I was called a "sexist" by a group of guys in a Programming
thread on Google+.</p>
<p>At the same time I was <a href="https://plus.google.com/u/0/+Tonyakay/photos/photo/5945839855843694482">discussing sexual
harassment</a>
with a <a href="https://plus.google.com/u/0/+Tonyakay/posts">well-written, well-expressed
girl</a>.</p>
<p>I have a very intelligent daughter, who is about to enter college. She
has considered tech fields, and could do well easily (her opinion and
mine), but at present has a slightly different direction. I raised my
kids to make their own choices, and I respect the choices my daughter
makes.</p>
<p>Two sides. The genders are not "equal", in a strict mathematical sense.
(I have a lot of math in my background. My degree from school is in
Physics.) Of human nature, males and females are <strong>not</strong>
interchangeable. Some differences are rooted in our human nature.</p>
<p>Those differences ... still learning what that means.</p>
<p>Exact gender equality is likely impossible. Likely one gender or the
other will be more represented in each profession, with exact mapping to
the difference in our natures. (I do not pretend to know where that
balance lies, or should.)</p>
<p>This factors out the question of gender representation within the
software development field into two parts:</p>
<ul>
<li>Part of the difference is due to the difference in the nature of
each gender.</li>
<li>Part of the difference is due to mis-treatment of the minority by
the majority gender.</li>
</ul>
Vapors2013-12-24T00:00:00Zhttps://bannister.us/weblog/2013/vapors
<p>Last Saturday <a href="http://www.flickr.com/photos/dreadedhill/sets/72157638871825865/">hiked up to the cloud
base</a>.
Always wanted to do that. You know when the hilltops are covered in
cloud, and you want to hike up into the cloud base? Except ... to be
exact ... that was not quite what happened.</p>
<p><a href="http://runkeeper.com/user/dreadedhill/activity/283149160">The hike in
question.</a></p>
<p>Planned on a three-hour hike. Had a <a href="http://www.flickr.com/photos/dreadedhill/sets/72157638706099936/">Secret
Dinner</a>
that evening, so time was limited.</p>
<p>The problem with hiking up a hill is that I have a hard time stopping
short of the summit (turning down a challenge, hard). Need a point
somehow significant.</p>
<p>At the three hour point, I could see the next outward bend in the trail
above was covered in mist - at the cloud base. Very cool - that made a
great point, once reached, where I could turn around.</p>
<p>Except when reached that part of the trail was clear, and the <strong>next</strong>
outward bend was in mist. Onwards ... repeated twice(!) more. Finally
the trail crossed a saddle, with mist streaming heavily across. <em>This</em>
shall be my goal! Except once reached, the air was clear, and the mist
was further up the trail.</p>
<p>The rational/deductive part of my mind applied Occam's rule - the
simplest explanation, that the cloud base had simply moved up - was most
likely right.</p>
<p>The <em>other</em> side of my mind noted the noted the coincidence, and that
cloud chambers (at cloud boundary conditions) are used by Physicists for
<em>extremely</em> sensitive experiments. Was I in some strong way perturbing
the cloud boundary? The fact that I had no idea <em>how</em> was <em>not</em> proof
against my disturbance of that boundary.</p>
<p>An added oddity. Coming down the trail, I saw a white feather suspended,
motionless, in the air just out of reach to my right. The slope above
was to the left. The ground sloped away on my right. White feathers are
a bit unusual in the local wild bits. I assumed the feather was held in
some slight upward current of air. As I passed, within a few feet, I
felt no current. The feather was just out of reach. (I could have jumped
and grabbed the feather, but that would be a jump over empty air...)</p>
<p>Proof of absolutely nothing to the rational, deductive mind. To the
imaginative mind ... the coincidence was a bit much.</p>
The Involved Father2013-10-13T00:00:00Zhttps://bannister.us/weblog/2013/the-involved-father
<p>Read this as a start:
<a href="http://www.psychologytoday.com/blog/the-long-reach-childhood/201106/the-importance-fathers">“The way fathers play with their children also has an important impact
on a child's emotional and social
development.”</a>
and the follow on.</p>
<p>Earlier, I was mystified how as a shy socially unadept kid, I ended up
raising three uber-confident socially adept kids. Made no sense. This
single observation fits perfectly. I know my father meant well, did the
best he knew how, but was distant and uninvolved. To my kids, I was a
strong, playful, very much involved presence. The mapping is exact.</p>
<p>Now I have a grandson. To him I am an affectionate, strong, playful
force. His father, uncle, and aunt (my kids) are the same. He is a
confident, joyful kid.</p>
<p>Wish I could do this right.</p>
Choosing ordered distinct random integers2013-08-31T00:00:00Zhttps://bannister.us/weblog/2013/choosing-ordered-distinct-random-integers
<p>This is a response to a <a href="http://lemire.me/blog/archives/2013/08/16/picking-n-distinct-numbers-at-random-how-to-do-it-fast/">puzzle posted by Daniel
Lemire</a>.</p>
<p>On first reading, I missed that Daniel wanted an ordered set, so offered
a 'shuffle' algorithm.</p>
<p>On second reading, noting the power-of-two bias in the benchmark, took
advantage and offered a 'cheat' algorithm, as an upper limit. The
'cheat' algorithm does not generate <em>all possible</em> sets. But it is
<strong>fast</strong>. Which matters most depends on your usage.</p>
<p>Posted the <a href="https://github.com/pbannister/UniformDistinct-java">sources to
GitHub</a>.</p>
<p>... a diversion. :)</p>
<pre><code> Reporting speed as millions of values per second. Max: 1048576
hash hash/neg hybrid reservoir tree shuffle cheat
4096 0.27 1.21 5.37 0.01 0.53 5.28 7.01
2048 4.33 2.59 5.12 0.02 2.65 10.09 92.93
1024 4.27 6.53 3.14 0.04 4.39 12.50 108.37
512 5.07 6.32 11.11 0.09 5.09 12.17 111.78
256 5.22 5.86 16.16 0.18 4.46 11.52 108.13
128 5.31 5.48 19.95 0.35 4.32 10.83 107.33
64 5.32 5.60 22.89 0.68 3.95 10.22 107.44
32 5.36 5.44 26.49 1.29 3.91 9.81 107.45
16 4.91 5.04 28.51 2.35 3.19 9.39 107.37
8 3.84 3.94 28.28 4.03 2.47 8.76 107.63
4 2.72 2.80 26.85 6.54 1.51 8.50 107.10
2 2.08 2.11 21.98 10.71 0.94 8.06 106.16
Reporting speed as millions of values per second. Max: 262144
hash hash/neg hybrid reservoir tree shuffle cheat
1024 7.22 7.30 9.00 0.05 6.77 15.14 105.88
512 6.99 6.95 12.57 0.09 6.83 14.04 105.59
256 6.78 6.74 15.81 0.18 5.88 10.09 103.17
128 6.20 6.28 20.68 0.35 5.75 12.61 112.66
64 6.19 6.12 24.73 0.69 4.71 12.16 111.99
32 5.96 5.97 28.04 1.32 4.74 11.51 110.57
16 5.51 5.85 30.23 2.43 4.32 10.96 108.58
8 5.48 5.57 30.78 4.14 3.73 10.42 112.01
4 5.25 5.26 28.93 6.89 3.09 9.61 104.60
2 3.78 3.80 23.74 11.56 1.93 9.19 106.82
Reporting speed as millions of values per second. Max: 65536
hash hash/neg hybrid reservoir tree shuffle cheat
256 6.52 6.66 16.45 0.17 7.11 15.54 94.37
128 6.56 7.01 21.25 0.35 6.74 14.11 111.87
64 6.62 6.56 24.87 0.67 5.75 12.59 102.90
32 5.63 5.96 26.33 1.23 5.67 12.40 108.15
16 6.21 6.09 30.36 2.46 5.10 12.10 110.82
8 5.60 5.75 30.36 4.48 4.56 11.55 110.59
4 5.99 5.79 28.92 7.44 3.95 10.96 110.19
2 5.61 5.76 23.79 12.63 2.99 10.44 109.16
</code></pre>
The tree died2013-08-11T00:00:00Zhttps://bannister.us/weblog/2013/the-tree-died
<p><a href="http://www.flickr.com/photos/dreadedhill/9491454252/" title="The tree died. Not sure when. by Preston L. Bannister, on Flickr"><img src="http://farm8.staticflickr.com/7308/9491454252_cd851b6913.jpg" alt="The tree died. Not sure
when." /></a></p>
<p>The dwarf apple tree over the backyard patio died. Not sure when,
exactly. Some time in the past year.</p>
<p>The tree grew like crazy every year. Required careful pruning for
balance, and to provide a good space for the patio beneath. Very nice
space. Very healthy tree. Spent many working hours on the patio, beneath
that tree, with a gold-furred dog sleeping near, in the decade I worked
from home while my kids grew.</p>
<p>The kids are grown. Started working in an office a couple years ago.
Almost no time spent outside. The dog is gone, and now the tree is gone.
As are other bits.</p>
<p>Changes of mind as well. Listening to my old iPod on shuffle, much of
the music I have collected now seems ... irrelevant. Odd. In a sense the
music I kept became or reflected a part of me. Music as a seamless part
of my background, no longer applies. Why?</p>
<p>Going to split my music collection. A first. Time to jettison a large
part of the past.</p>
<p>I tend to accumulate things. Something I got from my father. Visited my
father recently. Clutter is slowly overwhelming his new house in
Colorado. His stories were much about the past. I was not in a mind to
follow.</p>
<p>I keep too much, at first, then throw things away. Digging through and
discarding old stuff. "Might be useful someday." Or not. Gone.</p>
<p>Folk of my age seem to be much into nostalgia. Listen to the old songs.
Visit the past. Groups value "tribute" bands. Other patterns I cannot
follow. Nostalgia means nothing to me.</p>
<p>Sometimes it seems as though my mind creates the world around me. Not
exactly true ... but not wrong. With a change in focus an attention,
other things change. There are many things that worked, because I paid
attention. Now that my focus has shifted, some past-things no longer
work. I am of a mind to simplify, rather than go back.</p>
<p>Hiking through the local wilderness area. A path I took many hundreds of
times before was ... different. As though all the colors have shifted.
As though I was looking through different eyes.</p>
<p>Divide your life into quarters: health, kids, work, and pairing. Three
quarters are very strong. The last always empty. Might be able to do
something meaningful about that last, finally.</p>
<p>My mind has changed. Not sure where I am going, exactly. One thing is
clear. The future is more interesting than the past.</p>
No Nostalgia2013-07-26T00:00:00Zhttps://bannister.us/weblog/2013/no-nostalgia
<p><em>Motivated by some random post on Facebook.</em></p>
<blockquote>
<ol>
<li>the state of being homesick : homesickness</li>
<li>a wistful or excessively sentimental yearning for return to or of
some past period or irrecoverable condition; also : something that
evokes nostalgia</li>
</ol>
</blockquote>
<p>Noise on the web-stream about "nostalgia" - made me realize I have none.
The common theme is a desire to return to a familiar place or time.
<em>Nope.</em> No Thanks.</p>
<p>This rectangle of space on which I have spent more time than any other
place ... means nothing to me. Took care of my kids. Kept my promise to
them. Otherwise I have no attachment to this place. The majority of my
time here was far less than fun.</p>
<p>My kids seem to be very strongly attached to where and how they grew up.
They have strong positive memories attached to this place, and past
times.</p>
<p>Re-living the past, the common theme of nostalgia, does not sound fun.
Return to a past point, with present knowledge, and <strong>change things</strong>?
"Yes! Hell, Yes!!"</p>
<p>With a hint at key points, would have a very different life. Like my
kids, but on those other paths, they would not exist. Makes them think.</p>
<p>Choices in music reflect this state of mind. Music collected at a
more-or-less steady pace from the late 1970's through the present. No
attachment to any past time. Much folk near my age like old music and
"tribute" bands, where I do not. Finding a fair amount of interesting
new music. Tempted to prune and purge much of the older material from my
collection.</p>
<p>No nostalgia.</p>
New Buildings and Old Sidewalks2013-07-26T00:00:00Zhttps://bannister.us/weblog/2013/new-buildings-and-old-sidewalks
<p>In line for a performance in Los Angeles. Standing on an old, warped
sidewalk. Building across the way getting a new facade. Lame
conversation behind with three heads echoing a single thought, before
interrupted. Girl posed a question: "What do you want to talk about?"</p>
<p>What indeed. Struck by the oddity of new and old in downtown Los
Angeles. A question, lurking beneath, but not words.</p>
<p>Why new buildings and old sidewalks? Lacks sense.</p>
<p>More of the interesting things seem to happen in the city. Looking
around, the city is obviously insane. What?</p>
<p>A building is ripped out and rebuilt, while surrounded by old sidewalks.
What?</p>
<p>Drive a few hours on the interstates, outside of the dense
urban/suburban areas. Vast areas of unused wastelands. What difference?</p>
<p>Take that same rectangle of land in the city, transport to any of the
abundant open spaces, and it has no value. The value of land in a city
is <strong>entirely</strong> derived from the surrounding social and material matrix.
The intrinsic value within the rectangle is near none.</p>
<p>Makes the arguments about "taxes" less meaningful. The value of a plot
of land within a city derives entirely from the surrounding matrix.
There is a cost to being part of that matrix.</p>
<p>Why do we end up with new buildings and old sidewalks? Disconnect. The
source of value is the surrounding matrix. The costs of the matrix need
more accurate factoring.</p>
<p>Next time I have a topic.</p>
House Concert2013-07-05T00:00:00Zhttps://bannister.us/weblog/2013/house-concert
<p>From the start, I assumed that the advent of the web would allow change
the structure of how music was performed and distributed. The web allows
more direct connection of all sorts, and in this case between musicians
and their audience. Exactly what form that would take, I had <em>no idea.</em></p>
<p>Let me set the context, here.</p>
<p>When you choose your music, you have your choice of all the music in the
world. The music you collect is the best in the world - to your mind and
taste.</p>
<p>Now imagine you about to host an event where a couple of the best
musicians in the world want to perform in your home! Um, yes please! And
... how did this happen? Though a series of small reasonable steps,
enabled by connections and contacts via the web.</p>
<p>In the past, I had always assumed any like event would be far too
expensive, and beyond my reach. Quite impossible! The reality is turning
out a bit different. This will cost me time, and a modest amount of
money, but should prove worthwhile for all involved (I hope!!).</p>
<p>This will be the second house concert I host. From the first the
musicians got recorded material good enough to release. They used
pictures taken in my house as promotional material (including some I
took - which makes me unreasonably happy). And generally had a pleasant
time meeting the folk in the audience.</p>
<p>The audience is the trick. This is non-mainstream, and I live in a quite
conservative part of Orange County. Good music of this sort does not get
performed much around here. Even in this area, I am sure there are
enough folk to provide a healthy audience. I suspect this is a
degrees-of-separation exercise. Find a few folk, they will lead to a few
more, who in turn lead to others. Finding an audience is going to take
time. In time I hope to find enough folk to host like events more often.</p>
<p>Meanwhile I have flyers to distribute, messages to send, and await
RSVPs... :)</p>
Visions2013-07-01T00:00:00Zhttps://bannister.us/weblog/2013/visions
<p>Seems there are an increasing number of folk in and around my life that
see the world in an ... er ... <em>different</em> way. Not sure what to make of
this, but should at least make an effort.</p>
<p>Went to a meetup a couple months back. Something about yoga and
meditation (not much for mysticism). The attendees were mostly young and
female. The organizer lead an exercise ... something about relaxation,
energies, and visions. Found her a bit pesky, as every time I started to
relax and drift off ... she had something else to say.</p>
<p>My mind wandered a bit during the time relaxed. Usual stuff, no
"visions", or other mystical experience.</p>
<p>Mind drifted ... was in an amber field, outside an adobe-walled
courtyard, walls gold with late afternoon sun. A bit later ... floating
in space, earth above, on a open platform with a rank of my cohort, in
black armor, relaxed and waiting. The usual stuff when my mind wanders.</p>
<p>Wait, is this what other folk call "visions"?</p>
Puzzle pieces and emotion2013-03-01T00:00:00Zhttps://bannister.us/weblog/2013/puzzle-pieces-and-emotion
<p><a href="http://www.flickr.com/photos/dreadedhill/5983561647/"><img src="http://farm7.staticflickr.com/6004/5983561647_bd37054a1e.jpg" alt="untitled" /></a></p>
<p>This is the picture that broke my drawing.</p>
<p>In college I took a single drawing class, and did somewhat well. Always
wanted to take this a bit further.</p>
<p>I took up drawing again, a couple years ago. A local artist hosted
sessions in his studio where I could draw against a live model. My
drawing improved to the point that I could do figures well enough, but
needed practice with faces. Went into my saved favorites from Flickr to
find the best faces for practice.</p>
<p>After the above, my drawings became mechanistic, crude, and no longer
improved. Had no idea why. My frustration level at the end of a session
was incandescent, and I eventually stopped drawing.</p>
<p>In the last several weeks I have gone back to the hosted sessions and
tried to draw. My drawings were crude and my frustration level extreme.</p>
<p>...</p>
<p>Of late I have spent time with folk (musicians) whose emotions are very
much on the surface. Very different from the engineers in my working
life. Feeling everything seems to be connected with making good music.
This connection brought to mind the earlier drawing sessions. When I was
drawing well ... my emotions were very much active. In a sense, I was a
bit in love with subtle female curves, and how light touched the model's
body. (And have a positive disinterest in drawing male models.) The end
of a session was a bit painful - like falling out of love.</p>
<p>Thinking back, the drawing above was the inflection point. I had to
suppress emotion and could not finish the drawing. In later drawing
sessions, my emotions were still off, and I drew poorly.</p>
<p>Went back to the artist's studio this week. Intentionally kept my
emotions on. For the first time in a long while, my drawing improved.</p>
<p>Connections ... the girl in the above picture posted a series of
photographs to Flickr that were, frankly, brilliant. After a time, her
postings slowed, and then stopped. At first she claimed her camera had
lost it's focus. A bit later she admitted the camera was not at fault. I
wonder if she too suppressed emotion, without knowing. Feeling
everything is painful.</p>
<p><em>Update:</em> Three weeks and three drawing sessions later, my drawing
continues to improve.</p>
Another Lisp flashback2012-03-18T00:00:00Zhttps://bannister.us/weblog/2012/another-lisp-flashback
<p>Reading up on Dependency injection in the Spring Framework.
Class-binding is late-assigned in XML (mainly). Spring uses another
(different) interpreted language, derived from JSP expressions.</p>
<p>Reading up on the Standard Template Library for C++. Class templates are
written in this semi-interpreted template-script with tricky semantics,
rather different from C++.</p>
<p>Right. This is doing badly a long-ago learned lesson. Lisp does all it's
meta-level stuff in ... Lisp. A decades old insight. C++ has this
newly-invented semi-interpreted declarative script for templates ...
that is tricky to interpret and not reusable. JSP and Spring share a
very limited expression language, that is very much a niche, and not
much worth reusing.</p>
<p>The Lisp community learned decades back the lesson of using the same
language for meta-level stuff as for the regular level.</p>
<p>In the Java domain, I would use Javascript as the meta-language. Not
quite the same level, but close enough, and able (in the case of Rhino)
to readily access the Java world. The JSP expression language is a
limited wart. Use Javascript.</p>
<p>There are lots of higher-order languages that could fit in this space,
but the presence of Javascript in the browsers offers a selection
criteria. Javascript is good enough.</p>
Predictable ego - or "Shotwell" is a piece of crap - and priorities.2012-03-14T00:00:00Zhttps://bannister.us/weblog/2012/predictable-ego-or-shotwell-is-a-piece-of-crap-and-priorities
<p>The prior photo-handler in Ubuntu was implemented in a slightly
idiosyncratic language. Could be pragmatic, or could be programmer-ego.
Not immediately obvious, which. The current photo-handler in Ubuntu (and
OpenSUSE) is Shotwell ... implemented in a *completely* idio ... idiot
... er, "unique" language. And it crashes on uploading photos ... for
months. (A photo-manager that cannot upload photos. Right.) There is an
anti-pattern here.</p>
<p>We might make fun of Microsoft and the closed-source community for
predictable sorts of anti-patterns ... but the "open source" community
is also prone to (different) sorts of anti-patterns. The photo-manager
community is on a different sort of non-functional ego-trip, at present.</p>
<p>Not sure how much I care. Given a couple more (somewhat likely) upgrades
at work, I may just buy a Mac, and stop spending my time getting this
nonsense to work. (In my current role, less wasted personal time might
translate to millions in revenue on the company's bottom-line, through
shortened product timelines. Nothing instantly provable, nor will I try.
Personal motives still trump in personal time.)</p>
<p>Guess I am somewhat amused with the current tension. I do very much
enjoy my work, but on personal time have more time than money. I have in
past enjoyed spending personal time getting open source software to work
... but not so much of late. Of late my personal time goes into my
family, and to personal priorities. I spend personal time painting my
house, fixing leaky toilets, driving my kids from one place to another,
and other things. Would my work get more value if I could pay to get
some of those things done? Very likely ... but not easily provable, and
I have no reason to try. As a guess, in my current situation, I would
not be surprised if a thousand dollars of personal time translated into
a million dollars of company revenue (or more). Given no way and no
reason to prove ... no point for me in spending time.</p>
<p>In a macro-economic sense, I am reasonably sure my choices are
non-optimal. In the current economic system, my choices are personally
optimal. This tension I find amusing.</p>
Progress2012-03-04T00:00:00Zhttps://bannister.us/weblog/2012/progress
<p>Not much on my weblog in the past year. The past year has been about
personal change.</p>
<p>At the work-level, went from working at a dull company with a dull
product (kept alive only by a couple extreme efforts on my part). Served
the purpose I needed. Allowed me a decade at home to raise my kids. The
kids are doing great, and no longer need the time. The new job is
anything but dull. (There was a bit of a worry on my part. Maybe I had
become dull? As is turns out, hell no! This is fun ... and my work could
turn into more revenue for the new company than the entire gross income
of the old company. Fun. A strong challenge. Definitely fun.)</p>
<p>At a personal level, had knee surgery about a year back, and working to
bring my physical self in line with my self image. Hard to explain,
perhaps. There was a time between high school and university when I did
not know if I could reach the future I wanted. Hope was uncertain.
Something woke, an aspect of my self, that took me then from an average
cyclist to riding with UCSF category 2 cyclists (which at the time meant
able to compete at a state and national level). These pictures are from
that time:</p>
<p><a href="http://www.flickr.com/photos/dreadedhill/17460431/"><img src="http://farm1.staticflickr.com/13/17460431_aa076291d6_m.jpg" alt="Before the race" /></a>
<a href="http://www.flickr.com/photos/dreadedhill/17460586/"><img src="http://farm1.staticflickr.com/14/17460586_de0b4b0328_m.jpg" alt="... and after" /></a></p>
<p>Somewhere at the back of my mind, my mental self-image has always been
something like what was in my mind at that time. In the past year, that
long sleeping aspect awoke. Clearly I will never again be physically
capable of what I could do as a 19-year-old kid, but I will do all that
I can. Which as it turns out, is quite a lot. My weight has dropped, a
lot. My endurance has increased. And I have added muscle mass. Lots of
iteration needed. And something else.</p>
<p>Climbed up Saddleback Peak last weekend. The second time since resuming
hiking. (The first was September 25, last weekend February 25.) My time
to the top was close to 3 hours (for 8+ miles with 4000 feet of
elevation change) with a similar time for the hike down. Perhaps my
strongest hike yet, on that mountain. Took my regular ~11 mile longer
hike through Whiting Ranch this weekend, and finished in my fastest time
yet (a bit over 3 hours for ~2500 feet of elevation change - expected
to be a slower, as still recovering from the Saddleback hike.) Getting
steadily stronger.</p>
<p>Not done yet.</p>
Mind tricks2012-02-02T00:00:00Zhttps://bannister.us/weblog/2012/mind-tricks
<p>During the "Art Walk" in Laguna Beach. Walking along a dark, crowded,
noisy sidewalk.</p>
<p>"Do you have a cigarette?" Heard distinctly from an approaching blonde
girl, when still twenty-odd feet away.</p>
<p>"No." I answered, as the couple passed.</p>
<p>"What??" She turned after we passed. "What did you say??" She had a very
odd expression, as she approached.</p>
<p>"I do not smoke." She continued to stare. "You look surprised. Do I look
like someone who smokes?"</p>
<p>"Yes."</p>
<p>I smiled, turned and walked away.</p>
<p>Later, I could not quite place her expression. First, I thought she was
surprised, but that did not fit. Puzzled is closer.</p>
<p>Perhaps she was asking the question of her companion, though she was
looking directly at me, and she spoke clearly enough to be heard quite a
distance away. That might account for the puzzlement.</p>
<p>On reflection, I heard her very clearly from a distance - I usually have
trouble in noisy environments, even up close - and I do not recall
seeing her lips move. Mind tricks. Dark sidewalk, many distractions ...
but why the expression?</p>
When in doubt, confuse the innocent.2011-10-26T00:00:00Zhttps://bannister.us/weblog/2011/when-in-doubt-confuse-the-innocent
<p>It is fun, having intelligent children. Was trying to remember a phrase.
I have an odd memory. I cannot remember a person's name, told to me
moments ago, but came recall an interesting notion from decades back.</p>
<p>There was a quote. Something like "Confuse the idiots", but deliciously
subtle. I could not recall the exact phrase, so my daughter started
hammering at Google, trying to find variants. Not sure that we found
(eventually) the exact phrase, but this comes at least close in
subtlety:</p>
<blockquote>
<p>When in doubt, confuse the innocent.</p>
</blockquote>
<p>Sometimes I think, as a Father, I did not completely screw up. :)</p>
<p>Just after, I found this: <a href="https://www.facebook.com/photo.php?fbid=245599892155361&set=a.245579952157355.55710.236058619776155&type=1&theater">Adam's Family
reference</a>
Still looking for my
<a href="http://en.wikipedia.org/wiki/Morticia_Addams">Morticia</a>.</p>
Misplaced Music?2011-07-18T00:00:00Zhttps://bannister.us/weblog/2011/misplaced-music
<p>Trying to rebuild a personal social network. Something I neglected over
the last decade.</p>
<p>Music ... local social groups offer "tribute" bands. Not interested. I
liked ... at the time ... a lot of the then-popular bands. The "tribute"
groups are bands that cannot produce of value their own music. I did
like the '70's bands ... in the 70's. I liked the '80's bands, in the
'80's. In the present? I find the old bands (and their reproductions) a
bit boring.</p>
<p>Who is new and who is interesting?</p>
Active organizing in place of passive participation?2011-07-02T00:00:00Zhttps://bannister.us/weblog/2011/active-organizing-in-place-of-passive-participation
<p>I am trying to tie together a whole lot of threads into a coherent
whole. This is going to be rough (very very rough), in the first
iterations, under I can better sort things out.</p>
<p>Of late, I have been wandering around, trying random things, trying to
get socially reconnected. But I am odd. What I find interesting is not
what is most common. That means the existing venues are - for me - just
not interesting.</p>
<p>The first part of the problem is the shape of our current suburban
society. In fact, there is not a whole lot of society. For reasons that
are both
<a href="http://bannister.us/weblog/2004/suburban-planning/">too simple and too complex</a>,
most folk live in a physical and social environment that promotes silos and
isolation. No intention, no design - and not enough understanding of the
problem.</p>
<p>Well ... we cannot revamp the physical world, but perhaps through
focused choices, intentional action, we can route around what does not
work.</p>
<p>Quite a lot of social coherence grows out of incidental interaction -
which for the most part just does not happen by default in suburban
society. Can we intentionally build social coherence? I think so. There
are always a few exceptional actors, but they need a clear plan, and a
plan that works. What plan works?</p>
<p>One notion that I find interesting is <a href="http://shareable.net/blog/how-to-host-a-stranger-dinner">Stranger
Dinners</a>. I
suspect that what works for a single 20-something attractive female as a
host does not necessary work for another host or age group ... but the
base notion is still interesting. The notion of pulling together
mostly-unrelated folk for interesting incidental social interaction
seems to make some sense - if we can find a simple formula that can be
readily replicated, for many hosts.</p>
<p>Pulling folk together outside of our usual silos has to be a primary.
Putting together mutually interesting small meetings of dissimilar folk
has to be also(?) primary.</p>
<p>Initial Questions:</p>
<ul>
<li>How distinct in terms of group should be each participant?</li>
<li>Am I massively over-analyzing the problem? (likely)</li>
</ul>
<p>The above all needs to be reduced to a simple and clear message.</p>
The Longevity Project2011-07-01T00:00:00Zhttps://bannister.us/weblog/2011/the-longevity-project
<p>Picked up a pretty good book, on a random browse through the bookstore -
which is unusual as most books I end up buying through recommendations
and Amazon.</p>
<p><strong>The Longevity Project</strong>
<a href="http://www.howardsfriedman.com/longevityproject/">website</a>, <a href="http://www.borders.com/online/store/TitleDetail?sku=1594630755">Borders
(where I bought the
book)</a>,
<a href="http://www.amazon.com/Longevity-Project-Surprising-Discoveries-Eight-Decade/dp/1594630755">Amazon</a>,
<a href="http://www.npr.org/2011/03/24/134827587/secrets-to-longevity-its-not-all-about-broccoli">NPR</a>,
<a href="http://www.theatlantic.com/life/archive/2011/03/the-longevity-project-decades-of-data-reveal-paths-to-long-life/72290/">Atlantic</a>,
<a href="http://www.stanfordalumni.org/news/magazine/2000/julaug/articles/terman.html">Stanford</a>,
<a href="http://www.psychologytoday.com/blog/beautiful-minds/200909/the-truth-about-the-termites">Psychology
Today</a></p>
<p>The interesting bit (for me) is that this is a eight decade long study
of gifted middle class children from public schools in California - a
group of folk much like myself - so the results should be more than
usually applicable. The derived conclusions are rather encouraging.
Turns out I might have a good chance to live much longer than some of my
short-lived closest relatives. :)</p>
When spending time with doctors and hospitals is good news.2011-05-11T00:00:00Zhttps://bannister.us/weblog/2011/when-spending-time-with-doctors-and-hospitals-is-good-news
<p>Been spending a lot of time with doctors, hospitals, getting tests - and
it is all good news.</p>
<p>During my last bout with pneumonia, had to find a
<a href="http://bannister.us/weblog/2011/found-a-doctor-i-like-for-the-very-first-time/">new doctor</a>.
Got very lucky.</p>
<p>My doctor in turn gave an excellent recommendation for a knee doctor.
Lots of tests, including a visit to a cardiologist (there are heart
problems on both sides of my family tree), all with good results. Got
surgery on both knees a bit over four weeks back. Have been able to
<a href="http://runkeeper.com/user/dreadedhill/profile">resume hiking</a>, for the
first time in several years. Long ways to go, but ... <em>Hell Yes!</em></p>
<p>My doctor ordered an unusual set of tests, found a clue, and gave an
excellent recommendation for a Pulmnologist. The lung doctor ordered
quite a series of tests, leading to a lung biopsy - not a fun procedure.
There is a bunch of "weird shit" at the bottom of my right lung, that
the doctor suspects is "Valley fever" - a fungus that sometimes settles
in and causes repeated bouts of pneumonia. About every four years, for
the last forty years, I have a fairly nasty bout with pneumonia. If the
tests confirm the doctor's suspicion, this is treatable. For the first
time in forty years I could be free of this unwanted "guest" that
constantly drains my immune system, and has tried to kill me about every
four years. <em>Hell, yes.</em></p>
<p>Very seriously jazzed.</p>
<p>Seems I can be quite entertaining when seriously "up", at least based on the nurses' reactions. :)</p>
An odd insight - Dyson on Feynman2011-05-11T00:00:00Zhttps://bannister.us/weblog/2011/an-odd-insight-dyson-on-feynman
<p>Finished reading Freeman Dyson's book <a href="http://www.amazon.com/Disturbing-Universe-Sloan-Foundation-Science/dp/0465016774/ref=sr_1_2?s=books&ie=UTF8&qid=1305135954&sr=1-2">Disturbing the
Universe</a>
a few weeks back. Gained a couple unexpected insights - one about
<a href="http://bannister.us/weblog/2011/what-went-wrong-with-nuclear-power/">nuclear power</a>
and one about the Physics of Richard Feynman.</p>
<p>Before going to university I read quite a few books about science and
Physics, but the local city library had very little about (then) recent
Physicists. When at university I certainly heard about Feynman, who has
then teaching at CalTech, not far from UCI where I was attending. In
school my reading was mainly textbooks. As my interests shifted from
Physics to software, my readings shifted as well. So far as I know, I
have never read anything written by Feynman.</p>
<p>Though Physics is not my domain, occasional play with notions about
Physics has always been in the back of my mind. Lacking the math needed
to do real work, there is no consequence to my idle thoughts.</p>
<p>Rather a while ago, I settled on an
<a href="http://bannister.us/weblog/2008/the-other-tiger/">odd intuitive</a>
<a href="http://bannister.us/weblog/2008/metaphors-and-reality/">view</a> of
Physics. The surprise in reading Dyson's book was finding that Feynman
had arrived at his own unique view of Physics, that seems to exactly
match my own. Clearly Feynman was capable of doing the relevant math,
and I am not. Did I at one point read something of Feynman's, and it
only recently bubbled to the surface, or did I come to the same view
entirely on my own? No way to tell, for certain.</p>
<p>Started practicing drawing again. The only Art course I have ever taken
in my life was a year at university, of which only the first few months
was drawing. Picked up drawing relatively quickly, compared to those of
similar experience, but was hopelessly poor compared to those who had
practiced their entire (then young) lives. Always wanted to develop
further, and my recent practice is a good way to trim any excess ego.
(Read: I am improving, but have a <strong>long</strong> way to go!) A friend
recommended an excellent book: <a href="http://www.amazon.com/New-Drawing-Right-Side-Brain/dp/0874774195/ref=ntt_at_ep_dpi_1">Drawing on the Right Side of the
Brain</a>.
Turns out the book has taught me nothing about drawing, exactly, as the
recommended practices I had already somehow found on my own. Instead
what I got from the book was a bit of enlightenment - that somehow I
have always had a fully turned on "intuitive" mind. This explains some of the
<a href="http://bannister.us/weblog/2009/building-things/">odd moments</a>
in my past, and how I approach my work.</p>
<p>Apparently Feynman was odd in the same way. Wonder what would have
happened if I had encountered Feynman when in school. Would I have
stayed in Physics?</p>
<p>Curious.</p>
Sex is cheap?2011-05-02T00:00:00Zhttps://bannister.us/weblog/2011/sex-is-cheap
<p>Ran across an article in <strong>Slate</strong>:</p>
<p><a href="http://www.slate.com/id/2286240/pagenum/all/"><strong>Sex Is Cheap</strong>
Why young men have the upper hand in bed, even when they're failing in
life.</a></p>
<p>What the article says fits with the behavior I see around my sons. Sex
seems to very available, and cheap. Guess I was born into the wrong
generation. :)</p>
<p>On the other hand, I have a daughter ... wonder if there are still
colleges with a larger male population.</p>
<p>Saw a reference ... somewhere ... that this crosses generations, that
20-something younger women are hunting out the more "valuable" older
men, and that the greatest impact is on the late-30's career-minded
woman, who suddenly finds the dating pool near her age depleted. Cannot
find that reference...</p>
<p>Very ... odd?</p>
Story based reasoning and interviews2011-04-15T00:00:00Zhttps://bannister.us/weblog/2011/story-based-reasoning-and-interviews
<p>Roger Schank (a prominent AI figure) gave a talk at UCI several years
back. His notion was the humans do not naturally reason deductively,
rather we use something he called "story-based reasoning". In fact most
of human communication is in the form of "mini-stories". This upset the
deductive AI people to no end, but to me seemed to make a great deal of
sense.</p>
<p>(There is a certain amount of recursion here).</p>
<p>When I have done interviews I have found it useful to get the
interviewee to tell stories. In particular stories about work they have
done in the past - what worked, what didn't, points of interest, how did
they approach the problem.</p>
<p>My notion is that if you can cast your experiences as a story, bringing
out points of interest both high and low, then you are likely to have
gained a good understanding.</p>
<p>In one run of interviews we divided up so that one set of interviewers
did the detailed tech questions, and I tried to pull stories from the
interviewee about work they had done. Our opinions after the interviews
agreed remarkably. Those interviewed who could tell good stories,
generally did well on the tech questions. In a few cases the interviewee
did well in the tech questions, but not at telling stories.</p>
<p>In those cases where a candidate did well on the tech questions, but not
at telling stories, our opinions agreed. The interviewers who had asked
the tech questions were usually uncomfortable with these interviewees.</p>
<p>(So I've just told you a story, about eliciting stories from the
interviewee, to evaluate reasoning ability, in terms of stories...).</p>
Segregation - Partition the problem2011-04-15T00:00:00Zhttps://bannister.us/weblog/2011/segregation-partition-the-problem
<p>My question (in 2002) to Steve Theby, who originally told this story:</p>
<blockquote>
<p>You were part of a project deploying a large database application.
Response/processing times were not reliable or predictable until
each
computer was dedicated to a specific kind of transaction.</p>
<p>At least this is my somewhat hazy collection.</p>
</blockquote>
<p><em>Steve's answer:</em></p>
<p>Yes...I did work on a very large project that essentially constructed a
predictable response framework for American Express credit card
processing. I worked on it under a contract with McDonnell Douglas in
St. Louis (we had the world's largest computer room with over 100 IBM
system engineers permanently on site). The tape hanger personnel used to
wear roller skates so they could mount/unmount drives faster (I'm not
making this up). We had at least 300 tape drives the size of a four
drawer, 30" filing cabinet and a tape archive storing more than 30,000
tapes. Anyway...I digress...</p>
<p><strong>Application</strong></p>
<p>This was a world-wide application responsible for evaluating and
authorizing credit transactions. They planned to have several large IBM
mainframes located in the US and the UK to balance out the US and
European transaction loads. Our work headed us to Brighton, UK for about
a one year period. The application was written in COBOL using the CICS
transaction monitor plus the IMS shallow network database. CICS gave us
a terminal handling front end that allowed the application to scale up
with respect to connections and IMS gave us a very quick, indexed
hierarchical lookup capability.</p>
<p><strong>Architecture</strong></p>
<p>The initial architecture for the application pushed all transactions
through a single machine in a FIFO queue. Although this somewhat worked
for small loads (when the machine was below 40% utilization), it failed
quite predictably at medium to large loads. Even at small loads we could
not reliably predict closure times across transactions. This was
primarily because each transaction had different resource requirements
in terms of database I/O, CPU and communication transit time and they
were mixed together.</p>
<p>The goal was for a single mainframe to handle 2000 terminals. As I
recall, the 40% mark was reached at about 200 terminals (a bit shy of
expectations). This was a monster machine (something like a 30MHz CPU
with 512K of awesome memory and 30MB 2119 removable disk packs). I will
say that the thing really ran due to its wonderful I/O
channels....something PCs still don't have... I believe that each
merchant had a special dialup 1200 baud modem for super fast
connectivity. Our Solution - separate transactions into like sets and
route to different machines</p>
<p>We started a transaction QA group that put together a process called CPA
for Call Pattern Analysis. This process evaluated each transaction
sequence for its CPU, I/O and database resources required. We ended up
strongly typing each transaction based on where it fit in this resource
profile. If I recall correctly, it went something like this:</p>
<pre><code> Type CPU I/O DB
----------- ----------------------- ----------------------- -------------------
1 0.0 \< seconds \< 0.1 0 \< bytes \< 500 00 \< calls \< 05
2 0.1 \< seconds \< 0.5 500 \< bytes \< 1000 05 \< calls \< 20
3 0.5 \< seconds \< 3.0 1000 \< bytes \< 2000 20 \< calls \< 50
4 (batch) 3.0 \< seconds 2000 \< bytes 50 \< calls
</code></pre>
<p>We then routed transactions of the same type to a designated machine so
that we could predict when a transaction would finish (this put all the
same size stones in the same hour glass instead of mixing sand, stones
and boulders).</p>
<p>This really helped things out and wound up meeting the expectations of
American Express. Even though this meant that some machines were
frequently idle, each type of transaction was fairly dealt with and
dispatched in a uniform, consistent manner.</p>
<p>Before this arrangement, we had small transactions executing very
quickly (< 1 sec) one time and then stalling out for 10 seconds the
next time because of a 'boulder' transaction hogging everything.</p>
<p>Hopefully this helps. I looked briefly for some of our old documentation
but couldn't find anything (that was 12 years, 10 managers and 3
companies ago).</p>
<div>
<p><em>Stephen Theby (stheby@drsys.com), PRO-IV Tools, Architect
1-714-724-5640 (Irvine, Ca), 1-314-214-4025 (St. Louis, Mo)</em></p>
</div>
<hr />
<p><strong>Implications</strong></p>
<p>Applied to the present, I believe this story has interesting
implications. Start with the fact that the inexpensive PCs of today are
remarkably powerful, compared to the machines of 10 or 15 years ago.
Almost ridiculously so.</p>
<p>Add to this the lesson from the above story about partitioning the
problem, so that similar operations are on one machine.</p>
<p>In the past it made sense to run lots of services (mail, news, database,
files, etc.) off one machine, as computers were expensive. This is no
longer the case. Computers are cheap. Today you are likely better off
using each server for a single purpose, and no other purpose. Once a
server is running reliably, lock the box in a closet, and leave it
alone.</p>
<p>Note that this model also applies to the desktop.</p>
<p>The Windows PCs of today are in a sense turning into the mainframes of
yesteryear. Fully install Windows NT and Microsoft Office and you get
hundreds of megabytes of seldom used services. Address books, spelling
and grammar checkers, database engines, and lots of other seldom (if
ever) used services. Hundreds of megabytes of code and data, most of
which will never be used.</p>
<p>Imagine instead that we carve off chunks of functionality to dedicated
servers.</p>
<p>Spelling checkers run on a dedicated spelling check server. All that
runs on the client is a small bit of code to make requests of the
server. Performance is likely better as a properly configured (and now
inexpensive) server is likely able to turn around requests in less time
than it would take to load the spelling checker and word lists from
local disk. Not incidentally a spelling check server is likely to have
current lists of company specific words, and so is able to prove not
only faster but also better answers.</p>
<p>Apply the same model to address books. An address book server (LDAP is
of interest here) can have individual, department and company address
books. With proper configuration, you again can get both faster and
better answers.</p>
<p>Repeat for every activity that is not inherently local to the desktop.</p>
<p>Note that unlike the mainframes of yesteryear, the goal for a "properly
configured" dedicated server, is to optimize response time. Where once
we would try to make use of every spare mainframe cycle, with dedicated
servers the goal is to respond to incoming requests as quickly as if the
server were idle.</p>
<p>One way of looking at this notion is as a natural step in the evolution
from shared mainframes, though desktop PCs, to network computers.</p>
<ul>
<li>With mainframes the idea was for all users and tasks to share a
single machine.</li>
<li>With desktop PCs the idea was for all tasks for one user to share a
single machine.</li>
<li>With network computers and dedicated servers the idea is for any
single task use as many machines as needed to complete quickly.</li>
</ul>
<p>All this inferred from an old application that today could run off a
single server with an attached RAID :-).</p>
Firsts2011-04-15T00:00:00Zhttps://bannister.us/weblog/2011/firsts
<p>A list of programming languages is not very informative, so I compiled
this list.
<em>(Right. Like this page really has a serious purpose.)</em></p>
<pre><code>1973 - First program in Fortran
1974 - First program in Basic
1978 - First program in Pascal
1979 - First program in Lisp
1983 - First program in Modula-2
1984 - First VCR program
1984 - First program for DOS
1984 - First program for Windows (barely)
1985 - First program for Unix
1985 - First program in C
1986 - First used SQL (with Oracle)
1987 - First program in AWK
1992 - First program in C++ (maybe 1989? When did g++ come out?)
1992 - First program in Visual Basic
1992 - Second program for Windows
1993 - First Web page
1994 - First program in Java
1998 - First program in Perl
1999 - First ATL/COM program (not counting some small stuff in 1996)
1999 - First Java servlets
1999 - First IBM mainframe program (since 1973)
2002 - First PHP script
2003 - First full dynamic web application: HTML, CSS, Javascript, Java
</code></pre>
Burning Man isn't - anymore2011-04-04T00:00:00Zhttps://bannister.us/weblog/2011/burning-man-isnt-anymore
<p>First time I heard of the <a href="http://en.wikipedia.org/wiki/Burning_Man">Burning
Man</a>
<a href="http://www.burningman.com/">event</a> it sounded pretty cool - a scrappy
creative exercise outside the usual bounds. At the time I was wrapped up
in the tail end of a bad marriage, and had young kids to tend. Attending
was just not practical.</p>
<p>A few days back, saw an announcement for a local group to build an
exhibit for Burning Man. Sounded interesting - a break from my usual
routine, and chance to be a little random. Have been slowly turning my
garage into a personal workshop. I like to build things, and this would
not be the first time I fabricated something without ... coloring
between the lines.</p>
<p>The drive through Los Angeles and into Hollywood lived up to the LA
reputation for lousy traffic (this on a Sunday evening), but was not too
bad. Got to the meeting place at the appointed time (was the only one to
show up of those that promised), chatted for a while with the guy who
posted the announcement, chewed on some notions, then - when it became
clear no one else was going to show - headed home. Spent the drive home
thinking of possible practical-to-fabricate riffs on the main theme.</p>
<p>Pretty interesting, so far. There were some odd notes in the
conversation that I could not place. When I got home, checked the
Burning Man site for pragmatics.</p>
<p>Ticket prices are just shy of $400/person. Oh. Right. Now the odd notes
made sense. This is no longer the scrappy/creative event it once was.
Burning Man is no longer Dadaist, but rather a very bourgeois cool-kids
party. Scrappy is gone. My model is whether I would go as a
cash-strapped college student (as I once was). To the original Burning
Man, yes. To the present example, no. Substantial ticket prices exclude
the more random and keep out the riffraff.</p>
<p>With that realization, my interest evaporated.</p>
Found a doctor I like ... for the very first time2011-03-29T00:00:00Zhttps://bannister.us/weblog/2011/found-a-doctor-i-like-for-the-very-first-time
<p>A remarkable thing, thus the remark. For the very first time, quite by
accident, I have found a doctor that I like. Unexpected, that. If you
live in south Orange County, California and you need a doctor, I suggest
you check out:</p>
<blockquote>
<p>Michael A. Waldman, M.D., FACP
<small>DIPLOMATE AMERICAN BOARD OF INTERNAL MEDICINE</small>
#2 Hughes
Suite 175
Irvine, California 92618
phone: 949.600.8260</p>
</blockquote>
<p>By far the sharpest guy I have ever met at a doctor's appointment. :)</p>
<p><strong>Update:</strong> Turns out the other folk he has sent me to are also very
good.</p>
What went wrong with nuclear power2011-03-27T00:00:00Zhttps://bannister.us/weblog/2011/what-went-wrong-with-nuclear-power
<p>Oddly enough, I found one of my missing pieces yesterday, quite by
accident.</p>
<p>Reading Freeman Dyson's book "Disturbing the Universe" (1979). Did not
know he had anything to do with nuclear reactors. Turns out he was part
of a small very capable group that designed an early "fail-safe" nuclear
reactor - one that did not require active systems to maintain safety.
(The same kind that was in the basement of the Physics building at UCI,
before and while I was there.)</p>
<p>I had long suspected that something had gone wrong, and innovation in
reactor design was somehow derailed, but all I had was a suspicion. In
Dyson's book there is a rather long section where he ascribes the
failure of nuclear power to match the initial high hopes to interference
from government and business, and the shutdown of progress on new
designs.</p>
<p>And he was writing in 1979, from first-hand experience.</p>
<p>When someone asks if I am "pro-nuclear", the answer is a little long. I
am very much against using old reactor designs that always require
active systems to maintain safety (exactly the problem the Japanese are
having right now). But engineers and scientists are clever folk. Given
the right folk and enough resources, my bet is they could come up with
designs that "fail-safe", and generate far less waste. Given safe
reactors and small waste, we could have plentiful power, and <strong>very</strong>
much less impact on the environment than we get now, burning fossil
fuels.</p>
<p>Dyson's early group (some very idealistic folk) designed a "fail-safe"
small research reactor (not for power generation). General Atomic has
sold hundreds of copies ... and they are boring. Basically, nothing ever
goes wrong. This is an example of the very best design, by the very best
folk.</p>
<p>Imagine what the world would be like if research had continued, we got
ultra-safe nuclear reactor designs, and instead of 30-40 years of
depleting fossil fuels (and all the attendant political mess), we had
plentiful cheap energy from completely boring non-polluting plants.</p>
<p>Many of those very early folk (many who had worked on early nuclear
weapons) were very idealistic. They wanted a better world, and very much
wanted to put nuclear power to positive use. The story of how that went
wrong is ... tricky.</p>
<p>Nuclear power is at present the only long term viable solution to meet
the bulk of our energy needs. Given the best possible engineering,
nuclear power should also do the least harm to the environment (and
would undo a lot of the harm presently done). But before building new
reactors in large numbers, we need to take a good hard look at improving
the designs. We want designs that will serve us best over the long
stretch of history, not whatever is quickest to build, today.</p>
Very pleased2011-03-19T00:00:00Zhttps://bannister.us/weblog/2011/very-pleased
<p>Wanted to capture this picture for years.</p>
<p><a href="http://www.flickr.com/photos/dreadedhill/5533507210/"><img src="https://bannister.us/weblog/images/5533507210_023490c520_z.jpg" alt="Grass Feed Beef" title="Good thing he cannot read" /></a></p>
<p>Green grass, blue skies, an animal in the right place ... all are unusual.
This last Wednesday, everything lined up.</p>
What is an efficient "Free Market"?2011-02-06T00:00:00Zhttps://bannister.us/weblog/2011/what-is-an-efficient-free-market
<p>The "Free Market" meme is very popular. The usual definition is a market
without government intervention, and somehow efficient.</p>
<p>From where does this notion come?</p>
<p>One gift to European-derived societies, earned in the "Dark Ages", is
the notion that society and government are separate, and that society
can exist without government (where we associate "government" with the
larger nation-state). Our notions of "free market" probably date back to
that period.</p>
<p>Try and imagine how that might have worked ....</p>
<p>A buyer and seller meet in the woods (free of any sort of regulation).
The buyer does not like the seller's price, kills the seller, and takes
the goods.</p>
<p>Oops ... that did not work.</p>
<p>Maybe the seller was only wounded. Next time the buyer and seller meet,
the seller brings guards. The buyer does not like the seller's price, so
the seller has his guards kill the buyer and take his money.</p>
<p>Maybe the buyer was only wounded. Next time the buyer and seller meet,
they both bring guards. The money and goods are more than the guards
pay, so the guards rob them both.</p>
<p>Hmm ... seems that the transaction costs are getting a little high. For
an efficient market, you need civil behavior on the part of both buyer
and seller. Interesting word: "civil". Implies both good behavior and
organized society. Maybe the answer to this question is built into our
language, and the concepts in our language are derived from lessons in
our common history.</p>
<p>Lets see if we can come up with a more efficient arrangement. Instead of
buyers and sellers each hiring guards, charge a small fee and hire a
common set of guards for the entire market place. The market place needs
an agreed set of rules that buyers and sellers follow, and that the
guards enforce.</p>
<p>Of course, if the marketplace fees and regulation become too burdensome,
you could always try meeting in the woods ... but that does not always
end well.</p>
<p>Free markets imply civil behavior. Civil implies society. Society
implies rules governing behavior. In other words, an efficient market
requires buyers, sellers, and government on the scale of the
marketplace.</p>
<p>How did the current popular notion of a free market without government
get started, when the lessons are embedded in our history and built into
our language?</p>
<p>When you read the books, and strip away all the abstractions, the build
up to our current economic mess is not very different from sellers
robbing buyers in the woods. Even better ... the sellers want to go on
doing business in the same manner.</p>
<p>We need to be clear on what makes up an efficient free market.</p>
That’s not correct (on economics)2011-02-05T00:00:00Zhttps://bannister.us/weblog/2011/not-correct-on-economics
<p>Seems the folk that write about economics are largely idiots.</p>
<p>OK ... maybe that is a bit strong, but with so many examples like
<a href="http://economix.blogs.nytimes.com/2011/02/03/cowen-vs-meyerson-on-inequality/">this</a>,
it is hard to come to any other conclusion.</p>
<blockquote>
<p>The shift in income shares since the 1970s — from the middle and
bottom to the top, as well as from the top to the very, very top — is
a big reason incomes for the middle class and poor have grown so
slowly.
<small>[snipped a bit about another writer]</small>
That’s not correct. Look at the chart here, showing average annual
economic growth over three-year periods since 1950, and you’ll see
that growth since the 1970s has been slower than growth before the
1970s. The peaks on the right side of the chart are lower than the
peaks on the left.</p>
</blockquote>
<p>A simple observation - economic growth is about consumption. You only
produce goods when you have interested consumers. To increase
consumption you must have more folk getting paid more money - and not
stashing away increased income in investments. This point is by no means
new, as I have seen writings from the 1950's that made the very same
observation - and it could easily be far older.</p>
<p>If your income increased quite a lot, some folk will spend it all, but
most put a much larger portion into savings. To the extent that
investment is good for the economy, this is a good thing. In a
capital-starved economy, unequal income distribution might be a <em>very</em>
good thing. When the income distribution shifted disproportionately to a
smaller group, what we got is less consumption and more investment. Less
consumption depresses economic growth. Note that this is a destabilizing
feedback pattern.</p>
<p>The above referenced article fails to make the connection - and this
failure is very common in the Wall Street universe.</p>
<p>I came out of an engineering / science background. The best folk in
those disciplines are well-capable of distinguishing causes from
effects, and ruthless in their practice of analysis. By comparison, most
writings in economics - in terms of analysis - seem hopelessly flabby.
(Growing up, the few folk I knew who went into economics were far from
brightest, so perhaps the poor state of economics as a discipline is
predictable.)</p>
<p>What would the world look like if capital was far in excess of economic
needs?</p>
<p>Back in the 1950's my father considered going into farming, but found
that farm prices had jumped far out of reach. Back in the 1970's house
prices were rising far faster than costs (at least around here). In the
1980's and 90's computer and software companies rode enormous bubbles in
price on stock markets, though very few ever paid a dividend, and most
are gone today. There are and were lots of other bubbles. Any time
something looks like a good investment, lots of money flows in and
prices rise dramatically. Looks like there is a lot of money looking for
a place to invest.</p>
<p>Our present world looks very much like what you would expect with too
much capital.</p>
<p>In fact, if we use the history of the stock market as an measure, then
it would seem that excess capital (or at least misdirected capital) was
a problem as far back as the 1920's. The original notion of the stock
market makes sense - you buy stock in a company, the company expands,
and the stock pays dividends. The price of the stock reflects the
investors expected return on investment. What we have now is a market
that places little or no value on dividends, and prices reflect what
investors expect when the stock is sold in the future. The current stock
market is little more than yet another form of gambling. What made the
stock market transition from something useful to gambling? The answer
lies in too much capital chasing too few places to invest - and from our
history it seems this was true as far back as the 1920's.</p>
<p>For symbolic reasons, I think we should move all the stock exchanges to
Nevada. Could help the economy in Nevada. Might make New York a much
more livable city - more like it once was. But the main reason is to
make plain the association between gambling and the stock market.</p>
<p>Stop for a moment. Try to imagine what the world would be like if the
economy had followed a steady boom from early 1900's, without crashing
and stumbling through the 1930's. Without the economic crash, Germany
might not have gone to war, and World War II might never have happened.
If through those decades we had steady growth, and less waste on
warfare - what would the world look like now? Keep that in mind the next
time someone suggests that our current economic system works at all
well.</p>
<p>We have an economic system that generates too much capital, and the
result is unstable.</p>
<p>Unstable feedback loops are something for which a good engineer knows
how to look - and designs carefully to avoid. When I looked at our
economy, it seemed to be filled with unstable feedback loops - but for a
long time I assumed that appearance was due to my incomplete
understanding. After living through a major economic malfunction, with
the nominal economic experts largely clueless ... I'm thinking my first
impression was right.</p>
<p>Ironically, one solution to this problem is quite old, but reviled by
true believers in the Wall Street zeitgeist. To help limit excess
capital and promote growth, you need more folk saving less and consuming
more. How do you get folk to save less? Remove the need to save "for the
future". If as a society you guarantee that folk do not worry about
their future expenses, then you will see more consumption (and more
growth), and take a good chunk out of the excess capital.</p>
<p>So if you are wealthy, and you want a good return on your investments,
it is logical for you to promote socialism. (A logical conclusion I
fully expect will terminally confuse all true believers in the Wall
Street zeitgeist.)</p>
<p>The central driving cause behind all this instability is singular
wonderful fact - dramatically rising productivity. By this I mean
productivity at producing real things - growing food, and the
manufacture of real goods - not the government measure that counts less
useful activity. Over the past century or so, the rate at which work
produces goods expanded enormously. The problems come from a theory of
economic organization that does not offer a stable model though which to
channel rising productivity - but the underlying cause is wonderful.</p>
<p>Classic science fiction takes a singular premise, asks "what if" the
premise were extrapolated into the future, and tries to sketch out what
might be the result. Quite a while back, an author took the premise of
rising productivity, and extrapolated into a future when only one person
out of a hundred had to work to supply all material needs. The story was
a failure. The author could not tell a convincing story, which might be
a direct reflection of our present confusion about how to structure a
working economy.</p>
<p>The more I study economics and politics, the more it seems the last
century was little more than a turbulent interlude. Farsighted
individuals asked the right questions long ago, but as a society we have
yet to fully comprehend the questions, and are yet further from workable
answers.</p>
The end of the world ... and we do not care.2011-02-03T00:00:00Zhttps://bannister.us/weblog/2011/the-end-of-the-world-and-we-do-not-care
<p>The IPv4 address space is officially exhausted ... and we should not
care.</p>
<p><a href="http://www.reuters.com/article/2011/02/03/idINIndia-54646720110203">Internet addresses depletion reflects wired
world</a></p>
<p>Take this as a distinction between engineers and ... the real world.</p>
<p>The number of network-addressable objects connected to the Internet is
climbing dramatically. The IPv4 address space is limited to 2^32 (~4
billion) addresses. For an engineer, clearly there is the possibility of
many network-addressable devices per human. Since the world population
is in excess of 4 billion, the IPv4 address space is clearly not enough.</p>
<p>Engineers are mainly good-willed constructive folk. As such they tend
not to think easily about how technology can be subverted. To an
engineer it makes perfect sense to place every semi-intelligent device
on the open Internet, to allow the maximum number of constructive
interactions. Engineers are good folk.</p>
<p>The world has quite a number of not-so-good folk, who are more than
willing to subvert the work of well-intentioned engineers. The chance of
subversion means the devices should not be placed on the global
Internet, unless there is good reason, and unless very <em>very</em>
well-defended.</p>
<p>Caution means most potentially network-addressable nodes should not be
on the open Internet. (Do you want your robot vacuum exposed on the
Internet? How about your smart front door lock? Your TV video recorder?
Your not-entirely-secured daughter's laptop?) Caution means the number
of nodes exposed on the open Internet should be far less than one per
human.</p>
<p>If the number of exposed nodes on the open Internet is much less than
the number of humans, suddenly IPv4 limits are much less of a problem.</p>
Example of certificate creation with OpenSSL2011-02-02T00:00:00Zhttps://bannister.us/weblog/2011/example-of-certificate-creation-with-openssl
<p>If you need to create certificates for a test setup, the online examples
and O'Reilly OpenSSL book examples - while instructive - seem rather
awkward and obscure. The fault lies with OpenSSL (otherwise a great
piece of software) and the mash of parameters between the configuration
file, the command line, and interactive entry. The mash makes OpenSSL
usage obscure, so you get a lot of examples of cargo-cult programming in
the public examples.</p>
<p>I hate cargo-cult programming.</p>
<p>When a command requires a complex set of parameters, I prefer to pull
the parameters from a file. Parameter files can be generated by script,
archived, and/or stored in source control. With OpenSSL you cannot
(quite) do that. Even worse, the default configuration file mashes
together parameters from distinct commands in a non-obvious way. Thus
folk looking at OpenSSL usage are often uncertain about what is used and
when ... and you get "I hacked this until it worked, but not sure how"
examples.</p>
<p>Since I have to feed parameters to OpenSSL both in the configuration
file and on the command line, I chose to use shell scripts, create the
configuration files from script when needed, and run the command with
any remaining needed parameters.</p>
<p>The example is a Mercurial repository at:</p>
<p>http://hg.bannister.us/public/ca</p>
<p>Or just clone the set via:</p>
<p>hg clone hg.bannister.us:/public/ca</p>
<p>All the parameters for CA creation are in <strong>do/ca-create.sh</strong></p>
<p>test -d root || mkdir root || exit 1
test -d history || mkdir history || exit 2</p>
<p>export password1='really cool password'
export password2="$password1"</p>
<p>export config=history/ca-create.cnf</p>
<p>cat > $config << XXX</p>
<p>default_md = sha1
default_bits = 2048
x509_extensions = root_ca_certificate_extensions</p>
<p># You will want to change this, when security matters.
input_password = $password1
output_password = $password2</p>
<p>[ root_ca_certificate_extensions ]</p>
<p>subjectKeyIdentifier = hash
keyUsage = digitalSignature,keyCertSign,cRLSign
#authorityKeyIdentifier = keyid:always,issuer:always
basicConstraints = critical,CA:true</p>
<p>[ req ]</p>
<p>prompt = no
distinguished_name = root_ca_distinguished_name</p>
<p>[ root_ca_distinguished_name ]</p>
<p># You will want to change this, to match your target server.
# The order of these attributes is significant.
countryName = US
#stateOrProvinceName = California
organizationName = Bannister @ Home
organizationalUnitName = Root Certification Authority
commonName = bannister.home CA
emailAddress = preston@bannister.us</p>
<p>XXX</p>
<p>openssl req -config $config -x509 -new -days 365 -keyout root/ca-private-key.pem -out root/ca-certificate.pem</p>
<p>The bits above that you will want to change are in italics. To create
your CA run:</p>
<p>sh do/ca-create.sh</p>
<p>To get a certificate for a named entity, first you have to generate a
certificate request. For public web servers, the certificate request is
what you send to one of the CA roots (Verisign, etc.) along with money,
to get your certificate signed. For test setups, better to sign your own
certificates. (Large organizations - like the DoD - also sign their own
certificates.) All the parameters for creating certificate requests,
with the exception of the entity name, are in the file
<strong>do/request.sh</strong>:</p>
<p>test -z "$1" && {
echo 'Usage: request-certificate name'
exit 1
}
test -d history || mkdir history || exit 2</p>
<p>export name=$1
echo name = $name</p>
<p>export password1='really cool password'
export password2="$password1"</p>
<p>export config=history/request-$name.cnf
export base="cn-$name"</p>
<p>test -d requests || mkdir requests || exit 1
test -d $base || mkdir $base || exit 2</p>
<p>cat > $config << XXX</p>
<p>default_md = sha1
default_bits = 2048
x509_extensions = root_ca_issued_certificate_extensions</p>
<p># You will want to change this, when security matters.
input_password = $password1
output_password = $password2</p>
<p>[ root_ca_issued_certificate_extensions ]</p>
<p>basicConstraints = CA:false</p>
<p># PKIX recommendations.
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer:always</p>
<p># Typical in keyUsage for a client certificate.
# keyUsage = nonRepudiation, digitalSignature, keyEncipherment</p>
<p>[ req ]</p>
<p>prompt = no
distinguished_name = request_distinguished_name</p>
<p>[ request_distinguished_name ]</p>
<p># You will want to change this, to match your target server.
# The order of these attributes is significant.
countryName = US
#stateOrProvinceName = California
organizationName = Bannister @ Home
organizationalUnitName = Testing
commonName = $name
emailAddress = preston@bannister.us</p>
<p>XXX</p>
<p>openssl req -config $config -new -keyout $base/private-key.pem -nodes -out requests/$name.pem</p>
<p>Again, the part you will want to change is in italics. For example: to
generate a certificate request to server named "foozle" you would run
the command:</p>
<p>sh do/request.sh foozle</p>
<p>Repeat the command for all your named entities.</p>
<p>Once you have created all certificate requests, have your CA sign all
the certificates. All the parameters for processing certificate requests
are in the file <strong>do/requests.sh</strong>:</p>
<p>test -d root/db || {
mkdir root/db || exit 1
touch root/db/index.txt
echo 01 > root/db/serial
}
test -d history || mkdir history || exit 2
export issued=root/issued
test -d $issued || mkdir $issued || exit 3</p>
<p>export password1='really cool password'
export password2="$password1"</p>
<p>export config=history/ca.cnf</p>
<p>cat > $config << XXX</p>
<p>default_md = sha1</p>
<p># You will want to change this, when security matters.
input_password = $password1
output_password = $password2</p>
<p>[ ca ]</p>
<p>default_ca = root_ca</p>
<p>[ root_ca ]</p>
<p>certs = root/certificates
new_certs_dir = $issued
crl_dir = root/crl</p>
<p>database = root/db/index.txt
serial = root/db/serial
crlnumber = root/db/crlnumber</p>
<p>certificate = root/ca-certificate.pem
private_key = root/ca-private-key.pem
crl = root/crl.pem</p>
<p>default_days = 365
default_crl_days = 30
unique_subject = no
#preserve = no</p>
<p>policy = root_ca_policy
x509_extensions = root_ca_issued_certificate_extensions</p>
<p>[ root_ca_policy ]</p>
<p>countryName = supplied
stateOrProvinceName = optional
organizationName = supplied
organizationalUnitName = optional
commonName = supplied
emailAddress = supplied</p>
<p>[ root_ca_issued_certificate_extensions ]</p>
<p>basicConstraints = CA:false</p>
<p>XXX</p>
<p>for request in <code>ls requests</code> ; do
echo "===== Processing request: $request"
export out="cn-<code>basename $request .pem</code>/certificate.pem"
if openssl ca -config $config -batch -in requests/$request -key "$password1" > $out ; then
mv requests/$request history/.
echo "..... OK - Generated: $out"
else
rm $out
echo "\n***** ERROR in processing request: $request\n"
fi
done</p>
<p>Likely you do not to make any changes to the above. To process all the
pending certificate requests, run:</p>
<p>sh do/requests.sh</p>
<p>The private key and public certificate for each named entity end up in
the <strong>cn-*</strong> directories. The <strong>cn-foozle</strong> directory would contain the
private key and public certificate for the "foozle" named entity.</p>
<p>The <strong>Makefile</strong> is meant as an example of creating the CA and
certificates for all named entities in one operation.</p>
<p>#
# Example makefile for creating a CA and certificates for named entities.
#</p>
<p>all : # default rule</p>
<p>NAMED=
m2003
m2008
z2003
z2008
john
sammy
alice</p>
<p>clean : clean-named ; @rm -rf root history requests
clean-named : ; @rm -rf cn-*</p>
<p>root : clean ; sh do/ca-create.sh
all : root ; for name in $(NAMED) ; do sh do/request.sh $$name ; done ; sh do/requests.sh</p>
<p>.PHONY : all clean clean-named</p>
<p>Nothing complicated here. Run <strong>make</strong> to create the CA and certificates
for all named entities. Run <strong>make clean</strong> start over from a clean
state. Note that the configuration files fed to OpenSSL are saved in the
<strong>history/</strong> directory. (Did I mention that I like to be thorough?)</p>
User interface fail - in a research building2011-01-16T00:00:00Zhttps://bannister.us/weblog/2011/user-interface-fail-in-a-research-building
<p>Went to a <a href="http://calendar.ics.uci.edu/event.php?calendar=1&category=&event=647&date=2011-01-14">seminar at
UCI</a>
on advanced user interfaces, in a new/fancy building paid for by a local
billionaire.</p>
<p><a href="http://www.flickr.com/photos/dreadedhill/5358288442"><img src="http://farm6.static.flickr.com/5162/5358288442_b755bca0da.jpg" alt="panel" /></a></p>
<p>This is what i see - in the building used for seminars - when I go to
UCI, usually for a talk related the user interface design. This panel to
call the elevator is in the Donald Bren building. To find the elevator
in the first place is a bit of adventure. You walk in the front door,
through a side door, and then around a couple corners - all unlabeled.</p>
<p>This panel is the user interface to call the elevator. The most used
element is the button to call the elevator - and there is absolutely no
clue as to function. The unlabelled least obvious button at the bottom
panel is the button to call the elevator. (No idea what the other button
does.)</p>
<p>This in a building that hosts talks on advanced user interface design.
The level of irony is truly sublime.</p>
<p>I particularly like the words "Do not use elevator" directly above the
buttons. The button-like emblems above are a nice touch.</p>
<p>The control panel inside the elevator is equally impressive.</p>
<p><a href="http://www.flickr.com/photos/dreadedhill/5357688417"><img src="http://farm6.static.flickr.com/5207/5357688417_de8b2b1570_m.jpg" alt="panel" /></a></p>
<p>The building only has six floors, so the simplest, most obvious user
interface design would be a vertical column of six buttons, numbered top
to bottom from six to one. If you scan the buttons in left-to-right and
top-to-bottom reading order, you get 4-5-6-1-2-3. Apparently the button
you are most likely to want to use is "PH".</p>
<p>Not the most obvious arrangement.</p>
<p>I guess when a billionaire gives you a new building, you don't complain
about the screwy design. Then again, maybe the software folk at UCI got
to design the building?</p>
Scalable democracy2011-01-16T00:00:00Zhttps://bannister.us/weblog/2011/scalable-democracy
<p>How can a representative democracy work, without the risk of corruption,
subversion, and tedious partisan behavior we see at present? A couple of
observations take us part of the way to a solution, and a final clue
takes us the rest of the way.</p>
<p><strong>Clues</strong></p>
<p><a href="http://bannister.us/weblog/2005/first-impressions/">First impressions</a> -
at least in my experience, turned out to be fairly accurate. Of three
candidates to which I had first-hand exposure, the two I liked did very
well. The third I did not trust, voted against, and turned out later to
be corrupt.</p>
<p><a href="http://bannister.us/weblog/2006/making-politics-more-local/">Local elections</a> -
when the number of voters per candidate is fewer, you have a better
chance of direct exposure, and partisan politics seems to disappear. The
limit seems to be around a few thousand voters per representative.</p>
<p>For a long time, I was stuck at this point. I firmly believe local
elections are a pretty good filter - but tens of thousands of
representatives voting in Congress seems excessive - and possibly prone
to other bad behaviors. How can we reduce that number to a more
manageable level, without allowing corruption or subversion in the
selection?</p>
<p><a href="http://lemire.me/blog/archives/2011/01/11/demarchy-and-probabilistic-algorithms/">Demarchy</a> -
provided the last clue I needed to complete a scalable solution. The
<a href="http://en.wikipedia.org/wiki/Demarchy">Wikipedia article</a> describes a
number of alternatives I do not find interesting. You do not want
<strong>average</strong> citizens (or less) as your representatives. You want your
representatives to be a bit better than average. The trick is to come up
with a filter without bias and not vulnerable to corruption or
subversion. Local elections seem to make an excellent filter for
selecting above-average folk. Random assignment of roles gets you
appropriate-sized numbers of folk in each role.</p>
<p><strong>Solution</strong></p>
<p>Use local elections to select above-average representatives. Randomly
assign representatives to roles in city, county, state, and national
government. Candidate representatives would not know ahead of time to
which role they would be assigned. I suspect the optimal number is one
representative for every 1,000 to 5,000 citizens. (Small numbers of
citizens per representative would mean some elected representatives
would not be assigned roles.)</p>
<p>If we are electing one representative per thousand citizens, I suspect
the average capability of those folk is going to be pretty high. If the
United States had 300,000 elected representatives (likely not all with
assigned roles), then the traditional sorts of subversion or corruption
are much more difficult.</p>
<p>Demarchy without filtering would net us representatives of only average
ability. Combining very-local elections with Demarchy could net us very
high levels of ability without bias of corruption in the selection.</p>
<p>There are other details to be nailed down - but I rather like this
combined solution.</p>
<p>The question is - how do we get there from here?</p>
Corporate rights2011-01-01T00:00:00Zhttps://bannister.us/weblog/2010/corporate-rights
<p>Back in the late 1970's or early 1980's I saw an advertisement from an
oil company (I think it was Mobile) asking the question - if individuals
have rights, should not corporations also have rights? The question
stuck with me, as then I had no idea what answer made sense.</p>
<p>Many years later the answer is to me is now very clear. Individual
rights are central to our form of society (or at least the form our
society was meant to be in the beginning). Corporations should not have
rights meant for individuals. Individuals associated with a corporation
could choose to exercise their rights to aid the corporation - or not -
but those individuals should then be liable if the corporation causes
harm.</p>
<p>Corporations can muster huge economic resources - far out of proportion
from the means of individuals. There must be a counter-balance, else our
society will become dominated by corporations over individuals.</p>
<p>To be clear - I find the role of corporations as tightly-focused
profit-seeking organizations to be entirely reasonable. Corporations are
inherently amoral. We need a framework within which corporations can
seek profit, but are kept from immoral and destructive behaviors.</p>
<p>Our history is rich with examples of abusive organizations. European,
British, and American history traces the story where individual rights
were clearly defined and strengthened, to preclude the sorts of abuses
of the past. Those hard-won rights were meant to give individuals some
degree of parity against larger institutions.</p>
<p>The recent <a href="http://en.wikipedia.org/wiki/Citizens_United_v._Federal_Election_Commission">Citizens
United</a>
decision from the Supreme Court applies the First Amendment right of
free speech to corporations - to my mind this an enormous and
destructive mistake. Granting to corporations the rights meant for
individuals tilts the balance in favor of corporations.</p>
<p>I am slightly encouraged that the Supreme Court decision was a near
thing, with strong dissent. What I do not know is where to go from here.
I did not know that the notion of <a href="http://en.wikipedia.org/wiki/Corporate_personhood">Corporate
Personhood</a> was over
a century old. To my mind, this is wrong. A corporation is not a person.
The rights accorded to individuals should never be confused with the
roles allowed to corporations.</p>
<p>(The more I dig into economics and politics, the more it seems that
within that domain the last century has been has been little more than a
holding pattern. Problems identified and fought against over a century
ago remain relevant and unresolved today. Much else has changed, but the
base problems remain.)</p>
<p>The interests of corporations should not be dominant, if we wish to have
any sort of humane society.</p>
How to make a perfect omelet2010-12-07T00:00:00Zhttps://bannister.us/weblog/2010/how-to-make-a-perfect-omelet
<p>Making a good omelet is simple, but ... most of the recipes on the web
produce (in my opinion), an inferior result. I suspect many recipes
originally came from restaurants. In a restaurant, time is money, and
shortcuts are profitable. To my taste, restaurant omelets tend to be
closer to scrambled eggs - and an omelet should be something different.</p>
<p>Equipment:</p>
<ul>
<li>small/medium sized balloon whisk
(<a href="http://www.amazon.com/Best-Manufacturers-12-inch-Standard-French/dp/B00004R8ZM/ref=sr_1_9?ie=UTF8&qid=1291707393&sr=8-9">example</a>)</li>
<li>medium sized mixing bowl
(<a href="http://www.amazon.com/Pyrex-Prepware-3-Piece-Mixing-Clear/dp/B00004SZ7H/ref=sr_1_2?ie=UTF8&qid=1291708964&sr=8-2">example</a>)</li>
<li>good quality omelet pan
(<a href="http://www.amazon.com/Calphalon-Triply-Stainless-10-Inch-Omelette/dp/B003L1B5Q8/ref=dp_cp_ob_k_title_1">example</a>)</li>
</ul>
<p>Ingredients:</p>
<ul>
<li>two large eggs</li>
<li>one ounce of butter (a quarter of a stick)</li>
<li>fillings (a bit of shredded cheese is good)</li>
</ul>
<p>Crack open two eggs, dump into the mixing bowl, and give the eggs a
couple of whisks. (You can mix more if you want, but no need.) Put the
butter in the pan, and put the pan on the stove over medium heat (or
just a bit below - you will have to experiment a bit to find the right
setting on your stove). When the butter starts to brown (you will smell
the change), dump the butter into the eggs in the mixing bowl, give the
mixture a couple more whisks, and dump into the pan.</p>
<p>Watch the pan carefully! (This only takes a minute or two, and the
result is worth your time.)</p>
<p>In about 20 seconds the bottom of the omelet will solidify, and if you
jiggle the pan a bit, you should see the omelet slide freely. (This is
where a good clean omelet pan makes a difference.) After a minute or so
the top will look a bit less runny - this is a good time to sprinkle on
a bit of shredded cheese. In about another minute the omelet is done.
(Watch the omelet, not the clock.) Slide onto a plate. (With a bit of
practice you can fold the omelet in half while sliding onto the plate.)</p>
<p>How long does all this take, exactly? Depends on your tastes. I like to
let the butter brown a bit more, and use slightly higher heat to get a
bit of browning on the omelet. My daughter prefers when the butter and
omelet are just barely browned (slightly lower heat). Experiment a bit
to find out which you prefer.</p>
<p>This is simple, cheap, good food - and fast.</p>
<p>Hints:</p>
<ul>
<li>Best if your pan is squeaky-clean. Any leftover stuck-on bits of
food could cause your omelet to stick and tear. Clean up is very
easy if you give the pan a quick rinse and scrub immediately after
cooking. (The cloud of steam from the still-hot pan is quite showy.)</li>
<li>Cleaning the balloon whisk is very easy if done right away, and a
real pain if you wait until the egg mixture dries. Give it a quick
rinse, and drop into the mixing bowl, filled with slightly-soapy
water.</li>
</ul>
<p>This is easier to show than the describe. The above is simple, and the
result very nice.</p>
Cable companies and bad software2010-11-29T00:00:00Zhttps://bannister.us/weblog/2010/cable-companies-and-bad-software
<p>I have Internet, phone, and cable TV through <a href="http://cox.net/">Cox
Cable</a> in Orange County, California. Cox does an
excellent job as a cable and Internet provider.</p>
<p>On the other hand, the Cox website has always looked pretty, but worked
poorly. (This does not really matter at all, as the important bit is
that cable/internet service works well.) Seems the cable company is not
good at software / user interface work.</p>
<p>Just got a Cox DVR (made by Motorola) to work with the HDTV I got a
several months back. I used a Tivo (Series 2, not HD) before. The user
interface on the Motorola DVR sucks, big time. I was thinking, after all
this time, surely the manufacturers would have software at least roughly
comparable to Tivo. Nope. Not even <em>remotely</em> close. The user interface
is crap. Really quite painfully bad. This DVR is going back. Seems the
DVR hardware company is not good at software / user interface work.</p>
<p>Cable companies really need to get their software from outfits that do
user interfaces well. Google, Apple, Microsoft, Tivo - pick one (or more
than one), but stop buying crap software from outfits that do not do
well at user interface work.</p>
Practical thermonuclear power at small scale?2010-11-27T00:00:00Zhttps://bannister.us/weblog/2010/practical-thermonuclear-power-at-small-scale
<p>Thinking about small-scale fusion and came up with a couple questions,
for which I do not know where to look for answers.</p>
<ol>
<li>Send a stream of accelerated protons into a pool of water, what is
the rate of fusion?</li>
<li>If the pool of water is at the center of an electrolysis setup, do
the injected ions change the rate of electrolysis?</li>
</ol>
<p>I suspect these may be questions that no one has studied, empirically.</p>
<p>I understand that the rate of proton-proton fusion in a plasma is
extremely low. The plasmas humans create are very near to a vacuum. The
electrostatic forces between two protons are huge compared to their
mass. Easy to understand why fusion in a plasma is quite unlikely.</p>
<p>If a stream of protons is fired at a pool of water, the density of
hydrogen atoms is much higher, and there are no net electrostatic forces
until the protons are very close. Seems the rate of fusion should be
many orders of magnitude higher ... but has anyone measured?</p>
<p>The apparatus I have in mind is an evacuated chamber with a needle at a
very high positive voltage above a grounded pool of cold water. The
pressure in the chamber would be only water vapor. High voltage should
be enough to ionize hydrogen from the vapor, and send an accelerated
stream of protons into the pool of water. Given a high enough voltage,
some of those protons will fuse with the protons in bound hydrogen
atoms.</p>
<p>My Physics classes were a very long time ago. (I have a B.S. in
Physics.)</p>
<p>What is the mean-free path of ions in water vapor? What voltage is
needed to accelerate protons to energies where fusion is possible? What
is the optimal combination of voltage and distance to get the most
high-energy ions injected into water?</p>
<p>The second of the questions at the top is about capturing energy.
Electrolysis is endothermic at low voltages. If a trickle of high-energy
ions is injected into the center of an electrolysis setup, I suspect the
energy from the ions <em>might</em> be captured, and the rate of electrolysis
increased. Energy released from extremely low rates of fusion (compared
to the bulk of the water) <em>might</em> be captured in a similar manner. If
this works, we might have a very efficient way to capture energy
released by fusion.</p>
<p>My impression is that most of the attention in research on electrolysis
is centered on higher temperatures, pressures, and voltages. I would not
surprised if there was no more than a single researcher exploring this
domain ... or no one.</p>
<p>In similar fashion, empirical studies of fusion seem to almost entirely
focus on hot plasmas. There may be no more than a single researcher
exploring fusion rates with non-plasmas ... or no one.</p>
<p>The above questions bug me. If the ratios work out, we could build
relatively simple / practical small-scale fusion power generators. If
any of the ratios implicit in the above are sufficiently unfavorable,
then the notion will not work. I could build an experiment, but ...
given my lack of relevant knowledge, a negative result would not prove
anything. I do not have enough money to do the experiment well, or to
make many attempts. On the other hand, if the core notions in the above
work ... it would be rather a big deal.</p>
<p>Is it possible to build a workable small scale thermonuclear power
generator, using entirely conventional Physics?</p>
Exciting!2010-08-30T00:00:00Zhttps://bannister.us/weblog/2010/1867
<p><img src="http://imgs.xkcd.com/comics/exoplanets.png" alt="exoplanets" />
No joke.</p>
Strict mode for Javascript - continued2010-08-15T00:00:00Zhttps://bannister.us/weblog/2010/strict-mode-for-javascript-continued
<p>Seems the <a href="https://bannister.us/weblog/2010/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 - 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 - and have little or no experience
with anything different. The natural inclination is to transfer learned
habits from the old to the new language - and that is a mistake.</p>
<p>Back in the late-1980's or early-1990'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 - 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.</p>
<blockquote>
<p><strong>New</strong> gives you prototype inheritance, performance benefits, and
it's about language semantics.</p>
</blockquote>
<p>That is <strong>exactly</strong> my point! ... only the reality differs from the
assumptions of the guy making the comment (and I suspect he has a
<strong>lot</strong> of company). Back in the late 1980's / early 1990'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 - twenty years back - completely not
practical.</p>
<p>My reading of the articles on the current-generation Javascript engines
was that the toughest problem - and main aim of implementors - 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 "flyweight" class pattern
is useful here.)</p>
<p>My assumption (from what I have read) is that "static" class hierarchies
yield no particular benefit in client-side Javascript.</p>
<p>Assumptions should be checked ... so I wrote a micro-benchmark.</p>
<p><a href="http://bannister.us/examples/js-benchmark-methods/">Method dispatch - Microbenchmark -
Javascript</a>
The aim was to measure method-dispatch for three cases:</p>
<ol>
<li>The method is bound to the instance.</li>
<li>The method is bound to the "class" (via the <strong>__proto__</strong>
member).</li>
<li>The method is bound to the "class" (via the <strong>function</strong> invoked via
<strong>new</strong>).</li>
</ol>
<p>What I see (in terms of exact results) will likely vary as each browser
vendor tweaks their Javascript engine. The point - in the case of the
current discussion - 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 <strong>denying</strong> any semblance to
static-class languages. This was exactly my point.</p>
Is Tivo still a good bet?2010-08-08T00:00:00Zhttps://bannister.us/weblog/2010/is-tivo-still-a-good-deal
<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 ... 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 ... 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 - 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 ... 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 ...
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'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 ... let'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'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 ... 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 - 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?) ... 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>
Status check2010-08-06T00:00:00Zhttps://bannister.us/weblog/2010/status-check
<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>-- from <a href="http://en.wikiquote.org/wiki/Robert_A._Heinlein">Robert A.
Heinlein</a></p>
<p>Refactoring ... to what I want yet to do.</p>
<ul>
<li>Design and build a house that <em>works well</em>.</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>
Strict mode for Javascript2010-07-31T00:00:00Zhttps://bannister.us/weblog/2010/strict-mode-for-javascript
<p>A small item...</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 "strict" mode for Javascript:</p>
<ul>
<li>No use of "function name(){}" declarations</li>
<li>No use of "document.write()"</li>
<li>No use of "new"</li>
</ul>
<p>No doubt I could come up with more rules, with a bit more reflection,
but this is a start.</p>
<p><strong>No use of "function name(){}" declarations</strong>
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>
<p>function foo() {
}</p>
<p>For an entire collection of reasons I prefer this form:</p>
<p>var foo = function() {
};</p>
<p>The second form is better suited for later refactoring, and offers
subtle emphasis to the learning programmer of the <em>difference</em> offered
by Javascript. The first form can also lead to subtle bugs (which I do
not want to explain) - 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>
<p>var ZOT = {};
ZOT.foo = function() {
};</p>
<p>Or in the more elaborate use:</p>
<p>var ZOT = (function() {
var foo = function() {
};
return {
foo: foo
};
})();</p>
<p>This last form makes full use of closures, and allows for private data
and functions.</p>
<p><strong>No use of "document.write()"</strong>
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><strong>No use of "new"</strong>
On this point I am certain others will differ. They might even be
right. Certainly the "new" operator is of huge advantage in static
languages. But that is not the domain of Javascript - certainly in the
web browser, and possibly even for server-side usage.</p>
<p>The "new" 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><strong>Conflicted over Crockford</strong>
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 "new YUI()".
<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 quite get past the beginning.</p>
Perfect Pineapple Pizza2010-07-30T00:00:00Zhttps://bannister.us/weblog/2010/perfect-pineapple-pizza
<p>Bit of nonsense....</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 - 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 - every week or so - 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°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 - one hour at 250°F seems a
good start.</li>
<li>Add the shredded mozzarella to the pineapple, before topping the
pizza, <em>but only just before, otherwise the cheese absorbs too much
moisture.</em></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°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°F for 15 minutes (or less - watch carefully).</li>
<li>... and I am still working on this. Results are good, and improving.</li>
</ul>
Vodka and Lime2010-07-24T00:00:00Zhttps://bannister.us/weblog/2010/vodka-and-lime
<p>Random bit...</p>
<p>The cover of <a href="http://www.youtube.com/results?search_query=hazy+shade+of+winter+bangles&aq=0">"Hazy Shade of Winter" 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 "babe"
factor.)</p>
<p>My only wish is for a longer version.</p>
VirtualBox as free software2010-07-16T00:00:00Zhttps://bannister.us/weblog/2010/virtualbox-as-free-software
<p>File this under "Missing the Obvious".</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 - well after EMC acquired VMware - 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'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 "free" 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 <strong>many</strong> more opportunities
than any in-house usage at our development outfit. Nevermind my
misgivings - offering free software to developers is about the best
advertising Oracle could buy.</p>
<p>Does Oracle know this?</p>
Odds and ends in testing with Active Directory2010-07-12T00:00:00Zhttps://bannister.us/weblog/2010/odds-and-ends-in-testing-with-active-directory
<p>Of late, I have needed to test against Microsoft's Active Directory - 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 - 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 ... the irony.)</p>
<p>Oddly, all the nice GUI interfaces to administering a domain server
actually make the process <strong>more obscure</strong> 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's domain controller ... 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's <strong>ldifde</strong> 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 - 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> -
the period of time tombstones are kept before cleanup - 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.
"You are in a maze of twisty passages, all alike.")</p>
<p>Another approach is to take a snapshot of the VM when Active Directory
is in a "clean" state, and restore the snapshot later. In principle this
could be simpler/faster than the scripted restore (using delete
operations fed via <strong>ldifde</strong>). 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&ie=UTF-8&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....</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 ... 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>
Java for Business = Zinger from Oracle2010-06-22T00:00:00Zhttps://bannister.us/weblog/2010/java-for-business-zinger-from-oracle
<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 - and are not happy.</p>
<p>At first, there was no word from Oracle on a real fix ... then I
received this email.</p>
<blockquote>
<p>Hi Preston,
Good to hear from you. Have I told you what a fine group of folks
there is at Oracle Java? No? That's because there isn't.
<em>[snip]</em></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. <strong>The gotcha is the VP told me
that they will only release the JRE to licensed JRE users.</strong> I told
him the JRE has always been a free download and he responded with
"free download not free use". 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's a very Oracle response. Quite the opposite to my
dealings with Microsoft.</p>
<p>I guess time will tell....
<em>[snip]</em></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 ... 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's Dalvik VM potentially a viable option? Might IBM'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....</p>
Odd fragment2010-06-16T00:00:00Zhttps://bannister.us/weblog/2010/odd-fragment
<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 - 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>
Anachronisms - Icon for "Save..." is a floppy, HDTV sized in inches2010-05-20T00:00:00Zhttps://bannister.us/weblog/2010/anachronisms-icon-for-save-is-a-floppy-hdtv-sized-in-inches
<p>Went looking for an icon to represent the "Save..." or "Save As..."
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 ... 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. :)</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 <em>from</em> the memory card.</p>
<p>Checked to see if Microsoft had any good ideas. Office 2007 uses a image
of a floppy for "Save..." and "Save As..." - adding a pencil writing on
the floppy label (an antique behavior) for the "Save As..." icon.
Internet Explorer changes "Save As..." 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
"British Imperial System" 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't believe me? Check out the <a href="http://amazon.fr/">Amazon site
in France</a> - home of the Metric System.)</p>
<p>If only the French had developed Windows ... then the Metric System
would have had a chance. :)</p>
WordPress hacked (again)2010-05-19T00:00:00Zhttps://bannister.us/weblog/2010/wordpress-hacked-again
<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>
Stepped on someone's gravy train?2010-04-21T00:00:00Zhttps://bannister.us/weblog/2010/stepped-on-someones-gravy-train
<p>About five years back I wrote an
<a href="http://bannister.us/weblog/2005/model-quality-introductions/">article</a>
with my colorful speculations about a locally advertised business -
<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 "model quality introductions" as a search string into Google
or Bing (but not Yahoo - 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 - 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'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 -
and as a personal interest - I read rather a lot about Semantics and
Psychology.</p>
<p>You can often tell a lot about a writer'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 ... this was an uncertain judgement. In my response, I offered to
encourage and protect the sender - if honest (and meant <strong>exactly</strong> what
I wrote). I was - very carefully - 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 ... 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:</p>
<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
"Model Quality Introductions" expanded to more locations - and there
are many imitators.</li>
</ul>
<p>The odds of a hired marketeer - outside the content of the exchange -
seem rather high.</p>
<p>By analogy, I was playing chess, and the marketeer was playing
checkers.
Bit amusing, this. :)</p>
Odd ... how is this spam?2010-04-18T00:00:00Zhttps://bannister.us/weblog/2010/odd-how-is-this-spam
<p>Attempted to comment on <a href="http://nighthacks.com/roller/jag/entry/next">Gosling's
post</a>.</p>
<blockquote>
<p>Not that you likely have any shortage of suggestions - 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's. Maker'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) ... 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>
<p></p>
</blockquote>
<p>The automated response:</p>
<blockquote>
<p>Your comment was marked as spam and will not be displayed.
Comment contains blacklisted/ignored words</p>
<p></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 ... it seems Gosling does not like
<strong>me</strong>. Guess that is an achievement of sorts.</p>
Rude tax-time gift from past Republicans2010-04-16T00:00:00Zhttps://bannister.us/weblog/2010/rude-tax-time-gift-from-past-republicans
<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
"Fuck-You Middle Class Parents of Teenagers" 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 - so there is no logical sense to this.</p>
<p>There is another even nastier interpretation - 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>
Less noise2010-04-10T00:00:00Zhttps://bannister.us/weblog/2010/less-noise
<p>After a good long trial, I went through and deleted a bunch of "social"
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 ... revolting. Good riddance.</p>
<p>Friendster was never useful. There are likely a bunch of other tertiary
"social" 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) - at least for now. Google Reader
is immensely useful for tracking many things, and finding longer more
thoughtful communications.</p>
Do you trust Oracle?2010-03-31T00:00:00Zhttps://bannister.us/weblog/2010/do-you-trust-oracle
<p>The death of Sun, and the submission to Oracle - as a developer - 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 - especially with software - 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 ... the Oracle-core has a diminishing (if very fat) future. That fat
future can stretch out quite a while - beyond obvious reason - 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 - Javascript. May have
something to do with early heavy exposure to Lisp in school.) Hearing
that C# incorporates lambdas ... 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>
Re-thinking the IDE - a starting point2010-03-15T00:00:00Zhttps://bannister.us/weblog/2010/re-thinking-the-ide-a-starting-point
<p>Time for another user-interface rant. :)</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'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 - but not all - 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'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'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 ... apparently not.</p>
<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>
<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 - "Type" - is one of the
least important. The "Path" column occupies a lot of space, but is of at
best secondary importance.</p>
<p>The most important bit of the "Problems" panel is tiny.</p>
<p>Note also that in the above screenshot, the overhead elements in the
panel eat up about half the vertical space - far more space than the
most-meaningful message texts.</p>
<p>This is not efficient ... on a large 1920x1200 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>
<p>With Eclipse you can "maximize" the text panel, but there is still
substantial vertical space lost to overhead elements.</p>
<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 ... on a large 1920x1200 panel. On smaller panels,
things are much worse.</p>
<h3>Alternate presentations</h3>
<p>To make the best use of scarce vertical space - especially on smaller
panels - 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 - 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 - 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 1920x1200 - on a 24" desktop panel.</p>
<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 1440x900 - the resolution of my 17" laptop panel.</p>
<p>(Imagine the vertical overhead of Chrome as a part of the text-space.)</p>
<p>At 1280x800 - the resolution of common basic laptop panels.</p>
<p>Note that on this smallish laptop we are getting both more vertical
program text, and more complete message texts, than on my big 1920x1200
panel using Eclipse.</p>
<p>At 1024x600 - the resolution of a netbook panel.</p>
<p>With the fly-away message panel toggled off, even a netbook screen shows
a good amount of program text.</p>
<h3>Topic for later - navigation</h3>
<p>After using Eclipse for several years, I have become pretty comfortable.
Oddly, I have come to realize that in <strong>one</strong> aspect - navigation -
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 ... 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>
Magnetic propulsion?2010-03-08T00:00:00Zhttps://bannister.us/weblog/2010/magnetic-propulsion
<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 - 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 - could there be a
more efficient way? Nothing especially obvious ... 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 - 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">"electric
wind"</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 "electric wind" 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'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 - 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 "controller" 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 "magnetic propeller" is practical possibility?</p>
Using GMail for mailto links in Ubuntu2010-03-04T00:00:00Zhttps://bannister.us/weblog/2010/using-gmail-for-mailto-links-in-ubuntu
<p>Create the file <strong>$HOME/bin/mailto</strong> with the contents:</p>
<p>#!/bin/sh
gnome-open "https://mail.google.com/mail?extsrc=mailto&url=$*"</p>
<p>Make the file executable.</p>
<p>On Ubuntu Linux (using the Gnome desktop), go to:</p>
<p>System > Preferences > Preferred Applications</p>
<p>Under Internet / Mail Reader select "Custom" and enter the command:</p>
<p>/home/preston/bin/mailto %s</p>
<p>(Replace "/home/preston" with your $HOME.)</p>
<p>This should open GMail in your default web browser, composing a new
message, with the recipient set.</p>
Between Marketing and Engineering2010-02-24T00:00:00Zhttps://bannister.us/weblog/2010/between-marketing-and-engineering
<p>Brought up a command window in Windows 7, and saw:</p>
<p>Microsoft Windows [Version 6.1.7600]
Copyright (c) 2009 Microsoft Corporation. All rights reserved.</p>
<p>Yep. Windows 7 is in fact Windows version 6. Gotta love those Marketing
folk.</p>
Multiplexed FastCGI connections?2010-01-31T00:00:00Zhttps://bannister.us/weblog/2010/multiplexed-fastcgi-connections
<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 "1" (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>
Giving up HTML@W3C2010-01-17T00:00:00Zhttps://bannister.us/weblog/2010/giving-up-htmlw3c
<p>Got the "status as Invited Expert in HTML Working Group" 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 ... far too much noise. The HTML5
"standard" 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 "no". 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 - 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.
Time to stop pretending.</p>
Efficient UTF-8 recoding and secure processing2010-01-16T00:00:00Zhttps://bannister.us/weblog/2010/efficient-utf-8-recoding-and-secure-processing
<p>An attempt to make a point...</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="https://bannister.us/weblog/2009/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 <strong>in Java</strong> 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="https://bannister.us/weblog/2009/long-term-compatible-protocols">principles</a>
I adopted a long time ago is
<a href="https://bannister.us/weblog/2008/convert-at-the-edges">"convert at the edges"</a>.
If you have data coming in from an untrusted source, then you perform
conversion and validation at the "edge" 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 <strong>recode</strong> 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="https://bannister.us/weblog/2010/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 "convert at the edges" 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
"illegal" UTF-8 code sequences. In addition we allow all downstream
processing to be simpler and more efficient ... and we also can be
tolerant of imperfect upstream software. (Yes, I am going to invoke
<a href="https://bannister.us/weblog/2005/postel-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 "illegal" 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>
<p>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 & *p1++;
if (c < 0x80) {
*p2++ = c;
continue;
}
if (c < 0xE0) {
c = (31 & c) << 6;
c |= 63 & *p1++;
} else if (c < 0xF0) {
c = (15 & c) << 12;
c |= (63 & *p1++) << 6;
c |= 63 & *p1++;
} else if (c < 0xF8) {
c = (7 & c) << 18;
c |= (63 & *p1++) << 12;
c |= (63 & *p1++) << 6;
c |= 63 & *p1++;
} else if (c < 0xFC) {
c = (3 & c) << 24;
c |= (63 & *p1++) << 18;
c |= (63 & *p1++) << 12;
c |= (63 & *p1++) << 6;
c |= 63 & *p1++;
} else {
c = (1 & c) << 30;
c |= (63 & *p1++) << 24;
c |= (63 & *p1++) << 18;
c |= (63 & *p1++) << 12;
c |= (63 & *p1++) << 6;
c |= 63 & *p1++;
}
if (c < 0x80) {
*p2++ = c;
} else if (c < 0x800) {
*p2++ = 0xC0 | (c >> 6);
*p2++ = 0x80 | (63 & c);
} else if (c < 0x10000) {
*p2++ = 0xE0 | (c >> 12);
*p2++ = 0x80 | (63 & (c >> 6));
*p2++ = 0x80 | (63 & c);
} else if (c < 0x200000) {
*p2++ = 0xF0 | (c >> 18);
*p2++ = 0x80 | (63 & (c >> 12));
*p2++ = 0x80 | (63 & (c >> 6));
*p2++ = 0x80 | (63 & c);
} else if (c < 0x4000000) {
*p2++ = 0xF8 | (c >> 24);
*p2++ = 0x80 | (63 & (c >> 18));
*p2++ = 0x80 | (63 & (c >> 12));
*p2++ = 0x80 | (63 & (c >> 6));
*p2++ = 0x80 | (63 & c);
} else {
*p2++ = 0xFC | (1 & (c >> 30));
*p2++ = 0x80 | (63 & (c >> 24));
*p2++ = 0x80 | (63 & (c >> 18));
*p2++ = 0x80 | (63 & (c >> 12));
*p2++ = 0x80 | (63 & (c >> 6));
*p2++ = 0x80 | (63 & c);
}
}
nContent = (int) (p2 - pBuffer);
}</p>
UTF8/UCS conversion benchmark2010-01-12T00:00:00Zhttps://bannister.us/weblog/2010/utf8ucs-conversion-benchmark
<p>Point of reference...</p>
<p>UCS (Unicode) to UTF8 conversion, and the reverse, when efficiently
coded in C++ clocks in <strong>well above</strong> 100MB/s on current generation
CPUs. If you are getting something much less - enough to be a problem -
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><code> preston@athena:~/workspace/json-c$ time Release/json
base 00000010 : 229.9 MB/s UCS to UTF8 conversion
base 00000010 : 253.7 MB/s UTF8 to UCS conversion
base 00000010 : 122.0 MB/s UTF8 recode
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
</code></pre>
<p>The above run is on a <strong>AMD Phenom(tm) II X4 955 Processor</strong> 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>
(A start on an experiment in fastest-possible JSON conversion.)</p>
<p>Note that I intentionally allow proper conversion of "invalid" UTF8 code
strings. I completely understand the reason for the disallowed
conversions, and I disagree.</p>
<p><strong>Update:</strong> 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>
Musing about cumulative impact2010-01-08T00:00:00Zhttps://bannister.us/weblog/2010/musing-about-cumulative-impact
<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 <strong>massive</strong> 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="https://bannister.us/weblog/2005/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, <strong>every</strong> 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>
... status as Invited Expert in HTML Working Group2009-12-31T00:00:00Zhttps://bannister.us/weblog/2009/status-as-invited-expert-in-html-working-group
<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
"standard" is sure to be a mess. Not sure how to change any of this.</p>
<p>My status as an "Invited Expert" is up for renewal. With extreme
reluctance ... 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 ... 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 - I do not see a way to force a disconnect.</p>
Almost but not quite ... server-side JavaScript2009-12-30T00:00:00Zhttps://bannister.us/weblog/2009/almost-but-not-quite-server-side-javascript
<p>Bit over three years back I looked at
<a href="https://bannister.us/weblog/2006/revisiting-server-side-javascript">server-side Javascript</a>,
and was not enthused with the available choices.</p>
<p>Three distinct usages I'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'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 - 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 <strong>great</strong> performance,
and is easy to embed. (Google as the good guys, riding to the rescue
once again ... you'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 ... 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="https://bannister.us/weblog/2009/almost-but-not-quite-server-side-javascript">node.js</a> makes a lot of sense. I
<em>like</em> 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 <strong>node.js</strong> 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 <strong>node.js</strong> project offers a single-threaded non-blocking web
server ... but can it work behind FastCGI?</li>
<li>Is the environment for server-side JavaScript the same (or
sufficiently similar) between <strong>node.js</strong> and <strong>v8cgi</strong>?</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 ... but it
seems we are not quite fully there, as yet.</p>
Wireless network and Linux2009-12-24T00:00:00Zhttps://bannister.us/weblog/2009/wireless-network-and-linux
<p>A signpost of sort - 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> -
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's laptop seems to work well when mine does not.
I have a simple
<a href="http://bannister.us/examples/json/bounce.html">"bounce"</a> test for
network performance. My daughter's cheap Toshiba, on the same "bounce"
page, gets steady/fast performance when side-by-side to my laptop ...
which gets slower/unsteady/unreliable performance.</p>
<p>Not specific to the wireless router or crowded neighborhood either - I
get similar poor performance when at my father's place in Colorado
(different brand and generation of router, and fewer/further neighbors).</p>
Trie in Java - revisited2009-12-23T00:00:00Zhttps://bannister.us/weblog/2009/trie-in-java-revisited
<p>An earlier attempt at writing a fast
<a href="https://bannister.us/weblog/2009/example-general-purpose-trie-in-java">general purpose Trie in Java</a>
gave <strong>huge</strong> 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 <strong>TallTrie</strong> and
<strong>WideTrie</strong> implementations (that traded increased memory use for
speed) are indeed faster, though the <strong>LinkedTrie</strong> uses much(!) less
memory. The new <strong>FixedTrie</strong> is fastest (hurrah!) and uses the least
memory (a shade less than <strong>LinkedTrie</strong>).</p>
<p>But even the <strong>FixedTrie</strong> is slower than a generic hash table, with
read-only access about 3 times as expensive.</p>
<p>Sample measurements...</p>
<p>=== words
21 ms - 98569 words loaded</p>
<p>=== 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}
10768/second - access each item in hash map {4000 ms, 43074653 operations = 92 ns/op}</p>
<p>=== 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}
1431/second - access each item in trie (linked) {4063 ms, 5815571 operations = 698 ns/op}
98569 slots of trie (linked)
225791 nodes of trie (linked)</p>
<p>=== build fixed trie</p>
<p>=== 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}
3438/second - access each item in trie (fixed) {4013 ms, 13799660 operations = 290 ns/op}
98569 slots of trie (fixed)
225791 nodes of trie (fixed)</p>
<p>=== 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}
1672/second - access each item in trie (wide) {4007 ms, 6702692 operations = 597 ns/op}
41533124 slots of trie (wide)
225890 nodes of trie (wide)</p>
<p>=== 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}
1913/second - access each item in trie (tall) {4019 ms, 7688382 operations = 522 ns/op}
6982694 slots of trie (tall)
446075 nodes of trie (tall)</p>
<p>=== 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}</p>
<p>(Note that the <strong>FixedTrie</strong> 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 ... but not
necessarily outperform ... 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>
Identifying and documenting bugs in Sun Java Printing2009-11-30T00:00:00Zhttps://bannister.us/weblog/2009/identifying-and-documenting-bugs-in-sun-java-printing
<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) ... is
embarrassing.</p>
<p>After getting stuck on the latest problem, I finally built a
"PrintExplorer" 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 "push" 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:</p>
<p>java -jar PrintExplorer.jar</p>
<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 ... 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 ... 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:</p>
<ul>
<li>PrinterJob.getPageDialog() makes invalid change to page size.
<a href="https://bannister.us/weblog/images/print-test-log.html">(log)</a></li>
<li>Toolkit.getPrintJob() changes JobAttributes.getPrinter() to
default(?) printer.
<a href="https://bannister.us/weblog/images/print-test-log1.html">(log)</a></li>
<li>Quarter-sized pages sometimes printed on an HP DeskJet 5550 on
Windows 7.
<a href="https://bannister.us/weblog/images/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 <strong>exactly</strong> 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 <strong>DocPrinterJob</strong> 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><strong>Update - 2010.02.01</strong>
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>
Apples iTunes store hacked?2009-11-20T00:00:00Zhttps://bannister.us/weblog/2009/apples-itunes-store-hacked
<p>Just arrived in email.</p>
<blockquote>
<p><strong>Billed To:</strong>
<a href="mailto:preston@bannister.us">preston@bannister.us</a>
Preston Bannister
14 Vallecito
Foothill Ranch, CA 92610</p>
<p><strong>Order Number:</strong> MGLN2G836G
<strong>Receipt Date:</strong> 11/19/09
<strong>Order Total:</strong> $4.99
<strong>Billed To:</strong> MasterCard .... 1234</p>
<p><strong>Item Number</strong>
1</p>
<p><strong>Description</strong>
변환기, v1.0, Seller: Wang Xi|299225365 (4+)</p>
<p><strong>Unit Price</strong>
$4.99</p>
<p><a href="https://userpub.itunes.apple.com/WebObjects/MZUserPublishing.woa/wa/addUserReview?type=Purple+Software&id=337689079&o=i">Write a
Review</a>
<a href="https://buy.itunes.apple.com/WebObjects/MZFinance.woa/wa/reportAProblem?p=36000004208556&o=i">Report a
Problem</a></p>
<p>Subtotal: $4.99
Tax: $0.00
Order Total: $4.99</p>
<p><strong>Please retain for your records.</strong>
Please See Below For Terms And Conditions Pertaining To This Order.</p>
<p><strong>Apple Inc.</strong>
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">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/">http://www.apple.com/support/<wbr />itunes/store/</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 "Report a Problem" link asks me to install iTunes.</p>
<p>I am guessing the iTunes store has a (big!) problem.</p>
<p><strong>Update:</strong>
No charges have appeared on my credit card (so far).</p>
<p>I eventually found a "support" 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 ("run
iTunes to check on your account", grrr). I replied with a copy of the
receipt, and they did ... 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><strong>Update (2):</strong>
The charge just appeared on my credit card, so it is not clear the
exchange with iTunes Support addressed the problem.</p>
<p><strong>Update (3):</strong>
Shortly after <em>my</em> last email (where I again described the problem, and
added the other guy's receipt), Apple Support sent an unexpected email
refunding the charge <em>to the other guy!</em> Right. Half-successful?</p>
Shallow or deep?2009-11-10T00:00:00Zhttps://bannister.us/weblog/2009/shallow-or-deep
<p>The current trade dispute between China and the US - on the surface -
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>
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's near-term benefit from
continued exports.</p>
<p>What has leverage? An import duty on tires ... <em>really</em> ... 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 - one that likely
does more imports from China than exports to China - 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 "rule by men",
not "rule by law". Obama meeting with the Chinese leaders would be the
point where - privately - the game is made plain ... if this the deeper
game. If China allows the yuan to rise after the meeting - that would be
a <strong>big</strong> clue. (Likely China will keep buying dollars, but at a lesser
rate - a sort of compromise.)</p>
<p>Is this shallow, or deep?</p>
GTK bug in Ubuntu 9.102009-11-08T00:00:00Zhttps://bannister.us/weblog/2009/gtk-bug-in-ubuntu-9-10
<p>Upgraded my desktop from Ubuntu 9.04 to 9.10. That was a mistake. I
could really use an "undo" 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:
<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=291257">Bug 291257</a> -
[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 - myself included - it causes another severe problem (for
which there are other bug reports).</p>
<p>#
# 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
#</p>
<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 <strong>all</strong>
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:
<a href="https://bugs.launchpad.net/gtk/+bug/442078%20">Buttons in Eclipse not working correctly with GTK+
2.18.1-1</a>
<a href="https://bugs.launchpad.net/ubuntu/+source/swt-gtk/+bug/463086">Eclipse loses button events with swt-gtk in
karmic</a>
<a href="https://bugs.launchpad.net/ubuntu/+source/eclipse/+bug/458703">GDK_NATIVE_WINDOWS=1 still required for some
dialogs</a>
<a href="http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=550183">Breaks Default button in some eclipse dialogs (and rcp
apps)</a></p>
Moon rocks and a bit of math2009-10-28T00:00:00Zhttps://bannister.us/weblog/2009/moon-rocks-and-a-bit-of-math
<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>
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:</p>
<ul>
<li>~0.25 liters / minute - oxygen consumed for human at rest.</li>
<li>~5 liters / minute - oxygen consumed for athlete / heavy exercise.</li>
<li>~1.43 grams / liter - oxygen gas at Earth sea level pressure.</li>
</ul>
<p>Barring any dumb math errors on my part, that translates to....</p>
<ul>
<li>~636,000 liters / year - the ton of oxygen produced by the
above-mentioned generator.</li>
<li>~131,500 liters / year - 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 "real" space habitat would also have the means to
recycle oxygen from exhaled CO^2^, 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>
First impressions - Google Wave2009-10-24T00:00:00Zhttps://bannister.us/weblog/2009/first-impressions-google-wave
<p>Basically, Google Wave is a full and natural merger of messaging, on the
web. Before you say "oh, only that", 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 <em>all
applications in the world</em> (on the web).</p>
<p>E-mail clients can present "threads" 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 - that looks something like a conversation - 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>
<p>Using new names for existing notions is sometimes useful, but more
often not. Calling a conversation a "wave", calling items (messages)
within a conversation "blits" ... I find this more confusing than
useful. This reminds me more of talk from marketing folk than
engineers.</p>
</li>
<li>
<p>It's <a href="http://en.wikipedia.org/wiki/Talk_(software)">Talk</a>, on the
web. As a programmer, I get it - this is <em>kewl!</em> Writing a web
application that allows all participants to see each character
typed - is tricky. As a demo of tricky programming, this is sure to
impress. As a useful feature in a general use application - 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:</p>
<ul>
<li><strong>Locus of attention</strong> - the on-screen activity from updates to
other users' incomplete messages is sure to distract.</li>
<li><strong>Quality of expression</strong> - 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 ...
always?</li>
</ul>
<p>
Note that both are a disservice to **all** participants - cool in a
programming demo, not cool in a deployed application.
</p></li>
</ul>
<p>Other bits....</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
640x480, 800x600, and 1024x768 on 14" to 17" as most common screen
sizes. Today you are looking 1280x800 on 14" or 15" as your minimum
size, and 1920x1080 at 20" or bigger as common. Present and future
screens have not so much new height, with lots of new width - 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 - 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, <em>very</em> 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 - 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'd want to be pretty ruthless
about overhead that takes height away from the conversation view. I'd
drop the per-character updates. I'd drop the use of funky names for
existing ideas. None are fundamental problems, and all are easy to
address.</p>
PrinterJob.pageDialog() in Java is broken?2009-10-16T00:00:00Zhttps://bannister.us/weblog/2009/printerjob-pagedialog-in-java-is-broken
<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 "green-bar"
reports. Should be pretty simple - the reports are all fixed pitch text.
Given I like to do things that "just work" (from the users perspective),
I'd added live "smart" 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 - meant for old line-printer
green-bar paper - 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:</p>
<p>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</p>
<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:</p>
<p>controller.pageFormat = job.pageDialog(controller.pageFormat);</p>
<p>// 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);</p>
<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>
Example - general purpose Trie in Java2009-10-05T00:00:00Zhttps://bannister.us/weblog/2009/example-general-purpose-trie-in-java
<p>Run across mention of the <a href="http://en.wikipedia.org/wiki/Trie">Trie</a> data
structure in a <a href="http://www.daniel-lemire.com/blog/archives/2009/10/02/sensible-hashing-of-variable-length-strings-is-impossible/">slightly random
discussion</a>.
Had no notion of how performance of a Trie compares with the usual hash
table, so wrote a general-purpose Trie implementation in Java (<a href="http://svn.bannister.us/public/Trie/">sources
in an Eclipse project</a>) with a
bias toward performance.</p>
<p>The results are not encouraging. From a test run:</p>
<p>=== words
14 ms - 98569 words loaded</p>
<p>=== hash
3837/second - hash map loaded {4007 ms, 15376764 operations = 260 ns/op}
7953/second - hash map re-loaded {4003 ms, 31837787 operations = 125 ns/op}
12958/second - access each item in hash map {4001 ms, 51847294 operations = 77 ns/op}</p>
<p>=== trie (wide)
343/second - loaded trie (wide) {4022 ms, 1379966 operations = 2914 ns/op}
2089/second - re-loaded trie (wide) {4010 ms, 8378365 operations = 478 ns/op}
2165/second - access each item in trie (wide) {4005 ms, 8674072 operations = 461 ns/op}
41533124 slots of trie (wide)
225890 nodes of trie (wide)</p>
<p>=== trie (tall)
2254/second - loaded trie (tall) {4022 ms, 9068348 operations = 443 ns/op}
2446/second - re-loaded trie (tall) {4029 ms, 9856900 operations = 408 ns/op}
2429/second - access each item in trie (tall) {4017 ms, 9758331 operations = 411 ns/op}
6982694 slots of trie (tall)
446075 nodes of trie (tall)</p>
<p>=== string to UTF8 conversion
4708/second - word to UTF8 (stock) {4019 ms, 18925248 operations = 212 ns/op}
10503/second - word to UTF8 (fast) {4007 ms, 42088963 operations = 95 ns/op}</p>
<p>The test data is a file of 98569 words found in Linux installation. The
words are read from a file, and loaded into an array of strings. The
words are loaded into a HashMap (a library class) for comparison, and
loaded into both a "tall" and "wide" Trie (differing space/time
trade-offs).</p>
<p>The notion used to generate a "fast" Trie is for each node in the Trie
to index off a byte in the UTF8 encoding of key String. Along the way,
found that the stock String to UTF8 conversion to be a bit slow, so
wrote a <a href="http://svn.bannister.us/public/Trie/sources/us/bannister/encoders/EncoderUTF8.java">faster
version</a>.
Even with the faster encoding, measured Trie performance is not good.</p>
<p>(Bit of a shock to find the stock String-to-UTF8 conversion slow in
Java, as this is used a lot - especially in web applications - and may
be significant enough to effect benchmarks. Java has been around long
enough, so that I expected better. In fact, I expected UTF8 to be in
native code in the JVM. Byte-bashing code is better suited to C/C++.)</p>
<p>If strings were already in UTF8 (or ASCII) format - as in C/C++ code - a
similar Trie implementation would perform somewhat better, but still use
too much memory. Whether a Trie in C++ could more closely approach the
performance of a hash table is a bit of an open question.</p>
<p>Not sure why the <a href="http://svn.bannister.us/public/Trie/sources/us/bannister/structures/WideTrie.java">"wide"
Trie</a>
(using one node to index one UTF8 byte) is slightly slower than the
<a href="http://svn.bannister.us/public/Trie/sources/us/bannister/structures/TallTrie.java">"tall"
Trie</a>
(using two nodes to index 4-bits each from one UTF8 byte). Expected the
"wide" version to be faster. Suspect the larger memory use is enough to
bust the CPU cache, and on smaller data the "wide" variant may be
faster. Also saw a lot of jitter in the times - presumably due to Java
GC activity (garbage collection) - though the relative results were
consistent.</p>
<p>Clearly this "fast, general-purpose" Trie implementation is not overly
useful - at ~5 times slower than a hash table, and huge use of memory.
Alternate forms can be more space-efficient, but are likely to be
slower.</p>
<p>As a guess, a Trie is not going to find much use in my code. :)</p>
<p>[Note that I
<a href="https://bannister.us/weblog/2009/trie-in-java-revisited">revisited</a>
this topic, later.]</p>
Concurrency and threading is the new thing, again.2009-10-02T00:00:00Zhttps://bannister.us/weblog/2009/concurrency-and-threading-is-the-new-thing-again
<p>Tim Bray is writing <a href="http://www.tbray.org/ongoing/When/200x/2009/09/27/Concur-dot-next">a series of
posts</a>,
taking a run at the concurrent programming problem, with a focus on
languages. I think Tim is aiming in the right direction, but has his
focus set at the wrong distance.</p>
<p>There are good reasons to take a run at the problem. Physics is changing
what we can expect from future computers. Starting a few years back, and
barring any unexpected shifts in technology, the rate at which a CPU can
process a single instruction stream will increase only slowly. The
economics of chip fabrication allow us to build a CPU with multiple
cores. The physics of power consumption tell us that we can get more
computing done per watt with slimmer cores at slightly lower clock
rates. All of which argues for fabricating CPU chips with a slowly
increasing number of cores, and slowly increasing clock rates.</p>
<p>All of which means that to make full use of present and future CPUs,
there has to be a lot of concurrent computing.</p>
<p>Concurrency in programming is tricky, and often got wrong. This is
nothing new. My first job out of college (so many years ago) was to work
of an <a href="http://en.wikipedia.org/wiki/Ada_(programming_language)">Ada</a>
compiler (a computer language with direct support for multi-threaded
interaction) on a product (the <a href="http://en.wikipedia.org/wiki/Pascal_MicroEngine">Pascal
Microengine</a>) that had
thread support built into the CPU's microcode. There was then much talk
of how to do concurrent programming.</p>
<p>What we learned then and in the time since is that fine-grained
multi-threaded concurrent programming is tricky, and very easy to get
wrong. For the bulk of programs and programmers, there is very limited
need for this sort of concurrency. All things considered, this is
probably a good thing.</p>
<p>Tim Bray - and the folk responding to his post - are mainly focusing on
a programming language for concurrent programs. I suspect this is a
mistake. Maybe some new (or newish) programming language will make
bug-free concurrent programs easy, but I do not think this is likely.</p>
<p>I think we already have the bulk solution. Web-scale applications (at
least those that work well) make use of large numbers of CPUs, with a
huge amount of concurrent execution. Web-scale programming is mostly
about swarms of small-scale execution single-threaded programs (not
necessarily small), well isolated from other threads. Many of the
attributes Tim lists are true - or mostly-true, or should-be-true - of
web scale applications.</p>
<p>Clearly the web-scale application approach does not work for all
applications - though it may work for more than you expect. There are
always going to be some applications that need fine-grained threading
... but I suspect this group is very small. For the bulk of programming
we want to allow for massive concurrency, but well-isolated and
coarse-grained.</p>
<p>Why the focus on programming languages that support fine-grained
concurrent programs? What problem - in the application space - does that
solve? Are more than a tiny fraction of applications in that space?</p>
<p>My answer to Tim's question is to point at the concerns of web-scale
applications and cloud-computing. The problem does not drive an interest
in new programming languages. The answer to large-scale concurrent
execution is - for most applications - large numbers of single-threaded
programs, responding to requests. Tim's list of characteristics - in
part - is useful for that sort of programming. Editing down the list:</p>
<ul>
<li><a href="http://www.tbray.org/ongoing/When/200x/2009/09/30/C-dot-next-laundry-list#p-4">Message
passing</a>
and
<a href="http://www.tbray.org/ongoing/When/200x/2009/09/30/C-dot-next-laundry-list#p-11">Dataflow</a></li>
<li><a href="http://www.tbray.org/ongoing/When/200x/2009/09/30/C-dot-next-laundry-list#p-2">Immutable
data</a>,
and <a href="http://www.tbray.org/ongoing/When/200x/2009/09/30/C-dot-next-laundry-list#p-7">Transactional
memory</a>,
and <a href="http://www.tbray.org/ongoing/When/200x/2009/09/30/C-dot-next-laundry-list#p-8">Tuple
space</a></li>
</ul>
<p>(Have to admit, I am not sure the above grouped notions are distinct,
when viewed at this level.)</p>
<p>For the bulk of programmers and applications, the main needed change is
finding the simplest possible adaptation to the needs of web-scale
programming. Once done, concurrency and threading are solved problem. We
do not want or need fine-scale single-name/address space
multi-threading - that way lies madness. We do need well-isolated single
threads, in mass numbers, cooperating across web-scale process, machine,
and network boundaries.</p>
Wall Street Journal Online2009-09-23T00:00:00Zhttps://bannister.us/weblog/2009/wall-street-journal-online
<p>After a news item took me to the Wall Street Journal site, I left the
site up as it cycled through recent videos (while I was working on
something else). I have not spent a lot of time listening to videos from
Wall Street Journal, so had no overall opinion of the site.</p>
<p>In comparison to <a href="http://bannister.us/weblog/2009/msnbc/">MSNBC</a>,
the voices were at a normal level, and the sound effects hinted at "we
are tasteful and sophisticated".</p>
<p>Recurring memes I could identify ...</p>
<ul>
<li>Republicans are good, Democrats are bad.</li>
<li>Government is always less efficient than business.</li>
<li>Government - not business - is somehow responsible to the current
economic face-plant.</li>
<li>Not sure how to describe ... the Wall Street variant of the New
England mentality?</li>
</ul>
<p>Not sure that the videos are representative of the written/print edition
of the WSJ.</p>
<p>Has the WSJ changed since it was sold?</p>
BusinessWeek Online2009-09-23T00:00:00Zhttps://bannister.us/weblog/2009/businessweek-online
<p>Left the videos from the BusinessWeek Online site running in background.</p>
<p>In contrast to the <a href="http://bannister.us/weblog/2009/msnbc/">MSNBC</a>
and
<a href="http://bannister.us/weblog/2009/wall-street-journal-online/">WSJ</a>
sites, the videos came across as politically neutral, and not so much
into the financial orthodoxy. Seemed aimed roughly at the interests of
middle management.</p>
<p>Not getting a lot of insight, but also not as much propaganda.</p>
MSNBC2009-09-13T00:00:00Zhttps://bannister.us/weblog/2009/msnbc
<p>Went looking for video of the latest Apple product announcements, and
ended up on the MSNBC site. After the Apple-related video played, I left
the site up as it cycled through recent videos (I was working on some
code while it ran). I quit watching TV news many years ago, never had
much interest in the web equivalent, so had no particular opinion of
MSNBC.</p>
<p>First impression: Why all the shouting? Kind of the equivalent of TYPING
IN CAPITAL LETTERS ALL THE TIME!! Add the dramatic special effects
noise. <strong>WITH BOLD <u>AND UNDERLINE!!</u></strong> Did someone conclude that
SHOUTING the news made it more believable? Noisy. Should change the name
to the Shouting News Network (SNN).</p>
<p>Second: They sure do a <strong>lot</strong> of product placements disguised as news
reports.</p>
<p>Third: How do they pick their "outside-expert" guys to supplement the
usual talking-heads? Watching, I often could not figure out what
criteria lead to their choices.</p>
<p>Fourth: There must be some company edict to use the words "monetize" and
"free market" a lot. Did not seem to matter so much whether it made
sense in context. Caused the "outside-experts" some grief, as they tried
to come up with sensible responses to not-quite meaningful questions.</p>
<p>Kind of funny, in a really odd way. Don't think I'll be watching MSNBC
regularly.</p>
<p>Should try the same experiment with the other news networks.</p>
When hardware guys write about software2009-09-03T00:00:00Zhttps://bannister.us/weblog/2009/when-hardware-guys-write-about-software
<p>My father sent a link to an article in a hardware-oriented magazine -
EDN (Electronic Design News) - about the upcoming Power7 CPU from IBM.</p>
<blockquote>
<p>This is out of our fields, but interesting.</p>
<p></p>
<http: www.edn.com="" article="" CA6686259.html?nid="2435&rid=8150303">
<p>I liked the one comment: "the generally horrible code from the
Microsoft world".</p>
</http:></blockquote>
<p>My characteristically reserved response:</p>
<blockquote>
<p>Yes, it is usually cute when hardware guys talk about software.</p>
<p></p>
As I remember, the result came from the large number of branches found
in "the generally horrible code from the Microsoft world that
dominated tasks in those days". Except this characteristic is common
to most modern code, not just in "Microsoft world" code. It comes from
complex behaviors - an increasing and increasingly common
characteristic in contemporary code. Outside a small set of niche
applications (with large number crunching), you **are** going to have
a lot of branches. Branching limits the value of concurrent
instruction dispatch, and speculative execution (as we might guess).
Results pointed at more than \~3-way dispatch as on the wrong side of
the "knee" of the curve.
<p>I think the chip design offers a hint as to their expected application
domain:</p>
<blockquote>
<p>Each of the Power7's cores has 12 execution units, including two
each load/store and fixed-point, four double-precision
floating-point, and a decimal floating-point unit. The core can
dispatch six instructions per cycle.</p>
</blockquote>
<p>With <strong>four</strong> floating-point execution units, my guess is that they
are aiming at niche mass number-crunching applications, not general
purpose applications. Combined with the large shared-cache, these
should do well on problems that allow highly concurrent bulk number
crunching. Might see a lot of these to run weather simulations (to
predict Global Warming), and some sorts of large engineering design
calculations/simulations.</p>
<p>As a general purpose CPU, my guess is that benchmarks (when and if
they appear) will be unimpressive.</p>
<p>Add to this the fact that most big new web applications are moving
(have moved, in fact) to a no-shared-memory model - lots of
single-board nodes with 1 to 8 CPU sockets, no shared memory between
processes, connected via ethernet to large-scale high-performance
redundant datastores (specialized database/filesystems).</p>
<p>Which makes the really cool design aspects of the Power7 pretty much
useless. This is not the sort of CPU that would ever see large-scale
deployment in a web-service datacenter.</p>
<p>Too bad the writer of the article does not have a clue about software,
but no surprise from a hardware magazine.</p>
<p><em>Oh wait! I take it all back! This CPU could be terrific at the more
compute-intense computer games! Perhaps Microsoft will pick this up
for the next XBox? Super high frame rates in MegaBlaster2010! ...
except highly concurrent shared memory applications are a real bitch
to write, even worse to debug, so better make that MegaBlaster2012, or
2013, or 2015, or ... (hey! they never did ship!?!).</em></p>
<p>... maybe not. :)</p>
</blockquote>
Building things2009-08-26T00:00:00Zhttps://bannister.us/weblog/2009/building-things
<p>Took off this week and last with no specific plans. Might have gone
driving (might still), but I made several trips in the last year, so ...
(shrug). Guess I have been on a bit of a home improvement kick.
Imagining a new bit, and - much work later - seeing an entirely
satisfactory end result, is nice.</p>
<p>Was out in the garage last night, planning the next bit, when my
daughter popped out of the house. "Oh, you're thinking again, aren't
you?" She was not surprised to find me sitting and staring for an hour,
before starting on the next bit.</p>
<p>Seems I use roughly the same approach whether cooking, building things
out of wood and metal, or writing software. When cooking I never use
recipes, I am always changing <em>something</em>, and usually get good results.
When building I never use plans (other than occasional rough sketches),
will think through the problem and build the next bit in my mind, before
starting manufacture - and usually get good results. When writing
software I do not have much use for design documents or formal
processes, but cannot start until I have thought through the problem,
and usually get good results.</p>
<p>In each case I can visualize the end result before I start. In each case
I am working without plans (written plans or plans from others), yet ...
I <strong>always</strong> have a plan.</p>
<p>As I learned back in school, this pattern of work does not work at all
for some of my peers. My upper-division Physics lab class was the first
clear example. The lab was - at base - one student alone in a room with
a pile of equipment, and a set experiment to complete in a couple weeks.
The lab had a new instructor when I took the class, and he was not
familiar with the equipment. Also, for some reason, none of the
equipment worked. So with little or no instructions, I had to figure out
what the equipment did, how it <em>should</em> work, and what needed to be
fixed.</p>
<p>Getting the experiments to work was both frustrating, and fun!</p>
<p>Midway through the course, the instructor assigned another student to
work with me, as this guy was not doing well by himself. I knew the guy,
counted him as a bit of a friend, and thought he was at least as good as
I at the theory classes. But in the lab, he drove me nuts. I needed
silence so I could visualize how things should work. For the parts I did
not understand well enough to visualize, I would disassemble and play
with the equipment, until I better understood how it worked.</p>
<p>I suppose it looked to the other guy like I did things in no particular
order, while ignoring anything he said. After an indeterminate period of
seemingly aimless activity, he'd suddenly hear "Ah ... I get it!",
followed by an ordered, logical explanation, and a burst of activity -
after which the equipment would (usually) work.</p>
<p>Bet I drove him a bit nuts, as he did to me.</p>
<p>Also, up to that point in the lab class, I thought I was doing poorly.
Most times - when the instructor dropped by - the equipment was not
working, and I had no coherent explanation (or so I felt) of what to do
next. Once the equipment was working, I could - in short order - perform
the experiment, and move to the next lab.</p>
<p>Bet also my more present co-workers see something similar - an
indeterminate period of seemingly aimless activity, followed suddenly by
a burst of activity and plans. Probably drives some folk - of differing
nature - slightly nuts.</p>
<p>So my daughter caught me planning, again ... :)</p>
How improve both oil production and the economy2009-08-22T00:00:00Zhttps://bannister.us/weblog/2009/how-improve-both-oil-production-and-the-economy
<p>Part of our economic mess starts with the huge flow of dollars sent
outside the country to buy oil. We could produce oil from domestic
sources, but the base cost is higher than pumping oil out of the ground
and shipping halfway around the planet. If the market price is high
enough, investing in production from domestic sources looks like a good
idea. If the price of oil on the global market drops - as it did in the
1980's, then domestic production cannot compete.</p>
<p>If you visit towns in western Colorado and south-eastern Utah, you can
see a boom-and-bust pattern of development for the 1970's and 80's. In
the 1970's the notion of extracting
<a href="http://en.wikipedia.org/wiki/Shale_oil">shale-oil</a> got a lot of
investment, and caused a modest boom in development. The low oil prices
of the 1980's killed investment in (then uneconomic) shale oil
extraction, and development slowed. Investment in shale-oil production
since that time has proved a bit slow, as investors are not entirely
confident the world oil prices will stay high enough for profitable
production.</p>
<p>Keeping dollars in America means more productive economic activity
within the country. Domestic oil production should help stabilize
consumer prices. How can we fix the cost of imported oil high enough so
that domestic production stays profitable?</p>
<p>We could place a tax on imported oil, but this seems likely to become a
mess. How would we tax different grades of oil? What about refined
products? Is politics likely to grant different rates to different
nations and oil companies? We would need a new bureaucracy to set tax
rates, would most likely get things slightly wrong, and create new
nonconstructive opportunities for politics and corruption.</p>
<p>Better to not create new opportunities for bad behavior.</p>
<p>A far simpler approach would be to place a large retail tax on gasoline,
and offer an equally large tax credit for domestic oil production. The
idea is to have no net effect on the retail cost of gasoline produced
from domestic sources, but make non-domestic sources more expensive -
enough so that domestic production is profitable, and investment in
domestic production is safe.</p>
<p>I once heard that shale-oil production is profitable when the world oil
price is above $70 per barrel. The low point in world oil prices (that
killed development of shale-oil production) was around $30 per barrel.
A tax of about $40 per barrel (or $1 per gallon of gasoline) should be
enough to insure that domestic production is assured profitable. Given
assured profits, <strong>all</strong> feasible forms of oil production (including
sustainable production from biologic sources) should be able to attract
the level of investment that they need.</p>
<p>Put differently, by making one simplest-possible change in the ground
rules, we can let the market solve the production problem, without
more-complicated government intervention.</p>
Extending the Pearson hash function to larger values2009-08-18T00:00:00Zhttps://bannister.us/weblog/2009/extending-the-pearson-hash-function-to-larger-values
<p>My favorite hash function is without doubt the
<a href="http://en.wikipedia.org/wiki/Pearson_hashing">Pearson hash</a>.
In my measurements, for
<a href="https://bannister.us/weblog/2005/a-diversion-into-hash-tables-and-binary-searches">my usage</a>,
custom hash tables built using a Pearson hash to index into a
power-of-two-sized table, have always performed better than the best
alternatives. (For not-small tables each table slot is the root of a
binary tree.) Certainly this result is going to be somewhat specific to
the use-case and current CPU architecture, but each time performance was
important, my solution - using binary trees in 256 hash buckets, using
the Pearson hash - won the benchmarks.</p>
<p>The main limitation of the Pearson hash is that it only computes an
8-bit value (i.e. the range 0..255). For some problems a bigger range of
values would be good. The means offered in Pearson's original paper (as
I recall - threw out the old magazine long ago, and the paper is not on
the web) was to run the algorithm more than once to add additional 8-bit
chunks to the hash.</p>
<p>Just now I'm feeling like a bit of an idiot, as it seems the Pearson
hash could be easily extended up to 16-bits (or a bit beyond) with a
ridiculously small change.</p>
<p>The original Pearson algorithm:</p>
<pre><code class="language-C"> static unsigned char T[] = {
// The values 0..255 shuffled into random order.
};
static inline unsigned hashOf(unsigned h,const char* s) {
for (int c = *s++; c; c = *s++) {
h = T[h ^ (255 & c)];
}
return h;
}
</code></pre>
<p>The algorithm modified to generate a 16-bit hash:</p>
<pre><code class="language-C"> static unsigned short T[] = {
// The values 0..65535 shuffled into random order.
};
static inline unsigned hashOf(unsigned h,const char* s) {
for (int c = *s++; c; c = *s++) {
h = T[h ^ (255 & c)];
}
return h;
}
</code></pre>
<p>Note that only the type and size of the table <strong>T</strong> changed!</p>
<p>With the large cache sizes of current CPUs, the 128KB table will fit
nicely into cache, and perform very well. On CPUs with smaller caches,
you might want to use a smaller table. Also clearly the table size for a
32-bit hash would be huge. You might want some sort of test for
degenerate patterns in <strong>T[]</strong> (though I'd guess the probability of
getting a bad table is very small).</p>
<p>This notion is so simple, I am a bit surprised that no one (so far as I
can tell) suggested this approach before.</p>
<p>For large numbers of keys, each bit added to the hash value saves the
equivalent of a key comparison. Adding 8-bits to the key saves 8 key
comparisons. If the expense added to the hash function is less than the
cost of one key comparison (certainly true of string compares), then you
are ahead from the first bit added.</p>
Installing Pidgin with support for Microsoft IM2009-08-05T00:00:00Zhttps://bannister.us/weblog/2009/installing-pidgin-with-support-for-microsoft-im
<p>Needed to get IM working from my Ubuntu Linux boxes to my employer's
Microsoft Office Communicator (2007?) service. Was using the Microsoft
Messenger 4.7 client in a VM hosting Windows, but of late this seems to
not work well enough for some of my coworkers (since I am often not
actively using that VM).</p>
<p>I had looked at this over a year ago, but the SIPE support for Pidgin
did not support the options needed for the IM service as configured by
the company. On checking again, it seemed possible that the current
version might work, but I needed the most recent version of Pidgin and
the SIPE plugin.</p>
<p><strong>Update:</strong> There is at present a bug in the SIPE 1.11.0 in the
autodiscover code that causes a crash after about 90 seconds. I had to
revert to Pidgin 2.6.6 and SIPE 1.10.0.</p>
<p>So ... for future reference. :)</p>
<h3>Building Pidgin and the SIPE plugin from sources on Ubuntu</h3>
<ol>
<li>
<p>Install the dependencies needed to build from sources.</p>
<p>sudo apt-get build-dep pidgin pidgin-sipe</p>
</li>
<li>
<p>Remove any existing installation.</p>
<p>sudo apt-get remove pidgin pidgin-sipe libpurple-dev</p>
</li>
<li>
<p>Download <a href="http://www.pidgin.im/download/source/">Pidgin sources</a>.</p>
</li>
<li>
<p>Change to the directory in which you unpacked the Pidgin sources,
and build.</p>
<p>./configure
make
sudo make install</p>
</li>
<li>
<p>Download <a href="http://sourceforge.net/projects/sipe/files/">Pidgin SIPE
plugin</a>.</p>
</li>
<li>
<p>Change to the directory in which you unpacked the SIPE plugin
sources, and build.
./configure --enable-telepathy=no
make
sudo make install</p>
</li>
<li>
<p>Now run Pidgin. It should appear in the usual Gnome menu, or can be
run from the command line. Given that figuring out the right options
for you company's setup can be tricky (it was for me), you might
want to do the initial connection setup with debug output from the
command line.</p>
<p>pidgin -d</p>
<p>Not strictly necessary, as the "Debug Window" (got to via the "Help"
menu) offers the same(?) information.</p>
<p>
You might also want to (temporarily) disable any other IM accounts
you have configured.
</p></li>
</ol>
<p>Figuring out the right options to use with your company IM service ...
you are on your own. :)</p>
Tigers of Granularity2009-06-18T00:00:00Zhttps://bannister.us/weblog/2009/tigers-of-granularity
<p>Several months back, I
<a href="http://bannister.us/weblog/2008/the-other-tiger/">wrote up</a> a
speculation about the granularity of what we call "reality". Since then
I have tended notice <em>more</em> those instances of a perceptual gap - where
my mental record departs from the smoothly deductive model of reality.</p>
<p>(An odd trap, when deductions - of a sort - lead to speculation that
perceived reality may not follow a deductive model.)</p>
<p>What do I mean by a "deductive model of reality"?</p>
<p>If I cannot find object, search repeatedly in all the locations I
expect, and eventually find the object in plain sight in a place I
looked many times before - I assume by deduction that the object was in
fact there all along, and I somehow missed it. By somewhat-conscious
choice the episode is recorded in my memory as "the object was always
there, and I somehow failed to see it". By choice I reject from recall
an instance of "the object appeared where I had looked before" - as
impossible.</p>
<p>Along the same lines - if you and I have different memories of an event,
I assume that one (or both) of us were mis-remembering, and there was -
by deduction - a single true objective reality of the event.</p>
<p>A good practice in science is to occasionally question (and re-verify)
your assumptions. What could I expect if my speculation about a
"granularity" of reality might be somewhat true? With that question in
mind I now more often tend to mark the mismatch between memory and
"objective reality".</p>
<p><em>An aside</em> - At one point I wondered if the deductive the model of
reality was a learned behavior - and that question suddenly invoked a
faint memory of adopting a <em>choice</em> of interpretation, as a child. Is
the memory real? I do not know.</p>
<p>Again, without any sort of test, there is no reason to treat this
<em>speculation</em> as anything more. To be clear, I most firmly <em>believe</em> in
the deterministic model, and not the speculation. But I also now have
this persistent ghost of a question....</p>
Subversion, CVS, and tags2009-06-17T00:00:00Zhttps://bannister.us/weblog/2009/subversion-cvs-and-tags
<p>In the process of converting a group of programmers to Subversion, I ran
across a surprisingly awkward bit.</p>
<p>As a regular practice, before generating a build to go to customers, I
always carefully review all the changes to the program sources since the
last customer release. Using CVS the command line is simple (run from
the root directory for the component):</p>
<p>cvs diff -t WIDGET_v301</p>
<p>Reviewing the differences helps both to write up a customer-oriented
list of changes, and also helps insure that nothing unintended (say,
left over experiments or debug code) makes it into the customer release.</p>
<p>With Subversion under Eclipse the equivalent comparison is easy - just
select the <strong>trunk</strong> and <strong>tags/v301</strong> and a compare gets the same
result as CVS.</p>
<p>With Subversion on the command line, the equivalent comparison is
ridiculously tedious.</p>
<p>svn diff http://hostname/path/widget/tags/v301</p>
<p>Um, hello? Subversion knows the <strong>http://hostname/path/</strong> part. If I
followed the conventional layout, Subversion can deduce that the current
directory is <strong>trunk</strong> and from that the path to <strong>tags</strong>. Yes, I know
the repository layout (in terms of branches and tags) under Subversion
can be arbitrary (and this is all very cool), but optimizing for the
most-common case is always good.</p>
<p>Figuring that I must have missed something, I went digging, and came up
with this gem:</p>
<blockquote>
<p><a href="http://gcc.gnu.org/ml/gcc/2005-11/msg00136.html">Branko Äibej - Re: svn diff branch woprking copy against
mainline?</a>
This seems to be a common misconception. The important thing to
remember here is that there is no separate namespace for labels and
branches in SVN, and that the layout of the repository is arbitrary.
IOW, the fact that you have branches in /branches is a convention, not
something imposed by the SVN server.</p>
</blockquote>
<p>The writer is almost exactly wrong. There <strong>are</strong> a separate namespaces
in the Subversion repository. The namespaces are established by
convention. The recommended PROJECT/{trunk,tags,branches} can be
recognized by default, and any local variant specified by user-set
properties in Subversion. This is easy.</p>
<p>I expected Subversion to be a nearly uniform improvement over CVS, not
stuck for years on how to cover simple usage.</p>
What makes for "Global Competitiveness"?2009-06-16T00:00:00Zhttps://bannister.us/weblog/2009/what-makes-for-global-competitiveness
<p>Top Countries in Global Competitiveness:
<a href="http://www.businessweek.com/globalbiz/content/oct2008/gb20081022_377709.htm">article</a>,
<a href="http://images.businessweek.com/ss/08/10/1022_competitive_countries/index.htm">slideshow</a></p>
<p>An observation - a number of the small countries with outsize rankings
are noted as having high taxes. So high taxes need not harm - and when
the tax revenues are used effectively, may benefit - competitiveness (at
least as measured by this group).</p>
<p>On a more speculative note, Britain is noted for "sophisticated
financial markets", and also as no longer in the top ten ... and
falling. Is there a correlation?</p>
Video from our local Registrar of Voters2009-05-22T00:00:00Zhttps://bannister.us/weblog/2009/video-from-our-local-registrar-of-voters
<p>In Orange County (California) the process of collecting the vote is
managed by the <a href="http://www.ocvote.com/">Orange County Registrar of
Voters</a>. Only after this latest election (last
Tuesday) did I find that the OCROV has <a href="http://www.youtube.com/user/ocrov">a channel on
YouTube</a></p>
<p>
<object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/bkTxs8XnpH8&hl=en&fs=1" /><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" />
<embed src="http://www.youtube.com/v/bkTxs8XnpH8&hl=en&fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344" />
</object>
</p>
While the above video is only slightly interesting, of note is the guy
in the suit - [Neal
Kelley](http://www.ocvote.com/nealkelleyenglish.htm) - as after he was
appointed Registrar, his department did a noticeably better job. The
organization of supplies and instructions from the OCROV to the polling
sites have improved every year. I give the guy a lot of credit for a job
well done.
Another take on the class system2009-05-20T00:00:00Zhttps://bannister.us/weblog/2009/another-take-on-the-class-system
<p>Reading about the British class system, was surprised at one aspect.
Pretty much anyone who reaches a notable level of achievement can get
knighted. The class system in Britain - across generations - is not
static.</p>
<p>We have an unresolved problem. At the start of life and career, we want
rough equality of opportunity. But ability is not equal. What each
citizen could achieve, and will achieve ... differs. If great
achievement brings great wealth ... I think that is right. For each guy
who added much to society's real wealth, given wealth, the odds are good
that guy will do interesting things with that wealth.</p>
<p>On the other hand, some acquire great wealth without doing anything
particularly constructive. Great wealth acquired but not productively
invested leads to leads to huge instabilities in the economy - as in our
present trouble. There is some sense in having a recognized "class"
system - but only if the averaged result rewards real productivity (in
any various sense).</p>
<p>For a long-term stable and productive society, we do not want vast
unearned wealth passing between generations. There is only a slight
chance the next generations will be as productive the first
wealth-acquiring individual. This suggests that - as a society, and in
the case of great wealth - we must limit the amount of owned wealth that
can be passed between generations.</p>
<p>(Yes, a "death tax" - so colorfully named - makes sense for massive
wealth.)</p>
<p>On the flip side, I do not especially trust government - or any large
organization - to control or direct the economy. Central planning does
not often work. The intelligence of a committee tends to sum up to an
average of the individual participants
... or worse.</p>
<p>So how do you reward those of a different "class" (in terms of real
achievement), tax those of great wealth (and no achievement), while
using the least amount of "government"?</p>
<p>Perhaps the British approach to creating new "peerage" is a clue.</p>
<p>In the usual case, and as our society and economy is currently
organized, we want great tax on great wealth. As currently organized,
only a very small proportion is able to acquire great wealth. Of that
portion that gathers great wealth, only a small portion can put that
wealth to good use.</p>
<p>We need another filter - something that separates passive-rich from the
worthy-rich.</p>
<p>Could we use something like the British peerage system? Those publicly
recognized as exceptional <em>should</em> get a lower (or no) tax rate.
Recognition could come from the government, or from a small number of
entitled organizations. The number of entitlements should be limited,
and some measure put on the organization (<em>including and especially</em>
government agencies) allowed to grant entitlements.</p>
<p>An interesting exercise would be to express this notion in terms of a
series of empirical measures. A healthy sum would include both
individual or group judgment in granting economic privilege.</p>
I am not a Scientist2009-04-22T00:00:00Zhttps://bannister.us/weblog/2009/i-am-not-a-scientist
<p>What is a Scientist?</p>
<p>I have a clear notion. There are two parts. The first part is a pattern
of thought. The second is depth of training in a particular area of
expertise. My college degree is in Physics, but only a four-year degree.
In Physics a four-year degree is only a fraction of the way to
competence, so I am not a Physicist.</p>
<p>There is a pattern of thought essential to a good scientist (or a really
good engineer). Of this I am quite certain. You need to be a good
observer. You need to be a good skeptic. You need to be thoroughly
analytical. This part is easy for me. My father was a good engineer. I
read quite a lot, and before college had learned to be a good,
skeptical, and analytical observer. The aim in college is to teach you
this new mode of thought, and beyond this to transfer some of the wisdom
acquired through experience by your instructors.</p>
<p>Of course, following the usual human tendency, I assumed my peers were
at least as good at this mode of thought as was I.</p>
<p>In college, I did not need to learn a new mode of thought. The time in
college I very much valued, as it seems that the hints from experience
offered by my instructors fully sunk home. Those same lessons became so
deeply embedded in my way of thought that I could not imagine a true
"scientist" applying anything less.</p>
<p>What later I found is that "scientists" very often miss the obvious - or
what I thought should be obvious. The lessons from my college professors
(in Physics - admittedly the "hardest" science), suggest an analytical
path that many scientists do not fully follow. This I have the hardest
time understanding. Could it be that not having to acquire a new mode of
thought meant I absorbed more from my instructors?</p>
<p>I do not know. By my standards, I am not a scientist. But ... I very
often come up with (what seems to me) obvious questions, on reading
about the works of some scientists. Even more surprising - it seems very
often to turn out that my (distinctly amateur) questions lead to
interesting answers. How can that be so often true?</p>
<p>I am not a scientist, but perhaps I am a bit more than an intelligent
layman. Maybe that long-ago acquired mode of thought made more of a
difference than I expect.</p>
kitchen tips2009-04-18T00:00:00Zhttps://bannister.us/weblog/2009/kitchen-tips
<p>If you have no idea (like me) what size KitchenAid mixer is sufficient,
and what size is excessive - I can tell you with certainty that a 300
watt mixer will struggle with a kilogram of wheat flour in pizza dough.</p>
<p>I can also tell you that there is something on the underside of the
mixer that can lacerate your finger, when you wash off the bits of dough
left on the mixer (if mixing a bit too much dough, perhaps).</p>
Maybe Bill Gates was smarter than I thought?2009-04-13T00:00:00Zhttps://bannister.us/weblog/2009/maybe-bill-gates-was-smarter-than-i-thought
<p>My second job out of college was at Burroughs - then the second largest
computer company in the world, and still growing strongly. Interviewing
at Burroughs was fun! I went in at about 9am, and did not emerge until
8pm. In between I got to talk to smart people in many different areas.
Later I heard that I might have set a record for the longest set of
interviews. After talking to so many smart folk, I was completely
convinced that Burroughs was a great choice.</p>
<p>The reality of working at Burroughs in the early 1980's was a bit more
of a mixed bag. There were a lot of smart folk working at Burroughs, in
that time. The company had all the potential needed to do great things.
Yet ... there was something wrong. The company was - for the most part -
not doing great things. The Burroughs of that time had inherited a lot
of loyal customers, and customers were loyal to Burroughs because of
some brilliant work and products done in the past. Somewhere between the
1960's and the 1980's ... something had gone badly wrong with
management.</p>
<p>At the time, I did not have enough experience to know what was wrong, or
even to be certain that anything was wrong (though I did eventually have
suspicions).</p>
<p>I guess the interviews did me some good. I later learned that I'd landed
a position that many folk within Burroughs very much wanted (and this
was my second job out of college!).</p>
<p>Burroughs was a very early OEM partner for Microsoft Windows. I got sent
by Burroughs to a Windows Developer conference in Seattle in 1984.
During a lunch break, Bill Gates sat at our table, and suggested that we
send in resumes to Microsoft. I was rather surprised at this. My
employer had spent money to send me to the developer conference. For me
to jump ship afterward seemed - rather rude. (I was <em>very</em> tempted, but
my then-fiancée did not want to leave southern California. Turns out
that was a very bad judgment on my part - both in the choice of wife,
and in ignoring the opportunity.)</p>
<p>I may have underestimated Bill Gates. I thought his sitting at our table
during lunch - and the offer - was essentially random. On reflection ...
of the tens of thousands of programmers at Burroughs, I was the
representative they sent - a kid just out of college. If I were Bill
Gates and looking for a useful filter - a guy just out of college who
ended up at the Windows Developer conference through the second largest
computer company in the world - that would be about as good as anyone
could get.</p>
<p>The other way of reading this is that when given the perfect
opportunity, you should not trust my judgment. :)</p>
Sun and IBM2009-04-11T00:00:00Zhttps://bannister.us/weblog/2009/sun-and-ibm
<p>I find perplexing the gap between the performance record of Sun
Microsystems, and the published perceptions of professional journalists.
Professional journalists and the stock markets seem to have a low
opinion of Sun, and I find this ... well ... stupid.</p>
<p>Sun started out as a scrappy little company that built kick-ass hardware
and software. The smartest techies loved Sun (for good reason), and
snuck in Sun hardware whenever possible. By the time of the dot-com
boom, enough of those techies had ascended into upper management, and
Sun hardware - in large dollar volumes - came in through the front door.</p>
<p>The systems that Sun sold in the late 1990's were based on the scrappy
(and very cool) systems built by Sun in the 1980's. The per-unit price
tags and total dollar volume in the late 1990's were vastly greater than
the 1980's, but were sold largely on the reputation inherited from those
older systems.</p>
<p>By the late 1990's it was already clear that the big-iron Sparc platform
(like all other big-iron platforms) was ultimately doomed. For the most
part, the future belonged to arrays on mass-market x86 processors. As
usually seems to be the case, the market easily takes a decade to absorb
a change in technology, and match that change with a change of
direction.</p>
<p>The Sun folk had a problem - very similar to the problem that IBM had
with old mainframes. There is a continuing and highly profitable base of
customers that use the old technology. Over time that market will slowly
shrink. At the same time there are new technologies that need to ramp
up, but that if sold to the old customers will not yield the same
profits. Pretty much every company that finds itself in this position
has trouble. Why would you kill your cash cow for a yet-unproven
technology?</p>
<p>By the late 1990's, Sun was
<a href="http://bannister.us/weblog/2004/sun-was-cool/">no longer cool</a>.
Their technology - while good - was no longer especially interesting.</p>
<p>In the last few years, Sun "woke up" and launched a whole array of
interesting new products, all of which look like very good bets for the
future. Sales of the new products are growing strongly - though still
far less than revenue from older products. The revenue from older
products is slowly declining. All very predictable, and - so far as I
can tell - progressing well.</p>
<p>What I do not get is the stock price. Sun's revenues year-to-year are
pretty steady - in fact, short of the current economic mess, they showed
modest growth. Modest growth - when transitioning to new products from a
declining old cash cow - is actually pretty good. Revenues are
reasonably steady, growing, and Sun has a whole menu of new products
with lots of potential. Sun looks very well positioned for future
growth. Yet the stock price is wobbling downward. This makes no sense.</p>
<p>Interesting that you can easily find multi-year stock price data online,
but revenue numbers for the same period are harder to get. (Is there
somewhere with gross revenue numbers for the past 5-10 years?) Might
explain the irrational stock price, in part, if investors are working
off incomplete data. Also interesting are the somewhat recent
investments in Sun.</p>
<p>I am surprised - and somewhat impressed - that Sun's board has kept a
steady course, in the face of the declining stock price. Given a couple
years - time for new products to climb the adoption curve, and time for
the current economic mess to resolve - Sun should do very well in the
market. Presumably when revenue numbers head upwards, the stock price
will (finally) follow.</p>
<p>The recent offer from IBM to acquire Sun makes perfect sense - for IBM.
With Sun, IBM would get a raft of <em>very</em> nice products, for a bargain
price. The only question was if the Sun board had lost their nerve, and
were willing to sell out.</p>
<p>As it turned out - apparently not.</p>
Matrix Revisited2009-04-07T00:00:00Zhttps://bannister.us/weblog/2009/matrix-revisited
<p><a href="http://xkcd.com/566/"><img src="http://imgs.xkcd.com/comics/matrix_revisited.png" alt="unvisited" /></a></p>
<p><a href="http://xkcd.com/566/">xkcd - A Webcomic - Matrix Revisited</a></p>
<p>The first Matrix movie was great. The next two - not so much.</p>
<p>Watching the first Matrix movie - at about midnight, and at the point in
the movie where my suspension-of-belief was greatest, all the lights
went out in the theater. Walked out of the theater, and there were no
lights anywhere. Surreal.</p>
<p>(Wait. The movie <em>was</em> fiction. Right?)</p>
<p>As it turns out, the electric company had to shut off the power to the
entire block, to do repairs. Perfect timing.</p>
Where does "capital" come from?2009-04-06T00:00:00Zhttps://bannister.us/weblog/2009/where-does-capital-come-from
<p>A question for which I do not have an answer....</p>
<p>Where does "capital" come from?</p>
<p>Or more precisely - by portion, and in the present day, where does
"capital" come from? Is the bulk of capital currently hunting for a
place to invest, from:</p>
<ul>
<li>Baby-boomers saving for retirement.</li>
<li>Trust fund kiddies - or more exactly the trusts that support them.</li>
<li>Large institutions looking for a place to park their cash.</li>
<li>Middle-east families, looking for a place to park oil revenues.</li>
<li>Far-east outfits (of late most especially China), looking to park
profits from low wages and high exports.</li>
</ul>
<p>In proportion, I have no notion where the world's "capital" comes from.
This is a pretty important question, and I have no idea as to the
answer, or even if the answer is accessible.</p>
Lifelong learners2009-03-31T00:00:00Zhttps://bannister.us/weblog/2009/lifelong-learners
<blockquote>
<p><a href="http://blog.jonudell.net/2009/03/30/a-conversation-with-andrew-rasiej-about-activating-student-sysadmins-rebooting-america-and-designing-for-abundance/">A conversation with Andrew Rasiej about activating student sysadmins,
rebooting America, and designing for abundance « Jon
Udell</a></p>
<p>2. Be a lifelong learner. And to the extent you can, prefer to work with
other lifelong learners.</p>
<p>There’s a bit of a conundrum here, because lifelong learners arguably
are a resource that really is scarce. I’m still not sure how to think
about that.</p>
</blockquote>
<p>How does success in school relate to lifelong learners? School is in a
sense a passive learning activity. Lifelong learning is not passive.</p>
Rationalization needed...2009-03-30T00:00:00Zhttps://bannister.us/weblog/2009/rationalization-needed
<p>I am sorting through the old computer hardware that was collecting dust
in the corner of my study.</p>
<p>Used to be, hardware would die before it became obsolete. This made it
easy to rationalize the purchase of new hardware. Several years back I
hooked up a UPS between line power and each of my computers. Now I have
another problem. Old computers no longer die (a good thing), rather they
now become obsolete while still perfectly functional (a bad thing -
especially given my tendencies).</p>
<p>Now I have piles of new-looking perfectly functional computer hardware
... for which I have no rational use. 100GB+ drives, DVD readers, 2GHz
CPUs, 0.5GB memories - all perfectly functional, and all not worth
re-using. Clean off the dust, and everything is new and shiny-looking.
Why am I about to throw all this stuff out? Oh.</p>
<p>Doubtless I will keep more than what I will find of future use. (Geez
... I'm throwing out 0.5GB memory sticks! How many programmers sweated
away how many years of work to make their problems fit in smaller
memories - and now I'm junking once-huge chunks of memory?) I waited
years for a graphics card that could drive a 1600x1200 screen at full
color. Now I am throwing out stacks of AGI graphics cards - not because
they are too slow! - rather as there are essentially no new motherboards
that can use the old video cards. (I am not a gamer, so the newer cards
are not especially faster.)</p>
<p>Of the five old computer cases, one is gone (the newer sexy aluminum
case with transparent side panel ... was too noisy). Four are old PC
Power & Cooling steel cases - not sexy or stylish, but perfectly
functional - of which I will keep at most two. Threw out piles of
perfectly functional motherboards, CPUs, memories, and disk - as not
worth re-using.</p>
<p>Wish I could find some rationalization for re-using this old hardware
and software .... but I know there is none.</p>
Windows 2008 Server2009-03-26T00:00:00Zhttps://bannister.us/weblog/2009/windows-2008-server
<p>In testing a new software release, reached the point where testing
against Windows 2008 Server is now a reasonable requirement. Until now,
I'd not had any reason to try out Win2008 Server. Since the (upcoming)
2008 R2 is going to be 64-bit only, created a 64-bit VM (under Sun's
VirtualBox).</p>
<p>Note that the default VM memory size suggested by VirtualBox is 512MB
(where 256MB is recommended for 2003 Server) - and for good reason! At
least during the (usual) install and patch phase, it looks like 512MB is
not enough the keep the VM away from swapping. Have to note - while the
eye-candy is better installing 2008 Server, a Ubuntu server is a lot
less trouble. As a sysadmin installing your third, tenth, or hundredth
server, the eye-candy loses all appeal.</p>
<p>This leads to an interesting question. If Windows 2008 Server is run
directly on the hardware, current server hardware is likely a quad
processor with at least 4GB. On hardware the 2008 Server needs are a
complete non-issue. On the other hand, if 2008 Server is run on a VM
(and at this point I <em>would</em> expect most Windows Server instances to be
VMs), then a 512MB baseline requirement for the VM may be excessive.</p>
<p>This has got to be a pretty problem for Microsoft.</p>
<p>Naturally Microsoft would like to sell the OS installed on the hardware.
Lots of money to be got there. At the same time, smart customers are
more likely to want something else (less compulsive expense) as the base
OS, and push Windows Server instances into VMs. This creates a conflict.
If Windows 2008 Server is too fat to run in a VM, that puts a bit more
pressure on Windows business customers to either stay with Windows 2003
Server (or earlier), or to move off Windows servers entirely.</p>
<p>So ... Microsoft could squeeze more money out of business customers, at
the risk of losing those same customers ... and that loss could prove
permanent. Tricky. I would hate to be the guy at Microsoft making that
call.</p>
<p>No ... that is not right. I'd not have any trouble making that call.
<em>The customer is always right.</em> I would be looking to keep the customers
happy, and making the latest server OS a non-issue. Give customers no
incentive to move off Windows Server. (Which is going to conflict with
the MS folks still wanting lock-in.)</p>
<p>The install and upgrade UI on 2008 Server are a bit more "webby" ... but
it seems the Microsoft folk have not yet entirely got the message. While
a distinct improvement, the 2008 UI still feels a bit dated.</p>
<p>Right. I'm describing an MS product as "dated". You have no idea how odd
that feels. Windows has gone from the extreme cutting edge (as when I
went to a Windows developer conference in 1984), to "dated"?! Very, very
strange ....</p>
Recovery whiplash?2009-03-23T00:00:00Zhttps://bannister.us/weblog/2009/recovery-whiplash
<p>While I do not pretend to be any sort of "financial wizard" (right -
look where those folk got us), there is I think a single common cause
driving our economic roller-coaster. The single cause is a flood of
capital, accumulating at a compounded rate. Capital flooded the
"developed" countries, overflowed, and was enough to set most of the
formerly "third world" populations on a rocketing economic climb. Even
though places like China and India are no where near completely
developed, they are transforming from a sink to a source of capital.</p>
<p>Counting India and China in with the developed countries, we have most
of the world's population.</p>
<p>The only major area outside of the global economic boom seems to be
Africa. The oil-rich countries are not hungry enough to want to
transform. The mid-African countries seem to be too much of a mess.
South Africa is more advanced, but also a mess. Where would the
transformation start?</p>
<p>Seems the real answer is also the logical guess.</p>
<blockquote>
<p><a href="http://www.businessweek.com/magazine/content/09_11/b4123038640646.htm?campaign_id=rss_daily">Manufacturing: The Rise of the Maghreb -
BusinessWeek</a>
As costs rise in Eastern Europe, the company says, it's getting
harder to make a profit. North Africa, by contrast, offers far lower
wages and plenty of eager workers.</p>
</blockquote>
<p>Right. The non-oil-rich corner of Africa closest to developed Europe.</p>
<p>With all that capital sloshing around, our current economic stumble is
emotional, not rational. Nothing <em>real</em> and major happened. California
did not fall into the ocean (I would have noticed). Some investment
gamblers made some bad bets - and that is just about all. Once past the
current fears, all that capital has to go <em>somewhere</em>.</p>
<p>Recent government actions have three notable effects.</p>
<ol>
<li>The massive injection of spending ups the level of economic
activity.</li>
<li>A number of actions are meant to reassure investors.</li>
<li>The federal created-money raises the chance of inflation, forcing
capital off the (now risky) sidelines.</li>
</ol>
<p>The net effect may be a recovery (aside from housing prices) sudden
enough to cause whiplash.</p>
Hater2009-03-22T00:00:00Zhttps://bannister.us/weblog/2009/hater
<p>What do you hate?</p>
<p>No. I do not mean dislike. I mean <em>really hate</em>.</p>
<p>To me, hate seems to require a deeper emotion. I do not like rotten
bananas. They are a bit disgusting. I throw them away. But dislike is
something much less than hate. I do not hate rotten bananas.</p>
<p>My son asked me if I hated George Bush. No, I do not hate George Bush. I
hate what he did to the country. But mainly I just wanted him gone. Bush
(either one) is a symptom, not the cause. The cause ... dunno. Maybe I
hate that. Maybe I just want it to go away.</p>
<p>I tried to think of things that I <em>hate</em>. First to mind - I hate when
forced to do a mediocre job. I really <em>really</em> hate that. This is why I
hate the bogus requirement for @alt and @summary attributes in HTML (to
the non-HTML-techies: nevermind). I know in my work, with others, I have
sometimes proved difficult, for exactly this reason.</p>
<p>What else do I hate? I have prejudices - usually carefully chosen.
Should I these count as hate? I think not.</p>
<p>I have bad knees, that limit what I can do, and I do hate - <em>really
hate</em> that limit. Before and during college I did a lot of long distance
cycling. In high school I ran cross-country. Neither were popular
activities. Both suited my nature. I am ... stubborn? determined? As a
kid I picked the toughest hill I could find, kept attacking
periodically, until my ability was greater than the challenge. As a kid,
when I started reading "adult" library books at ten years old, they were
tough. I had no help or offered encouragement - I just kept at it until
my ability increased. Running cross-country, I always chose the run with
the biggest hill. Cycling, midway through a double century ride, I made
up near all the ground gained by the run-away lead pace group, on a solo
climb from valley to mountain (and loved the climb). A few years back I
was near strong enough to attempt a one day round trip up Mt. Whitney
(yes - of course I would pick the biggest mountain within reach).</p>
<p>I was nearly to ready to attack Whitney, when my knees failed. In the
prior couple years I'd worked my way up to making the 4000-odd-foot hike
up the local peak several times. I was <em>running</em> the steepest uphills of
my local hike ... then my knees failed. For a year I could barely walk.
Hiking the local ~7 mile loop is now limited to one or twice a week.
Not enough to be a challenge. Cycling is limited in the same way. Too
limited to present a challenge, and I lost most of my interest. This I
hate.</p>
<p>What else? Dunno. Hard to come up with real-world examples...</p>
<p>What do you <em>hate</em>?</p>
Apple NetBook? Or not.2009-03-19T00:00:00Zhttps://bannister.us/weblog/2009/apple-netbook-or-not
<p>There are rumors that Apple might soon introduce something like a
NetBook. The entire substance of the rumor appears to be a manufacturer
supplying 10-inch touch-screens for a future Apple product.</p>
<p>A netbook? From Apple? Sounds a bit too "me too". Seems unlikely.</p>
<p>NetBooks are kind of a dubious product category. Running the usual
desktop/laptop applications on a tiny screen is not going to be fun.
Using a NetBook for email and limited web browsing is OK - but that does
not leave room for Apple to be anything clever.</p>
<p>More likely Apple is looking at the success of the Amazon Kindle. This
is a fairly distinct, and useful, product category. Amazon has put in a
fairly substantial infrastructure, to make the Kindle a success. That
same infrastructure could be re-used by Apple.</p>
<p>My take - a book-reader sized Apple product would consist of:</p>
<ul>
<li>A Kindle-sized screen - but in full color.</li>
<li>Access to the same e-books as are used in the Kindle.</li>
<li>The same "free" access to content via cell-phone networks as the
Kindle (though possibly over a different cell-network).</li>
<li>The same ability to play music and video as the current generation
iPods.</li>
<li><strong>Likely</strong> a built-in version of iTunes, with content-delivery over
the same cell-network (or wi-fi), trimmed to fit the small screen,
and extended to acquire/manage e-books.</li>
<li><strong>No</strong> ability to place/receive phone calls (at least in the first
iteration).</li>
<li><strong>No</strong> ability to browse the web. (Or only as an added-cost service,
which may not be in the first iteration.)</li>
<li><em>Might</em> have some ability to use email - but I'd not bet on this.
(Again, more likely as a later, cost-added service.)</li>
</ul>
<p>Apple does not have a viable contender in the e-Book reader product
space. In some ways this could be viewed as a natural extension of the
the iPod, using iPhone hardware, taking advantage of the Amazon
Kindle-supporting services, roughly the same product "shape" as the
iPod, and extended for e-books.</p>
<p>My guess, in any case. :)</p>
My sister and spam2009-03-18T00:00:00Zhttps://bannister.us/weblog/2009/my-sister-and-spam
<p>My personal email address is <a href="mailto:preston@bannister.us">preston@bannister.us</a> and is posted in
public in <em>many</em> places. As a result, a <strong>lot</strong> of spam gets sent my
way. (I do not believe in hiding.) Of all that very little gets through
to my inbox.</p>
<p>My email setup is a little different. All the email sent to
<strong>preston@bannister.us</strong> goes through a mail server operated by
Dreamhost, and the spam filter they use is pretty good. I read my email
via GMail, so all the email sent to <strong>preston@bannister.us</strong> (after
filtering out most of the spam) gets bounced to GMail. The Google folks
did a pretty good job with their spam filter. As a result, of the spam
that gets past the Dreamhost email filter, almost all is caught by the
GMail spam filter. I usually see about one spam per day (that gets
through both Dreamhost and GMail spam filters). Occasionally the
spammers figure out how to get through the spam filters, and there is a
short-lived surge. Lately I have seen up to three spams per day.
Eventually one of the filters gets a little smarter, and the number of
spams that get through drop to the previous levels.</p>
<p>My current setup works rather well, so I set up my sons, my daughter, my
father, and my sisters the same.</p>
<p>Today my sister comes over, and tells me she changed her GMail address.
She changed her GMail address because she was getting too much spam.
This did not make sense. She has the same setup as I (spam filtering at
both Dreamhost and GMail). My email address is <strong>very</strong> public, and hers
is not. She should get no more - and likely less - spam than I see.</p>
<p>So I logged into her GMail account, in the expectation that - for some
reason - a great deal of spam was getting through to her inbox. That was
<strong>not</strong> it. Apparently she feels a compulsive need to read through her
"spam" folder. (To be fair - I suspect my father does the same thing -
it is a bit of a family tendency.) Also, she was wanted to check the
spam folder on the @bannister.us server (just to be sure ... I guess).</p>
<p>Right. You basically have two choices. Either do not use email - at
all - or do not look in your "spam" folders.</p>
<p>This I cannot help her with....</p>
Class nightmares2009-03-17T00:00:00Zhttps://bannister.us/weblog/2009/xkcd-a-webcomic-students
<p><img src="http://imgs.xkcd.com/comics/students.png" alt="mares" /></p>
<p><a href="http://xkcd.com/557/">xkcd - A Webcomic - Students</a></p>
<p>Yep - <em>still</em> have those dreams.</p>
Newspapers = obsolete2009-03-16T00:00:00Zhttps://bannister.us/weblog/2009/newspapers-obsolete
<p>File this under "completely clueless".</p>
<blockquote>
<p><a href="http://www.ordinary-gentlemen.com/2009/03/the-web-has-a-lot-less-to-teach-the-print-media-than-you-think/">the Web has a lot less to teach the print media than you think | The
League of Ordinary
Gentlemen</a></p>
<p>Shirky points out, as many have, that the real collapse of the
financial model of newspapers came from the widespread availability of
free classified ads. Which is true. But like many, he talks as if it
matter of factly the case that Craigslist et al. are significantly
profitable. That’s not actually certain, as best I can gather, and
Craigslist plays it very close to the vest with its profit numbers.
<strong>I certainly don’t think Craigslist and its competitors are making
close to the aggregate amount of profit the nation’s newspapers did
with their classified sections in boom times.</strong> So I can’t understand
lauding the brilliance of Craigslist when they have in essense taken
an established business model and rendered its profitability a tiny
fraction of what it once was.</p>
</blockquote>
<p>(The emphasis is mine.)</p>
<p>Boy does this guy ever have things backwards! The fact that Craigslist
does not make the same profit as did newspapers is pretty much
irrelevant. What is relevant is the service offered to customers.
Craigslist offers a <em>better</em> service - to both buyers and sellers - at a
lower cost. Classified ads in newspapers are expensive to buy, and
tedious to use - and are simply not competitive.</p>
<p>Customers do not exist to serve newspapers. Newspapers exist to serve
customers. For most customers, newspapers are no longer competitive.</p>
<p>Newspapers provided two services to customers. First, they offered
collection and reporting of news. Second, they offered advertising, some
of which might be interesting to the reader. Newspapers are in trouble
now due to losing a large part of the advertising revenue, The loss of
revenue is due to more efficient competitors (like Craigslist). For
newspapers other main service - collection and reporting of news - the
web already offers a better and more efficient alternative in RSS feeds
and feed readers (like Google Reader). Feed readers are still on the
early part of the adoption curve - lots of folk do not use then yet.
Eventually the general population will realize that newspapers are not
the best source of news.</p>
<p>With the web providing better and more efficient services, that leaves
very few customers for newspapers.</p>
<p>Its the future. Get used to it.</p>
Better living through chemistry2009-03-15T00:00:00Zhttps://bannister.us/weblog/2009/better-living-through-chemistry
<p>From the start, I want to offend and repel most who might read this
based on the title. If you are amused by chemicals that fuck your mind,
go away. I am not interested in that case.</p>
<p>Are you curious about hacking the human mental engine? Aside from
folklore, what do we know? Are there constructive chemical means to hack
the mental engine? I do not know, but it seems likely. Whether anyone in
the present has a substantial clue as to how this might be done - as yet
I have not seen anything useful. Lots of folklore on this topic, but not
so much fact.</p>
<p>Just to set the measure, I grew up in the 1960's and 1970's. I had good
friends in high school who could have got me almost anything I wanted
(of the not-legal drug nature), of which I did not make any use. I
consumed quite a lot of alcohol in university, then stopped for no
obvious reason. The effect of alcohol was only slightly interesting.</p>
<p>Fast-forward to the near-present, and reading of a programmer who worked
mostly-intoxicated on Marijuana. Is it possible that this individual was
more productive when affected by chemicals absorbed when ingesting
Marijuana? Given that the nature of the human cognition engine is mostly
unknown, this is at least possible. Also very possible is that the user
might be distracted by the immediate pleasant effects, and not
necessarily more productive.</p>
<p>Certainly there were times loaded up on cold medicines when I was
unusually focused and productive. Also times when the same(?) stuff
seemed to have the opposite effect. No idea why the difference.
Sometimes coffee seems to help. Sometimes (maybe after too much coffee)
a glass of wine seems to help.</p>
<p>What works?</p>
Trusting trust2009-03-09T00:00:00Zhttps://bannister.us/weblog/2009/trusting-trust
<p>The curious bit about "security" as a discipline, is that at root you
need to know who to trust, and when. Corporate security is critically
dependant on the abilities of a small number of well-intentioned
employees. Personal security is dependent on choosing which large
entities you choose to trust (and to what extent). National security is
dependant on the degree of trust assumed for various large groups of
individuals - not all of which are as well-known as circumstance
demands.</p>
<p>Any of the above is easy to get wrong.</p>
<p>The key metric missing in most discussions is - <strong>trust</strong>. Whom do you
trust, and to what extent? Do the systems you use (hardware and
software) accurately reflect the exact extent of that trust?</p>
Subcutaneous fat, and global resurgance2009-03-09T00:00:00Zhttps://bannister.us/weblog/2009/subcutaneous-fat-and-global-resurgance
<p>Watching an episode of Anthony Bourdain's mis-adventures - this time in
Vietnam - and what strikes me as most meaningful is the presence of
subcutaneous fat. This single observation, even amid the current
economic mess, makes me oddly hopeful. Vietnam - as an after-effect of
the American war there - suffered a measure of neglect. In spite of that
neglect, with the current and continuing global surplus of capital,
Vietnam is resurging. The folk presenting Vietnam to Anthony look more a
member of the current well-fed global generation, at least more than I
expected.</p>
<p>If the global economic surplus of productivity is enough to lift
once-abused places like Vietnam, it seems like we could solve almost any
problem.</p>
My Google Android phone2009-03-09T00:00:00Zhttps://bannister.us/weblog/2009/my-google-android-phone
<p>A progress report of sorts....</p>
<p>Back in December I got a
<a href="https://bannister.us/weblog/2008/gps-in-an-android-phone">Google Android phone</a> -
specifically a T-Mobile G1 phone. I happened to walk into the local
T-Mobile store just out of curiosity. They had the phone in-stock and
for a good price - and I was thoroughly disgusted with my Motorola Razor
from Verizon. The fact that this was the first phone where I could
freely (almost) install software was a clincher.</p>
<p><a href="http://flickr.com/photos/dreadedhill/3272663630/"><img src="http://farm4.static.flickr.com/3464/3272663630_ea6389614f.jpg?v=0" alt="untitled" /></a></p>
<p>Compared to every phone I have used prior, the <strong>G1</strong> is without doubt a
solid improvement. The effect of the unified IM/text/email notifications
is distinctly Pavlovian - my phone blurps, and I check GMail on my
computer. At the same time, there are bits about the Android phone that
are not ideal. The touch-selection algorithm needs work. I am never
certain whether my touch will cause selection, activation, dragging, or
.... I dunno. As a guess, it does what I wanted a bit less than half the
time.</p>
<p>The GPS/location feature is very cool - except when it decides I am
somewhere else. Again, an algorithm that needs work.</p>
<p>I have fat-fingered the phone and invoked the wrong actions when
answering a call ... less often than with the Razor, but still too
often. Again, something that needs work.</p>
<p>Overall, I am distinctly encouraged. More work is needed, but this seems
the best work as yet.</p>
Almost time for a new camera?2009-03-09T00:00:00Zhttps://bannister.us/weblog/2009/also-time-for-a-new-camera
<p>Been using the
<a href="http://bannister.us/weblog/2005/the-nearly-perfect-camera/">same two digital cameras</a>
for a bit over four years. The cameras I have work pretty well, and - so
far at least - none of the newer cameras is yet enough of an improvement
to justify an upgrade.</p>
<p>What I am looking for that I do not have now...</p>
<ul>
<li><strong>MUCH</strong> better low-light performance! Pictures taken in twilight
are generally poor - so cameras that produce grainy high-ISO images
are non-starters.</li>
<li>A total package size no bigger than my Canon S2 - and preferably
<strong>smaller</strong>. Heck, I often take my smaller Sony over the more
capable Canon. Size matters, and smaller is better. (As you might
guess, I refuse to lug around a "pro" SLR. Adding a camera bag full
of lenses? Never going to happen!)</li>
<li>The ability to record continuous video at 1080p resolution.
Actually, this is optional, but looks like it may become common by
the time really good low-light performance finally arrives.</li>
</ul>
<p>Up until recently, I have not been tempted to upgrade. From the
most-recent camera reviews ... looks as though an upgrade worth buying
is <em>almost</em> here.</p>
Sound troubles on Ubuntu 8.102009-03-08T00:00:00Zhttps://bannister.us/weblog/2009/sound-troubles-on-ubuntu-810
<p>Count this article as a bookmark, so I can find the relevant links, the
next time I have a sound problem.</p>
<p>I have a recurring problem with sound on Ubuntu 8.10. On my desktop
sound almost always stops working after a few hours (or sooner). On my
laptop sound is less trouble, but still occasionally does stop working.</p>
<p>Also the volume on the my laptop was far too low. Found by opening the
volume control applet and running all the sliders up to the max, I could
get the volume to a decent level. One problem solved - after a fashion.
Clearly there is an issue if the master volume control is defeated by a
non-obvious secondary setting.</p>
<p>Lots of folks are having trouble with sound on Ubuntu, but a fair number
are due to configuration issues. Wading through far too many notes, I
found something that works:</p>
<blockquote>
<p><a href="http://ubuntuforums.org/showthread.php?t=1028259">Re: no sound on Ubuntu
8,10</a>
try to restart alsa</p>
<p>sudo /etc/init.d/alsa-utils stop
sudo alsa force-reload
sudo /etc/init.d/alsa-utils start</p>
</blockquote>
<p>Yep, that worked. Had to manually kill <strong>rhythmbox</strong> (which was playing
music when sound died), and had to re-start the volume control applet.
Bit crude.</p>
<p>Seems the base problems are <a href="http://drowninginbugs.blogspot.com/2009/02/pulseaudio.html">more-or-less well
known</a>. Also
seems at least one guy came up with <a href="http://ubuntuforums.org/showthread.php?t=205449">instructions for diagnosing audio
problems</a> (though more
for no-sound-ever problems). The
<a href="http://www.pulseaudio.org/">PulseAudio</a> software seems to be at the
heart of the problem.</p>
Sanity check - too much talk over too little - in html@w3c2009-03-05T00:00:00Zhttps://bannister.us/weblog/2009/sanity-check-too-much-talk-over-too-little-in-htmlw3c
<p>Asked GMail to search my email for: <em>w3c "summary attribute"</em>
I count 534 messages.</p>
<p>Asked GMail to search my email for: <em>w3c "alt attribute"</em>
I count 1769 messages.</p>
<p>If the result was brilliant, the counts would be worthwhile.
I do not think brilliant results can come out of those discussions.</p>
Are designers stuck in a rut?2009-03-03T00:00:00Zhttps://bannister.us/weblog/2009/are-designers-stuck-in-a-rut
<p>Looking for an update on CSS-based web design, so took a look at
<a href="http://www.cssreboot.com/">CSS Reboot</a> and
<a href="http://www.csszengarden.com/">css Zen Garden</a>. What you mainly find are layouts
tall, skinny, and top-heavy with large headers. User's screens - with
growing use of "widescreen" panels - are becoming mainly very wide, but
not very tall. As a result, most of those clever examples fit very
poorly on most user's screens. On many current screens, about the only
thing showing is the designer's beautiful and clever graphics
(surrounded by acres of empty horizontal space). This may make the web
designer happy, but the user will be less happy with the scarce scrap of
content visible (if visible at all) at the bottom of the screen, and
less happy with the amount of scrolling needed for a viewing a tall
skinny column.</p>
<p>When low-end laptops ship with 1280x800 panels, large headers above
tall/skinny content seem a <em>very</em> poor design. Designs that suit
<a href="https://bannister.us/weblog/2008/design-for-standard-screen-sizes">common screen sizes</a>
seem a little scarce.</p>
<p>Was hoping for inspiration, but left the above-mentioned CSS example
sites feeling <em>very</em> uninspired.</p>
Professional Journalism is Evil2009-03-02T00:00:00Zhttps://bannister.us/weblog/2009/professional-journalism-is-evil
<p>Some folk worry about the impact of the web on print publications.
Newspapers and magazines are dying, and readers shifting to the web are
to blame. Professors of Journalism complain that amateurs on the web are
displacing well-educated professional journalists. I also was a little
concerned, as I too had in my mind the notion of a professional
journalist as a thoughtful and well-expressed writer.</p>
<p>That notion is wrong, and always was wrong.</p>
<p>I no longer subscribe to newspapers or magazines. Twenty years ago I
received and read easily a dozen or more periodicals every month. Now I
only occasionally read articles from those sources - sometimes when
browsing on the web, but mainly when sent copies in email from friends.
Those emailed articles are mainly from Newsweek, the New York Times, the
Washington Post, and the Wall Street Journal - in theory the best of
professional journalism.</p>
<p>After a while I started to notice a couple of patterns.</p>
<p>The first pattern was the journalist "making a name for himself". Some
journalists are mentioned by name on the magazine cover. Clearly the
publication knows that the name of the writer is somehow more important
than the topic. Clearly becoming a "name" is beneficial to the career of
a "professional journalist". Also clearly to become a name the writer's
articles must be accessible and attract attention. Note that popularity
is more important than reason, for this pattern of behavior.</p>
<p>The second pattern was new articles that were no more than a rehash of
older articles. Often the sum of such articles made no sense.
Professional journalists have a problem - they have to write to a
schedule. What can you write when you have nothing new or meaningful to
say? What you can do is take a current event, throw in a couple of
clichés, and you have an article easily digestible by readers. Note
there is no need for the article to make sense.</p>
<p>Found a recent example in the Washington Post: <a href="http://www.washingtonpost.com/wp-dyn/content/article/2009/01/25/AR2009012501772.html?referrer=emailarticle">Three Crises In
One</a>.
From the article:</p>
<blockquote>
<p>First: the collapse of consumer spending. American consumers represent
70 percent of the economy.</p>
</blockquote>
<p>Also:</p>
<blockquote>
<p>As Americans save more of their incomes, Asians should save less and
spend more, so that they rely more on producing for themselves rather
than exporting to us.</p>
</blockquote>
<p>Clearly the math does not work. If American consumers save more, than
means less consumer spending. If consumer spending is the largest part
of the economy, how does spending less help the economy? This article is
a rehash of a current event (the weakening economy) combined with a
usual notion (that Americans spend too much and save too little). In
combination, the article makes no sense. Unless American consumers get
paid more, you cannot make the equation work (remember Henry Ford?), but
the journalist completely fails to make that connection.</p>
<p>The end result of our system of professional journalism is a steady
stream of meaningless articles on current topics rehashing popular
notions. There might be a few gems amid the stream of mostly garbage,
but this is by no means certain. The habits and skills essential to a
"professional journalist" are more likely to harm than benefit society.
Taken as a whole, and in its most common form -</p>
<p><em>Professional journalism is evil</em>.</p>
Can a modern country have a monarch?2009-02-28T00:00:00Zhttps://bannister.us/weblog/2009/can-a-modern-country-have-a-monarch
<p><a href="http://www.youtube.com/watch?v=z7fMsvsZe_c"><img src="https://bannister.us/weblog/images/screenshot.png" alt="untitled" /></a></p>
<p>Can a modern country have a monarch? As an American I am inclined to
think the entire notion absurd, and quaint. On the other hand, from my
slowly accumulating readings and reflections on state and society -
there is a place for exceptional individuals in the state. The founders
of this country carefully divided governance among individuals
(presidents, governors, mayors) and groups (congress, assemblies,
councils). Absolute monarchs were almost always a flawed notion - but
carefully trained families with a significant but carefully
circumscribed role - there might be a workable, useful solution.</p>
<p>From watching the above video - I suspect the Swedes may have something
right. I do not understand a single word of Swedish, but there are other
aspects to communication aside from language. Somehow I suspect the guy
may be entirely decent, and well worth his position.</p>
<p>To put this in context - I saw in person a local guy running for Sheriff
of our county several years back. He spoke well, but at the end I found
I <a href="http://bannister.us/weblog/index.php?s=carona">did not trust the man</a>.
He did get elected,
but was eventually removed from office and accused of corruption. If you
are a good judge of character (whatever that means), perhaps simply
seeing - in person - someone speak, reveals <em>enough</em> clues to their true
nature.</p>
<p>Anachronism or not, I have a sneaking suspicion the Swedes got this
right. (That this apparently-official communication appears on a popular
video-sharing service on the web, is also an encouraging clue.)</p>
<p>Got here following a <a href="http://flickr.com/photos/sexyswedishbabe/3306598671/">bit of humor</a>.</p>
Absent minded2009-02-28T00:00:00Zhttps://bannister.us/weblog/2009/absent-minded
<p>In the kitchen this morning, to make breakfast. Had a small amount of
diced salami and bacon (both very nice) left over from dinner last
night. Simple to fold that into an omelet. Started gathering and
preparing the needed bits.</p>
<p>In the kitchen, my mind is always wandering. Reflecting on a book I am
reading. Perhaps musing about a bit of obscurity from the prior days.
Puzzling out a current problem (which covers the prior two, also). As a
result I tend to be a bit absent-minded. This morning - after opening
the refrigerator for the third time, each time at a loss what to do once
the door was open - thought it good to be unwatched. Turned back to the
counter, where everything was prepared, except for the missing eggs.</p>
<p>The dog was watching, alert and polite. I have no doubt as to his
interest, but little idea as to his thoughts.</p>
Guess I'm a little slow...2009-02-23T00:00:00Zhttps://bannister.us/weblog/2009/guess-im-a-little-slow
<p>Self-judgment is always tricky. Some bits took me a <strong>long</strong> time to
figure out.</p>
<p>Whenever I go into a new situation, I expect to find someone much
smarter. It never seems to work out that way. Often I find folk
as-smart, but never (yet) anyone I thought clearly smarter. (Worse, I
tend to over-estimate the abilities of folk I know.)</p>
<p>Yet my expectation persists.</p>
<p>I have had some occasional odd interactions with folk in the past, that
I did not understand at the time. Easy to forget that other folk have
insecurities of their own. Years after one episode, I figured out the
most likely and unexpected explanation.</p>
<p>My career-path meant I got heavy exposure to client-server programming
very early. I tend to think through the issues fairly throughly (perhaps
I have an odd notion of "fun"), when presented with an interesting
problem. A decade later, I started at a company that had a client-server
product. The product had clearly got some of the
<a href="http://bannister.us/weblog/2009/elegant-distributed-applications/">principles</a>
I had <a href="http://bannister.us/weblog/2009/long-term-compatible-protocols/">arrived
at</a>,
badly wrong. After starting at Quest, and seeing the current-generation
product, I heard there was a guy working on the next-generation of that
same product. So I went to the guy and outlined all the things I thought
he should do for the next generation product. On one point he said
something like "we thought about doing that, but it was too hard", for
which my answer was "we did that on my last project, and it worked out
very well". I think the guy's name was Jeremy.</p>
<p>I was just trying to be helpful.</p>
<p>What I did not know at the time was that what I had seen demonstrated
was in fact the <em>next-generation</em> product, the result of two years of
Jeremy's work. So instead of criticizing the old generation to offer
advice for the new generation ... it must have sounded to Jeremy like
this new guy was tearing apart his best work. The product was called
"Vista".</p>
<p>Then things got much worse.</p>
<p>Not many folk are intimately familiar with both Windows and Unix
programming. Vista was a Unix-only product. Most folk in that outfit
were Unix-only. Since I knew both platforms, I got tasked with porting
Vista to Windows. Another guy - a long-term hand at the company - was
tasked to work with me. The other guy - John? - I knew and liked. He was
pretty sharp, but had other obligations. After a few weeks he bowed out,
claiming that he was only going to slow me down.</p>
<p>I am a sucker for challenging problems - and always have been.</p>
<p>There were about a half-dozen programmers working on the Vista product.
I had to keep up with their changes, while building a port to Windows,
against an ever-diverging source-base. After six months of <em>very</em>
intense work, I had a dual port. The same source base could be compiled
to generate either a Windows or Unix version of the product. To keep up
the necessary pace, I had isolated myself from most of the daily
workings of the group. Along the way I found some perfectly astonishing
bad code. I had assumed that programmers with equivalent levels of
experience, but who had spent their entire careers doing only Unix
programming, would be far better than I in that domain. Working through
the Vista source code, I found out that I was wrong - and very badly
wrong. Since I was under huge time pressure, I took an extremely
pragmatic approach. When I found a malfunctioning section of code, I
first tried to read through the code. If I was unclear what the code was
meant to do, I re-wrote the section of code for clarity. At this point I
usually realized the original code contained a number of errors.
Code-level errors do not necessarily translate to customer-level errors,
and the pressure on my time was enormous, so I made no effort to report
my findings.</p>
<p>When I had finished, the group cut-over to using my source-base. They
were a bit surprised to find that I had kept current with all their
changes. (I had a secret weapon. They were using RCS-based source code
control. I used CVS to track their changes.) What was worse was that I
had almost-accidentally killed off a large part of their bug list. The
code inspection and re-coding for clarity was just to make the port
work, but had the side-effect of eliminating a lot of existing bugs. By
this time Jeremy had been made manager for the group, and he called me
in and yelled(!) at me, while admitting this. I was confused.</p>
<p>What I did not realize - until years later - is how this looked from
Jeremy's point of view.</p>
<p>Imagine a new guy at your company walks into your office, and details
all the things wrong with the project you have worked on for the past
two years. Imagine he claims to have done something you thought was too
hard to do. Now imagine that the new guy is tasked with something you
cannot do. You expect him to fail (and I know he did). Instead of
failing he delivers a result that not only works, but is much improved
over your best work.</p>
<p>Did I mention that Jeremy was made manager for the Vista group, and that
I reported to him?</p>
<p>Midway through the project, I realized each client instance of the
server in the Unix implementation of the Vista server was started via
<strong>inetd</strong>. Since the Vista server-side incorporated Ghostscript, and the
Ghostscript initialization took 20-30 seconds (loading a large amount of
font information, mainly), this put a serious crimp in per-client
startup time, and a pretty serious load on the server when there was a
lot of clients. Since the Ghostscript initialization was the same for
all clients, if the Vista server was run as a server, the per-client
startup could be reduced to milliseconds, and the total load placed on
the server hugely reduced. I went to Jeremy to explain how this could be
done. He <em>angrily</em> rejected my suggestion, for no logical reason that I
could discern. I was puzzled, but went back to the all-consuming task of
completing the port.</p>
<p>Imagine that annoying new-guy offers a suggestion (which he has already
implemented and demonstrated) that improves the startup time of your pet
project by a few-thousandfold. At this point Jeremy <em>really</em> did not
like me, and I had no clue as to why.</p>
<p>Naturally I had taken the same approach with the Windows port, so the
per-client startup time was almost instantaneous.</p>
<p>After finishing the Vista port (to the great pleasure of the Marketing
folk, who could now sell Vista into the Windows market), I got tasked
with another port. I had a conversation with a distinctly grumpy Jeremy,
who had to admit that the Vista port worked, and since I was apparently
some sort of legend (not to my knowledge), I was tasked to port another
product.</p>
<p>The next product was called "Shareplex", and was a database replication
product for Oracle databases.</p>
<p>I had used Oracle as a programmer/user a fair amount while at FileNet,
so I was pretty familiar with Oracle at a user-level. Knowledge of
Oracle at the reversed-engineering level needed for third-party database
replication was entirely outside what I knew. Moreover the guy in charge
of the group had written a book on Oracle performance tuning, so I felt
entirely out-classed on both fronts.</p>
<p>Again, I was one guy trying to keep up with an active development group
of about a half-dozen, while performing a port from Unix to Windows. It
quickly became plain that I could not perform testing in the same
labor-intensive manner as the existing group. (It also struck me as odd
that there were no comprehensive test suites for a potentially
mission-critical product.) So I came up with a series of Perl scripts to
perform a series of automated tests against the database-replication
product. The tests created, exercised, and destroyed a series of
progressive, then semi-random, series of structures, data, and
operations.</p>
<p>At the end of the port - another six months of very intense work - I had
another dual-port. The same sources could be compiled for either Windows
or Unix. The tests I had built proved that the port worked just as well
as the original Unix code - and also proved that the original code did
not work.</p>
<p>I was stunned. I had no idea how to proceed from that point.</p>
<p>What I did not realize at the time was that I had given two important
group managers reason to hate me. A few weeks later, Charles - the
Shareplex group manager - escorted me to a meeting, where I was fired.</p>
<p>Much later, I learned that the Shareplex product was withdrawn from the
market, and took another 2-3 years of rewrites before it became a
marketable product. The conclusions I derived from my tests were right,
but I did not, at the time, know what to do with the information.</p>
<p>Without knowing, I had intimidated co-workers, by doing things that they
could not.</p>
<p>This morning I made a different connection along the same lines....</p>
<p>When I worked at FileNet, the company hired in a new graduate from
CalTech. Management treated him as if he was a living legend. Dan was a
fairly smart guy, but I kind of doubted his ability to walk on water.
Fairly early on, he did a performance analysis in the area in which I
was working, and made a couple fairly elementary mistakes (for a
first-year Physics student), and circulated some bogus results. I sent
out a correction, but did nothing else.</p>
<p>What I did not take into account was his likely insecurity as a guy
promoted well past his peers. Any sort of criticism was likely seen as a
serious threat.</p>
<p>Fast-forward a bit over a decade. A marketing guy at my then-current
employer wants to go talk to the folk at FileNet. I don't see a likely
gain to the exercise, but went along to support the marketing guy. We
end up waiting in the entrance lobby for an oddly long time. Dan walks
through the lobby. Dan claims not to know me, with a hint of anger. Odd.
To put this in context - the lobby is not on a natural path between any
two points within the building (I used to work there). That Dan would
walk through the lobby at the time I was there was ... odd. That Dan
would not remember me (we worked together for about seven years), is ...
odd.</p>
<p>Since the episode was of no importance, the odd bit stuck, but was
otherwise forgotten. In retrospect, if I had indeed made Dan feel
threatened, then the combination of oddities add up to a probability. Is
it possible I had made Dan feel threatened? Is it possible that we were
made to wait until Dan could walk through the lobby? At some point Dan
was promoted to CTO. Was the odd delay, odd diversion, and odd lack of
recognition ... not odd at all?</p>
<p>This morning's amusement - of no further import. :)</p>
<p>Now ... I could be wrong about any of the above. On the other hand, even
if right, it seems unlikely that anyone involved would confirm anything.
Oh well.</p>
How to get started?2009-02-22T00:00:00Zhttps://bannister.us/weblog/2009/how-to-get-started
<p>This is simple programming problem. Tune out if this is not your thing.</p>
<p>Started writing a simple <strong>cxi</strong> (for CGI-like Xml Interchange, perhaps)
program as suggested in a
<a href="https://bannister.us/weblog/2009/scripting-inspired-by-monad-for-unix">prior scripting-oriented article</a>.
Pretty straight-forward coding (with some added clever notions that
occurred to me later), right up until I got stuck on how to get the
child command started.</p>
<p>Commands to be run by <strong>cxi</strong> fall into two main groups.</p>
<ul>
<li><em>Generators</em> - commands that generate output, without reading input.</li>
<li><em>Filters</em> - commands that read input and generate output.</li>
</ul>
<p>Filters are the easier case.</p>
<ol>
<li>Read environment for HTTP_ACCEPT.</li>
<li>Read the input for headers.</li>
<li>Read the command line for options.</li>
<li>Based on the last found, select the command to run, and set
HTTP_ACCEPT for the child process.</li>
</ol>
<p>Note that the input must be scanned for headers <strong>before</strong> the child
process can be started. Generators are tricky. We cannot read the input
for headers (since there is no input), as this would block, and the
child process would never get started. We could require pre-knowledge to
distinguish generators from filters (a sort of database of command
metadata), but this strikes me as inelegant. Traditionally in Unix there
is no way to distinguish between commands that are filters and
generators. Any given command could be either.</p>
<p>Need a simple convention to mark a generator. I'm inclined to conflate
two needs and address with single solution. At the start of a pipeline
of <strong>cxi</strong> commands, you need to establish the desired intermediate data
type, as well as indicate that the command is a generator. Since this a
usual case, the presence of a command option could indicate both. So a
pipeline of <strong>cxi</strong> commands would look like:</p>
<p>cxi -t xml ps | cxi foo | cxi bar</p>
<p>In the less-usual case, where the initial command is a filter, and
addition option could override and force filter-behavior:</p>
<p>cxi -t xml -f ps | cxi foo | cxi bar</p>
<p>In the less-usual case, where the type is indicated in the environment,
then another option to indicate the generator:</p>
<p>export HTTP_ACCEPT=text/xml
cxi -g ps | cxi foo | cxi bar
cxi -g ps | cxi foo | cxi bar</p>
<p>Can't think of anything more elegant, so will go with the above.</p>
<p>As a slightly amusing sidelight - turns out the GNU <strong>getopt</strong> is too
smart for my purposes, and I will have to use an older "dumber"
implementation of getopt. The GNU implementation will pick out options
anywhere in the command line, and I want it to stop at the first
non-option argument.</p>
Making pizza2009-02-17T00:00:00Zhttps://bannister.us/weblog/2009/making-pizza
<p>Cooking is a sort of minor hobby. Started back in high school. On one
hand my mother was an indifferent cook, so I quickly learned to do
better. On the other hand participation in Track and Cross Country meant
I had an enormous metabolism. Learned how to make cookies, breads, and
large quantities of absolutely perfect brown rice. Once, as a school
exercise, figured I was consuming 11,000 calories every day (while
weighing less than 130 pounds).</p>
<p>Over the years I have occasionally experimented with different sorts of
cooking. I like to experiment! What that means is that I try a lot of
things that do not turn out - at first - but after a while I come up
with extraordinary results, for whatever is my current interest.</p>
<p>My kids have learned to both value and distrust my cooking. :)</p>
<p>My kids are almost always interested in whatever I make (even when I try
to scare them away). First, they sample (cautiously), then (if the
result is good) they steal as much as they can eat. This strategy makes
sense, as early experiments are often not very good, but later
experiments are <strong>very</strong> good.</p>
<p>One of my favorite examples:</p>
<p>My teenage son walked in. He had just eaten at a fast-food joint. "I am
<em>so full</em>, but the broccoli smells <em>so good!</em>" (Then he stole some of my
freshly cooked broccoli.) How often do teenagers stuffed with hamburgers
eat broccoli - of their own choice? :)</p>
<p>I like to experiment! That means I might use a recipe as a starting
point, but - once I've learned what works - never use recipes, and never
use exactly the same combination of ingredients. At first the results
are uneven, but eventually I get good (or better!) results pretty much
every time.</p>
<p>My latest cooking puzzle was pizza. I am allergic to tomatoes, onions,
and garlic. That pretty much rules out all your usual recipes for pizza.
Coming up with a feasible equivalent to the usual sorts of pizza sauce
was a bit of a puzzle. (You can order a pizza w/o tomato-based sauce at
many pizza joints, but the results are usually uninspiring.) Was
watching a cooking show, when a bit of inspiration hit! Tomato sauce is
sweet (somewhat), tangy, and (on pizzas) spiced. To make a somewhat
sweet, tangy, spicy sauce - used unsweetened apple sauce, with lemon
juice, paprika, peppers, and salt - and it worked! (The mass of cheese
needs sauce as a sort of balance, so the "right" sauce is important.)
First session making pizza, some things worked, some did not. Second
session, some did not work, and some did (different than the first).
Third session ... pretty much everything worked, and <em>really</em> good
pizza.</p>
<p>With any luck, the fourth session will take me into the <em>profoundly
evil</em> category.</p>
<p>Already bought the ingredients. :)</p>
Disposable appliances2009-02-17T00:00:00Zhttps://bannister.us/weblog/2009/disposable-appliances
<p>When I was growing up my parents were usually a bit short of money. Much
of what we bought was second hand. Some things we made instead of
buying. Often things that broke were repaired rather than replaced. That
history means I tend to buy things that I expect to last, and tend to
try to repair things that break, rather than just throw things away.</p>
<p>First vacuum cleaner I bought was a ~$300 Hoover (in mid-1980's
dollars), very well reviewed by Consumer Reports, that I expected to
last. It didn't. The cord holder broke. The power-assist broke.
Replacement parts were hard to obtain and expensive. After a while -
despite cleaning - it just did not do a good job as a vacuum. (After
that experience, I am unlikely to buy Hoover, again.)</p>
<p>More recently I bought a ~$200 (about year 2001) Sharp vacuum billed
as very quiet - and it was! Did a good job of cleaning at first, but
after a year seemed less effective, then much less effective a bit
later.</p>
<p>Bought a ~$250 <a href="http://bannister.us/weblog/index.php?s=Roomba">Roomba</a>
a few years back. The robot vacuum cleaner was very cool, though it
needed frequent cleaning, and then broke. Then the replacement broke.
Then the next replacement broke. Then the <em>next</em> replacement broke - and
I finally gave up on the Roomba.</p>
<p>Bought a ~$150 Dirt Devil, which worked pretty well for maybe a year
(or much less). When the results were once again not very good (not
impressed with the "Dirt Devil" brand), hit Consumer Reports (which is a
good start, but one I do not entirely trust after the first Hoover) and
the other review sites.</p>
<p>I prefer to buy high quality products, with the expectation that they
will perform well, and last a long time. After mucking through the user
reviews, I started to suspect that almost any new vacuum performs better
than an old vacuum, and that price may not mean much.</p>
<p>Went to Wal-Mart to buy a cheap replacement vacuum. Settled on a
bag-less Bissell, priced $70 on the shelf, and $45 at the checkout.
First run - it's much quieter than the old Dirt Devil, and picked up a
lot of dirt the old vacuum had left behind. The new vacuum is lighter,
and does a better on edges as well.</p>
<p>Right. Seems to confirm the theory. New vacuums are better than old. At
$45 this vacuum is pretty much a disposable item - if it stops
performing, I will toss it and buy new.</p>
<p>That something the size and complexity of a vacuum cleaner has become a
disposable item (in a very practical sense), is ... clearly true, but a
bit hard for me to digest. :)</p>
Questions about urban architecture2009-02-13T00:00:00Zhttps://bannister.us/weblog/2009/questions-about-urban-architecture
<p>Sometimes simple things bother me....</p>
<p>In a dense urban environment, in cold climates, why are sidewalks at
street level?</p>
<p>Warm air rises. Walkways elevated above baffled entrances (to keep out
the wind) should be warmer than exposed sidewalks, and always dry.
Elevated walkways across city streets can only improve the flow of
traffic. Given the huge investment in large buildings, why not also
improve the public space associated with the building? Should enhance
the value of first-floor tenant spaces as well.</p>
<p>What are the arguments against?</p>
Dissonance2009-02-11T00:00:00Zhttps://bannister.us/weblog/2009/dissonance
<p>There is a television series called "Lost". In passing I have noted some
who seem quite taken by the series. Naturally this made me somewhat
curious. When an obvious opportunity appeared, I set my TiVo to record
the series.</p>
<p>After watching a few episodes, I wanted all the characters to die.
Figured it would improve the species. (Yes, I have not lost track of the
fact the characters exist only in a work of TV fiction.) The characters
were without exception <strong>stupid</strong>.</p>
<p>OK, so I know the series was most likely written by Hollywood script
writers. These are folks who for the most part have avoided science (and
any form of rational thought) as much as they could. Yes, the end result
is hideously predictable. Still ... I wanted all the characters in the
story to die. I really did not care about the "plot" or the
"characters". (Well, as a male, any attractive female biases my
response, but in this case, not so much.)</p>
<p>In trying to follow the script, I found myself asking the characters:</p>
<p>"Um. Hello!? This is a <em>survival</em> situation. Maybe now is not the time
to engage in silly soap-opera style behavior?"</p>
<p>Of course, in the world of TV marketing, a "soap opera" that sells on
the cable "Science Fiction" channel, probably sounds like a good thing.
The fact that the actions of the characters make no logical sense is not
relevant. I know this.</p>
<p>Have to wonder - if I was in this (fictional) situation - what would I
do?</p>
Ten years2009-02-10T00:00:00Zhttps://bannister.us/weblog/2009/ten-years
<p>On this day, ten years ago, at about 8am my little brother was killed.
Arthur was going to work in heavy traffic on the west-bound 91 freeway
when he was bumped by a car. Whether the fault was his or the other
driver, there is no way to know. Because my brother was riding a
motorcycle, the accident killed him.</p>
<p>They said he died instantly. His neck was broken, so his heart would
have stopped. There is no way of knowing if he was still aware, after
the accident.</p>
<p>In college I had three friends who all loved riding motorcycles, and who
all stopped riding after a close call.</p>
<p>Arthur was nine years younger than me. Growing up, he was always getting
into trouble. Once, he burned most of the skin off his upper legs, when
he played with first solvent, then fire. For years, through high school
and after, he was messed up on drugs and alcohol. In that time it was as
though my brother was not there. Eventually he did get cleaned up, met a
very nice girl, got a decent job, and got married.</p>
<p>His life was looking up, when he was killed by a meaningless accident.</p>
<p>I miss my brother.</p>
Mathematics is Metaphor2009-02-08T00:00:00Zhttps://bannister.us/weblog/2009/mathematics-is-metaphor
<p>From <a href="http://arxiv.org/abs/0709.4024">Shut up and calculate</a>:</p>
<blockquote>
<p>I advocate an extreme "shut-up-and-calculate" approach to physics,
where our external physical reality is assumed to be purely
mathematical. This brief essay motivates this "it's all just
equations" assumption and discusses its implications.</p>
</blockquote>
<blockquote>
<p>Yet our ability to answer other questions has surpassed earlier
generations’ wildest expectations: Newton would have been amazed to
know that we would one day measure the age of our universe to an
accuracy of 1 per cent, and comprehend the microworld well enough to
make an iPhone.</p>
</blockquote>
<p>There is a dangerous - and possibly naive - assumption in the above
statement. We have <em>models</em> from which we can <em>guess</em> the age of the
universe, but the basis for those models could be quite wrong. The
models are based on what measurements and observations we can make from
at most an <em>insignificant</em> cosmological distance from our home planet.
The portion of the universe we have minutely explored and measured is
fantastically small.</p>
<p>That we can come up with theories that seem to apply to the greater
universe is - frankly - astonishing.</p>
<p>Still <em>based on what we know</em> the popular theories of the universe do
seem to work. Good science is to go with what works. Good scientists
should also keep in mind the limits of our present knowledge. Good
scientists should be wary of our present assumptions, and question those
same assumptions from time to time. Good scientists should be aware of
the history of science - where further exploration of the real world
(through experiment) have often forced changes in then-current theories.</p>
<p>Theory is a map of reality. Mathematics applied through theory is a
means to read that map. But the map is not the territory. Maps are
abstractions - they leave things out. If the bits left out do not matter
for a particular usage, then the map is useful. But always remember -
<em>the map is not the territory</em>.</p>
<p>Someday we may have a map of reality so detailed as to be
indistinguishable from reality. Perhaps reality is sufficiently simple
that a bunch of barely-evolved primates can cook up an accurate map.
Somehow I just cannot come up with enough arrogance to assume that we
are there already.</p>
<p>Over time I have worked with a lot of very smart people on fairly
complex constructions. To get a grip on the both the people and the
constructions, I have found much use for what I call "outer metrics".
Direct measurements of people or constructions may be practically
impossible, but there are usually aspects you can measure readily, and
that are indirectly but strongly related to what you want to measure.
The linkage is <em>probable</em> - by no means certain - but useful.</p>
<p>The current state of Physics has me ... wary. The "outer metrics" are
telling me that the upper reaches of theory <em>may</em> be on the wrong track.
Theory may be on the modern equivalent to the old "How many angels can
dance..." notion. How much of practical use has theory generated of
late? In what ways has our ability to manipulate the real world
improved? It seems ... not much. This is only a <em>probable</em> judgement,
but enough to ask the question.</p>
<p>The above-quoted paper makes me wary. Sometimes application of theory
has extended our understanding of the real world - when the map is
accurate. When the map is less accurate than believed, calculation can
take us down a blind alley.</p>
<p>We must always keep in mind - <a href="http://en.wikipedia.org/wiki/Map%E2%80%93territory_relation">the map is not the
territory!</a></p>
Just enough "Security"2009-02-07T00:00:00Zhttps://bannister.us/weblog/2009/just-enough-security
<p>This is brilliant.</p>
<blockquote>
<p><a href="http://blog.wired.com/cars/2009/02/stressful-munic.html">Munich's Metro Stressful, But It Goes Everywhere | Autopia from
Wired.com</a>
Riders purchase tickets at self-service kiosk priced by zone -- a
ticket covering most of the inner city costs €2.30 ($2.95) -- and
before boarding, stamp them with an old-school time clock. It's
possible to score a free ride by "forgetting" to stamp your ticket,
but at the risk of getting caught by plainclothes agents making random
checks. They’ll slap you with a big fine, and the "I'm just a confused
tourist" won't get you anywhere.</p>
</blockquote>
<p><a href="http://www.schneier.com/index.html">Bruce Schneier</a> frequently repeats
the notion that security should be cost-effective (counting <em>both</em>
material and non-material costs). Whomever came up with this approach
for the Munich Metro ... the result is brilliant. The investment in
infrastructure for fee collection should be less. The Metro can employ
fewer folk in less repetitive, more intelligent jobs. (I would bet the
plainclothes agents are cross-trained to look for other criminal
behaviors.) Peak traffic flows are less likely to be impeded by
"security" measures.</p>
<p>Incidentally, I do believe that Schneier is having a large positive
effect on application of concepts for security, directly or indirectly.
Seems more and more often I am running into fragments of his thoughts in
other venues. I know enough about the principles to use security
effectively in my working domain (which makes me the "security expert",
though I would not claim that title). When folk want or need know more I
almost always point them to Schneier's writings. I suspect there are
other folk who also point to Schneier as the standard-bearer for
security-related issues. Over time it looks as though the cumulative
effect is significant.</p>
KCRW - Jewish Public Radio?2009-02-05T00:00:00Zhttps://bannister.us/weblog/2009/kcrw-jewish-public-radio
<p>Earlier I had noticed an apparent
<a href="http://bannister.us/weblog/2004/npr-national-jewish-public-radio/">over-representation of Jewish issues</a>
in NPR coverage. What I heard over the air on Monday pretty much removes
all doubt.</p>
<p><a href="http://www.kcrw.com/">KCRW</a>, a local <a href="http://www.npr.org/">NPR</a>
affiliate, is holding a fund drive. Nothing unusual in that, up until a
particular story ran on NPR:</p>
<p><a href="http://www.npr.org/templates/story/story.php?storyId=99913807">Abuse Scandal Plagues Hasidic Jews In
Brooklyn</a></p>
<p>After the story ran, the fund drive hosts expressed misgivings about the
effect the story might have on donors, and essentially <em>apologized for
the appearance of the story on NPR</em>!! Apparently stories that might
reflect negatively on any portion of the Jewish community are not
welcome. (Raping little boys is OK. Saying bad things about popular
rabbis is not.)</p>
<p>Amazing. Guess that pretty much erases any remaining doubts about using
the label "Jewish Public Radio".</p>
Elegant distributed applications2009-02-03T00:00:00Zhttps://bannister.us/weblog/2009/elegant-distributed-applications
<p><a href="http://en.wikipedia.org/wiki/Elegant">"Elegance is the attribute of being unusually effective and
simple"</a></p>
<p>Heard this first applied to theories in Physics. Any
not-over-complicated theory that effectively explained the facts was -
as I understood - considered an "elegant" theory. (My original
interest - and college degree - was in Physics. I wanted to build
starships.)</p>
<p>Came up, long ago, with rules for "elegant" distributed applications.
The first significant distributed application I spent time with was the
early FileNet system. This was well over twenty years ago. Strong
interest in scaling to large (by the standards of the time) deployments,
forced careful thought about performance. Pretty much everything I have
worked on before and since has had a network in the middle, so I've had
time and reason to think about the subject. Changing technology does not
change the inherent nature of distributed systems, so the relevant set
of notions will pretty much <em>always</em> apply.</p>
<p>(<em>What continues to surprise me is that individuals and outfits still
get these same bits</em> <strong>wrong</strong>!)</p>
<p>In the interest of hitting the <em>usual</em> points once....</p>
<p>When building distributed applications, there are some basic principles
you should always keep in mind.</p>
<p>Minimize the amount of data crossing the network.
: The capacity of the network is always limited. Capacity is large in
the usual development setup, when both server and client are on the
same segment. In real use the available capacity is almost always
less, and sometimes <em>much</em> less.</p>
<p>Minimize the number of round-trips across the network.
: Networks always have <em>latency</em>. This has nothing to do with the speed
of a network (in terms of bits/second). I have written about this
<a href="https://bannister.us/weblog/2007/rest-should-not-be-uniform">before</a>.
For an interactive application the ideal is one round-trip per user
action.</p>
<p>Shift computation from the server to the clients, where practical
: There are almost always more clients than servers. If you can shift
computation to the clients, you will get better overall throughput.</p>
<p>From the above principles, for building web applications you can derive
further guidelines.</p>
<p>Code complexity belongs on the server. Code in the client should be simple.
: Code to be executed on the client must be shipped across the
network. The less you have to ship across the network, the better.
If you have an application that calls for code-complexity on the
client, you want to ship the code once, and should be looking at
solutions like <a href="http://en.wikipedia.org/wiki/Java_Web_Start">Java
WebStart</a>. Otherwise
you want to ship as little code as possible across the network. This
fits perfectly with the use of compact scripts in the client using
Javascript.
</p>
<p>
The fact that Javascript is interpreted on each and every load (and
not compiled) serves only to reinforce this guideline.</p>
<p>Large iterations belong mainly on the server, not the client.
: Compiled code is usually much more efficient than interpreted code.
The server can (or should) use compiled code. In the case of web
applications, the client code is interpreted code.</p>
<p>Large data belongs on the server, not the client.
: The (sometimes) narrow network channel, and the relative efficiency
of compiled code - both argue for keeping large data on the server.</p>
<p>Use the strengths of the web browser.
: Native code is faster than interpreted code. The web browser is
smart, and incorporates a large set of behaviors in native code. Use
of built-in behaviors can mean smaller Javascript and faster
execution.</p>
<p>In the present, Javascript offers an elegant solution to the need for a
scripting language in both client and server. Made the mistake(?) of
responding to a <a href="http://alarmingdevelopment.org/?p=191">recent post</a>.
Seems that each time something like this comes up, we have an almost
fixed set of notions coming back. After a few iterations - just not very
interesting.</p>
<p>Some quotes, with names omitted to protect the guilty.</p>
<blockquote>
<p>Arrays have no semantics. They are not first-class collections. Do not
use them in any public API, regardless of the language you use. Wrap
arrays with a public type that exposes semantics.</p>
</blockquote>
<p>The semantics of arrays as collections and iterations are simple and
perfectly suited for small scripts. For the most part, you do not need
anything more. The domain for scripting is small, concise, and hideously
flexible code. More elaborate solutions might make sense in large
server-side code. Client-side script or structures shipped between
client and server should only be as elaborate as is needed - and no
more.</p>
<blockquote>
<p>You’re right in the sense that JS is “good enough” for most of basic
usages, but almost useless for writing bigger software. It’s the
reason why there’s been recently a lot of higher level languages that
generates JS code. Either Java (GWT) or haXe (http://haxe.org)</p>
</blockquote>
<p>You should not be writing large code in Javascript. You must use
Javascript in the client (the web browser), but in-browser script should
<strong>not</strong> be large. You should consider Javascript as "glue" code on the
server-side - small code, few iterations, with huge flexibility - to
allow special-case customization without re-coding. Javascript (as with
ELisp in Emacs and AutoLisp in AutoCAD) is a scripting language. You do
not want to write the bulk of a large application in Javascript. Large
code is a non-goal for a scripting language.</p>
<blockquote>
<p><a href="http://pinderkent.phumblog.com/post/2009/01/i_still_dislike_javascript_and_likely_always_will_it_has_some_pretty_fundamental_flaws">I still dislike JavaScript, and likely always will. It has some
pretty fundamental
flaws.</a></p>
</blockquote>
<p>Javascript evolved almost as a hack (if not quite). Early versions were
less capable. Early examples were uninspired (or worse). The present
iteration preserves past mistakes. Ignore the mistakes, and use the good
parts. The good parts are ... very good, as suits a scripting language.</p>
<blockquote>
<p><a href="https://bannister.us/weblog/2009/elegant-distributed-applications">JavaScript has no place on the server.</a></p>
</blockquote>
<p>Quite the opposite - as the scripting language known to the largest
group, and fated to be well-known over a long period - Javascript can
serve exceptionally in the role that scripting languages have long met
in large, successful applications. Not for large use, but with a valued
place. Often when faced with the need to adapt a large application to a
specific customer/site needs, there are always cases when a simple list
of options is not enough (and rarely-used options serve only to make the
application obscure to all customers). There is always a part of the
problem space best met by a scripting language deeply integrated with
your application.</p>
<p>Historically we have always had a zoo of suitable scripting languages,
with insufficient reason to choose between them. In an odd way, the rise
of Javascript in the web browser does us a favor, as Javascript is
sufficient, and now most widely known of all scripting languages. There
are times when a single logical solution is best for all involved.</p>
<p><strong>Javascript is good enough.</strong></p>
Long-term compatible protocols2009-02-02T00:00:00Zhttps://bannister.us/weblog/2009/long-term-compatible-protocols
<p>Prompted by this article: <a href="http://ocaml.janestreet.com/?q=node/41">Lightweight versioning for lightweight
protocols</a></p>
<p>Yes, this is a many-times-solved problem - though not always well
solved. Seems like most everything I've done in the last twenty-odd
years (or more) has had a network in the middle. From that experience, a
few guidelines...</p>
<h3>Guidelines for network protocols used in distributed applications</h3>
<ol>
<li>
<p><strong>Design for differing versions on the client and server.</strong></p>
<p>
In some limited cases you can keep the client and server versions in
sync. For the most part - over time and over growing deployments -
you cannot. Assume that the client version will often differ from
the server (in either direction).
</p></li>
<li>
<p><strong>Convert at the edges.</strong></p>
<p>
The types inside your application may change many times (for good
reason). The structures that cross the network should change slowly
(if at all). In your application, convert from internal to protocol
structures at the edge.
</p></li>
<li>
<p><strong>Version your protocol.</strong></p>
<p>
This could be as simple as a single version number offered by the
client to the server, and the server to the client, at the beginning
of the conversation. You could do finer-grained versioning, but this
seems rarely needed.
</p></li>
<li>
<p><strong>Do not be over-specific in your protocol types.</strong></p>
<p>When passing a number across the net, use a general number type. You
application might internally use a small number type (8-bit or
16-bit), and you may think that is all you will ever need. Some of
those numbers will grow. At the edge, when ingesting incoming data,
check for values outside the range you can handle.</p>
<p>
The same argument applies to strings, arrays, and the like.
</p></li>
<li>
<p><strong>Design for upwards and downwards compatibility.</strong></p>
<p>
When the client asks a question of the server, older servers may not
understand the question, or return a smaller answer. When the client
is older, the server may have a larger answer, or the question may
be smaller. Most of the time, changes are incremental, and both
server and client can handle the difference without explicit
reference to the protocol version. Sooner or later someone will
goof, and you will need to add a special case for a specific
version.
</p></li>
</ol>
<p>This all might sound complex or difficult - but is simpler than the
alternative.</p>
Scripting inspired by Monad - for Unix2009-01-30T00:00:00Zhttps://bannister.us/weblog/2009/scripting-inspired-by-monad-for-unix
<p>Scripting on Windows has always been pretty lame compared to Unix. The
usual <strong>command.exe</strong> or <strong>cmd.exe</strong> shells on Windows are pretty
pathetic compared to the <a href="http://en.wikipedia.org/wiki/Bourne_shell">Bourne
Shell</a> (which was released
back in 1977!). Lacking a good shell, and with a population of GUI
developers less familiar with the command line, Microsoft never really
got a clue. The Cygnus ports (and the like) of GNU command line
utilities and <a href="http://en.wikipedia.org/wiki/Bash">bash</a> likely lessened
the demand somewhat.</p>
<p>A few years back a group at Microsoft came up with
<a href="http://weblogs.asp.net/jnadal/archive/2003/10/29/34413.aspx">Monad</a> ...
which was a pretty cool idea, if a little too fat. Took years before
they eventually shipped (renamed as
<a href="http://en.wikipedia.org/wiki/Windows_PowerShell">Powershell</a>).</p>
<p>Unix has tended to be about simple ideas with a lot of mileage. While
the notion of building something like Monad on Unix is pretty
interesting (I'd use Javascript via <a href="https://bannister.us/weblog/2009/scripting-inspired-by-monad-for-unix">Rhino</a> on the JVM), what I really
wanted was a simpler notion that better "fit" the Unix-tools mindset.</p>
<p>One of the really cool bits about Monad was the ability to stream
structured data - typically XML. Unix tools typically work on character
streams - and only that. The character streams could quite naturally
include structured data ... but there seemed to be something missing.</p>
<p>Turns out there is a simple/elegant solution that could be retrofit to
existing shells and tools, and fits very well within the usual Unix-ish
way of doing things. The notion is so simple, it is a bit funny. This
makes a round-trip of sorts....</p>
<p>The first generation of web servers were almost entirely running on
Unix. The first common-model for dynamic content was
<a href="http://en.wikipedia.org/wiki/Common_Gateway_Interface">CGI</a>, which was
simply (and logically) a slightly warmed-over of Unix shell scripting.
Running a shell script for each incoming web request was not especially
efficient, so we got a whole zoo of alternatives (ASP, JSP, mod_perl,
etc.) but the programming model is still based on CGI - which in turn is
derived from Unix shell scripting.</p>
<p>When a web browser makes a request of a web server, the request includes
a "Content-Type" header to indicate the
<a href="http://en.wikipedia.org/wiki/MIME">MIME</a> type of the request data, and
a set of "Accept" headers to indicate acceptable data-types for the
response.</p>
<p>When a shell script is used for CGI, the HTTP headers turn into
environment variables - for example:</p>
<p>HTTP_ACCEPT=text/html,application/xhtml+xml,application/xml;q=0.9,<em>/</em>;q=0.8
HTTP_ACCEPT_LANGUAGE=en-us,en;q=0.5
HTTP_ACCEPT_ENCODING=gzip,deflate
HTTP_ACCEPT_CHARSET=ISO-8859-1,utf-8;q=0.7,*;q=0.7</p>
<p>Unix tools that got used for CGI applications (Perl, Python, PHP, etc.)
were all taught to ingest HTTP requests and generate HTTP responses. The
code exists and is generally quite mature.</p>
<p>How could we pipe structured data between processes, automatically
negotiating the data-type where possible?
<strong>In <em>exactly</em> same way a web browser negotiates the content-type with
the web server!</strong></p>
<p>There are a relatively small number of missing bits needed to make shell
run scripts/tools in a similar fashion to CGI.</p>
<ol>
<li>The shell needs to read HTTP response headers from the output of a
prior process, and translate the headers into environment variables,
before invoking the next process in a pipeline.</li>
<li>Some convention so tools know whether to generate a plain character
stream, or structured data. The presence of the HTTP_ACCEPT
environment variable is probably sufficient.</li>
<li>... er, maybe that's all.</li>
</ol>
<p>There are many ways we could enable this behavior, but it could be as
simple as:</p>
<p>HTTP_ACCEPT=text/xml ps -e | fold | spindle | whatever</p>
<p>... to invoke use of XML in a single pipeline, or:</p>
<p>export HTTP_ACCEPT=text/xml
ps -e | fold | spindle | whatever</p>
<p>... to invoke use of XML over an entire script.</p>
<p>Could use a shim without changing the shell. Something like:</p>
<p>HTTP_ACCEPT=text/xml ps -e | cgi perl a.pl | cgi php -f b.php</p>
<p>An exercise for another day....</p>
RSS-Atom2009-01-26T00:00:00Zhttps://bannister.us/weblog/2009/rss-atom
<p>A small proposal - the <a href="http://en.wikipedia.org/wiki/Atom_(standard)">Atom Publishing
Protocol</a> should be named
and referred to as "RSS-Atom".</p>
<p>Why? Because when you subscribe to a feed from a website, you are often
offered a list of choices.</p>
<p>RSS-0.92
RSS-2.0
Atom</p>
<p>This is bad user interface design. The end user - who has no deep notion
of what these things are and how they differ - has no means of knowing
which to pick. A well-designed user interface will hide the redundant
choices, and select the most appropriate (probably Atom, going forward).
Over the entire universe of applications, we can pretty much count on
the fact that not all user interfaces are well-designed. If we can help
the end user, we should.</p>
<p>The naming used should result in the list of choices:</p>
<p>RSS-0.92
RSS-2.0
RSS-Atom</p>
<p>Now even with indifferently-done user interfaces the user is given a
sufficient clue. Clearly the choices are all of the same "kind". Sorted
alphabetically "RSS-Atom" will appear after any "RSS-<em>version-number</em>,
which is a clue to the user that Atom is a better choice.</p>
<p>A small aid to hundreds of millions (soon billions?) of users is a big
deal.</p>
Sam Ruby - Contributions Welcome2009-01-17T00:00:00Zhttps://bannister.us/weblog/2009/sam-ruby-contributions-welcome
<p><a href="http://www.intertwingly.net/blog/2009/01/17/Contributions-Welcome">Sam Ruby: Contributions
Welcome</a>.</p>
<p>Yep. I think Sam in the HTML5 working group is a very good thing.</p>
Malfunctioning mindset - the HTML5 working group2009-01-16T00:00:00Zhttps://bannister.us/weblog/2009/malfunctioning-mindset-the-html5-working-group
<p>For the record, I think that making Sam Ruby a chair of the HTML5
working group is a good sign, in a dismal process.</p>
<p>Credit Sam with <a href="http://www.intertwingly.net/blog/2009/01/15/Grandiosity">pointing
out</a> bits that
are just wrong. The
<a href="http://dev.w3.org/html5/spec/Overview.html#the-doctype">DOCTYPE</a>
section is a good/bad example.</p>
<blockquote>
<p>A DOCTYPE is a mostly useless, but required, header.</p>
<p></p>
DOCTYPEs are required for legacy reasons. When omitted, browsers tend
to use a different rendering mode that is incompatible with some
specifications. Including the DOCTYPE in a document ensures that the
browser makes a best-effort attempt at following the relevant
specifications.
</blockquote>
<p>To a web developer the DOCTYPE header is <strong>essential</strong> to insure a
specific interpretation of HTML. If you think that HTML4 is better than
HTML3 (or earlier), then the DOCTYPE is pretty damn important. In some
ideal (non-existent) world, the first specification of HTML was perfect,
and all browser implementations perfectly implemented the HTML exactly
as in that same specification. In that world the DOCTYPE header would
not be needed. In the real world, the DOCTYPE header is <strong>extremely</strong>
useful, because it allows the web developer to invoke the better
behaviors offered by later browser implementations, when those later
implementations improve on what came before.</p>
<p>Seems I wrote about the
<a href="http://bannister.us/weblog/2008/doctype-works/">DOCTYPE</a> a year
ago. My opinion has not changed.</p>
<p>Somehow the W3C HTML working group has walked through the looking glass.
The difference between compatible and incompatible is "mostly useless".
Good is bad, and the trivial is vitally important.</p>
<p>Have doubts about that last? The HTML working group is still arguing
over the <a href="https://bannister.us/weblog/2009/malfunctioning-mindset-the-html5-working-group">alt</a> attribute - a
<a href="http://bannister.us/weblog/2008/altwaste/">stupid waste</a> of
<a href="http://bannister.us/weblog/2008/accessibility-and-html/">time</a>.
(If it would do any good, I'd be far more diplomatic.)</p>
<p>The constant references to XML and SGML in the HTML5 spec need to be
removed. HTML is not XML. HTML is not SGML. HTML is not and never will
be either XML and SGML. An appendix describing a mapping to XML would be
useful. A history section describing the relationship to SGML and XML
would be informative. Pretty much every other reference is a waste of
time.</p>
<p>The massively verbose sections on parsing are a waste of time. The HTML
standard is defined in terms of ASCII, and ASCII only, which makes much
of the following needlessly verbose.</p>
<blockquote>
<p>A DOCTYPE must consist of the following characters, in this order:</p>
<p></p>
1. A U+003C LESS-THAN SIGN (<) character.
2. A U+0021 EXCLAMATION MARK (!) character.
3. A string that is an ASCII case-insensitive match for the string
"DOCTYPE".
4. One or more space characters.
5. A string that is an ASCII case-insensitive match for the string
"HTML".
6. Optionally, a DOCTYPE legacy string (defined below).
7. Zero or more space characters.
8. A U+003E GREATER-THAN SIGN (>) character.
<p>In other words, <!DOCTYPE HTML>, case-insensitively.</p>
</blockquote>
<p>Then there is the
<a href="http://intertwingly.net/blog/2009/01/15/Grandiosity#c1232059491">response</a>
from Ian Hickson. To be clear - I give Ian a <strong>lot</strong> of credit for
tackling a large and difficult job (though Google's apparent sponsorship
dilutes that just a bit), and for trying to be <em>moderate</em> in dealing
with the HTML5 working group. Credit aside, it seems that Ian does not
have the right mindset (in which he is not at all alone).</p>
<p>For example:</p>
<blockquote>
<p>Regarding the alt="" attribute: we don’t want to say that alt=""
should be optional, because that would be an accessibility nightmare.
It isn’t optional, it shouldn’t be optional.</p>
<p></p>
</blockquote>
<p>In reality the <strong>alt</strong> attribute <em>is</em> optional. You cannot force web
developers to use the attribute, or to use the attribute well. Web
browsers cannot reject HTML documents that lack <strong>alt</strong> attributes. Few
web applications will be written for accessibility, and the treatment of
the <strong>alt</strong> attribute in the HTML5 standard cannot change that. Better
to fit the spec to reality, than insist on a fantasy.</p>
<p>Also:</p>
<blockquote>
<p>Regarding the extensibility mechanisms — HTML5 already has literally
over half a dozen extensibility mechanisms: [link]</p>
<p></p>
</blockquote>
<p>The existing support for extensibility in HTML is lame. What we need is
something simpler and more fundamental. Here I have to admit weakness in
that I have no particular skill as <em>teaching</em>. If you do not already
deeply get why Lisp and Scheme are remarkable, then I cannot offer an
adequate explanation. (Who does?)</p>
<p>I wish Sam luck. Boy does him ever have a big job in front of him.</p>
Vacation 2008.122009-01-04T00:00:00Zhttps://bannister.us/weblog/2009/vacation-200812
<p>Final scores...</p>
<ul>
<li>Twice 850-odd miles driving, not counting side trips. The trip out
was nice.</li>
<li>Two kids who slept most of the trip, both ways.</li>
<li>Three days my father spent skiing in Telluride with my 2 kids, and
one sister. My father has since recovered.</li>
<li>One day of falling snow, around dawn, on the drive back only.
Driving in the dark in falling snow on icy roads is novel and thus
fun. I grew up in southern California.</li>
<li>Two spin-outs behind, watched in the rear-view mirror, one of which
may have been Colorado highway patrol. Never saw a spin-out on an
icy road before.</li>
<li>Two cars passed when off the road, not in control (them not me),
west of Grand Junction in Colorado.</li>
<li>One Utah highway patrol who turned on his lights briefly when we
topped a rise from opposite directions. Might have had something to
do with speed on a clean, fast section of road.</li>
<li>Two more cars off the road - coming from the other direction on the
I-70 - in the <a href="http://en.wikipedia.org/wiki/Fish_Lake,_Utah">Fishlake mountains in
Utah</a>.</li>
<li>Two very large snow-plows facing my tiny minivan in a snow-covered
parking lot, when I came out of the "Panoramaland" rest stop. The
driver was friendly and polite. I removed the minivan from their
path.</li>
<li>Seven(!) snow plows working on the I-70 in Utah. These folk do not
mess around - the road was in good shape.</li>
<li>Many hours peacefully driving down the I-70 and I-15 in gradually
thickening traffic.</li>
<li>One Utah highway patrol car who swooped in from behind, and pulled
over the car I was following.</li>
<li>Three Nevada highway patrol cars in the median (two facing toward,
one away) who offered no objection as we flew by.</li>
<li>One "cancel" button on the cruise control that works very well.</li>
<li>One hour lost grinding through slow and rude traffic on the twisted
and warped portion of the Interstate through Las Vegas.</li>
<li>I hate Las Vegas - an ugly place.</li>
<li>Another hour lost getting to and past Primm, Nevada. No obvious
reason for the slowdown, but it makes money in Primm. Might be
intentional, and not likely the California Highway Patrol would
catch them (or try).</li>
<li>I hate Nevada, or at least parts.</li>
<li>Hours of thick traffic and poor drivers on the I-15 in California.
Not nice.</li>
<li>One SUV that very nearly had a spectacular accident, right in front
of me, on the fast/last downhill of the <a href="http://en.wikipedia.org/wiki/Cajon_Pass">Cajon Pass</a>.
Another foot to the left would have taken his/her car off the
shoulder. At that speed I my guess is a spin followed by a tumble,
and maybe a bounce or two. Bummer.</li>
<li>The two mostly-sleeping kids missed all the witnessed mishaps.</li>
<li>One trouble-free and more than usually eventful trip.</li>
</ul>
Oops? Tripping over a math problem.2009-01-02T00:00:00Zhttps://bannister.us/weblog/2009/oops-tripping-over-a-math-problem
<p>Just finished reading <a href="http://www.amazon.com/gp/product/0765351684">Variable
Star</a>, a book written by
<a href="http://www.spiderrobinson.com/">Spider Robinson</a> from a partial story
outline found recently in Robert Heinlein's papers.</p>
<p>Have to admit to a bit of confusion here. Both Heinlein and Robinson are
among my favorite authors, but I would never have tagged Robinson as
"the new Heinlein". (Then again, my interest in "science fiction" has
much diminished over the years.) The book works out to a very decent
Spider Robinson story with overtones of Heinlein.</p>
<p>There is one part of the story where the math strikes me as badly wrong.
Given the list of credits given at the end, I do not know how this could
have been missed by other reviewers. Maybe I'm dead wrong. Will try to
setup the problem without giving away too much of the plot. (Might be a
silly concern. At this point in time, is there anyone likely to read
this article before reading the book?)</p>
<p>Given two ships: One large, traveling at near the speed of light, and
unable to slow or stop. One small and capable of traveling at ~20 times
light-speed. The larger ship is on-course and provisioned for a
destination many light-years away. The larger ship is designed for and
carries ~50 times as many folk as the smaller ship.</p>
<p>How long would it take the smaller ship to off-load passengers from the
larger? The answer in the book is <em>many years</em> of continuous shuttling,
and I am pretty sure that is wrong.</p>
<p>To take a first-order guess at the answer, assume that minimum round
trip time for the smaller ship is one day - when the larger ship is
passing the destination at minimum distance. A ship designed for 10
passengers on long trips can probably handle twice as many for short
trips (a <em>very</em> rough guess), so figure 20 passengers per trip (for
short trips). After 20 days the larger ship will be about 20 light-days
from the destination, so the smaller ship will add about a day to it's
travel time. We can (very roughly) average the travel time, and say that
over that 20 day period round trips by the smaller ship between the
larger ship and the destination take about 1.5 days. Over 21 days you
could make about 14 round trips. Assuming the same logic applies when
the larger ship is both approaching and just past the destination
(another massive assumption) then in 42 days the smaller ship could make
28 round trips, and off-load 560 passengers.</p>
<p>Would be pretty tedious for the pilot(s), but it looks as though you
could off-load the larger ship in a few months (with room for large
error in either direction, of course) - and almost certainly in less
than a year. The trick is you do most of the shuttling when the larger
ship is close to the destination.</p>
<p>I can understand why this problem was not looked at too closely - but
without giving away plot, I cannot say more here. :)</p>
Mystery houses decrypted!2008-12-30T00:00:00Zhttps://bannister.us/weblog/2008/mystery-houses-decrypted
<p>About a year ago work started on a new housing tract in a once-empty
field across the road from my father's house in Colorado. Walking around
the newly built houses, I could not figure out the placement of rooms
and entrances. There seemed to be pattern, but I could not figure what
the pattern meant. Documented my puzzlement in the
<a href="http://flickr.com/photos/dreadedhill/sets/72157603994698548/">faceless</a>
set of photos.</p>
<p>This was the house that cracked the code.</p>
<p><a href="http://www.flickr.com/photos/dreadedhill/2275072018/"><img src="http://farm3.static.flickr.com/2265/2275072018_c47df5f11e.jpg" alt="house" /></a></p>
<p>As the house on a corner, the scarcity of windows, and the main
entrance that looks more like a side entrance - looks rather odd. Last
night we took a walk that wandered through the same tract of houses -
when suddenly the odd patterns made sense. The clue is to look at that
same house when facing the garage, and imagine the house in a dense
southern California development, with houses packed tightly on both
sides.</p>
<p><a href="http://www.flickr.com/photos/dreadedhill/2275074268/"><img src="http://farm3.static.flickr.com/2318/2275074268_87197ceb08.jpg" alt="house" /></a></p>
<p>This follows the <em>usual</em> pattern for recent dense-suburban southern
California homes. The garage is in front, occupying nearly the entire
street-facing side of the house. The width of the house (viewed from the
street) is scarcely wider than the garage, which allows crowding the
greatest number of houses on one street. The front entrance is around
the side of the garage, and scarcely visible from the street as the next
house (typically) is only a few feet away.</p>
<p>My guess is the
<a href="http://www.pinnaclehomesreachhigher.com/about.htm">builder</a> took
existing plans meant for dense-suburban homes - probably plans they had
from prior projects - and <em>stretched</em> the plans to add more square
footage (to sell into a market for bigger houses). The development is
named <a href="http://www.pinnaclehomesreachhigher.com/stone-ridge-map.htm">Stone Ridge</a>
(though on flat ground), and the above pictures most closely match the
<a href="http://www.pinnaclehomesreachhigher.com/floorplans/IronRidgeFloorPlan.jpg">Iron Ridge</a>
floor plan.</p>
<p>Once I had figured out the pattern, deciphering the other houses was
easy.</p>
<p><a href="http://www.flickr.com/photos/dreadedhill/2275068358/"><img src="http://farm3.static.flickr.com/2276/2275068358_80ee3cf86b.jpg" alt="house" /></a></p>
<p>Take this example. Note the narrow/useless "front porch"? The front of
the house in the original plan was what is now the right side (in the
photo). The room on the right was the garage. The useless front porch
was originally the walkway from the front of the house to the "front"
door. Push in a couple stretched-out rooms, and you have a house
suitable for dropping into a dense-suburban development.</p>
<p>Note that the pictures are almost a year old, and none of the houses
have sold since. Don't know if the it's due to the economy, or due to
the random floorplans - but my guess is that even ordinary folk notice
the odd layouts.</p>
<p><strong>Update:</strong> December, 2010</p>
<p>Saw a bunch of hits on this article in August and November, got
curious, found the builder's website was gone, and the website for the
tract is gone. Called my father and found that the builder had gone
bankrupt, and all nine of the oddly-designed homes had sold (apparently
at somewhat below local market prices). Wonder if the folk who bought
the homes are passing around this article?</p>
GPS in an Android phone2008-12-29T00:00:00Zhttps://bannister.us/weblog/2008/gps-in-an-android-phone
<p>Got a T-Mobile G1 phone a bit over a week ago. I can write software for
my phone, so this counts as a new toy. :)</p>
<p>Drove out to south-western Colorado from southern California, yesterday.
Was curious how the GPS in the phone would perform. The answer: not very
well. Could be the GPS hardware in the phone is not very good. Something
about the heuristic in the GPS software is almost definitely not right.
There were long periods where the GPS seemed unable to determine the
current location. There were times when the GPS would seem to be at the
right location - then would suddenly jump to a few miles from home
(hundreds of miles from my then-present position). Could be that the GPS
has trouble in a moving car.</p>
<p>Another downside is that T-Mobile has poor coverage on much of the route
(the I-15 to the I-70, then south in western Colorado). When the GPS
could find my position, often Google Maps could not get a connection to
download map tiles.</p>
<p>There is a need to download and cache map tiles over a pre-planned
route.</p>
<p>If the GPS heuristic for dealing with moving vehicles and spotty
satellite reception is poor (assuming that was the problem), then there
is some hope a later software release from Google will offer
improvements.</p>
Performance parsing CSV data2008-12-21T00:00:00Zhttps://bannister.us/weblog/2008/performance-parsing-csv-data
<p>Not sure how exactly, but I ran across an
<a href="http://www.daniel-lemire.com/blog/archives/2008/12/08/parsing-text-files-is-cpu-bound/">article</a>
that claimed parsing of
<a href="http://en.wikipedia.org/wiki/Comma-separated_values">CSV data</a> was
necessarily CPU-bound. I was pretty sure that with reasonably efficient
code, there was no reason this had to be true. Still, proof is better
than opinion, so I took the
<a href="http://svn.bannister.us/public/wide-finder-1/">feed-readers</a> code from
a <a href="https://bannister.us/weblog/2008/wrapping-up-wide-finder-2">prior exercise</a>,
and adapted the code to parse CSV files.</p>
<p>You can grab the sources for the test
<a href="http://svn.bannister.us/public/CSV-parser-1/trunk">CSV-parser-1</a>
program from Subversion. The test program does a full CSV parse as
described in <a href="http://tools.ietf.org/html/rfc4180">RFC 4180</a> (including
handling quoted fields with embedded line breaks) and a bit more, but
does nothing with the parsed data.</p>
<p>Results from test runs - on my HP laptop (Intel T9300 Core 2 Duo CPU @
2.5GHz with 4GB memory):</p>
<p>preston@mercury:~/workspace/CSV-parser-1$ time Release/CSV-parser-1 -n 0 in/1g.txt
TIME Sun Dec 21 16:45:43 2008
Scanning: in/1g.txt
Done with: in/1g.txt
TIME Sun Dec 21 16:45:47 2008
Elapsed (ms): 4249, total (MB): 981
Scanned 230 MB/s</p>
<p>real 0m4.254s
user 0m3.500s
sys 0m0.656s</p>
<p>The above is for a ~1GB file, fully cached in memory (do repeated test
runs until the times stabilize).</p>
<p>preston@mercury:~/workspace/CSV-parser-1$ time Release/CSV-parser-1 -n 0 in/4g.txt
TIME Sun Dec 21 16:49:31 2008
Scanning: in/4g.txt
Done with: in/4g.txt
TIME Sun Dec 21 16:51:02 2008
Elapsed (ms): 91449, total (MB): 3944
Scanned 43 MB/s</p>
<p>real 1m31.455s
user 0m41.271s
sys 0m10.549s</p>
<p>The above is for a ~4GB file, <strong>not</strong> cached in memory. The result is
very clear - an efficient CSV file parser can ingest data <strong>much</strong>
faster than the data can be read off ordinary disks (a bit over five
times faster). Even a fast RAID would be hard-pressed to deliver data
faster than it could be parsed.</p>
<p>Of course, in "real" applications, any processing performed on the
parsed CSV data will likely dominate the runtime. Application-specific
processing could easily saturate more the one CPU. The problem
partitions into most-efficient read-and-parse of CSV data from disk
(which is what this example does), and distribution of
application-specific processing across multiple CPUs (which this example
can do in the same manner as <strong>feed-workers</strong> ... and which may or may
not suit your application).</p>
<p><em>Insert the usual caveats here. The example program has seen only basic
testing. There were other applications (minimally) active. The C++ code
was written for reuse, and has not been run through a profiler. You
could tweak the code to get slightly better performance, but probably
not any large improvements.</em></p>
<p>The same test run on a desktop (slower CPUs, faster disk):</p>
<p>preston@brutus:~/workspace/CSV-parser-1$ time Release/CSV-parser-1 -n 0 in/1g.txt
TIME Sun Dec 21 17:21:19 2008
Scanning: in/1g.txt
Done with: in/1g.txt
TIME Sun Dec 21 17:21:27 2008
Elapsed (ms): 7530, total (MB): 981
Scanned 130 MB/s</p>
<p>real 0m7.535s
user 0m6.136s
sys 0m1.388s</p>
<p>The above times are for a file cached in memory.</p>
<p>preston@brutus:~/workspace/CSV-parser-1$ time Release/CSV-parser-1 -n 0 in/4g.txt
TIME Sun Dec 21 17:23:31 2008
Scanning: in/4g.txt
Done with: in/4g.txt
TIME Sun Dec 21 17:25:00 2008
Elapsed (ms): 89020, total (MB): 3944
Scanned 44 MB/s</p>
<p>real 1m29.084s
user 0m26.994s
sys 0m7.004s</p>
<p>The above times are for a file <strong>not</strong> cached in memory. The results are
entirely consistent with the first set of runs.</p>
<p>Clearly, an efficient CSV file parser can process data faster than a
single disk can deliver. The SSD's (solid-state disks) currently on the
market seem to manage sustained read rates in the range of 40-100MB/s,
so a single-process parser should be able to fully saturate the disk.</p>
<p>If you are doing large-scale processing of CSV data, your most-efficient
approach is most likely to use a single (efficient!) reader-parser
thread, and then roughly as many application-specific processing threads
(or processes) as you have CPUs.</p>
Metaphors and reality2008-12-09T00:00:00Zhttps://bannister.us/weblog/2008/metaphors-and-reality
<p>Physics is taught and understood through a series of metaphors. Events
and processes beyond the range of human perception and experience are
are described and understood via metaphors. If the metaphors are close
enough to reality, then we are able to derive useful results. When the
wrong metaphors are in use (and this happened before) the science ends
up in a blind alley.</p>
<p>There is always a chance that some of our present metaphors are wrong
(or at least a poor choice). There is a distinct chance that at some
point Physics will run up against an aspect of reality that cannot be
expressed - even via metaphor - in terms digestible by the human mind.
Some of our science may already be up against just such a limit. At some
point the human mind will have to evolve to something greater, before
further progress can be made.</p>
<p>A few more metaphors that may or may not prove useful....</p>
<p>The <a href="http://bannister.us/weblog/2008/the-other-tiger/">prior speculation</a>
leads to some derivatives.</p>
<p>If when looking far out into the universe we can see <em>all</em> distant
present variants that do not change our present sum, then the further
out we look the "fuzzier" the image would appear. If this were true (a
very big <em>if</em>) then the distance to which we could see clearly would
represent the distance to which some sort of fairly-immediate
interaction is possible. (Hello warp-drive?)</p>
<p>If the weave-of-variants metaphor is in fact a good match to reality,
then the diffraction pattern observed in the classic <a href="http://en.wikipedia.org/wiki/Double-slit_experiment">double-slit
experiment</a> may
represent an interaction between photons <em>across the weave of variants</em>.
In effect a single photon takes every possible path, each in it's on
variant, and interaction across variants establishes the diffraction
pattern. (Though interaction-between-photons is itself a metaphor of
which I am wary.) Are there other interactions across variants? Is this
metaphor in any way testable or useful?</p>
<p>Again, without some sort of test, the above are no more than
speculations.</p>
The Other Tiger2008-12-06T00:00:00Zhttps://bannister.us/weblog/2008/the-other-tiger
<p>Been re-reading some old Arthur C. Clarke stories (largely written
before I was born). I did not care very much for most of Clarke's later
stories. Whether the fault was his or mine I cannot say. The notions in
Science Fiction writings do not affect me nearly so much now as when I
first "discovered" science fiction in the early 1970's. Clarke was one
of my first most-favorite authors (only partly because I went
alphabetically through the science fiction section of the local public
library). I remember as a teenager finding Clarke's stories quite
exciting.</p>
<p>I find the collection of Clarke's short stories exactly to my taste, if
no longer exciting. Did get a bit of a jolt when I re-read "The Other
Tiger". The notions in that story had struck me as "right", and become
so deeply embedded in my thought, I no longer remembered the source.</p>
<p>Of late I have tended to return to an extension to that same line of
thought. The starting notion is that if the universe is infinite, all
possible combinations of events must occur. (Yes, I have heard of the
Big Bang Theory. The theory may yet be proven wrong. It may be that the
universe is <em>effectively</em> infinite ... but we will get to that later.)</p>
<p>If all possible combinations occur, there are infinitely many Earths
with an infinite number of variations. You might think there could be an
infinite number of identical Earths as well ... but Nature seems to tend
to favor simple solutions, so I suspect that each identical variation
occurs exactly once. You could imagine a sort of dimension-of-variations
with each possible combination strung out along the dimension as a sort
of standing wave. (It would of course not be anything like a
single-measure dimension ... but again, something to return to later.)</p>
<p>You could imagine that dimension viewed over time as an enormous tree,
with branchings each time an event or combination could vary. The tree
is quite nearly infinite (or a near-infinite count of near-infinite
numbers).</p>
<p>Or is it?</p>
<p>Does it really matter when an isotope decays a hundred light years away?
Sometimes yes, but mostly not (a most overwhelming "mostly"). Perhaps
that tree is more like a weave. Many past combinations lead to our
present, so viewed over time the massive branching out of variations is
matched by a massive branching in of past variants that make no
difference to our present state or future.</p>
<p>You could view this as computation, where many different combinations of
past-values could compute to the present-sum. In fact, when viewed as a
computation, the size of an infinite universe - when filtered to all
<em>meaningful, unique</em> combinations, suddenly becomes finite! So starting
with the assumption of an infinite universe, you end up with the
conclusion that the universe is finite. (Perhaps there is hope for the
Big Bang Theory after all.)</p>
<p>Does the <strong>entire</strong> universe branch for each quantum variation? Seems a
bit like overkill. If the variation makes no difference to our local
sum, might they all exist in our "present"? The further away, the larger
variations could be without effecting our local sum.</p>
<p>There is an outside chance we might already have proof. If an astronomer
took two pictures at the extreme edge of the visible universe, and the
pictures came out different, a good scientist would (quite reasonably!)
assume a small error in the aim of the instrument. Those two differing
pictures could be views into distinct distant "present" variants. Or
perhaps the further out we look, the "fuzzier" images become, as we can
see all "present" distant variants that do not change our local sum?</p>
<p>Looked at that way, the "weave" of variants might vary over the
dimensions of space that we can perceive.</p>
<p>Of late I have been bothered by the question of granularity. It is easy
to assume that a quark popping into existence a hundred light years away
does not cause a local branch - but where exactly (a poor word in this
context) does the fork occur? How much can the past variants differ,
without changing the present sum?</p>
<p>I would prefer to believe the variants could only be very small, or very
far away. But ... I could be wrong. Could the past variants be nearby
and macroscopic?</p>
<p>When you and I remember a past event differently, and it makes no
difference to our present, or to our future actions, could it be that we
are both right? Discounting the unreliable nature of human memory, could
it be that some portion of the time our memories of past events differ
<em>because we did each experience (slightly) differing events</em>?</p>
<p>Lacking a test, this is no more than an entertaining speculation. But
... the question of granularity bugs me. <strong>A lot.</strong></p>
<p>Not long after this notion had occurred to me, I started to notice that
some of the music (played from the my collection stored on my iPod)
sounded different than I remembered. Now I think it far more likely that
this is due to a faulty bit in my memory, or the not-very-good sound
system in my car, but ... <em>what if my memory is right?</em> Could it be that
the proof is all around us, but we have gotten used to discarding those
bits that did not fit into our metaphor-of-the-world to which we are
accustomed?</p>
<p>There is of course no proof for any of this, so the above is just an
entertaining speculation. <em>But ... could it be true?</em></p>
Isolating the UI Thread2008-12-03T00:00:00Zhttps://bannister.us/weblog/2008/isolating-the-ui-thread
<p>I got stuck overhauling a badly implemented Swing application, not so
long ago. Seems I end up doing desktop GUI applications every several
years. Been doing this since pre-Windows days, so long ago learned the
rule that long-running tasks should never be performed on the UI thread
(or the equivalent). Have also seen (many times!) that most programmers
are not aware of the rule and the underlying reason. The Swing
application (to my complete lack of surprise) performed pretty much
everything on the UI thread.</p>
<p>Refactoring an existing application to move long-running tasks off to a
background queue, is not easy. The flow of control that leads to disk,
network, or database operations can be rather indirect. You could have
long-running operations still performed on the UI thread (via an
indirect path) of which you are not aware. Even for an application
written from scratch with full knowledge of the relevant principles,
there is some chance an indirect control path might unexpectedly place a
potentially long-running task on the UI thread.</p>
<p>You could put tests in various places to check that (say) disk and
network operations are not performed on the UI thread, but that adds
complexity and expense to existing code, is prone to error, and only
catches problems after the fact. Not exactly an elegant or minimal
solution.</p>
<p>What we really want is an efficient solution that makes the usual errors
impossible. You want a file, network, or database operation on the UI
thread to fail to get past the compiler - or at the very least to fail
on the first invocation.</p>
<p>The world of server-side Java web applications offers a solution. Java
web application servers (like Jetty or Tomcat) use custom class loaders
to isolate distinct web applications. Classes loaded into one web
application are completely unknown (and unshared) with other web
applications hosted on the same application server.</p>
<p>The same notion - with a twist - could be applied to desktop GUI
applications. The UI thread could use a class loader that knew about
Swing (or the equivalent), and knew nothing about classes that did file,
network, or database operations. The non-UI threads would not have
access to any of the GUI (Swing or the like) related classes.</p>
<p>The project setup would be a little more complicated, but any errors
could be caught at compile-time, without adding any additional
complexity or runtime expense to existing classes.</p>
<p>This seems to imply a rather significant of reorganization of the stock
Java classes.</p>
<p>Ran across this article, that takes a less interesting run at a similar
problem.</p>
<blockquote>
<p><a href="http://java.sys-con.com/node/763739">Should Java Assert that Network I/O Can't Occur on the UI
Thread?</a>
Doing network I/O on the user interface (UI) thread is bad. Most
developers know that and can tell you why; unfortunately, it’s still
done. At this year's JavaOne, one of the keynote JavaFX demos bombed
because the network was slow, something that would be forgivable had
the entire application's UI not frozen, which required it to be
restarted, only to trip up again a few minutes later.</p>
</blockquote>
<p>I believe to notion of using class loaders to completely isolate the
class name-space is a more efficient solution.</p>
Taxpayer-funded bus service in Orange County2008-11-15T00:00:00Zhttps://bannister.us/weblog/2008/taxpayer-funded-bus-service-in-orange-county
<blockquote>
<p><a href="http://bos.ocgov.com/legacy5/newsletters/Volume2Issue42.htm">Supervisor Pat Bates' Fifth District
Report</a>.
<strong>OCTA Proposed Fare Adjustments</strong></p>
<p>Due to rising costs and a decline in revenue, the Orange County
Transportation Authority (OCTA) Board of Directors will consider a
proposal to increase fare amounts at its November 24th meeting. Since
fares were last increased in 2005, fuel costs have soared 185 percent,
employee pension costs have increased 92 percent and healthcare costs
have risen 28 percent. Due to the weak economy, the largest OCTA
transit revenue source, the quarter cent sales tax enacted under the
State Transportation Development Act (TDA), declined by more than 3
percent for fiscal year (FY) 2007-08 as compared to FY 2006-07.
Additionally, the recently approved state budget is expected to
provide $7.8 million less to the State Transit Assistance funds than
expected.</p>
<p>While OCTA has experienced growth in ridership in recent years, fare
revenues have not kept pace with escalating costs, thus reducing the
farebox recovery ratio. The TDA mandates OCTA meet a <strong>minimum 20
percent farebox recovery ratio</strong> to continue to receive full funding
and for every 1 percent below the minimum, OCTA will be penalized
approximately $2.7 million. In order to continue to be a good steward
of taxpayer dollars and to increase the farebox recovery ratio, OCTA
will consider increasing fares along with reducing expenditures where
it can.</p>
</blockquote>
<p>Right. The fares charged to ride the buses in Orange County are only
covering about <strong>one fifth</strong> of the costs of running the buses. Not
exactly what you would call a profitable operation. The county bus
service in Orange County was started in the 1970's. For a while, just
after high school, I used the buses to get to classes at the local
community college ... at least until I realized that riding a bicycle
was faster and far more convenient.</p>
<p>Orange County is not laid out to allow any sort of efficient mass
transit. We do get periodic attempts to establish various
taxpayer-funded forms of mass transit (light rail, subways, etc.). I
actually like the <em>idea</em> of being able to read/work/doze while traveling
to work or other destinations, but the simple fact is that mass transit
is impractical when destinations are too diffuse.</p>
<p>For mass transit to work, you have to zone and build a region from the
start in patterns with few, highly concentrated clusters of
destinations. That is not what we have here.</p>
Microsoft Office Project Server2008-11-15T00:00:00Zhttps://bannister.us/weblog/2008/microsoft-office-project-server
<p>Some folks at my employer have chosen to deploy Microsoft Office Project
Server.</p>
<p>I have used Microsoft Project, on and (mostly) off over a couple
decades. Each time I've come back to using Microsoft Project, the
experience is less than satisfactory. I seem to detect an anti-pattern.
Those folks that are hopelessly invested in the use of Microsoft Project
offer a weak defense of the product. Pretty much everyone else thinks
the product a poor choice. The single-copy price has always been
somewhat high, so relatively few folk have tried to use MS Project.</p>
<p>In the last encounter with project planning software (several years
back), I became convinced that a web-based solution was the <em>right</em>
solution to the for this sort of problem. Schedules are inherently a
shared thing, and passing file copies around via email was a poor
substitute. A few years later Microsoft came up with a web-based variant
of Project, but by then I was too busy (fortunately) to mess around with
project-planning software. (Some other poor guy had inherited the job of
making and updating the MS Project schedules - a vast and singularly
non-productive time sink.)</p>
<p>Still ... there was a chance Microsoft could have done good things since
the last time I had used Project. Turning out a web-based application is
very different from turning out a desktop application. With the forced
change there is the opportunity to re-think the design, and perhaps to
make things better.</p>
<p>Nope.</p>
<p>The web-based version of Project is unbelievably lame. I could make a
list ... but it would be too long. (Hey, this is my personal weblog, not
a paid-for review.) The static screenshots look nice, but as a <em>usable</em>
web application, this is not. For the design aspects, the words that
come to mind are "completely clueless". (Again, I am puzzled that
Microsoft - with all their vast resources - could do anything so badly.
Though from my own experience at other companies, I might have a pretty
good idea why this can happen.)</p>
<p>Did a bit of searching to see what others were saying about the product,
and mainly found folk selling training or consulting - a sign of a
pain-in-the-ass to use product. I'm guessing that anyone who has a
choice and a bit of intelligence uses something else.</p>
Hosting a polling place in Orange County, California2008-11-08T00:00:00Zhttps://bannister.us/weblog/2008/hosting-a-polling-place-in-orange-county-california
<p>Frankly I am annoyed at reading yet-another article about the "long
lines" on election day. Checked Google - search on "polling" and "long
lines" and I get 762,000 matches. Is this a sign of careless reporting,
or an intentional lie?</p>
<p>There <em>are</em> polling places with long lines. Polling places are run by
volunteers (of which I am one), and are not always as well run as they
could be. (On the flip side, a random collection of volunteers at each
polling place makes that part of the polling process generally more
secure - a very good thing.) There are occasional foul-ups in supply,
organization, and equipment malfunctions. With hundreds of thousands of
polling places in use during an national election, some will function
badly.</p>
<p>But telling voters to expect long lines at the polls, is going to
discourage folks. To my mind, intentionally discouraging voters is
unethical (at best - "traitor to your country" is the phrase that comes
to mind). If very few voters will have to deal with "long lines", then
the news reports are a disservice.</p>
<p>I hosted one of the busiest polling places in Orange County, California
during the last election. We did have a line about 100 feet long at 7am
when the polls opened. By about 9:30am the line was gone, and by 10:30am
the polling place was (briefly) empty. What that means is that we able
to process voters faster than they arrived, from the moment the polls
opened at 7am. Voters tend to arrive in clumps, and it takes a few
minutes to get everyone signed in and voting, but after the first rush
there was <strong>never</strong> a "long" line.</p>
<p>While I know it is common practice to assume government organizations
are clumsy and inefficient, the fact is that the Orange County Registrar
of Voters tried very hard to make sure things went well. They did make
some mistakes, but from my point of view they gave me more than enough
to make the election day a success.</p>
Got my election supplies, and a few surprises2008-11-02T00:00:00Zhttps://bannister.us/weblog/2008/got-my-election-supplies-and-a-few-surprises
<p>Went to pick up my election supplies on Saturday morning (as usual). Got
two(!) controllers, and two(!) supply boxes. Hauled in the (heavy!)
supply box with a measure of dread. The supply box contains the rosters
used to process each incoming voter. One election they gave me two
different "precinct" lists, so each voter's name had to be checked in
two lists, taking twice as long. Fortunately that election had a low
turnout, so hosting the local polling place with inefficient lists
was not a problem.</p>
<p>This election we expect a <strong>big</strong> turnout, so anything inefficient could
make my day not fun, and could make long waits for voters. Was greatly
relieved to find a single precinct list, split alphabetically into two
lists - a very good thing.</p>
<p>Called the four adult poll workers to verify that they knew and were
going to show up at my polling place. The very first year I volunteered
to work the polls, they made me an Inspector. I did not call the poll
workers to make sure they would show up (had no reason to think that was
needed), and <strong>no one else showed up</strong>! The ROV re-assigned one girl
from another polling place to help. Two people are not really enough,
and that made for a very long and hard day.</p>
<p>In the afternoon talked to two, and left messages for two others. I
cannot call the "student clerks" to verify, so I have to trust that the
ROV (or <em>someone</em> will make sure that
the high school kids show up. In the past the high school students have
done a terrific job, so they are very welcome. (The fact that I have
three teenagers may help, in that I have no trouble dealing with kids of
that age.)</p>
<p>In the evening I got a call from another poll worker assigned to my
location, but he was not on my list! The ROV had told him (not me) there
was going to be ten(!) people assigned to my location. News to me....</p>
<p>A couple hours later I got another unexpected call from someone who had
a table and chairs to deliver, on instructions from the ROV. News to me!
Asked about the chairs - hard metal folding chairs - and said no thanks.
(Not going to inflict those on poll workers.) Asked for two tables - if
they had them. Should be delivered on Monday. Otherwise I'm going to
pick up a couple folding tables from the hardware store on Monday.</p>
<p>Since the <a href="http://ocvote.com/nealkelleyenglish.htm">new guy</a> was
assigned to the Registrar of Voters, each election has been a bit better
organized than the prior - so I give the folks at the ROV a lot of
credit.</p>
<p>Still, it <em>would</em> be nice to know some things ahead of time, such as:</p>
<ul>
<li>How many voters are in my precinct? (Found out the Saturday before
the election!)</li>
<li>How will the roster be organized? (Found out the Saturday before the
election!)</li>
<li>How many voting machines will I get? (Found out the Wednesday before
the election!)</li>
<li>How many controllers will I get? (Found out the Saturday before the
election!)</li>
<li>How many poll workers will I get? (Knew of 3 as of a week ago on
Friday, and 8 on the Wednesday prior to the election.)</li>
</ul>
<p>Not that I want the above to sound overly critical. For low-turnout
elections (most elections) it does not matter much, and I am willing to
adapt to whatever comes along. In recent years the ROV has done better
job each year. Still - this election looks to be big, and I want to do
whatever I can to make sure voters have to wait as little as possible.</p>
<hr />
<p>A reflection of scale and the interchange of ideas on the Internet. Of
the 1900-odd voters in my polling area, I bet none have any idea I keep
a weblog....</p>
<p></p>
Hosting the local polling place2008-10-29T00:00:00Zhttps://bannister.us/weblog/2008/hosting-the-local-polling-place
<p>The fun part about hosting a polling place is that I have no idea what
I'm in for until just about the last minute.</p>
<p>The voting machines were delivered today - all sixteen(!) of them. Can I
fit them all in my garage in an efficient layout? The guy from the
shipping company noted that mine was the only polling place with more
than eight machines. Oh boy.</p>
<p>The updated list of poll workers showed up today. Last week's list had
only three name - too few for a high turnout election. (I've generally
had three to five helpers.) Today's list has eight(!) names (in addition
to mine). Six would be wonderful. Eight ... not sure where everyone is
going to sit (especially with all the voting machines filling up space.</p>
<p>Saturday is when I pick up the voting supplies and the controller for
the voting machines. In the box of supplies will be the list of voters
in my precinct. Until I see that list I have <em>no idea</em> how many voters
are in my precinct. Worse, for one election they gave me two precincts -
which meant signing in voters took nearly twice as long. Don't know why
they did not just merge the lists. After that election I called
<a href="http://www.ocvote.com/">RoV</a> to (strongly!) suggest that I get only one
roster in future.</p>
<p>Several weeks back a guy came from the RoV to measure my garage. About a
week back they sent a suggested floor plan of how I might arrange the
machines. The plan had two controllers ... so am I going to get two
controllers on Saturday?</p>
<p>Not sure how I can use eight people ... unless the RoV split the list of
voters alphabetically. That would work. Going to have to buy a couple
more folding tables.</p>
<p>Sure wish I knew what I will be getting in the box on Saturday. This
could work very well, or very badly - all depending on how the rosters
are organized.</p>
On the Economy2008-10-25T00:00:00Zhttps://bannister.us/weblog/2008/on-the-economy
<p>When it comes to the economy of our world and our society, I do not
pretend to be any sort of expert. On the other hand, from the events of
the last several weeks, my opinion of those who are claimed as most
expert is much deflated. The interpretation they offered of recent
events boils down to "I'm scared - make it the same as before". Seems my
understanding might not be much worse than the claimed "experts".</p>
<p>Our current economic system is a fiction. The fact that it seems to work
(with recent exceptions) is interesting, but not proof that this
represents anything like absolute truth. If it mostly-works ... great.
When it fails should serve as a reminder that we mostly do not know what
we are doing.</p>
<p>We live in an insignificant fraction of human history. (Yes, that
assumption would make me an optimist.) It would take astounding
arrogance (or more likely a complete lack of insight) to assume that how
we organize ourselves now is economically or politically is the best
possible solution for the entire human race for all of time. With any
luck, the expanse of human history in front of us will be vaster greater
than the brief time behind.</p>
<p>What we have at present is our approximation for what we think might be
the best way to proceed. No reason to assume that approximation is the
final solution. There is within that approximation a considerable
diversity of opinion. :)</p>
<p>The American Experiment, presently two hundred-plus years along, is a
remarkable departure from what came before. (Something easy to forget.)
I think the Founding Fathers, as well-educated men of the time, got a
lot of things right. No reason to assume that they got everything right,
but good reason to assume they were not wide of the mark.</p>
<p>Back in the 1960's there was a projection that improvements in
productivity would make the 40-hour work week obsolete. We got the
improvements in productivity, but instead we got both sexes working full
time (in place of mainly the male sex working), and no change in the
expected work time.</p>
<p>What happened?</p>
<p>Over the past few decades we see increasing amounts of "capital" chasing
too few places to "invest". What we get is a series of "bubbles", where
a seeming "investment grade asset" gets over-valued due to far too much
money looking for a place to sit.</p>
<p>As a kid I remember reading about the enormously smaller cost of living
in the "third world". How could the same goods cost far less there than
in the United States? What would the transition look like, as their
goods make it to our markets, and their economy rises towards ours?</p>
<p>Science fiction has long projected a future where only a fraction of the
human race needs to work to provide enough for all. Within living memory
(if only just) the main bulk of the population of the most advanced
nation on the planet - the United States - has gone from living on farms
to living in cities. Most of the rest of the world seems to be following
the same sort of transition, but at a greatly accelerated pace. The old
projection of science fiction writers seems likely to come true within a
generation - but the difference between what was necessary in the past,
and what will be necessary in the future is a difference in kind, not
just a difference in numbers.</p>
<p>What does that transition look like?</p>
<p>The rise of the rest of the world is due in large part to the success of
the American Experiment, and borrows from the same ideas. Oddly enough
that same success is the root of our current economic success and
problems. We are in the middle of a transition to a future very
different from the past, and we do not know how best to proceed.</p>
<p>The first and perhaps most obvious observation is that we have too much
money in "capital" that should be put elsewhere. Is this a symptom of
the income gap where a small fraction of the population gets a large
fraction of an economy's wealth?</p>
<p>When the difference between the future and the past is very large, how
well can we expect a theory of economics derived from past experience to
serve us in the future?</p>
Filler2008-10-16T00:00:00Zhttps://bannister.us/weblog/2008/filler
<p>Now is the time for all good men to run in small circles while chasing
clouds wearing checkered vests with buttered purple carnations. Now is
the time for all good men to run in small circles while chasing clouds
wearing checkered vests with buttered purple carnations. Now is the time
for all good men to run in small circles while chasing clouds wearing
checkered vests with buttered purple carnations. Now is the time for all
good men to run in small circles while chasing clouds wearing checkered
vests with buttered purple carnations. Now is the time for all good men
to run in small circles while chasing clouds wearing checkered vests
with buttered purple carnations. Now is the time for all good men to run
in small circles while chasing clouds wearing checkered vests with
buttered purple carnations. Now is the time for all good men to run in
small circles while chasing clouds wearing checkered vests with buttered
purple carnations. Now is the time for all good men to run in small
circles while chasing clouds wearing checkered vests with buttered
purple carnations. Now is the time for all good men to run in small
circles while chasing clouds wearing checkered vests with buttered
purple carnations. Now is the time for all good men to run in small
circles while chasing clouds wearing checkered vests with buttered
purple carnations. Now is the time for all good men to run in small
circles while chasing clouds wearing checkered vests with buttered
purple carnations. Now is the time for all good men to run in small
circles while chasing clouds wearing checkered vests with buttered
purple carnations. Now is the time for all good men to run in small
circles while chasing clouds wearing checkered vests with buttered
purple carnations. Now is the time for all good men to run in small
circles while chasing clouds wearing checkered vests with buttered
purple carnations. Now is the time for all good men to run in small
circles while chasing clouds wearing checkered vests with buttered
purple carnations. Now is the time for all good men to run in small
circles while chasing clouds wearing checkered vests with buttered
purple carnations. Now is the time for all good men to run in small
circles while chasing clouds wearing checkered vests with buttered
purple carnations. Now is the time for all good men to run in small
circles while chasing clouds wearing checkered vests with buttered
purple carnations. Now is the time for all good men to run in small
circles while chasing clouds wearing checkered vests with buttered
purple carnations. Now is the time for all good men to run in small
circles while chasing clouds wearing checkered vests with buttered
purple carnations. Now is the time for all good men to run in small
circles while chasing clouds wearing checkered vests with buttered
purple carnations. Now is the time for all good men to run in small
circles while chasing clouds wearing checkered vests with buttered
purple carnations. Now is the time for all good men to run in small
circles while chasing clouds wearing checkered vests with buttered
purple carnations. Now is the time for all good men to run in small
circles while chasing clouds wearing checkered vests with buttered
purple carnations. Now is the time for all good men to run in small
circles while chasing clouds wearing checkered vests with buttered
purple carnations. Now is the time for all good men to run in small
circles while chasing clouds wearing checkered vests with buttered
purple carnations. Now is the time for all good men to run in small
circles while chasing clouds wearing checkered vests with buttered
purple carnations. Now is the time for all good men to run in small
circles while chasing clouds wearing checkered vests with buttered
purple carnations. Now is the time for all good men to run in small
circles while chasing clouds wearing checkered vests with buttered
purple carnations. Now is the time for all good men to run in small
circles while chasing clouds wearing checkered vests with buttered
purple carnations. Now is the time for all good men to run in small
circles while chasing clouds wearing checkered vests with buttered
purple carnations. Now is the time for all good men to run in small
circles while chasing clouds wearing checkered vests with buttered
purple carnations. Now is the time for all good men to run in small
circles while chasing clouds wearing checkered vests with buttered
purple carnations. Now is the time for all good men to run in small
circles while chasing clouds wearing checkered vests with buttered
purple carnations. Now is the time for all good men to run in small
circles while chasing clouds wearing checkered vests with buttered
purple carnations. Now is the time for all good men to run in small
circles while chasing clouds wearing checkered vests with buttered
purple carnations.</p>
Paper size and user interface design2008-09-19T00:00:00Zhttps://bannister.us/weblog/2008/paper-size-and-user-interface-design
<p>In a
<a href="https://bannister.us/weblog/2008/design-for-standard-screen-sizes">prior post</a>
I tried to make clear why today's common idioms in user interface design
are horribly inefficient on today's screen sizes. Thinking about this a
bit later, I realized there is something I did not mention - the single
common basis for why the old trade-offs once made sense, are now
complete non-sense, and has to do with the size of a piece of paper.</p>
<p>Most of the information we present through software (content, not
decorations) is organized to present well on an ordinary letter-sized
piece of paper. Once the width of a screen became wider than
letter-sized paper, we no longer needed to be severely constrained in
our use of horizontal space. We crossed a threshold. Now even the
lowest-end screens (at 1280x800) are much wider than paper.</p>
<p>Why should an ancient medium like paper have anything to do with modern
user interface design? Common paper sizes are - in effect - the result
of a centuries-long experiment in user interface design. Paper can
easily be fabricated in practically any size and shape. The paper sizes
we use are the result of human choice, not a limitation somehow imposed
by the manufacturing process. The range of paper sizes we most commonly
use today are the result of generations of humans choosing what works
best.</p>
<p>If you compare screen size to paper size, the old trade-offs make a lot
more sense. There <em>was</em> for a long time - as long as 800x600 (or
smaller) screens were significant - a very strong motivation to place
overhead elements on the top and bottom of the screen, and <em>not</em> on the
sides. For those small screens the cases where content was wider than
the screen were not rare. For anything text-like, usage that requires
horizontal scrolling is horribly inefficient (for the human, not for the
computer). Any design element that took away from horizontal space for
content was going to force an ever larger fraction of usage into
horizontal scrolling. Put simply, screens were effectively <strong>narrower
than paper</strong> and best design required preserving as much horizontal
space as possible for content.</p>
<p>The old trade-offs did <em>in the past</em> make a lot of sense.</p>
<p>A low-end 1280x800 14-inch laptop screen is about 11.9 inches wide and
7.4 inches tall. Given the content area on letter-sized is about 7.5
inches wide and 10 inches tall, the screen about 2.6 inches too short
and 4.4 inches too wide. Hold a piece of paper up against the screen,
and the problem is pretty clear.</p>
<p>Have to admit: when "widescreen" panels first started to appear on
laptops, I was hoping this was an aberration, not a trend. Unless you
spend all your time watching movies and playing video games, most of the
content you look at is text-like, and "widescreen" is not efficient for
this sort of content. By now it seems very clear that we are going to be
stuck with this form-factor for a very long time, and must adjust our
design-habits to match.</p>
<p>There is a good deep/underlying basis that justified the old design
idioms on old screens. That same basis on today's "widescreen" panels
makes those old idioms horribly wrong.</p>
Covering a use-case for many screens2008-09-17T00:00:00Zhttps://bannister.us/weblog/2008/covering-a-use-case-for-many-screens
<p>At 45 the eye doctor told me that my vision was going to get worse with
age. Nothing unusual there, as a perfectly normal part of aging, the eye
gets less flexible, and range of focus gets narrower. He was right, as a
few years later I needed bifocals to comfortably focus on the screen at
laptop and desktop distances.</p>
<p>What I find at 51 is that after a long day my eyes will sometimes get
tired, and have a hard time focusing on the screen - at any distance.
Maybe this is just a sign that I need a new prescription. Maybe this is
a simply a fact of life at this age.</p>
<p>There is at least some chance that focus-fatigue will be less of a
problem if the screens are placed at greater than the usual
laptop-screen or desktop-screen distances. The question of
screen-distance is interesting as the prices for 1920x1080 HDTV screens
have dipped below $1000 for 42-inch panels. The resolution is a bit
lower than I would like for a single panel - but not horribly so. I can
see buying two or four panels to use as my working screen surface.</p>
<p>Aside from the fact that my workspace would now look like a hacker's
lair from some dubious Hollywood product, there is the practical
question of how to hook up the screens to whatever computer I am using
at present.</p>
<p>It is possible (though somewhat/very tricky) to hook up more than two
screens to a Windows desktop, in hardware (best performance, but
sometimes difficult to get working) or in software (through MaxVista, a
third party product). With a Windows laptop it is not easy to get more
than one additional screen.</p>
<p>With Unix and the X Window system there is another very interesting
possibility. This is especially relevant to me, as I have switched both
my desktop and laptop computers to running Unix (specifically Ubuntu
Linux ... even though my paid-for time is to develop applications that
run on Microsoft Windows).</p>
<p>The old X11 protocol inherent in every version of the X Window system
assumes that a window may be displayed on a screen remote from the
computer on the program is running. This is really very old stuff. The
original version of the X Window system assumed that when a program puts
up a window, the window may appear on the screen of another machine on
the network.</p>
<p>This is incredibly cool as I could walk into a room with a wall of flat
panel screens, sit down, fire up my laptop, and open windows on the
wall-screens.</p>
<p>.... in theory ....</p>
<p>In practice, as far as I can tell, this would take a lot of tedious
one-time setup. Not really a surprise as to be practical this use-case
requires a fast CPU and a fast wireless network. Before performance
might not have been nearly good enough. With current hardware, this case
is feasible.</p>
<p>This is where the success of Linux is an impediment. How would you
search for someone else who had solved the same problem? Linux, X11, X
Windows, and "remote" are far too generic to return any sort of
selective results, and most of what comes back is as answers is of poor
quality.</p>
<p>How can you dynamically associate a computer with network-connected
screens in the same room?</p>
Google's Chrome - Bet your enterprise on it2008-09-15T00:00:00Zhttps://bannister.us/weblog/2008/googles-chrome-bet-your-enterprise-on-it
<p>Have to credit an
<a href="http://www.computerworld.com/action/article.do?command=viewArticleBasic&articleId=325539">article</a>
for a bit of insight - though at all not what the author intended.</p>
<p>There is an aspect I had previously missed. The Google Chrome web
browser is an <em>excellent</em> platform for company intranet applications.</p>
<p>Lots of companies have internally-used applications. Lots of
developer-hours went into those applications, and some of those
applications end up being mission critical. The average level of
programming talent that went into creating those applications is often
less than first rate, and so they tend to be somewhat inefficient, and
somewhat unreliable.</p>
<p>Google Chrome is probably the best platform for those
not-entirely-performant and not-entirely-reliable internally developed
applications. The fast Javascript engine means less efficient
applications will run better on Chrome, and isolation of Javascript
engines within means less-reliable applications will cause less trouble
when run within Chrome.</p>
<p>Is this what the Google-folk expected? My guess is not.</p>
<p>Organizations with a long enough history will almost certainly have had
to deal with vendor-forced upgrades that interacted badly with important
in-house applications. The fact that Chrome is open source means that
companies now have more of a choice - they could choose to opt-out of
any changes that disrupt important internal applications.</p>
<p>Google may have accidentally created the ideal platform for large
organizations that are looking at deploying internally developed web
applications.</p>
Design for standard screen sizes2008-09-14T00:00:00Zhttps://bannister.us/weblog/2008/design-for-standard-screen-sizes
<p>An observation that should be obvious - the universe of common screen
sizes has changed.</p>
<p>When you design a graphical user interface (GUI), you want make your
design optimal for current and near-future screen sizes. You want your
design to be at least passable on less common smaller screen sizes. Over
time the range changed:</p>
<ul>
<li>320x200 (color), 640x200 (mono), 720x348 (mono) <em>... yes, I've been
doing GUIs for a <strong>LONG</strong> time</em></li>
<li>640x350 (EGA), 640x480 (VGA), 800x600 (SVGA)</li>
<li>640x480, 800x600, 1024x768, 1152x864, 1280x1024, 1600x1200</li>
</ul>
<p>The last range stayed around for a rather long time. The most-probable
resolution went up over time, but VGA resolution stayed around as
probable on low-end laptops, or on servers (which often inherited old
VGA-only monitors). Note that all the common screen sizes shared similar
aspect ratios: 1.3̅ (640x480, 800x600, 1152x864, 1600x1200), and 1.25
(1280x1024). Wikipedia has a rather nice
<a href="http://en.wikipedia.org/wiki/Image:Vector_Video_Standards2.svg">picture</a>
at the bottom of the <a href="http://en.wikipedia.org/wiki/Super_Video_Graphics_Array">Super Video Graphics
Array</a> article.</p>
<p>Rather recently - due in large part to the rise of "digital"
television - the set of common screen sizes has changed, and are now
essentially all <a href="http://en.wikipedia.org/wiki/Widescreen">"widescreen"</a>.</p>
<ul>
<li>1280x800, 1440x900, 1600x1080, 1920x1080, 1920x1200</li>
</ul>
<p>Note that the ratios are generally "wider": 1.7̅ (1920X1080), 1.6
(1280x800, 1440x900, 1600x1000, 1920x1200), 1.48 (1600x1080). This is
for designers in fact a very big deal. Designs that once made sense are
now badly non-optimal. The existence of a huge mass market for 1920x1080
(television) means that we pretty much are going to have a permanent
"notch" in the price curve around that resolution, and that notch means
a large "bump" in the number of screens at that resolution.</p>
<p>Personally, I once hoped that 1200x1600 (and similar ratios) might
become dominant. That would better suit the content that we have to
present. Most content (outside movies) is much taller than wide. Instead
things have gone, <em>er,</em> sideways. (Old movies have an oddly dominant
effect on the world in which GUI designers must exist.) Unfortunately,
portrait-mode screens are rare, and there is no reason to expect this to
change. Given the mass-market, designers can expect an overwhelming
number of screens at the 1920x1080 resolution for at least the next
decade - if not longer.</p>
<p>As designers we need to design for the screens on real customer
desktops. That means designing for screens that are much wider than
tall, when the content we have to present is usually much taller than
wide. This mismatch has got to push us powerfully away from the
once-reasonable trade-offs of the past.</p>
<p>The sum of which means that the design of current desktop GUIs are all
badly <strong>wrong</strong>. Common/standard design elements that occupy scarce
vertical space are not optimal. Design elements that occupy the entire
horizontal extent of the screen - mostly as empty space - are not
optimal.</p>
<p>What does all this mean? Standard window title bars that occupy the
entire horizontal extent of a window are a <em>really bad</em> idea. Standard
menu-bars that occupy the entire horizontal extent of a window are a
<em>really bad</em> idea. Standard tool-bars that occupy the entire horizontal
extent of a window are a <em>really bad</em> idea. Standard status-bars that
occupy the entire horizontal extent of a window are a <em>really bad</em> idea.</p>
<p>If you are a smart, younger guy - for whom Microsoft Windows has been
around for your entire life - you might feel uncertain questioning
standard design elements. Might there be good reasons for standard
elements of which you are unaware? Let me help you. Put a standard
Window title bar on a VGA screen. When you add the horizontal extent for
[icon for Windows menu] plus [document name] plus [application name]
plus [icons for window size & close] ... the horizontal extent of the
title bar is pretty full, if not a bit over-full. At SVGA resolution the
title bar is still full, and only at 1024x768 do we start to see a
consistent (but not overwhelming) bit of wasted space. For a rather long
period of time this standard design element was reasonably efficient.</p>
<p>The same argument applies to menu-bars and tool-bars, as both made
reasonably efficient use of the then-available horizontal space.</p>
<p>Horizontal scroll-bars were rarely an efficient use of space, but (when
used) were simple to understand as due to the near-exact similarity with
vertical scroll-bars. Even as far back as the early 1980's there were
interaction-designs for scrolling that avoided horizontal scroll-bars as
an inefficient use of scarce screen space.</p>
<p>At one time the value of small personal computers to the average human
was <em>not</em> a certain thing. As designers - much of the time - we had to
aim for the human who was not at all convinced he wanted to use a
computer. This has changed. Due largely (and oddly) to the rise of the
Internet, the overwhelming consensus is now that use of computers is at
least of value, if not of primary importance. What this means for
designers is that we can afford to be a <em>little</em> more arcane. This is
<strong>NOT</strong> an excuse to be arcane without reason! What it does mean is that
users are more willing to make a greater initial investment in learning
than we could expect in the past.</p>
<p>What does all this mean? Current standard design elements that occupy
the entire vertical extent of the screen are insane - given what we have
now and can expect in the near future. We need to allow for
user-relevant content to occupy the entire vertical extent of the screen
(or nearly so). Today even on low-end laptops the width of the screen is
a little to wide for reading text comfortably. What this means is that
we afford to use horizontal space on various "overhead" elements,
without negative impact on the presentation of end-user content.</p>
<p>The above argues for pushing design elements (outside of end-user
content) to the sides, and away from the top or bottom of the screen.</p>
<p>When you place a variable or optional element on the left side of the
screen, for text-like end-user content, when that element changes size
(or disappears) the main content shifts horizontally. This is not
optimal. By shifting the horizontal placement of content, you force the
end-user to visually re-examine that content to see if it has changed.</p>
<p>This argues for placing overhead elements always to the right (at least
for users whose written text reads left-to-right).</p>
<p>Note that some current designs are starting to push toward more
efficient use of space. On Microsoft Windows the we have Internet
Explorer 8, and Google's "Chrome" web browser as examples. (I would
<em>hope</em> this is due to designer's explicit awareness of the space in
which they must "fit" their designs, but have no basis to assume.) At
least some designers are pushing for change in the, <em>er,</em> right
direction.</p>
JVM invocation - the Sun/Java folk screw up again.2008-08-29T00:00:00Zhttps://bannister.us/weblog/2008/jvm-invocation-the-sunjava-folk-screw-up-again
<p>It started out with bugzilla reports for Apache Tomcat. Ran across a
series of messages for <a href="https://issues.apache.org/bugzilla/show_bug.cgi?id=41538">this
bug</a>. This is
of interest for me, as a few years back I wrote a <strong>JavaService.exe</strong> -
a program that ran as a proper Win32 service, and followed all the
<a href="http://java.sun.com/docs/books/jni/html/invoke.html">documented</a>
Sun/Java behaviors for discovering and invoking a JVM. This meant a
commercial product (what paid for my time) could run Tomcat, was
perfectly and exactly isolated from generic Tomcat installations, and
would do exactly the right thing across Java upgrades. I'd carefully
crossed every "t" and dotted every "i", in the expectation that future
versions of Java would be consistent, and everything would work out as
was meant.</p>
<p>Except it did not. The Sun folk changed the API. Again. (I ran the test.
It failed.)</p>
<p>I do not know how to present this. Generally, I am an advocate for Java.
But ... the Sun folk do a terrific job on some aspects ... sometimes.
Now that Sun has open-sourced Java, I could contribute to the weaker
bits ... but only on my own (limited) time, as my current employer is
not explicitly interested in Java. I do not like saying "someone else
should do this", unless I am willing to contribute something.</p>
<p>Gah....</p>
<p>The documented API for invoking a JVM changed from Java 1.4 to 1.5, and
(as it turns out) from 1.5 to Java 1.6. No reason for this - the
capabilities did not change in any fundamental way - but it changed
anyway. The <strong>JavaService.exe</strong> program I wrote a few years back ..
guess what? It started failing for one customer for no obvious reason.
Turns out the failure is due to careless Sun programmers that
effectively changed the JVM invocation API in Java 1.6, and introduced a
new failure mode.</p>
<p>There is an <a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6509291">existing documented
bug</a> in
Sun's database for this issue, marked as "Closed, Not a Defect" ...
which is wrong. I could invest time in this, but no guarantee that any
work I did would get picked up. Should I bother?</p>
The stock File Open dialog is wrong.2008-08-19T00:00:00Zhttps://bannister.us/weblog/2008/the-stock-file-open-dialog-is-wrong
<p>The first time I went through the exercise of writing a GUI design guide
was in the early 1980's (very much pre-Windows). In the years between I
have written a moderate number of GUI applications, but most of my work
has been non-GUI, so I often spend years not thinking (much) about GUI
design.</p>
<p>My most recent task was to add a customized "File" "Save As" dialog to a
desktop application. Not too big a deal, but once running I had this
nagging mental itch ... I knew there was something wrong, but could not
first at figure out what was bugging me. Pulled up and compared the File
Open and File Save dialogs as used on Windows, Macintosh, and Gnome
(Linux). Finally it clicked - they are all <strong>wrong</strong>.</p>
<p>Take the File Open dialog. Choosing a file to open is a <strong>selection</strong> task - the file to open must already exist.</p>
<ol>
<li>What is the first most-likely task? Choose a file from a (short)
list. The list could be most-recently-used names of saved files. The
list may be files in a particular directory. Probably a bit of both.</li>
<li>What is the second most-likely task? Choose a location from a
(short) list. This is not a generic browse-anywhere-on-disk gadget.
This is an application-dependent list of a small number of places
where you might have files to open.</li>
<li>Less likely is the need to browse to an arbitrary location on disk.
This is where "progressive disclosure" kicks in, with the
expectation that most users will never need or want to see this part
of the user interface.</li>
</ol>
<p>This is entirely different organization than the usual File Open dialog,
and the usual dialog is wrong. The first task should be the first thing
in the dialog, not buried amid a bunch of controls you are mostly not
going to use.</p>
<p>The interesting bit here is that of all the platforms, the Gnome File
Open dialog is - not perfect by any means, but the closest to fitting
the task. Guess I need to pay more attention to the Gnome folks. :)</p>
<p>This is <strong>not</strong> about "dumbing down" the user interface for average
users. This is about "smarting up" the work done by the programmer.
Think about this ... if your application has ever <em>saved</em> files,
shouldn't that list of saved files show up in the File Open dialog? Of
course, the standard File Open dialogs do not fit this usage. Seems
pretty silly that the list of "recently used" files (when supported) are
not available as an immediate choice when opening a file.</p>
<p>The File Save dialog is for an entirely different task.</p>
<ol>
<li>What is the first most-likely task? Entering an name for the new
file to be saved.</li>
<li>What is the second most-likely task? Changing the location where the
file is to be stored. Again, this is a short list, not anywhere on
disk.</li>
<li>Less likely is the need to browse to an arbitrary location on disk.
Again, this is the point to apply "progressive disclosure".</li>
</ol>
<p>Again, note this is different from the usual File Save dialog, and the
usual dialog is wrong.</p>
<p>Again, the Gnome File Save dialog is a notch above pretty much everyone
else.</p>
<p>Looking at the new dialogs in Windows Vista, without doubt I find the
visual appearance "cool" ... but not well designed for the task. Bit
disturbing that - as I Microsoft with all their money can afford to hire
good user interface design folk. What has gone wrong?</p>
<p><strong>Update:</strong> Two added notes.</p>
<p>First, I do not have access to a Macintosh (last Mac I used regularly
was a Lisa) so I have to go off screenshots on the web (seem to remember
looking at a design guide on Apple's site). Not ideal - so the OS/X
behavior is only a guess. Sure wish Apple had OS/X in a VM for
developers, so I could test web applications and web-launched
applications to insure compatibility.</p>
<p>Second, the recently-used-files list (when present) is both finite and
distinct from the File Open dialog - both of which are silly as default
behavior. The history of recently opened files should be accessible from
the File Open dialog. Using the same notion, the File Save dialog should
"remember" the recently used directories for saved files. You want a
single locus of attention in either case.</p>
Why FileInputStream is slow - continued2008-08-18T00:00:00Zhttps://bannister.us/weblog/2008/why-fileinputstream-is-slow-continued
<p>As noted
<a href="https://bannister.us/weblog/2008/why-fileinputstream-is-slow">earlier</a>
reads through FileInputStream were radically slower than I had expected. Hit a roadblock when I could not find the sources for <strong>SetByteArrayRegion()</strong>. Got the JDK7 sources to build locally, so went looking again - and finally found a mess of macros. A *partial* expansion of the SetByteArrayRegion() definition:</p>
<p>DT_VOID_RETURN_MARK_DECL(SetByteArrayRegion);</p>
<p>JNI_ENTRY(void, jni_SetByteArrayRegion(JNIEnv <em>env, jbyteArray array, jsize start, jsize len, const ElementType <em>buf))
JNIWrapper("SetByteArrayRegion");
DTRACE_PROBE5(hotspot_jni, SetByteArrayRegion__entry, env, array, start, len, buf);
DT_VOID_RETURN_MARK(SetByteArrayRegion);
typeArrayOop dst = typeArrayOop(JNIHandles::resolve_non_null(array));
if (start < 0 || len < 0 || ((unsigned int)start + (unsigned int)len > (unsigned int)dst->length())) {
THROW(vmSymbols::java_lang_ArrayIndexOutOfBoundsException());
} else {
if (len > 0) {
int sc = typeArrayKlass::cast(dst->klass())->log2_element_size();
memcpy((u_char</em>) dst->byte_at_addr(start),
(u_char</em>) buf,
len < < sc);
}
}
JNI_END</p>
<p>I <em>think</em> I know what this code is doing ... but no guarantees. Have to
admit to having serious doubts about this code. This sort of massive
macro expansion is more a characteristic of C code, not C++ code. Is
this really necessary? I cannot tell - without spending a lot more time.</p>
<p>Re-wrote the <strong>readBytes()</strong> function to something more sensible - a
single I/O call with no buffer allocation or copies.</p>
<p>int
readBytes(JNIEnv <em>env, jobject this, jbyteArray bytes,
jint off, jint len, jfieldID fid)
{
int nread, datalen;
jbyte</em> pBuffer;
FD fd;</p>
<p>if (IS_NULL(bytes)) {
JNU_ThrowNullPointerException(env, 0);
return -1;
}
datalen = (*env)->GetArrayLength(env, bytes);</p>
<p>if ((off < 0) || (off > datalen) ||
(len < 0) || ((off + len) > datalen) || ((off + len) < 0)) {
JNU_ThrowByName(env, "java/lang/IndexOutOfBoundsException", 0);
return -1;
}</p>
<p>if (len == 0) {
return 0;
}</p>
<p>fd = GET_FD(this, fid);
if (fd == -1) {
JNU_ThrowIOException(env, "Stream Closed");
return -1;
}</p>
<p>pBuffer = (*env)->GetByteArrayElements(env,bytes,0);
nread = IO_Read(fd, pBuffer+off, len);
(<em>env)->ReleaseByteArrayElements(env,bytes,pBuffer,0);
if (0 < nread) {
/</em> The read() is good <em>/
} else if (nread == JVM_IO_ERR) {
JNU_ThrowIOExceptionWithLastError(env, "Read error");
} else if (nread == JVM_IO_INTR) { /</em> EOF <em>/
JNU_ThrowByName(env, "java/io/InterruptedIOException", 0);
} else { /</em> EOF */
nread = -1;
}</p>
<p>return nread;
}</p>
<p>To measure the effect of the modified FileInputStream, first we need the
measure throughput with <strong>feed-workers</strong>:</p>
<p>preston@mercury:~/workspace/feed-workers$ time ./feed-workers -n 1 -r <code>which cat</code> logs/_3.5G > /dev/null
Sun Aug 17 23:30:29 2008
Scanning: logs/_3.5G
Done with: logs/_3.5G
Worker #12263 ended with status: 0
Sun Aug 17 23:32:00 2008
Elapsed (ms): 90235, total (MB): 3394
Scanned 37 MB/s</p>
<p>real 1m30.242s
user 0m0.848s
sys 0m11.437s</p>
<p>preston@mercury:~/workspace/feed-workers$ time ./feed-workers -n 1 -r <code>which cat</code> logs/_400MB logs/_400MB logs/_400MB logs/_400MB logs/_400MB logs/_400MB logs/_400MB logs/_400MB logs/_400MB logs/_400MB > /dev/null
Sun Aug 17 23:46:58 2008
Scanning: logs/_400MB
Done with: logs/_400MB
Scanning: logs/_400MB
Done with: logs/_400MB
Scanning: logs/_400MB
Done with: logs/_400MB
Scanning: logs/_400MB
Done with: logs/_400MB
Scanning: logs/_400MB
Done with: logs/_400MB
Scanning: logs/_400MB
Done with: logs/_400MB
Scanning: logs/_400MB
Done with: logs/_400MB
Scanning: logs/_400MB
Done with: logs/_400MB
Scanning: logs/_400MB
Done with: logs/_400MB
Scanning: logs/_400MB
Done with: logs/_400MB
Worker #13303 ended with status: 0
Sun Aug 17 23:47:02 2008
Elapsed (ms): 4337, total (MB): 4243
Scanned 978 MB/s</p>
<p>real 0m4.346s
user 0m0.384s
sys 0m3.932s</p>
<p>For this test machine, the C++ code manages <strong>37MB/s</strong> reading from
disk, and <strong>978MB/s</strong> reading cached file data. (The machine used for
the timings in this article is different from prior articles. The
differences make sense - this is a new laptop with a faster CPU and
slower disk.)</p>
<p>Running the prior Java file reader using FileInputStream against the
stock JDK7 build:</p>
<p>preston@mercury:~/workspace/wide-finder-j$ ~/sources/j2sdk-image.base/bin/java -version
openjdk version "1.7.0-internal"
OpenJDK Runtime Environment (build 1.7.0-internal-preston_2008_08_12_18_09-b00)
OpenJDK 64-Bit Server VM (build 14.0-b01, mixed mode)
preston@mercury:~/workspace/wide-finder-j$ ~/sources/j2sdk-image.base/bin/java -jar upload/wide-finder-j.jar logs/_400MB logs/_400MB
Wide Finder in Java</p>
<p>FILE /home/preston/workspace/wide-finder-j/logs/_400MB</p>
<p>Time for READ - to get file cache consistent
File: /home/preston/workspace/wide-finder-j/logs/_400MB
Size: 444945620
Read: 444945620
Time: 1760
Rate: 241 MB/s</p>
<p>Time for READ - for measure
File: /home/preston/workspace/wide-finder-j/logs/_400MB
Size: 444945620
Read: 444945620
Time: 1737>
Rate: 244 MB/s</p>
<p>FILE /home/preston/workspace/wide-finder-j/logs/_400MB</p>
<p>Time for READ - to get file cache consistent
File: /home/preston/workspace/wide-finder-j/logs/_400MB
Size: 444945620
Read: 444945620
Time: 1750
Rate: 242 MB/s</p>
<p>Time for READ - for measure
File: /home/preston/workspace/wide-finder-j/logs/_400MB
Size: 444945620
Read: 444945620
Time: 1741
Rate: 243 MB/s</p>
<p>Running the same Java code, but using the JDK7 build with the
FileInputStream using the modified <strong>readBytes()</strong>:</p>
<p>preston@mercury:~/workspace/wide-finder-j$ ~/sources/j2sdk-image.new/bin/java -jar upload/wide-finder-j.jar logs/_400MB logs/_400MB
Wide Finder in Java</p>
<p>FILE /home/preston/workspace/wide-finder-j/logs/_400MB</p>
<p>Time for READ - to get file cache consistent
File: /home/preston/workspace/wide-finder-j/logs/_400MB
Size: 444945620
Read: 444945620
Time: 1770
Rate: 239 MB/s</p>
<p>Time for READ - for measure
File: /home/preston/workspace/wide-finder-j/logs/_400MB
Size: 444945620
Read: 444945620
Time: 1734
Rate: 244 MB/s</p>
<p>FILE /home/preston/workspace/wide-finder-j/logs/_400MB</p>
<p>Time for READ - to get file cache consistent
File: /home/preston/workspace/wide-finder-j/logs/_400MB
Size: 444945620
Read: 444945620
Time: 1762
Rate: 240 MB/s</p>
<p>Time for READ - for measure
File: /home/preston/workspace/wide-finder-j/logs/_400MB
Size: 444945620
Read: 444945620
Time: 1734
Rate: 244 MB/s</p>
<p>Right. No difference? Odd - there must be something eating a <strong>lot</strong> of
CPU in the Java/JVM code. I'm not tooled up for profiling the Java/JVM
code, so ... not sure if I am will get to the bottom of this one.</p>
<p>The point of this exercise is that I believe the FileInputStream read()
code should - for large buffers - come very close to the performance of
C++ code. Something is knocking down the cached-file-data read rate for
Java code to about a fourth of C++ code. This is a good point to apply
profiling - and the block of time needed may be more than I am willing
to spend.</p>
Guilty as charged...2008-08-15T00:00:00Zhttps://bannister.us/weblog/2008/guilty-as-charged
<blockquote>
<p><a href="http://www.joelonsoftware.com/uibook/chapters/fog0000000064.html">User Interface Design for Programmers - Chapter 8</a>
Human aptitude tends towards the bell curve. Maybe 98% of your
customers are smart enough to use a television set. About 70% of them
can use Windows. 15% can use Linux. 1% can program. But only 0.1% of
them can program in a language like C++. And only 0.01% of them can
figure out Microsoft ATL programming. (And all of them, without
exception, have <a href="http://images.amazon.com/images/P/1861000111.01.LZZZZZZZ.gif">beards and glasses</a>.)</p>
</blockquote>
<p>The link points to this image:
<img src="http://images.amazon.com/images/P/1861000111.01.LZZZZZZZ.gif" alt="beards" /></p>
<p>Guilty as charged. :)
<img src="https://bannister.us/weblog/images/preston.jpg" alt="ouch" /></p>
Desktop design needs a kick in the pants2008-08-10T00:00:00Zhttps://bannister.us/weblog/2008/desktop-design-needs-a-kick-in-the-pants
<p>What is wrong with this picture?</p>
<p>[<img src="https://bannister.us/weblog/images/screenshot.png" alt="untitled" /></p>
<p>Don't get it? Try this version...</p>
<p>[<img src="https://bannister.us/weblog/images/screenshot-2.png" alt="untitled" /></p>
<p>Everything outside the text box, everything grayed out in the second
picture, is overhead. Wasted space. Pixels serving no purpose. Or very
little purpose at the moment. In the above example, 18% active, and 82%
overhead - not good. Even better? The text box is not fully on the
screen. Have to scroll to see it all. The currently most important
element is partly off-screen due to too much vertical clutter.</p>
<p>To be clear - I am not picking particularly on the coders of the web
application on screen. This design mistake is very, very, <em>very</em> common.</p>
<p>In an odd way the rise of HDTV makes the problem both permanent and
worse. Permanent as "widescreen" displays are from this point forward
going to be cheaper than other form-factors, due to sales volume. Worse
as the "widescreen" format is, well, wide rather than tall. Look at the
above pictures (or the screen in front of you) and you will see a pile
of conventional design elements that eat away chunks of vertical space,
while serving limited purpose.</p>
<p>Due to the price advantage, in a few years HDTV panels are going to
predominate in the workplace. We must adjust our design practices to
suit the new and most-common form factor.</p>
<p>The screenshot was taken from my 17-inch laptop screen - which is about
as big (or bigger) as is practical for a laptop. That's all there is
folks. You can get higher resolution, but cannot downsize fonts or UI
elements without making them hard to read/use.</p>
<p>Yes, I know there is always a crop of programmers that think tiny
6-point fonts are "kewl". Right. Walk past their office a week later,
and you will catch them <em>leaning in</em> so they can read the screen with
less effort. There is a good reason the world of print-on-paper uses 10
or 12 point fonts (or bigger) for anything they expect you to read.
Nothing shouts "clueless" quite so much as a user interface (desktop
application, web page, or whatever) with too-small text and interactive
design elements.</p>
<p>Which is what I saw rather a lot of when installing and trying alternate
window managers (this is on Linux). Too small design elements is too
common in that lot. Bit of a disappointment that, as the Windows
developers at Microsoft seem unfortunately clueless (if I had a penny
for every mis-click on a cascading popup ... that would be a lot).</p>
<p>Is Apple the only hope for something better, in the desktop GUI? Don't
know who else will make the effort.</p>
Google and Programming2008-08-05T00:00:00Zhttps://bannister.us/weblog/2008/google-and-programming
<p>In an odd way, Google is harmful to programmers.</p>
<p>To pick an example - look for examples of Java application/applet use.
What you find is a lot of poor or obsolete information. For a
programmer, how to filter out the (rare) good from the (often) bad is
not easily obvious. Google is ranking results by ... well I don't really
know Google's algorithm, but measures of popularity are clearly not good
measures of quality.</p>
<p>Java is also hurt by the lack of a single well-kept reference site
comparable to <a href="http://php.net/">php.net</a> for PHP users. Lacking a popular
common site, searching for Java information take you to quite a variety
of places, mostly not good.</p>
<p>The problem exists for any topic with a long history. Java gains from a
long period of relevance, but loses from a large amount of visible
material on the web offering not-very-good information. Javascript also
has a long history, and a large body of examples and hints that are not
good.</p>
<p>Quite unintentionally, Google favors newly-invented languages and
toolkits. Search for Ruby and web programming topics, and the results
you get back contain little obsolete information.</p>
<p>If you want programmers to get back current and relevant material, seems
you need to rename your language/toolkit/whatever every few years. :)</p>
Presidential candidates at the local mega-church2008-07-30T00:00:00Zhttps://bannister.us/weblog/2008/presidential-candidates-at-the-local-mega-church
<p>This is so very odd. Both presidential candidates are doing to appear,
on the same day, at the same place, for the first time, within walking
distance of my house.</p>
<blockquote>
<p><a href="http://saddlebackcivilforum.com/index.html">Saddleback Civil Forum</a>
This historic forum will be the only joint event for the two, and the
last public appearance for either candidate prior to the two-week
hiatus during each party’s national convention.</p>
<p>Due to Secret Service mandate, tickets will be required for the event
in the main auditorium, but the program will be broadcast live in
multiple venues on the Saddleback campus, as well as on several
national broadcast networks and online. It will also be streamed live
on www.SaddlebackCivilForum.com.</p>
</blockquote>
<p>The local Saddleback Church is an argument for taxing "church" property.
They rake in so much money that they can build the equivalent of a
"church" Disneyland. With so much money coming to so few people - I
suspect their owners are more interested in money than morality.</p>
<p>The odd bit here is that I <em>like</em> the idea of tax-exempt status for
small churches. When wealth is not a reason to head a local church, I
like the idea of making survival easier for local churches. About
mega-churches and franchise operations disguised as churches, I have
doubts.</p>
<p>I am an agnostic, which for me means I find religion a mostly-harmless
fantasy practiced by others. About the larger forms of "religious"
organizations ... I have doubts. Doubt enough to suspect some of those
larger outfits are the moral equivalent of <em>evil</em>.</p>
<p>Every Sunday they hold their sideshow, collect unholy amounts of money -
and this is the first common place where the Presidential candidates are
going to speak. Odd.</p>
Today's surprise - applet reload does not sandbox2008-07-29T00:00:00Zhttps://bannister.us/weblog/2008/todays-surprise-applet-reload-does-not-sandbox
<p>In retrospect I should not have been surprised - in either case.</p>
<p>Load an applet into Internet Explorer (version 7 in this case). Hit
"refresh" on the page from which the applet was loaded. Some classes
used by the applet have static initializers. Some of the static
initializers start threads. The threads are part of a thread group
associated with the first applet instance. On the first reload, all(?)
the threads in the first applet's group are terminated. Second instance
of the applet does not start the background threads, since the classes
(already) loaded think the background thread exists.</p>
<p>Right. Is this the right behavior? Sometimes. Maybe. My take? Not so
much.</p>
<p>Should the state of a re-loaded web page (though applets) share state
from the first load? Sometimes this is useful, but this <strong>always</strong> makes
the programmer's job more complicated. My preference - as with re-loaded
server-side web application - would be to share nothing (by default).</p>
<hr />
<p>On a related but distinct note - ran into a reason for Microsoft to
improve the shitty garbage collection in their Javascript interpreter.
My daughter provided the use-case. She is very fond of a site called
"Horseland". Her laptop (with 0.5GB memory) was running very slowly.
Found Internet Explorer are using 1.3GB of memory. Clearly her favored
site was using Javascript, but did not know how to avoid the problem
with Javascript in Internet Explorer.</p>
<p>There are a lot of second or third tier web sites that lack the skill to
work around the Microsoft Javascript problems. They are going to deploy
sites (sometimes quite popular) that - over time - perform very poorly
on Internet Explorer, and perform well on Firefox.</p>
<p>I had thought Microsoft was not likely to improve Javascript garbage
collection, given that all the first tier sites <strong>must</strong> write for
Internet Explorer. What I had not considered was the effect of the large
mass of second and third tier sites. For those sites, there is not the
skill to work around Microsoft's weakness. The net effect is a large
number of semi-skilled sites that over time perform better on Firefox
than on Internet Explorer.</p>
<p>Yes, there is a good mass-market reason for Microsoft to improve the
garbage collection in their implementation of Javascript.</p>
Linus is a bit of a jerk2008-07-19T00:00:00Zhttps://bannister.us/weblog/2008/linus-is-a-bit-of-a-jerk
<blockquote>
<p><a href="http://article.gmane.org/gmane.comp.version-control.git/57918">... from a somewhat emotional discussion
...</a>
C++ is a horrible language. It's made more horrible by the fact that
a lot of substandard programmers use it, to the point where it's much
much easier to generate total and utter crap with it. Quite frankly,
even if the choice of C were to do *nothing* but keep the C++
programmers out, that in itself would be a huge reason to use C.</p>
</blockquote>
<p>Apparently Linus is not a very good programmer - and by extension thinks
no one else could be - when using C++ as a tool.</p>
<p>Sounds familiar. Heard the same sort of rants out of ego-laden assembly
language programmers dismissing higher level languages (C or Pascal)
back in the early 1980's. Makes as little sense now as it did then.</p>
<p>C++ is an extension of C. In every way C is good, C++ is <strong>exactly</strong> as
good, and some large ways C++ is better. C++ is a dangerous language (as
is C), just as a knife is a dangerous tool. (I keep the knives in my
kitchen very, <em>very</em> sharp.) A mediocre programmer can write very bad
code in C++. A good programmer can write clean and hideously efficient
code in C++. For a good programmer C++ is <em>always</em> and without exception
a better tool than C.</p>
<blockquote>
<p>In other words: the choice of C is the only sane choice. I know Miles
Bader jokingly said "to piss you off", but it's actually true. I've
come to the conclusion that any programmer that would prefer the
project to be in C++ over C is likely a programmer that I
really *would* prefer to piss off, so that he doesn't come and screw
up any project I'm involved with.</p>
<p>C++ leads to really really bad design choices. You invariably start
using the "nice" library features of the language like STL and Boost
and other total and utter crap, that may "help" you program, but
causes:</p>
<ul>
<li>infinite amounts of pain when they don't work (and anybody who tells
me that STL and especially Boost are stable and portable is just so
full of BS that it's not even funny)</li>
<li>inefficient abstracted programming models where two years down the
road you notice that some abstraction wasn't very efficient, but now
all your code depends on all the nice object models around it, and you
cannot fix it without rewriting your app.</li>
</ul>
</blockquote>
<p>The last bit I will agree with somewhat. I played a bit with STL and
Boost - enough to form an opinion - but never in code that shipped to a
customer. Not so much that I am convinced either library is necessarily
bad, rather more that I am not convinced those big gobs of code are all
good enough for my purpose. Digging into the code for large libraries,
what I usually find is a mixed bag. Some of the code is quite good, but
not all.</p>
<p>I very often write my own string, list and hash classes - none of which
are difficult to write. There is very often some aspect of the problem
to be solved that benefits greatly from a tweaked implementation, and
the same end result is just not possible with a general purpose
implementation. Often I can re-use a bit of prior work, with adjustment
to fit the problem at hand.</p>
<p>There are parts of the C++ language which I do not consider well done.
Trying to throw new features into a language during the standardization
process is an amazingly bad idea - and the C++ standard is a good/bad
example. (In contrast I believe the Standard C folk did an outstanding
job.) Templates in particular do not seem well thought out. I <em>do</em> use
C++ templates, but seldom. Not really a problem - just use the good
bits.</p>
<p>There is another problem - excessive abstraction - common with C++ and
Java programmers. As a group, Java programmers are especially prone to
this excess. Note that I blame the programmers, not the language. There
is nothing in either language that <em>prevents</em> writing efficient and
clear code, but the ease of adding abstractions does make it possible
for an incautious programmer to build things more complex than they can
understand.</p>
<blockquote>
<p>In other words, the only way to do good, efficient, and system-level
and portable C++ ends up to limit yourself to all the things that are
basically available in C. And limiting your project to C means that
people don't screw that up, and also means that you get a lot of
programmers that do actually understand low-level issues and don't
screw things up with any idiotic "object model" crap.</p>
</blockquote>
<p>This is nonsense. The problem is with the programmers, not the language.</p>
<p>C++ is dangerous in the same way that a sharp knife is dangerous. Used
with insufficient skill or caution and you can do a lot more damage.
Used well and you can get a lot more done.</p>
<p>Now if Linus were to say that the skill levels among the large group of
Linux contributors is quite various, and not all are skilled enough (or
able to be managed) to produce good C++ code ... then he could have a
good point.</p>
<p>Along the same lines ... as a decoy I keep a block of gift knives (cheap
steel, serrated edges, not very sharp) in plain view on the counter in
the kitchen. The good hideously sharp knives are out of sight in a
drawer. A guest in the kitchen is going to grab the gift knives, and so
are somewhat less likely to get into trouble.</p>
Swing, Java, and old notions not yet met2008-07-16T00:00:00Zhttps://bannister.us/weblog/2008/swing-java-and-old-notions-not-yet-met
<p>Of late I find myself in rather a strange place.</p>
<p>What I work on pretty much follows whatever my present employer
currently needs. I've done pretty much everything - from device drivers
to fancy web applications - and by this time have touched pretty much
every major genre in programming. My starting interest in software came
from the rise of personal computers (beginning with the <a href="http://en.wikipedia.org/wiki/Intel_8008">Intel
8008</a> and contemporaries), and
a very strong belief in <a href="http://en.wikipedia.org/wiki/Graphical_user_interface">graphical user
interfaces</a> (take
<a href="http://en.wikipedia.org/wiki/Smalltalk">SmallTalk</a> as an early
example).</p>
<p>Right. The current generations of programmers cannot imagine a time
before small computers. The fact that there was once a time when
graphical user interfaces were revolutionary is similarly inconcievable.</p>
<p>This long base of experience has an advantage. I can remember the
original rationale for what now has become programming dogma. In some
cases, what is now convention no longer makes sense.</p>
<p>After spending a few years pushing the envelope on web applications, of
late I found myself sucked back into the realm of desktop (mostly) GUI
applications written in Java. Not entirely a bad thing as I was curious
what progress had been made in this area.</p>
<p>The Java library folk had an advantage in that when they started the
Windows and Apple Mac programming domains for the construction of GUI
applications were fairly well understood. At the same time they had the
disadvantage of relative inexperience - the folk working on the Java
libraries were young, and had not fully learned the lessons well-known
to experienced Windows and Mac developers. That lack made them prone to
a particular collection of mistakes.</p>
<p>In balance, you have to add in the fact that writing a cross-platform
GUI (Windows, Mac, X-Windows) is difficult. To find an implementation
path that does not over-serve any particular platform is ... a lot more
than tricky.</p>
<p>At the same time there are old ideas about what counts as good design -
in contrast to common practice - that remain outside most-common
practice.</p>
<p>How should I evaluate this?</p>
<p>Over the last several months I've taken a badly written Java desktop GUI
application, and re-written a huge fraction to remove problems. Along
the way I found missing bits in the Swing classes - or that I think are
missing - and am coding notions that are 10 or 20 years old. Maybe I'm
missing something. Maybe not.</p>
Looking for a good breakfast, found another Sysco restaurant instead.2008-07-06T00:00:00Zhttps://bannister.us/weblog/2008/looking-for-a-good-breakfast-found-another-sysco-restaurant-instead
<p>There is something odd going on in restaurant and fast food business.
Lots of places opening well-funded, with fancy decor and not very much
skill in the kitchen. As though there is a lot of money looking for a
place to invest, and not enough skilled help to make the investment
work.</p>
<p>This morning I was looking for a good place to eat breakfast. We don't
really have any good weekend breakfast places around here. The good
places I know of are not at all close, and usually <em>very</em> busy on the
weekends. For the record, the places I do know that are at least
somewhat local:</p>
<ul>
<li><a href="http://www.costamesaomeletteparlor.com/">Omelette Parlor</a> - very
nice breakfast (mostly omelettes) at very reasonable prices with
efficient service. More of a drive than I like, and much worse
during the summer beach-season months. Obscure location yet usually
a substantial wait on weekends. Never been disappointed in
twenty-odd years, and very much wish there was a place like this
closer.</li>
<li><a href="http://www.originalpancakehouse.com/">Original Pancake House</a> -
most excellent breakfast (mostly pancakes) with an impossibly long
wait on weekends. Have not been there in years (I do not like long
waits). Have driven past, saw long lines, and kept driving.</li>
<li><a href="http://www.bagelsandbrew.com/">Bagels and Brew</a> - decent bagels and
coffee. A short drive, but long lines on the weekend, and often no
good place to sit and eat. If you are not so much interested in a
high-carb breakfast, this is not so interesting.</li>
<li><a href="http://www.citruscafe.com/">Citrus Cafe</a> ... depends on the owner.
This place used to be called "Cookie's" and was very decent. Then
the place got a new owner, and went downhill. The prior owners
(Steve Tsirtsis and Steve Xenos) bought the place back (at a bargain
price, apparently), changed the name to "Citrus Cafe", and once
again the service and food was excellent. The same owners were also
was associated with the "Lakeview Cafe" and the <a href="http://www.citruscitygrille.com/">Citrus City
Grill</a> - and both were very good.
I visited Lakeview Cafe a couple months back, and could tell from
the food (not in a good way) that it had changed owners.</li>
<li><a href="http://www.rubys.com/">Ruby's Diner</a> ... this is a definite maybe.
Some Ruby's locations were consistently good, and others not. The
nearest Ruby's (in Rancho Santa Margarita) was always a
disappointment. I have not been to any lately to offer a
recommendation. For all I know the entire chain has gone downhill.
Worth a try, maybe.</li>
<li><a href="http://www.cocosbakery.com/">Coco's Bakery</a> ... another definite
maybe. Sometimes the local Coco's is very decent, and other times
... not so much. Used to live near an Irvine location that was very
good then went downhill. Lived near the Mission Viejo location,
which was then ... passable. The closest location now is in Laguna
Hills, that was not more than mediocre a decade ago, but seems to
have improved. Perhaps I should go there more often...</li>
</ul>
<p>Definite pattern here, as the good places all have more business than
they can handle, while dozens on nearby eating places are near empty. At
the same time, the good places are remarkably few. My guess is that the
difference in the end probably comes down to one or a couple guys ...
owner or operator ... that makes all the difference.</p>
<p>Looking for a new place to try, not too much of a drive from here. Went
on the Internet, and hit this site.</p>
<blockquote>
<p><a href="http://www.pacificwhey.com/menu.html">Pacific Whey Cafe</a>
We use only the highest quality and freshest ingredients to prepare
our made-to-order dishes. From our Organic Buckwheat Hotcakes to our
Pacific Cobb Sandwich on Fresh Artisan Bread to Filet Mignon over
Biscuits, we invite you to explore our savory offerings listed below.</p>
</blockquote>
<p>Sounded good so rounded up the kids and got into the car. On arrival was
not immediately impressed. The place was obviously very new, not too
heavily used (though there was a line at the time), and a bit baroque.
Ordered an omelet and a cafe mocha. The coffee drink was <em>far</em> too
sweet, and I drank only half before switching to water. The omelet came
with avocado, whole wheat bread, and fried potatoes. The omelet was
unimpressive - passable but my routine efforts are better. The avocado
was obviously the bland and watery Fuerte, or a picked-too-young
<a href="http://en.wikipedia.org/wiki/Hass_(avocado)">Hass</a> (my favorite - when
properly ripe). Both the bread and potatoes might have been good when
fresh, but were instead bland and stale.</p>
<p>Since my teenage son started working food-service jobs, he can often
identify ingredients as sourced from <a href="http://www.sysco.com/">Sysco</a>, and
even guess their place in the Sysco price list. Sysco is the largest
<a href="http://en.wikipedia.org/wiki/Foodservice_distributor">foodservice
distributor</a> in
North America, and supply most of the local eating places. By itself
there is nothing wrong with this. Some of the items offered by Sysco are
of good quality. But Sysco also offers for almost(?) every item a range
of similar choices of lesser cost and quality. For the owner of a
food-serving business, the temptation to shift down the Sysco price-list
to items of lesser cost (and quality) must be almost irresistible.</p>
<p>There is a rather odd pattern to all this.</p>
Why FileInputStream is slow.2008-06-22T00:00:00Zhttps://bannister.us/weblog/2008/why-fileinputstream-is-slow
<p>On my
<a href="https://bannister.us/weblog/2008/wide-finder-2-over-to-the-dark-side">first crack</a>
at a Java-based Wide Finder implementation, got a surprisingly slow result for using java.io.FileInputStream to read a file. Dug into the sources to track down the cause.</p>
<p>(Is there a better public-reference to the OpenJDK code than
<a href="http://hg.openjdk.java.net/">here</a>?)</p>
<p>First, the
<a href="http://hg.openjdk.java.net/jdk7/jdk7/jdk/file/0a5b87833562/src/share/classes/java/io/FileInputStream.java">FileInputStream Java class</a>
read() call turns into a native call to readBytes().</p>
<p>public int read(byte b[]) throws IOException {
return readBytes(b, 0, b.length);
}</p>
<p>private native int readBytes(byte b[], int off, int len) throws IOException;</p>
<p>Next, the
<a href="http://hg.openjdk.java.net/jdk7/jdk7/jdk/file/0a5b87833562/src/share/native/java/io/FileInputStream.c">FileInputStream native code</a>
bounces from the JNI function to a local <strong>readBytes</strong> function in
<a href="http://hg.openjdk.java.net/jdk7/jdk7/jdk/file/0a5b87833562/src/share/native/java/io/io_util.c">io_util.c</a>.</p>
<p>JNIEXPORT jint JNICALL
Java_java_io_FileInputStream_readBytes(JNIEnv *env, jobject this,
jbyteArray bytes, jint off, jint len) {
return readBytes(env, this, bytes, off, len, fis_fd);
}</p>
<p>/* The maximum size of a stack-allocated buffer.
*/
#define BUF_SIZE 8192</p>
<p>int
readBytes(JNIEnv *env, jobject this, jbyteArray bytes,
jint off, jint len, jfieldID fid)
{
int nread, datalen;
char stackBuf[BUF_SIZE];
char *buf = 0;
FD fd;</p>
<p>if (IS_NULL(bytes)) {
JNU_ThrowNullPointerException(env, 0);
return -1;
}
datalen = (*env)->GetArrayLength(env, bytes);</p>
<p>if ((off < 0) || (off > datalen) ||
(len < 0) || ((off + len) > datalen) || ((off + len) < 0)) {
JNU_ThrowByName(env, "java/lang/IndexOutOfBoundsException", 0);
return -1;
}</p>
<p>if (len == 0) {
return 0;
} else if (len > BUF_SIZE) {
buf = malloc(len);
if (buf == 0) {
JNU_ThrowOutOfMemoryError(env, 0);
return 0;
}
} else {
buf = stackBuf;
}</p>
<p>fd = GET_FD(this, fid);
if (fd == -1) {
JNU_ThrowIOException (env, "Stream Closed");
return -1;
}</p>
<p>nread = IO_Read(fd, buf, len);
if (nread > 0) {
(*env)->SetByteArrayRegion(env, bytes, off, nread, (jbyte <em>)buf);
} else if (nread == JVM_IO_ERR) {
JNU_ThrowIOExceptionWithLastError(env, "Read error");
} else if (nread == JVM_IO_INTR) { /</em> EOF <em>/
JNU_ThrowByName(env, "java/io/InterruptedIOException", 0);
} else { /</em> EOF */
nread = -1;
}</p>
<p>if (buf != stackBuf) {
free(buf);
}
return nread;
}</p>
<p>A couple bits in the above code of which I am not fond:</p>
<ol>
<li>The I/O operation does not read directly into the final buffer.</li>
<li>A temporary buffer is allocated off the C runtime heap for reads
bigger than 8192 bytes.</li>
</ol>
<p>The extra buffer copy is wasteful, but not a huge deal (given all the
call overhead we paid to get to this point). The dynamic allocation of
the temporary buffer is much more of a big deal. Heap allocations are
not free, and allocating a temporary buffer on <em>every</em> call to
<strong>java.io.FileInputStream.read(buffer)</strong> has got to cost something. Note
that there is also a risk of heap fragmentation (rare, but something I
have seen).</p>
<p>Ideally we would like to do the full I/O operation in one call directly
into the final buffer. My guess is that the extra copy is somehow
required (once?) by Java garbage collection. Wonder if this is in fact
required, or just an artifact of some earlier version?</p>
<p>Cannot seem to find the sources for <strong>SetByteArrayRegion</strong>. Must be
initialized <em>somewhere</em>...</p>
<p>At the very least, we want to drop the heap allocation, and get on the
"knee" of to I/O performance curve:</p>
<p>/* Use a buffer big enough to get close to the "knee" of the I/O curve. */
char buffer[32 * 1024];
int iRead = off;
int nWant = len;
int nRead;
for (;;) {
nRead = IO_Read(fd, buffer, (nWant < sizeof(buffer)) ? nWant : sizeof(buffer));
if (nRead <= 0) {
break;
}
(*env)->SetByteArrayRegion(env, bytes, iRead, nRead, (jbyte *)buffer);
iRead += nRead;
nWant -= nRead;
}</p>
<p>As a later exercise, will try building the JDK with the above change,
comparing performance to the stock JDK. Of course, what I would <em>really</em>
like to do is read directly into the Java <strong>byte</strong> array. Need to find
the implementation of <strong>SetByteArrayRegion</strong> first, to see what sort of
magic might be involved.</p>
<p>The baseline number measured on my local Linux x86 box and stock Java
1.6.0_06.</p>
<p>Wide Finder in Java</p>
<p>FILE /home/preston/workspace/wide-finder-j/logs/_400MB</p>
<p>Time for READ - to get file cache consistent
File: /home/preston/workspace/wide-finder-j/logs/_400MB
Size: 444945620
Read: 444945620
Time: 6833
Rate: 62 MB/s</p>
<p>Time for READ - for measure
File: /home/preston/workspace/wide-finder-j/logs/_400MB
Size: 444945620
Read: 444945620
Time: 6767
Rate: 62 MB/s</p>
<p>FILE /home/preston/workspace/wide-finder-j/logs/_3.5G</p>
<p>Time for READ - to get file cache consistent
File: /home/preston/workspace/wide-finder-j/logs/_3.5G
Size: 3559564960
Read: 3559564960
Time: 74856
Rate: 45 MB/s</p>
<p>Time for READ - for measure
File: /home/preston/workspace/wide-finder-j/logs/_3.5G
Size: 3559564960
Read: 3559564960
Time: 72839
Rate: 46 MB/s</p>
<p>Looks like the Java test program on this box can manage <strong>62M/s</strong> when
reading from cache (the first file is small enough to cache in memory),
and <strong>45Mb/s</strong> reading from disk.</p>
<p>For comparison the (roughly) equivalent C++ code clocks in at
<strong>332MB/s</strong> when reading from cache, and <strong>51MB/s</strong> reading from disk
(which we can assume is as fast as data can be read from this machine's
SATA disk).</p>
<p>Clearly we need more headroom in the Java I/O performance, to allow for
faster disks and slower CPUs.</p>
Wide Finder 2 - over to the dark side2008-06-18T00:00:00Zhttps://bannister.us/weblog/2008/wide-finder-2-over-to-the-dark-side
<p>My first solution for Tim Bray's <a href="http://www.tbray.org/ongoing/When/200x/2008/05/01/Wide-Finder-2">Wide Finder
2</a>
problem was aimed at ease of re-use before performance. Simple Perl
scripts (run in a large number of worker processes) did the bulk of the
processing.</p>
<p>Got my
<a href="https://bannister.us/weblog/2008/wide-finder-final-result">times</a>,
posted the <a href="http://wikis.sun.com/display/WideFinder/Results">results</a>,
and was going to leave it at that.</p>
<p>The damn problem got stuck in my head. Clearly a multi-threaded
shared-memory solution would be much more efficient. How would a more
specialized solution perform? Found I was thinking about the specialized
solution, how to minimize synchronization issues, and was curious how it
would perform.</p>
<p>My preference would be to use Java for a multi-threaded shared-memory
solution. I have not had cause to use Java for anything similar, so did
not know exactly what to expect. Turned out I was in for some surprises.</p>
<p>The first surprise was file I/O. Open a FileInputStream, loop on read()
passing a 1MB buffer each call ... and I only get ~32MB/s (from cache)
on the Sun test box. Not good. The native code <strong>feed-workers</strong> reader
manages ~124MB/s (from cache) and ~85MB/s (from disk) while piping
through <strong>cat</strong>. Java should manage about the same, but does not - am I
missing something?</p>
<p>The second surprise was byte to character transformation. Seems you have
to create a lot of garbage to do a simple UTF-8 to Unicode conversion.
The Java garbage collector may be pretty good, but better not to create
huge masses of garbage in the first place. Maybe I missed an API
somewhere? Wrote a simple buffer-to-buffer byte to character converter,
to stay away from large GC's. This sort of byte-bashing would be <strong>far
better</strong> in native code.</p>
<p>The third surprise was java.util.regex performance (or lack). Add in
regex matching, and suddenly we are down to ~1MB/s processing. Not just
a problem with performance - on one long input line regex processing
overflowed the Java stack! Ouch.</p>
<p>Not really a surprise - the standard Java general purpose hash tables
are not well suited for the required usage: adds and update, but no
deletes. Wrote a specialized hash table for which synchronization is
only needed on leaf nodes when doing an add (<em>very</em> little chance of one
thread blocking another). Still need to properly benchmark this bit.</p>
<p>The poor performance of Java regular expression processing was a
disappointment. (I think we have <a href="http://en.wikipedia.org/wiki/Henry_Spencer">Henry
Spencer</a> to blame ...
indirectly.) Found the <a href="http://tusker.org/regex/regex_benchmark.html">Java Regular expression library
benchmarks</a> interesting.
Sorting out the java.util.regex or better entries:</p>
<p>Regular expression library Time taken for 10,000 iterations</p>
<hr />
<p>java.util.regex.Pattern 1.4 609ms
<a href="http://jint.sourceforge.net/">kmy.regex.util.Regex 0.1.2</a> 468ms
<a href="http://www.karneim.com/jrexx/">com.karneim.util.collection.regex.Pattern1.1.1</a> 297ms
<a href="http://www.brics.dk/~amoeller/automaton/">dk.brics.automaton.RegExp1.7-1</a> 172ms</p>
<p>The results are a few years old, so timings may have changed. Also the
log parsing regex may benchmark differently. Any sort of definite
statement would require a benchmark.</p>
<p>The two fastest listed regular expression libraries:
<a href="http://www.brics.dk/~amoeller/automaton/">dk.brics.automaton</a> and
<a href="http://www.karneim.com/jrexx/">Jrexx
(com.karneim.util.collection.regex)</a>, do
matching only, no group extractions - and so are not useful for my
purpose. For the all the faster entries, documentation is sparse.</p>
<p>There is recent traffic among the JRuby folk about regex performance,
the upshot of which is the <a href="http://ola-bini.blogspot.com/2007/11/joni-merged-to-jruby-trunk.html">recent integration of
<strong>Joni</strong></a>
into JRuby. Without a proper benchmark, there is no way of knowing how
Joni compares, and the code is pretty much undocumented.</p>
<p>Regex processing can be spread over many concurrent threads, and is thus
less of a bottleneck. The worry is the poor single-thread file read
performance through FileInputStream. Hunted around the Internet looking
to see if anyone got better results. Pretty dismaying how much garbage
information is out there. Lots of programmers who think single-char
read() calls are a good idea (or small-buffer reads). Did not find any
substantially better results.</p>
<p>I expect the overhead for calling from Java to be a higher, but not
enough to matter when reading a megabyte in a single call. Somewhat
disappointed that no one has worked through the simple exercise of
allowing Java to process bulk data efficiently. Tempted to dig into the
Java sources - there must be something funky in the
FileInputStream.readBytes() native method.</p>
<p>From the test run with 32 thread threads scanning the log and updating
the hash table:</p>
<p>Time for - grok (32 workers)
File: /export/home/bannister/wfj/logs/O.10m
Size: 2029140422
Read: 2029140422
Time: 57216
Rate: 33 MB/s</p>
Wrapping up Wide Finder 22008-06-13T00:00:00Zhttps://bannister.us/weblog/2008/wrapping-up-wide-finder-2
<p>The main point of the Tim Bray's <a href="http://wikis.sun.com/display/WideFinder">Wide Finder
2</a> exercise was to solve a
common problem (processing web server logs files) in a way that took
full advantage of a large number of CPUs. As Sun is shipping machines
with many cores per chip, and as Tim works for Sun - he has good reason
to use his soapbox to take a public poke at the problem.</p>
<p>My approach to solving the <strong>Wide Finder</strong> problem is meant to be
re-useable. As such, I am not interested in exotic languages, or
solutions minutely specialized to this exact problem. I do not expect to
get the highest possible performance, but I do expect to get reasonably
close - close enough that the difference in runtime is not significant
compared to the programmer time saved through easy re-use and
adaptation.</p>
<p>Large log file processing is something I have done quite a lot of in the
past. Each time I tended to be looking for slightly different
information and correlations. In that sort of usage you want simple,
clearly written scripts that can be easily adapted to the present need.
My <a href="http://svn.bannister.us/public/wide-finder-1/">solution</a> to Tim's
problem is written for just that sort of usage.</p>
<p>Getting back to the original notion - just how does the benchmark
compare when run on the <a href="http://wikis.sun.com/display/WideFinder/Infrastructure">"wide" Sun
box</a> to a
generic x86 box? From the
<a href="https://bannister.us/weblog/2008/wide-finder-final-result">prior test</a>
got about 22MB/s running on the Sun box. My local x86 box (Athlon64 x2
4800) gets about 15MB/s. This is a bit unfair to x86 as the Sun box is
current generation, and my x86 box is a few years old. I would guess
that a current generation quad processor x86 box would more than double
the processing rate, and out-perform the Sun box by a fair margin.</p>
<p>In fact, this is not a bad showing for Sun. This particular solution to
the problem becomes much "fatter" (more CPU cycles used) when
distributed across many CPUs. For usage that can be more cheaply
distributed (like web serving) we could expect proportionately better
performance from the Sun box. A more specialized solution - with
multiple threads updating shared in-memory data - should perform better
on this problem, but would likely also prove harder to re-use (and less
interesting for my usage).</p>
<p>Upshot - for this sort of solution, the Sun box is not going to
out-perform an equivalent generation x86 box.</p>
<p>Prior "Wide Finder 2" articles:</p>
<ul>
<li><a href="https://bannister.us/weblog/2008/wide-finder-first-round">First round</a></li>
<li><a href="https://bannister.us/weblog/2008/wide-finder-combine-and-sort">Combine and sort</a></li>
<li><a href="https://bannister.us/weblog/2008/wide-finder-combine-for-top-n">Combine for top N</a></li>
<li><a href="https://bannister.us/weblog/2008/wide-finder-final-result">Final result</a></li>
</ul>
Wide finder - final result2008-06-12T00:00:00Zhttps://bannister.us/weblog/2008/wide-finder-final-result
<p><a href="https://bannister.us/weblog/2008/wrapping-up-wide-finder-2">[wrapup - added later]</a></p>
<p>From running my implementation of Tim Bray's
<a href="http://wikis.sun.com/display/WideFinder">Wide Finder 2</a> on the Sun test box.</p>
<p>bannister@wfind01$ time ./feed-workers -n 30 -r <code>which perl</code> -s scripts/reduce.pl logs/O.all |
time scripts/combine.pl > _x30_reduce_combine
Fri Jun 13 04:03:32 2008
Scanning: logs/O.all
Done with: logs/O.all
Worker #21875 ended with status: 0
Worker #21874 ended with status: 0
Worker #21873 ended with status: 0
Worker #21872 ended with status: 0
Worker #21871 ended with status: 0
Worker #21870 ended with status: 0
Worker #21869 ended with status: 0
Worker #21868 ended with status: 0
Worker #21867 ended with status: 0
Worker #21866 ended with status: 0
Worker #21865 ended with status: 0
Worker #21864 ended with status: 0
Worker #21863 ended with status: 0
Worker #21862 ended with status: 0
Worker #21861 ended with status: 0
Worker #21860 ended with status: 0
Worker #21859 ended with status: 0
Worker #21858 ended with status: 0
Worker #21857 ended with status: 0
Worker #21856 ended with status: 0
Worker #21855 ended with status: 0
Worker #21854 ended with status: 0
Worker #21853 ended with status: 0
Worker #21852 ended with status: 0
Worker #21851 ended with status: 0
Worker #21850 ended with status: 0
Worker #21849 ended with status: 0
Worker #21848 ended with status: 0
Worker #21847 ended with status: 0
Worker #21846 ended with status: 0
Fri Jun 13 04:36:03 2008
Elapsed (ms): 1950971, total (MB): 43178
Scanned 22 MB/s</p>
<p>real 34:06.9
user 10:32.7
sys 11.1</p>
<p>real 34m6.930s
user 609m12.577s
sys 12m33.298s</p>
<p>Total elapsed time was a bit over 34 minutes to process the full 45GB
log file.</p>
<p>The emphasis here is on a more general-purpose and re-useable solution,
rather than something over-specialized to this one example problem, as
described in
<a href="https://bannister.us/weblog/2008/wide-finder-first-round">the first round</a>.
Implementation in brief:</p>
<ol>
<li>The <a href="http://svn.bannister.us/public/wide-finder-1/">feed-workers</a>
process reads data from disk (at the fastest possible rate),
and writes the data to a specified number of child processes.</li>
<li>The
<a href="http://svn.bannister.us/public/wide-finder-1/scripts/reduce.pl">reduce</a>
process parses the log file and computes subtotals for the fields of
interest.
This is the heaviest processing, and is best suited for
distributing across many CPUs.</li>
<li>The
<a href="http://svn.bannister.us/public/wide-finder-1/scripts/combine.pl">combine</a>
process reads the <strong>reduce</strong> subtotals
and computes the final totals for each value of interest.</li>
</ol>
<p>If you wanted to adapt this "wide-finder" to another purpose, you need
only look at <strong>reduce</strong> and <strong>combine</strong>. Approximate line counts for
each component:</p>
<table width="auto">
<tr><th>lines</th><th>component</th><th>language
</th></tr><tr><td>349</td><td>feed-workers</td><td>C++
</td></tr><tr><td>24</td><td>reduce</td><td>Perl
</td></tr><tr><td>36</td><td>combine</td><td>Perl
</td></tr></table>
<p>Final result (that might even be correct):</p>
<p>Top 10 URIs by total response bytes
919814823566: /ongoing/ongoing.atom
393012328499: /ongoing/potd.png
297110748615: /ongoing/ongoing.rss
95967470509: /ongoing/rsslogo.jpg
70619295535: /ongoing/When/200x/2004/08/30/-big/IMGP0851.jpg
46373582976: /talks/php.de.pdf
43559176904: /ongoing/When/200x/2006/05/16/J1d0.mov
42428609673: /ongoing/When/200x/2007/12/14/Shonen-Knife.mov
38415215289: /ongoing/
35603054785: /ongoing/moss60.jpg</p>
<p>Top 10 URIs returning 404 (Not Found)
54271: /ongoing/ongoing.atom.xml
28030: /ongoing/ongoing.pie
27365: /ongoing/favicon.ico
26084: /ongoing/Browser-Market-Share.png
24631: /ongoing/When/200x/2004/04/27/-//W3C//DTD%20XHTML%201.1//EN
24078: /ongoing/Browsers-via-search.png
24004: /ongoing/Search-Engines.png
22637: /ongoing/ongoing.atom'
22619: //ongoing/ongoing.atom'
20587: /ongoing/Feeds.png</p>
<p>Top 10 URIs by hits on articles
614255: /ongoing/When/200x/2005/05/01/Hammer_sickle_clean.png
561720: /ongoing/When/200x/2003/07/17/noIE.gif
321873: /ongoing/When/200x/2004/12/12/-tn/Browser-Market-Share.png
252828: /ongoing/When/200x/2004/02/18/Bump.png
242520: /ongoing/When/200x/2004/12/12/-tn/Browsers-via-search.png
241340: /ongoing/When/200x/2004/12/12/-tn/Search-Engines.png
219569: /ongoing/When/200x/2003/09/18/NXML
204202: /ongoing/When/200x/2004/08/30/-big/IMGP0851.jpg
168652: /ongoing/When/200x/2003/03/16/XML-Prog
137457: /ongoing/When/200x/2006/03/30/IMG_4613.png</p>
<p>Top 10 client IPs by hits on articles
366634: msnbot.msn.com
192147: cmbg-cache-2.server.ntli.net
161867: crawler14.googlebot.com
145264: crawl-66-249-72-173.googlebot.com
132805: crawl-66-249-72-172.googlebot.com
131051: cmbg-cache-1.server.ntli.net
100298: crawl-66-249-72-72.googlebot.com
95580: wfp2.almaden.ibm.com
90831: sv-crawlfw3.looksmart.com
84546: crawler10.googlebot.com</p>
<p>Top 10 referrers by hits on articles
993394: http://www.google.com/reader/view/
243013: http://planet.xmlhack.com/
195861: http://tbray.org/ongoing/
194726: http://planetsun.org/
181280: http://planetjava.org/
158613: http://slashdot.org/
117228: http://www.chat.kg/
112469: http://planet.intertwingly.net/
89177: http://www.planetjava.org/
55593: http://www.bloglines.com/myblogs_display?all=1</p>
Wide finder - combine for top N2008-06-12T00:00:00Zhttps://bannister.us/weblog/2008/wide-finder-combine-for-top-n
<p><a href="https://bannister.us/weblog/2008/wrapping-up-wide-finder-2">[wrapup - added later]</a></p>
<p>As the
<a href="https://bannister.us/weblog/2008/wide-finder-combine-and-sort">last exercise</a>
showed, doing the full <strong>combine</strong> of all the reduced data was just too fat to get acceptable performance. This iteration is to re-write
<a href="http://svn.bannister.us/public/wide-finder-1/scripts/combine.pl">combine.pl</a>
to limit the amount of data retained to not much more than the final "top N" result.</p>
<p>The notion here is to only keep a sample of the largest values found,
adding to the sample only values above a minimum. When the pool of
samples grows too large, sort the sample values, and trim to just N (the
final number of samples), and choose the smallest as the new minimum
value. This keeps sort operations small, and few. The vast majority of
values (well over 99%) are rejected with a simple comparison, so this
pass is essentially O(N) and very cheap per value.</p>
<pre><code class="language-Perl"> sub sampleTop {
my ( $n, $kv ) = @_;
my $iLast = $n - 1;
my $nLimit = 100 + $n;
my $min = 0;
my @sample = ();
while ( my ( $k, $v ) = each(%$kv) ) {
next if $v < $min;
push( @sample, [ $v, $k ] );
next if ( scalar @sample ) < $nLimit;
@sample = sort { $b->[0] <=> $a->[0] } @sample;
$#sample = $iLast;
$min = $sample[$#sample]->[0];
}
@sample = sort { $b->[0] < => $a->[0] } @sample;
$#sample = $iLast;
return @sample;
}
</code></pre>
<p>Unfortunately, this step is necessarily a single process.</p>
<p>The single-process <strong>combine</strong> result and time for the full (reduced)
data on the Sun test box:</p>
<pre><code class="language-sh"> bannister@wfind01$ time scripts/combine.pl tmp/_reduce_only
Top 10 URIs by total response bytes
919814823566: /ongoing/ongoing.atom
393012328499: /ongoing/potd.png
297110748615: /ongoing/ongoing.rss
95967470509: /ongoing/rsslogo.jpg
70619295535: /ongoing/When/200x/2004/08/30/-big/IMGP0851.jpg
46373582976: /talks/php.de.pdf
43559176904: /ongoing/When/200x/2006/05/16/J1d0.mov
42428609673: /ongoing/When/200x/2007/12/14/Shonen-Knife.mov
38415215289: /ongoing/
35603054785: /ongoing/moss60.jpg
Top 10 URIs returning 404 (Not Found)
54271: /ongoing/ongoing.atom.xml
28030: /ongoing/ongoing.pie
27365: /ongoing/favicon.ico
26084: /ongoing/Browser-Market-Share.png
24631: /ongoing/When/200x/2004/04/27/-//W3C//DTD%20XHTML%201.1//EN
24078: /ongoing/Browsers-via-search.png
24004: /ongoing/Search-Engines.png
22637: /ongoing/ongoing.atom'
22619: //ongoing/ongoing.atom'
20587: /ongoing/Feeds.png
Top 10 URIs by hits on articles
614255: /ongoing/When/200x/2005/05/01/Hammer_sickle_clean.png
561720: /ongoing/When/200x/2003/07/17/noIE.gif
321873: /ongoing/When/200x/2004/12/12/-tn/Browser-Market-Share.png
252828: /ongoing/When/200x/2004/02/18/Bump.png
242520: /ongoing/When/200x/2004/12/12/-tn/Browsers-via-search.png
241340: /ongoing/When/200x/2004/12/12/-tn/Search-Engines.png
219569: /ongoing/When/200x/2003/09/18/NXML
204202: /ongoing/When/200x/2004/08/30/-big/IMGP0851.jpg
168652: /ongoing/When/200x/2003/03/16/XML-Prog
137457: /ongoing/When/200x/2006/03/30/IMG_4613.png
Top 10 client IPs by hits on articles
366634: msnbot.msn.com
192147: cmbg-cache-2.server.ntli.net
161867: crawler14.googlebot.com
145264: crawl-66-249-72-173.googlebot.com
132805: crawl-66-249-72-172.googlebot.com
131051: cmbg-cache-1.server.ntli.net
100298: crawl-66-249-72-72.googlebot.com
95580: wfp2.almaden.ibm.com
90831: sv-crawlfw3.looksmart.com
84546: crawler10.googlebot.com
Top 10 referrers by hits on articles
993394: http://www.google.com/reader/view/
243013: http://planet.xmlhack.com/
195861: http://tbray.org/ongoing/
194726: http://planetsun.org/
181280: http://planetjava.org/
158613: http://slashdot.org/
129256:
117228: http://www.chat.kg/
112469: http://planet.intertwingly.net/
89177: http://www.planetjava.org/
real 10m50.437s
user 10m32.404s
sys 0m17.107s
</code></pre>
<p>The above time may be slightly pessimistic, as there was some fairly
heavy processing (a gcc-build apparently) going on at the same time.
With so many CPUs there was no competition for CPU. There might have
been some competition for disk usage.</p>
<p>This same test took 3 minutes (elapsed) on my local x86 box - about a 3x
difference. Since the earlier test showed the <strong>reduce</strong> processing will
take ~28 minutes, the ~11 minutes taken by <strong>combine</strong> is reasonably
similar.</p>
<p>Good enough. On to the full test run... :)</p>
property.import task for Ant2008-06-11T00:00:00Zhttps://bannister.us/weblog/2008/propertyimport-task-for-ant
<p>I have Ant build scripts that can be run on either Windows or Linux.
There are a few properties that need to be set differently, depending on
the platform in use. Been using this little snippet for a while now.</p>
<p><strong>import.js</strong></p>
<pre><code class="language-js"> Array.prototype.map = function(f) {
var a = [];
for (var i=0; i<this.length; ++i) {
a.push(f(this[i],i));
}
return a;
};
Array.as = function(v) {
var a = [];
for (var i=0; i<v.length; ++i) {
a.push(v[i]);
}
return a;
}
var PROPERTY = (function(){
var t = {};
var _get = function(k) {
return project.getProperty(k);
};
t.get = _get;
t.verbose = function(n) {
n = 1 * n;
if (0 < n) {
t.get = function(k) {
var v = project.getProperty(k);
self.log("get " + k + " = " + v);
return v;
};
} else {
t.get = _get;
}
};
t.low = function(s) { var v = t.get(s); return v && v.toLowerCase(); };
var os_name = t.low("os.name");
var user_name = t.low("user.name");
if (os_name.match(/^windows/)) {
os_name = "win32";
}
t.byUser = function(s) {
return t.get(s + "." + user_name);
};
t.byOS = function(s) {
return t.get(s + "." + os_name);
};
t.byPlatform = function(s) {
return t.get(s + "." + os_name + "." + user_name);
};
t.pick = function() {
return Array.as(arguments).map(function(k){
var v = t.get(k) || t.byPlatform(k) || t.byUser(k) || t.byOS(k);
project.setProperty(k,v);
self.log("set " + k + " = " + v);
return v;
});
};
return t;
})();
PROPERTY.verbose(attributes.get("verbose"));
PROPERTY.pick(attributes.get("name"));
</code></pre>
<p>Task definition from Ant build file:</p>
<pre><code class="language-XML"> <scriptdef
name = "property.import"
language = "javascript"
src = "import.js"
>
<attribute name="name" />
<attribute name="verbose" />
</scriptdef>
</code></pre>
<p>Example contents of <strong>build.properties</strong>:</p>
<pre><code> nsis.home.win32=c:/Program Files/NSIS
launch4j.home.win32=c:/tools/launch4j
launch4j.home.linux=${user.home}/tools/launch4j
</code></pre>
<p>Usage is simple:</p>
<pre><code class="language-XML"> <property.import
name = "launch4j.home"
verbose = "0"
/>
</code></pre>
<p>The <strong>property.import</strong> task looks for variants of the named property
suffixed with <strong>user.name</strong>, <strong>os.name</strong> or both. For the above import
of <strong>launch4j.home</strong> the <strong>property.import</strong> task when run by user
"preston" on Windows gets the value from the first of:</p>
<pre><code> launch4j.home.win32.preston
launch4j.home.win32
launch4j.home.preston
</code></pre>
<p>This allows checkin of <strong>build.properties</strong> while picking up appropriate
per-user and per-platform property values when run.</p>
Wide finder - combine and sort2008-06-10T00:00:00Zhttps://bannister.us/weblog/2008/wide-finder-combine-and-sort
<p><a href="https://bannister.us/weblog/2008/wrapping-up-wide-finder-2">[wrapup - added later]</a></p>
<p>Took another crack at the <strong>combine</strong> process for my <a href="http://svn.bannister.us/public/wide-finder-1">implementation of
wide finder</a>. My theme is
to try and come up with the something easily re-used and re-purposed,
rather than the fastest possible specialized solution. The first round
used the generic Perl <strong>sort</strong> operation, with an inline (two key) sort
function. For small sizes the built-in Perl <strong>sort</strong> works well. When
fed the full 45GB example data and attempting to sort the counts of
client IPs - between a large memory footprint and a too-slow sort - for
data that large Perl's <strong>sort</strong> is not the right solution.</p>
<p>Tried the old trick of transforming multiple keys into a single key for
sorting. Back in the 1980's the problem I occasionally faced was how to
efficiently sort data extracted from large sets of log files. The Unix
<strong>sort</strong> command was (and is) pretty efficient, but the data was often
not in a form <strong>sort</strong> could handle. On Unix the answer was simple - use
<strong>awk</strong> and/or <strong>sed</strong> to re-shape the data to be fed into <strong>sort</strong>.
Seemed like a pretty obvious approach at the time. Seems very unlikely I
was the first to use a transform to turn awkward and/or multi-key data
into a single-key sortable form.</p>
<p>This was long before the first version of Perl was posted to USENET.
Funny thing - someone wrote a paper on <a href="http://www.sysarch.com/Perl/sort_paper.html">"efficient Perl
sorting"</a>. Funny because
this "new" approach is rather familiar.</p>
<p>Tried and discarded a transformed-to-single-key variant for Perl
<strong>sort</strong> - as it did not perform well.</p>
<p>The data to be sorted for problems like the <a href="http://wikis.sun.com/display/WideFinder/The+Benchmark">wide finder
exercise</a> can be
large enough to often-but-not-always fit in memory. Counting on an
in-memory sort makes me uncomfortable (keeping to the "general purpose"
meme). Perhaps better to use the Unix <strong>sort</strong> command. The Unix
<strong>sort</strong> command does a smart disk-based sort-merge for large data, and
is quite lean in it's use of memory. Also, we can pick up a small amount
of concurrent execution by piping from <strong>combine</strong> to <strong>sort</strong>.</p>
<p>The relevant code from
<a href="http://svn.bannister.us/public/wide-finder-1/scripts/combine.pl">combine</a>
(which may change later):</p>
<pre><code class="language-Perl"> sub processSection {
my ($c,$kv) = @_;
local *OUT;
open( OUT, "| sort -k 2nr,2 -k 3 | head -n 10" )
or die "Cannot sort results!\n";
while ( my ( $k, $v ) = each(%{$kv}) ) {
print OUT $c . " " . $v . " " . $k . "\n";
}
close OUT;
}
while ( my ( $c, $kv ) = each %v ) {
processSection($c,$kv);
}
</code></pre>
<p>Got acceptable (though not inspiring) times on an x86 box, so ran the
already-reduced data through <strong>combine</strong> on the Sun box.</p>
<pre><code class="language-sh"> bannister@wfind01$ time scripts/combine.pl tmp/_reduce_only
H 614255 /ongoing/When/200x/2005/05/01/Hammer_sickle_clean.png
H 561720 /ongoing/When/200x/2003/07/17/noIE.gif
H 321873 /ongoing/When/200x/2004/12/12/-tn/Browser-Market-Share.png
H 252828 /ongoing/When/200x/2004/02/18/Bump.png
H 242520 /ongoing/When/200x/2004/12/12/-tn/Browsers-via-search.png
H 241340 /ongoing/When/200x/2004/12/12/-tn/Search-Engines.png
H 219569 /ongoing/When/200x/2003/09/18/NXML
H 204202 /ongoing/When/200x/2004/08/30/-big/IMGP0851.jpg
H 168652 /ongoing/When/200x/2003/03/16/XML-Prog
H 137457 /ongoing/When/200x/2006/03/30/IMG_4613.png
N 54271 /ongoing/ongoing.atom.xml
N 28030 /ongoing/ongoing.pie
N 27365 /ongoing/favicon.ico
N 26084 /ongoing/Browser-Market-Share.png
N 24631 /ongoing/When/200x/2004/04/27/-//W3C//DTD%20XHTML%201.1//EN
N 24078 /ongoing/Browsers-via-search.png
N 24004 /ongoing/Search-Engines.png
N 22637 /ongoing/ongoing.atom'
N 22619 //ongoing/ongoing.atom'
N 20587 /ongoing/Feeds.png
R 993394 http://www.google.com/reader/view/
R 243013 http://planet.xmlhack.com/
R 195861 http://tbray.org/ongoing/
R 194726 http://planetsun.org/
R 181280 http://planetjava.org/
R 158613 http://slashdot.org/
R 129256
R 117228 http://www.chat.kg/
R 112469 http://planet.intertwingly.net/
R 89177 http://www.planetjava.org/
I 366634 msnbot.msn.com
I 192147 cmbg-cache-2.server.ntli.net
I 161867 crawler14.googlebot.com
I 145264 crawl-66-249-72-173.googlebot.com
I 132805 crawl-66-249-72-172.googlebot.com
I 131051 cmbg-cache-1.server.ntli.net
I 100298 crawl-66-249-72-72.googlebot.com
I 95580 wfp2.almaden.ibm.com
I 90831 sv-crawlfw3.looksmart.com
I 84546 crawler10.googlebot.com
B 919814823566 /ongoing/ongoing.atom
B 393012328499 /ongoing/potd.png
B 297110748615 /ongoing/ongoing.rss
B 95967470509 /ongoing/rsslogo.jpg
B 70619295535 /ongoing/When/200x/2004/08/30/-big/IMGP0851.jpg
B 46373582976 /talks/php.de.pdf
B 43559176904 /ongoing/When/200x/2006/05/16/J1d0.mov
B 42428609673 /ongoing/When/200x/2007/12/14/Shonen-Knife.mov
B 38415215289 /ongoing/
B 35603054785 /ongoing/moss60.jpg
real 79m59.721s
user 82m9.882s
sys 0m42.510s
</code></pre>
<p>Given the same run completed in under 7 minutes on my x86 box, the lack
of concurrency and slower Sun CPU is not(!) working in our favor. Not
sure why this came in so slow (I doubt the Sun chip is in general the
10x slower this seems to show), but clearly performance is too far in
the wrong direction.</p>
<p>So much for general purpose - we need to specialize <strong>combine</strong> for
better performance. :)</p>
<p>As an aside, I tried a using <strong>fork()</strong> to run the <strong>sort</strong> for each
section of the report in parallel. Given that the client IP count data
is much larger than the data for the other sections, for this problem
the gain would not be great, but at least we would get a bit more
concurrency. The Perl code to process each report section in a child
process:</p>
<pre><code class="language-Perl"> sub forkWorker {
return unless 0 == fork;
processSection(@_);
exit;
}
while ( my ( $c, $kv ) = each %v ) {
forkWorker($c,$kv);
}
</code></pre>
<p>Oddly enough this did not work on either Linux or Solaris. I was
counting on copy-on-write <strong>fork()</strong> to keep the physical memory use of
each Perl child process quite small. On my Linux box (with 3GB real
memory), execution slowed to a crawl as the disk chattered away madly.
Seems Linux does not do copy-on-write. I expected better from Solaris,
but instead got:</p>
<pre><code> bannister@wfind01$ time scripts/combine.pl tmp/_reduce_only
Cannot sort results!
[snip]
</code></pre>
<p>Oh well ... this wasn't going to get the performance we wanted in any
case ...</p>
<p>Next iteration will have to specialize <strong>combine</strong> for the "top 10"
nature of this problem. Will have to limit the size of the data sorted
to get acceptable (and reliable) performance.</p>
<p>Prior:
<a href="https://bannister.us/weblog/2008/wide-finder-first-round">Wide finder - first round</a></p>
Wide finder - first round2008-06-08T00:00:00Zhttps://bannister.us/weblog/2008/wide-finder-first-round
<p><a href="https://bannister.us/weblog/2008/wrapping-up-wide-finder-2">[wrapup - added later]</a></p>
<p>Took my
<a href="http://svn.bannister.us/public/wide-finder-1">feed-workers</a>
tool from
<a href="https://bannister.us/weblog/2007/wrapping-up-wide-finder">my example</a>
of solving the
<a href="http://www.tbray.org/ongoing/When/200x/2007/09/20/Wide-Finder">prior wide-finder</a>
exercise, and updated the
<a href="http://svn.bannister.us/public/wide-finder-1/scripts">scripts</a> to
match(?) the new
<a href="http://wikis.sun.com/display/WideFinder/The+Benchmark">strawman</a>
wide-finder benchmark. Updated the scripts over the weekend (yes, I'm
sufficiently warped to find this sort of exercise amusing). Got onto the
Sun 32-CPU box on Tuesday, and did some full scale runs on the 45GB
data. Caught a couple minor bugs on my part, and got results mostly in
line with my expectations, with one major exception.</p>
<p>Note that my aim here is not to get the fastest possible time, or to
illustrate the use of some new exotic programming language or technique.
Rather I am interested in using the simplest possible general purpose
tool (<strong>feed-workers</strong>) in combination with commonly available Unix
tools (Perl in this instance) to solve the problem in the least
programmer time while taking advantage of a large number of available
CPUs (as in the <a href="http://wikis.sun.com/display/WideFinder/Infrastructure">Sun Fire T2000
box</a>). Note that
the <strong>reduce</strong> process fully parses each line of the log - no shortcuts
assuming log lines are space-delimited - which means the script can
easily be re-used for other log-scanning tasks (and should be dead easy
to read and modify).</p>
<p>Counting the (approximate) lines of <strong>feed-workers</strong> code:</p>
<pre><code class="language-sh"> $ cat *.cpp *.h | tr -cd ';}' | wc -c
349
</code></pre>
<p>Counting the lines of one-pass <strong>report</strong> Perl code:</p>
<pre><code class="language-sh"> $ tr -cd ';' < scripts/report.pl | wc -c
23
</code></pre>
<p>Counting the lines of <strong>reduce</strong> Perl code:</p>
<pre><code class="language-sh"> $ tr -cd ';' < scripts/reduce.pl | wc -c
23
</code></pre>
<p>Counting the lines of <strong>combine</strong> Perl code:</p>
<pre><code class="language-sh"> $ tr -cd ';' < scripts/combine.pl | wc -c
29
</code></pre>
<p>Once written, you never have to look at the sources for <strong>feed-workers</strong>
again. When changing the log scanner you need only read <strong>reduce</strong> and
<strong>combine</strong>, each of which are amounts only to a rather sparse page of
code - thus easy to modify and easy to re-use.</p>
<p>In the first set of measurements I was interested in CPU usage, not I/O
speed, so I made sure the input files were cached in memory before
collecting times. I also did more than one run for each test, just to
verify that times were consistent (as they were).</p>
<p>First run - single process Perl script processing a small (100K line)
log file.</p>
<pre><code class="language-sh"> bannister@wfind01$ time scripts/report.pl logs/O.100k > _report
real 0m13.767s
user 0m13.656s
sys 0m0.108s
</code></pre>
<p>Next, split the Perl script into two scripts. The first reduces the data
to a smaller form, and the second generates a report from the reduced
form. We are using two CPUs here, but we get slightly slower
performance - and this makes sense. The <strong>reduce</strong> script only generates
output after completely processing the input, so the two processes are
essentially sequential. The generation and consumption of the
intermediate (reduced) form should cost us a little, and it does.</p>
<p>First we time the <strong>reduce</strong> script:</p>
<pre><code class="language-sh"> bannister@wfind01$ time scripts/reduce.pl logs/O.100k | scripts/combine.pl > _reduce_combine
real 0m14.584s
user 0m14.552s
sys 0m0.125s
</code></pre>
<p>Next we time the <strong>combine</strong> script:</p>
<pre><code class="language-sh"> bannister@wfind01$ scripts/reduce.pl logs/O.100k | time scripts/combine.pl > _reduce_combine
real 14.5
user 1.3
sys 0.0
</code></pre>
<p>As expected, the majority of the processing is in the <strong>reduce</strong> script,
and the time needed for the <strong>combine</strong> script is small.</p>
<p>Note that splitting the original script into two scripts requires the
generation and consumption of an intermediate form, but both scripts are
still quite short. If you have spent a considerable amount of time
analyzing large log files (as have I) then this is a common technique
used, not for performance, but to break a complex transformation into
more manageable chunks.</p>
<p>Put simply, if you do this sort of work, the approach used here should
be familiar.</p>
<p>Next, use the same two scripts as the prior run, but invoke the first
via <strong>feed-workers</strong>. There are three active processes now, but we
expect and get pretty much the same times as the prior test.</p>
<pre><code class="language-sh"> bannister@wfind01$ time ./feed-workers -n 1 -r `which perl` -s scripts/reduce.pl logs/O.100k |
scripts/combine.pl > _feed_x1_reduce_combine
Tue Jun 3 01:28:50 2008
Scanning: logs/O.100k
real 0m13.241s
user 0m12.547s
sys 0m0.402s
</code></pre>
<p>Up to this point we really have not used more than one CPU. The prior
measurements were to give us a baseline, and to show the processing load
was in line with expectations. Now we want to show the effect of
spreading out the heavy <strong>reduce</strong> processing over a greater number of
CPUs.</p>
<p>Times for <strong>reduce</strong> processing on 4 worker processes:</p>
<pre><code class="language-sh"> bannister@wfind01$ time ./feed-workers -n 4 -r `which perl` -s scripts/reduce.pl logs/O.100k |
scripts/combine.pl > _feed_x4_reduce_combine
Tue Jun 3 01:30:16 2008
Scanning: logs/O.100k
real 0m5.046s
user 0m13.063s
sys 0m0.408s
</code></pre>
<p>Times for <strong>reduce</strong> processing on 10 worker processes:</p>
<pre><code class="language-sh"> bannister@wfind01$ time ./feed-workers -n 10 -r `which perl` -s scripts/reduce.pl logs/O.100k |
scripts/combine.pl > _feed_x10_reduce_combine
Tue Jun 3 01:31:08 2008
Scanning: logs/O.100k
real 0m3.669s
user 0m14.378s
sys 0m0.535s
</code></pre>
<p>Times for <strong>reduce</strong> processing on 20 worker processes:</p>
<pre><code class="language-sh"> bannister@wfind01$ time ./feed-workers -n 20 -r `which perl` -s scripts/reduce.pl logs/O.100k |
scripts/combine.pl > _feed_x20_reduce_combine
Tue Jun 3 01:31:46 2008
Scanning: logs/O.100k
real 0m3.322s
user 0m17.300s
sys 0m0.747s
</code></pre>
<p>Times for <strong>reduce</strong> processing on 30 worker processes:</p>
<pre><code class="language-sh"> bannister@wfind01$ time ./feed-workers -n 30 -r `which perl` -s scripts/reduce.pl logs/O.100k |
scripts/combine.pl > _feed_x30_reduce_combine
Tue Jun 3 01:32:16 2008
Scanning: logs/O.100k
real 0m3.086s
user 0m20.378s
sys 0m0.997s
</code></pre>
<p>Times for <strong>reduce</strong> processing on 40 worker processes:</p>
<pre><code class="language-sh"> bannister@wfind01$ time ./feed-workers -n 40 -r `which perl` -s scripts/reduce.pl logs/O.100k |
scripts/combine.pl > _feed_x40_reduce_combine
Tue Jun 3 01:32:47 2008
Scanning: logs/O.100k
real 0m3.090s
user 0m21.265s
sys 0m1.250s
</code></pre>
<p>Times for <strong>reduce</strong> processing on 50 worker processes:</p>
<pre><code class="language-sh"> bannister@wfind01$ time ./feed-workers -n 50 -r `which perl` -s scripts/reduce.pl logs/O.100k |
scripts/combine.pl > _feed_x50_reduce_combine
Tue Jun 3 01:33:27 2008
Scanning: logs/O.100k
real 0m3.140s
user 0m21.528s
sys 0m1.459s
</code></pre>
<p>To be honest I was not exactly sure what sort of result we would get for
the above on a <a href="http://www.sun.com/servers/coolthreads/t2000/">Sun Fire
T2000</a>. Sun claims the
single-chip <a href="http://www.sun.com/processors/UltraSPARC-T1/index.xml">UltraSPARC T1
processor</a>
contains 8 cores and supports 32 threads. That might mean 32 active
threads in a multi-threaded application like Java, but what does it mean
for a multi-process application? Guess we have an answer. :)</p>
<p>The above is pretty much exactly what you might expect. We get large
improvements in elapsed time spreading the processing over 4 and 10
CPUs, and smaller improvements up to 30 CPUs. As the number of CPUs used
increases, the amount of "wasted" processing also increases (as
reflected in the "user" times). Elapsed times are slightly worse for 40
and 50 <strong>reduce</strong> processes - past the number of "threads" supported by
the 32-way UltraSPARC T1.</p>
<p>Upshot: scaling the number of CPUs used improves elapsed time up to the
number of physical CPUs, netting about a 3x overall speedup (for this
problem) over the original single-process version. (Remember to add in
the ~1.3 seconds needed for the <strong>combine</strong> processing, which is
largely sequential to the <strong>reduce</strong> processing.)</p>
<p>Note also that for larger input data we might expect the overhead for
many-processes to matter less. For the above 100K line input, we are
very much into diminishing returns above 10-way replication on
<strong>reduce</strong>.</p>
<p>The above is all about distributing the same problem over a varying
number of processors. The next set of tests is about increasing the
amount of data processed.</p>
<p>Bumping the amount of data processed from 100 thousand to 1 million
lines, we get:</p>
<pre><code class="language-sh"> bannister@wfind01$ time ./feed-workers -n 30 -r `which perl` -s scripts/reduce.pl logs/O.1m |
scripts/combine.pl > _x30_1m
Tue Jun 3 01:35:10 2008
Scanning: logs/O.1m
real 0m21.246s
user 3m5.751s
sys 0m4.180s
</code></pre>
<p>Elapsed time for <strong>reduce</strong> processing with 10x data takes only 7x as
long. This makes sense as the overhead for the startup of a larger
number of processes gets amortized over a longer run for each
sub-process. Looks good thus far, so tried the full data set...</p>
<pre><code class="language-sh"> bannister@wfind01$ time ./feed-workers -n 30 -r `which perl` -s scripts/reduce.pl logs/O.all |
scripts/combine.pl > _reduce_all
Tue Jun 3 21:34:20 2008
Scanning: logs/O.all
... manually aborted ...
</code></pre>
<p>I had to manually abort this test run. The multi-process <strong>reduce</strong>
processing was complete, but the <strong>combine</strong> processing was running ...
and running ... and running ....... so apparently something in
<strong>combine</strong> was not scaling well to large data sets. Something to
address in the next iteration.</p>
<p>Measured just the <strong>reduce</strong> processing on the full data set:</p>
<pre><code class="language-sh"> $ time ./feed-workers -n 30 -r `which perl` -s scripts/reduce.pl logs/O.all > _reduce_all
Tue Jun 3 21:34:20 2008
Scanning: logs/O.all
Tue Jun 3 22:02:00 2008
Elapsed (ms): 1660139, total (MB): 43178
Scanned 26 MB/s
real 27m40.180s
user 597m45.533s
sys 12m1.064s
</code></pre>
<p>Note that the input data is no longer cached in memory for the full data
set, so the processing rate now includes the time needed for reading the
data off physical disk. Clearly the <strong>reduce</strong> processing is nicely
distributable across multiple processes (and CPUs).</p>
<p>Object of the next iteration will be to find where <strong>combine</strong>
processing is expensive.</p>
Sun and tools2008-06-07T00:00:00Zhttps://bannister.us/weblog/2008/sun-and-tools
<p>Sun has a problem, and it is not a small one.</p>
<p>I had a bit of free time last Tuesday, so I took a poke at the
<a href="http://www.tbray.org/ongoing/When/200x/2008/05/01/Wide-Finder-2">wide-finder</a>
benchmark. (Took the day off work to host the local polling place, and
voter turnout was very light.) The test machine is a 32-CPU Sun box
running Solaris 10.</p>
<p>Did have a small off-by-one bug in my code, and got a core dump. Core
dumps ... right ... I used to use these quite a lot ... about 15-20
years ago. Been a long time since I've used a command line debugger on
Unix. What is the name of the debugger? Oh, right - <strong>adb</strong> and
<strong>mdb</strong> - I used to be quite proficient using these, but ... I have
pretty much zero interest in re-learning these old tools.</p>
<p>Bit of a pain when you cannot use the tools to which you are accustomed.</p>
<p>I switch quite a lot between Windows and desktop Linux when writing and
testing new code. Both environments I have used for a long time, and I
am entirely comfortable in both - through I tend to prefer the shell and
tool chain under Linux.</p>
<p>Under Solaris I ran across a number of small irritations.</p>
<p>Checking free space, typed: "ps -Pm". Nope. OK, I can kind'a understand
not changing "ps" <strong>if</strong> there are any backwards compatibility problems
with old scripts. Not that I'm overly sympathetic.</p>
<p>Fired up "top" to monitor process activity. Since "top" was around for
old BSD machines (yes, I have been around that long), and "top" is not
so much used in shell scripts, I was expecting a pretty current version.
But on Solaris "top" is dumb compared to Linux. No auto-size the list of
processes to fit the terminal. No per-CPU status. Maybe there is some
other command on Solaris to do the same thing, but I do not want to go
digging around to find what should be at my fingertips.</p>
<p>Add a dozen or so minor other instances where I issued a command, and
Solaris said "Huh??", then the need to re-learn an old debugger (that I
might never use again) ... and I quit ... at least for a while.</p>
<p>Sun has a problem.</p>
<p>For their existing group of long-term customers, they need to maintain
backwards compatibility, and that means not upgrading existing commands
in any way that might break existing shell scripts. For existing and
potential new customers who have become accustomed to the GNU and usual
Linux tool vocabulary, trying to use Solaris is a royal pain in the ass.</p>
<p>This is a shame as the stuff done in Solaris beneath the layer of tools
is pretty damn impressive.</p>
<p>Something rather odd about all this. Long ago - when my day job was
working on Unix - for the universe of tools flowing by on USENET, the
Sun systems were the golden standard. If a new piece of software was
buildable anywhere, it probably was buildable on Sun. By in large, if
you had a Sun box (and I did only briefly), then things pretty much just
worked.</p>
<p>The problem is quite solvable. Disk space is cheap, and keeping both
old-Sun and current-common tools on disk is a bit of PATH setup, but
little more. (Without over-complicating the "man" pages, please.) There
is some effort to distribute current-common tools, but I am not sure
this is exactly mainstream from Sun's point of view.</p>
<p>Wonder if someone at Sun has a plan ... :)</p>
Received a Microsoft Office XML document...2008-06-01T00:00:00Zhttps://bannister.us/weblog/2008/received-a-microsoft-office-xml-document
<p>... and can't do a thing with it.</p>
<p>Right. Missed the kind-of-obvious. All those non-Microsoft applications
that learned to read the old proprietary Microsoft formats are now back
to square zero. Need to read a Microsoft document - in the new
supposedly "open" formats from Microsoft? Since the only implementation
is in Microsoft Office, you are (once again) forced into buying a
Microsoft product.</p>
<p>Or not. I sent the unreadable document back ...</p>
Reality check2008-06-01T00:00:00Zhttps://bannister.us/weblog/2008/reality-check
<p><a href="http://www.flickr.com/photos/scroggin/2078365748/" title="National landmarks by brian.scroggin, on Flickr"><img src="http://farm3.static.flickr.com/2314/2078365748_0fc9c45523.jpg" alt="National
landmarks" /></a></p>
Breaking the cell-phone deadlock2008-06-01T00:00:00Zhttps://bannister.us/weblog/2008/breaking-the-cell-phone-deadlock
<p>When Apple introduced the iPhone, the story I read - by reading between
the lines - maps pretty much <em>exactly</em> to the contents of this article
in Wired.</p>
<blockquote>
<p><a href="http://www.wired.com/gadgets/wireless/magazine/16-02/ff_iphone">The Untold Story: How the iPhone Blew Up the Wireless
Industry</a>
By giving so much control to Jobs, Cingular risked turning its
vaunted — and expensive — network into a "dumb pipe," a mere conduit
for content rather than the source of that content. Sigman's team made
a simple bet: The iPhone would result in a surge of data traffic that
would more than make up for any revenue it lost on content deals.</p>
</blockquote>
<p>So much of this is predictable. The cell phone companies - big business
used to doing things in a particular way - tend to want to see the
future the same way as in the past. This works well when the present is
like the past, and always fails across a discontinuous change. The
internet is a discontinuous change.</p>
<p>The network <strong>is</strong> a "dumb pipe". The business of network providers is
moving bits. Content is a different business, and not one at which the
network providers have any expertise. When a business tries to work
outside the area in which they are competent, they usually do very
poorly. This pretty much explains the current/past deadlock. Cell phones
have generally lousy software. The added services offered by the
networks (cell phone companies) are poorly done, over-priced and
under-used. As long as the mindset of the phone companies remain
unchanged, and as long as they can maintain their "walled-gardens", the
situation will not improve.</p>
<p>But this is an unstable and temporary situation. All that is needed to
break the deadlock is one company willing (or forced) to change their
business model to more closely match their customer's needs. It appears
Apple's iPhone (through Steve Jobs) was the catalyst, and Cingular (now
AT&T) was the carrier - to break the deadlock and start long-needed
forward progress.</p>
<blockquote>
<p>It may appear that the carriers' nightmares have been realized, that
the iPhone has given all the power to consumers, developers, and
manufacturers, while turning wireless networks into dumb pipes. But by
fostering more innovation, carriers' networks could get more valuable,
not less. Consumers will spend more time on devices, and thus on
networks, racking up bigger bills and generating more revenue for
everyone. According to Paul Roth, AT&T's president of marketing, the
carrier is exploring new products and services — like mobile banking —
that take advantage of the iPhone's capabilities. "We're thinking
about the market differently," Roth says. In other words, the very
development that wireless carriers feared for so long may prove to be
exactly what they need. It took Steve Jobs to show them that.</p>
</blockquote>
<p>I give Steve Jobs a huge amount of credit, for applying the right amount
of leverage at the right place in the time - from which all users of
cell phones will derive a benefit, over time. Jobs helped bring us a
better future just a bit sooner.</p>
<p>(Not that I own an iPhone - yet. My Verizon contract was up in February,
and I am waiting for the new iPhone models in June...)</p>
Another reason for "open" document formats2008-06-01T00:00:00Zhttps://bannister.us/weblog/2008/another-reason-for-open-document-formats
<blockquote>
<p><a href="http://blog.wired.com/business/2007/03/google_10k_clif.html">WIRED Blogs:
Epicenter</a>
And you discover that while Google has been arguably the most
successful company in the world for the past four years, it is deeply
paranoid. The "risk factors" section of any 10k is typically
boilerplate but Google found a way to make it interesting - coming up
with 36 of them including some like this: "A large amount of
information on the Internet is provided in proprietary document
formats such as Microsoft Word. The providers of the software
application used to create these documents could engineer the document
format to prevent or interfere with our ability to access the document
contents with our search technology. This would mean that the document
contents would not be included in our search results even if the
contents were directly relevant to a search. The <strong>software providers
may also seek to require us to pay them royalties in exchange for
giving us the ability to search documents in their format</strong>. If the
software provider also competes with us in the search business, they
may give their search technology a preferential ability to search
documents in their proprietary format. Any of these results could harm
our brand and our operating results."</p>
</blockquote>
<p>An obvious possibility - Microsoft could assert patent on aspect of
their proprietary formats, and try to prevent competitors from reading
documents in that format. Not something they are likely to do while the
Oasis battle of standard document formats in ongoing. Not likely if they
<em>lose</em> the battle, and ODF becomes the standard. But if they by some
measure "win" the battle - asserting patents becomes a possibility.</p>
<p>One more reason to support open and standardized formats for "office"
documents.</p>
Accessibility and HTML2008-06-01T00:00:00Zhttps://bannister.us/weblog/2008/accessibility-and-html
<p>Sometimes the best thing to do when presented with an unsatisfactory
solution, is to walk away from the problem for a while. The continuing
arguments in the HTML@W3C arena of accessibility proved an example.
After reading through many of the arguments, I was left distinctly
unsatisfied with the solutions offered. I had questions and arguments,
but nothing better to offer.</p>
<p>The core problem is that I (and the vast bulk of web authors and
developers) will never spend very much time writing for accessibility.
As a consequence I (and the larger "we") will always be unskilled in
this domain. We need help. What we need is some means that makes writing
for accessibility ... accessible. Arguing over individual attributes is
a waste of time. What we need to understand is the impact of the page as
a whole.</p>
<p>Someone (months back) suggested I download one of the specialized
browsers, and play with it for a while. Not a bad idea, but not a very
good one either ... to be honest ... the larger "we" will never spend
enough time to really make good use of this approach. Someone who has
used such browsers for years will have a skills and most likely a
different approach that I cannot acquire in a few hours poking around.</p>
<p>We need a bit more leverage. We need to be enlightened.</p>
<ol>
<li>The first missing bit is a "best practices" document - something
that captures the expertise of skilled disabled-human readers, and
captures the most effective implementations of specialized browser
software.</li>
<li>The second missing bit is a visually-oriented test browser that
offers a clear presentation of the structure of a page, as seen by a
"best practices" browser. Such a test browser would strip out any
visual elements, recognize any added bits added for accessibility,
and visually highlight the organization and navigation
associations - perhaps green background for the main (hinted?) path,
and red background for islands of unlinked or ungrouped text - so
that the visual aspects of a page are discarded, and the non-visual
structure of a page becomes visual. The test browser might well just
be an add-in for an existing mainstream browser.</li>
<li>The third missing bit - only possible after we have the first two -
is a clear definition of how to apply minimal additional hints (via
styles, attributes, or whatever is needed) so as to make a web page
and web application more accessible.</li>
</ol>
<p>Arguing over attributes - an aspect of the third part - is backwards,
and a waste of time without clear understanding and realization of the
first two parts.</p>
<p>Creating the first part could be a problem as the software vendors in
that domain are likely small, and treat their algorithms as proprietary.
Also as the market size is small, the products offered may not be very
good, and thus not a good source of enlightenment. The size of the
"practices" document should be small. If you present the larger "we"
with a 100-page document then approximately no one will ever read the
document. Guidelines must be clearly and concisely expressed in a single
page of text (with larger explanatory material available to read as
needed), if the guidelines are ever to be read by a significant
percentage of authors. This is a pretty good test. Writing short,
concise, and clear is only possible when you have a good comprehension
of the subject. Writing large, fuzzy texts is easier, but less useful.
If the field in question is filled with large/fuzzy ideas, you end up
with large/fuzzy texts.</p>
<p>The fact that the second part - the visually oriented "test" browser -
does not exist is a pretty good litmus test. That lack is a strong hint
that this aspect of design is not yet well and properly understood. (Of
course that existence of the "test" browser is a threat to small
proprietary software vendors, as a subset of the "test" browser could
serve as a generic browser for the disabled.)</p>
<p>There is in fact a future mainstream application for this area of study.
As use of the internet becomes pervasive, rather than something done
always done as a sole activity, then non-visual usage becomes more
important. Imagine you are driving a car, riding a bike, or walking down
the street. You will want to make queries without staring at a screen.
(Running into a tree or a car is at least embarrassing.) This
growing/future need could prove a boon to accessibility, if authors and
designers are offered a clear and efficient path.</p>
<p>The argument over whether accessibility-oriented attributes should be
required for HTML5 conformance is a waste of time. Testing for
accessibility is semantically remote and distinct from the concerns of a
well-structured HTML page. Better to channel that time and energy into
defining and building better tests and development aids.</p>
<p><em>[Yes, I read some of the <a href="http://www.w3.org/WAI/">ARIA</a> documents.
Unless I really do not understand, this is not going to happen
... as described above.]</em></p>
Not so much (electromagnetic) noise?2008-05-31T00:00:00Zhttps://bannister.us/weblog/2008/not-so-much-electromagnetic-noise
<p>Do not know what to make of this...</p>
<p>My car has one of those common remote lock gizmos - no more than a
little radio transmitter that sends a weak coded signal. Around here
(densely populated southern California) the range is only about 20-40
feet (at most). Given all the other electronic gadgets in this area, the
level of electromagnetic noise is likely quite high, and the limited
range is not a surprise. Ditto for the remote to open the garage door
from the car - I pretty much have to be directly in front of the house
for the remote to work. When out in less densely populated areas, the
car remote works from 100-200 feet away. Pretty much what you would
expect.</p>
<p>Now comes the part less easy to figure out.</p>
<p>In the past several years there are stretches of time when the range of
my local wireless network drops radically. Sometimes the drop is only
for a few hours. Sometimes the drop lasts for weeks. Could be due to
some noisy electronic gadget used by one of my neighbors, but no way to
be sure - at least without somewhat-fancy laboratory-type gear.</p>
<p>There is another possibility.</p>
<p>My neighborhood is up in the foothills, with a view covering much of
southern Orange County. Millions of people down there, as well as many
electronic and defense-related businesses. Atop nearby hills there are
some left-over odds & ends - clusters of antennas and the like. Some
might be left-overs from the Marine base that was once nearby. Some
might still be in use. There is some chance that my area could be in a
"spotlight" or beam of what amounts to electromagnetic noise from
somewhere down below the hills - a beam meant for some other purpose,
but with the effect of raising the local noise level.</p>
<p>Just an idle speculation - nothing more.</p>
<p>Yesterday I hit the car remote from about a hundred feet away - and it
worked! Odd. As we approached the house I (prematurely) hit the garage
door opener from the end of the street (much too far away) - and it
worked. Now wait just a second ....</p>
<p>Nothing proved, just curious.</p>
Is IIS still (as) relevant?2008-05-31T00:00:00Zhttps://bannister.us/weblog/2008/is-iis-still-as-relevant
<p>My preference for the server-side of web applications is Java (or
Javascript in the JVM). In the past that meant I needed to allow for
running a Java web server (like <a href="http://tomcat.apache.org/">Tomcat</a> or
<a href="http://www.mortbay.org/jetty-6/">Jetty</a>) behind
<a href="http://en.wikipedia.org/wiki/Internet_Information_Services">IIS</a>. For
many applications it made sense for IIS to be the front-end web server.
Most desktops were (and are) using Internet Explorer as a web browser,
and used Microsoft's security scheme. This meant using <a href="http://en.wikipedia.org/wiki/Integrated_Windows_Authentication">integrated
Windows
authentication</a>
which eliminates a lot of explicit logins, and was a lot more practical
in most cases. Originally the only way to use Windows authentication was
to use IE and IIS in combination, as the
<a href="http://en.wikipedia.org/wiki/NTLM">protocol</a> was proprietary and
undocumented by Microsoft.</p>
<p>For a long time we were pretty much locked to running Java code somehow
behind IIS.</p>
<p>Since then the Samba folk have decoded the once-secret Windows
authentication protocol, and provide an usable <a href="http://jcifs.samba.org/">implementation in Java
(JCIFS)</a>. The implementation was first
available a few years back, but as with most new software the first few
versions tended to be troublesome (to varying degrees) when deployed. A
bit too risky for a product installed on hundreds of unique company
intra-nets.</p>
<p>At the same time, Microsoft continues to make changes to IIS. Seems that
every new version of IIS causes existing web applications (deployed on
or behind IIS) to break in new and interesting (not!) ways, and more
often than not at a customer site rather than in development testing.
Microsoft has good reasons for continuing to improve IIS, but those same
"improvements" are a continuing source of grief for both development and
our customers.</p>
<p>Would sure be nice to get off the IIS upgrade (not-so-merry)
merry-go-round...</p>
<p>Another constraint was the chance that the customer might want to
install other web applications on the same server box. Those other
intra-net applications were likely to require IIS.</p>
<p>On recent reflection - I am not sure that the once-required solution
still makes as much sense.</p>
<ul>
<li>The non-Microsoft implementations of NTLM authentication seem a lot
more reliable.</li>
<li>Cheap/powerful hardware and widespread use for virtual machines
(VMware and the like) means each web application is most likely on
it's own individual machine (virtual or not).</li>
<li>New and future versions of IIS are pretty much guaranteed to cause
future grief.</li>
<li>Pure Java-based solutions can be run on non-Windows platforms.</li>
</ul>
<p>Ditching IIS would sure make my (professional) life easier...</p>
alt="waste"2008-05-31T00:00:00Zhttps://bannister.us/weblog/2008/altwaste
<p>Tuned out from HTML@W3C working group for a few months. (I was <em>very</em>
busy at work, and participation in the working group is entirely a free
time activity.) Ran across this long and apparently continuing argument
that seems to boil down to whether <strong><img></strong> tags should be required
to have an <strong>alt</strong> attribute to be accepted as HTML5 conformant. One or
more of the guys associated with accessibility at their place of work
seem to be arguing for mandatory <strong>alt</strong> usage.</p>
<p>Just to be clear, if the writer is not attempting to make a document
accessible, then all we need for HTML is:</p>
<p><img src="https://bannister.us/weblog/2008/a.png" /></p>
<p>The above is an image with no extra information for accessibility.</p>
<p>All of the following is a waste of time:</p>
<p><img src="https://bannister.us/weblog/2008/a.png" noalt="" />
<img src="https://bannister.us/weblog/2008/a.png" alt="" />
<img src="https://bannister.us/weblog/2008/a.png" alt="." />
<img src="https://bannister.us/weblog/2008/a.png" alt="*" />
<img src="https://bannister.us/weblog/2008/a.png" alt="boilerplate-put-in-only-because-it-is-required" />
<img src="https://bannister.us/weblog/2008/a.png" alt="not-very-meaningful-text" />
<img src="https://bannister.us/weblog/2008/a.png" alt="downright-misleading-text" /></p>
<p>The above is ritualistic waste - about the only good it will do is give
global warning a tiny boost, and perhaps delay the next ice age.</p>
<p>Frankly, I do not care about accessibility. Except when I do.</p>
<p>When I do not care about accessibility, if an HTML5 conformance tester
bugs me until I waste time putting in bogus attributes, I am going to
regard HTML5 conformance as a somewhat bogus waste of time. The vast
majority of web pages have been and will be written from this frame of
mind. Any attempt to force accessibility on this population is going to
fail. Worse - attributes added for HTML conformance, but lacking
meaningful human-semantic value, are likely to make pages a bit <em>less</em>
accessible.</p>
<p>When I do care about accessibility, I need help - big time. Somehow I
doubt that just filling in a few attributes is going to do the trick. I
have never been part of an organization big enough to have folk
dedicated to accessibility. That means I am pretty much on my own. Sure,
I could go through and mindlessly fill out a bunch of <strong>alt</strong>
attributes. I am sure this will make some bureaucrat happy, but I doubt
the result will be very good. What I really need is something that will
let me test the page as a whole, and give me some insight into how
alternate browsing tools present the page.</p>
<p>Also it always kind of bugged me that the text inside an <strong>alt</strong>
attribute could not be styled. Seems like the text should be treated
like other text. Sometimes a little emphasis in the right place goes a
long way.</p>
<p>This argument is a waste of time. Requiring <strong>alt</strong> attributes when the
writer is interested in accessibility is a waste of time. Making HTML
documents non-conformant because they lack meaningless boilerplate is a
waste of time.</p>
<p>A test for accessibility (usable without expertise in accessibility) is
a great goal, but pretty near independent of what should be the main
concerns of the HTML working group.</p>
<p>Accessibility is a noble goal. You cannot force people to be noble.</p>
Autoconfig2008-04-29T00:00:00Zhttps://bannister.us/weblog/2008/autoconfig
<p><a href="http://xkcd.com/416/"><img src="http://imgs.xkcd.com/comics/zealous_autoconfig.png" alt="zealous" /></a>
Been tempted to do something similar, at times. :)</p>
JFC Swing and software entrophy2008-04-22T00:00:00Zhttps://bannister.us/weblog/2008/jfc-swing-and-software-entrophy
<p>Been re-working and fixing up a clear example of <a href="http://www.pragprog.com/the-pragmatic-programmer/extracts/software-entropy">software
entrophy</a>.
The sad part is that this is a moderate-sized client part of a
client-server application, and reached this state under the original
author. So I have spent time (far too much time) looking at fairly awful
code.</p>
<p>At the same time this has lead me to look at <a href="https://bannister.us/weblog/2008/jfc-swing-and-software-entrophy">Swing</a> more closely than
I had need before. After poking around in the guts of javax.swing, I
came away really unimpressed. Too many half-good ideas. Too much code.
Not so much the tight and clean conceptual model one might hope for in
"foundation" classes. Admittedly I was not in a very favorable frame of
mind.</p>
<p>Looking at all the "loose" (of the late-binding sort) lashing, have to
wonder if we'd not be better off using Javascript to describe UI
component structures.</p>
<p>Wonder what the internals of SWT look like?</p>
A bit of pre-historic (for the Internet) history2008-04-13T00:00:00Zhttps://bannister.us/weblog/2008/a-bit-of-pre-historic-for-the-internet-history
<p>Years ago the local STOR (in Tustin) was replaced by Ikea. I had not
looked before for the backstory.</p>
<p>From 1988: <a href="http://findarticles.com/p/articles/mi_m3092/is_n12_v27/ai_6425174">IKEA suit forces STOR to shelve catalog; home furnishings
retailer claims copyright
infringement</a></p>
<blockquote>
<p>IKEA--with stores in 19 countries including two sites in the
U.S.--contends that STOR replicated IKEAs' furniture, furniture names,
signs, testing machines, price tags, department names, color schemes,
checkout areas, shopping carts, general store layout and design, and
catalogs, and that this replication constitutes unfair competition and
copyright infringement.</p>
</blockquote>
<p>Um, yes, that would explain why the later Ikea store was so much like
STOR.</p>
<p>From 1992: <a href="http://findarticles.com/p/articles/mi_m5072/is_n1_v14/ai_11781446">Observers hail Stor-Ikea merger - Stor Furnishings
International Inc.; Ikea Svenska
AB</a></p>
<blockquote>
<p>Ikea's announcement last week that it plans to buy City of
Industry-based Stor Furnishings International Inc. was lauded by
industry sources as a logical culmination of competition between the
two furniture retailers and as the best deal for Stor shareholders.</p>
</blockquote>
<p>Wonder if the STOR folk made money as copycats. Wonder if Ikea found a
ready-made market at former STOR locations.</p>
<p>In any case, pretty cool that <a href="http://www.bnet.com/">bnet.com</a> is
placing online stories that pre-date common use of the Internet.</p>
One guy's take on the iPhone user interface2008-03-22T00:00:00Zhttps://bannister.us/weblog/2008/one-guys-take-on-the-iphone-user-interface
<p>Rather a nice video on <a href="http://www.edwardtufte.com/bboard/q-and-a-fetch-msg?msg_id=00036T">this guy's
page</a>
showing the iPhone interface, and offering some praise and some
critique. As to the user interface overhead added - what he calls
"administrative debris" - I completely agree. On desktop GUIs the
usual/unquestioned overhead includes titlebars, menubars, and
scrollbars - all of which take large meaningless amounts of space on
current screens (another case of design that made sense once, but much
less so now). On the iPhone the Apple folk generally do a good job of
minimizing UI overhead, with a couple exceptions.</p>
<p>At the end though he offers a replacement for the iPhone weather screen,
and without a doubt his replacement is a <strong>very bad idea</strong>. The
big/readable day and temperature information from the iPhone version is
shrunk to a smaller much less readable size. A large portion of the
screen is instead taken up by an animated image apparently from a
weather satellite. While undoubtedly cool, the animation carries little
useful information. When you are looking for information about future
weather, an animated weather map showing the recent past is not
especially helpful. All of which means he is using a larger portion of
the (small) screen for the least useful information.</p>
<p>Using much-smaller-than-optimal font sizes is a common mistake in web
and desktop user interface design. The problem is much more acute on
small cell phone screens. Reading small characters may be very difficult
in unfavorable light conditions. I can see allowing small fonts when web
browsing - as this activity is more likely done while the user is
indoors and stationary. For anything that might be used in less
favorable conditions - like driving - you want to push up the font sizes
and unclutter the screens. You want the user to capture relevant
information in a single quick glance.</p>
<p>Which all leaves me in an odd position. This guy is a pretty well-known
name (in some design circles). In part he is making a point - to a
somewhat large audience - that very much needs to be made. On the other
hand, he gets one part very badly wrong.</p>
<p>Oh well. This is pretty much all I can do.</p>
Convert at the edges2008-03-21T00:00:00Zhttps://bannister.us/weblog/2008/convert-at-the-edges
<p>My time writing software spans from 16-bit DOS and Windows, through
32-bit Windows and Unix. I have written a fair amount of code or ported
code to run in different environments. Along the way I picked up
practices that proved useful.</p>
<p>One practice I call: <strong>"Convert at the edges"</strong>.</p>
<p>A data structure may have a pre-specified fixed form when stored to
disk, or shipped across the network. You could choose to keep the data
in the same fixed form when in-memory. There seemed <em>some</em> logic to this
choice - but experience proved otherwise. Long ago, I took this path in
one client/server application. Lots of data structures going across
network. Lots of data structures going to and from disk. When in-memory
you needed accessor functions to read and write fields into the fixed
form. The result was a great deal of tedious and not very efficient
code.</p>
<p>Ever since I found it much simpler and more effective to perform all
conversions at the edges. Data structures stored in-memory are kept in
the most natural and efficient form for use by the program. Any
conversion needed to more fixed or limited formats is done only when
needed. Benefits from using the most-natural in-memory include:</p>
<ul>
<li>More efficient for the programmer to write and read.</li>
<li>More efficient to use when the program is run.</li>
<li>Less likely to result in program errors.</li>
</ul>
<p>The last bit was far from immediately obvious ... and a bit involved.</p>
<p>The strongly typed <a href="http://en.wikipedia.org/wiki/Ada_%28programming_language%29">Ada programming
language</a>
was very much a current topic when I was in school. Extensive support
for user-specified types, numeric types with exactly defined range, and
built-in range checking - this all seemed to make a great deal of sense.
Experience both before and since clearly show that typing and conversion
is the source of common and serious problems (like Mars probes that slam
into the planet). In that context, strong type-checking at compile and
run time seems to make sense. Better to exactly define the values and
range of each numeric type ... or at least so it seemed.</p>
<p>There were counter-indications. On old 16-bit machines the most natural
form for an integer was 16-bit word. On current 32-bit machines the most
natural form for an integer is a 32-bit word. Compiler-generated code
tends to be more efficient for that most natural form than for any of
the smaller types. Unsigned integers are the source of occasional
program errors. Different compilers on different processors tend to have
slightly different rules when unsigned integers are used. Even when
running on only one platform, the conversion rules applied by the
compiler in expressions are an occasional surprise. For the most part,
the additional range offered by unsigned integers is not worth the
increase in program errors.</p>
<p>Taken together - in C/C++ using "int" for all integers is more efficient
and less error prone. When the disk or network formats require a smaller
form, "convert at the edges". In practice I found it <em>much</em> easier to
write portable, efficient code with fewer errors by stripping most of
the very-specific numeric types (UINT8, UINT16, UINT32 and the like),
using generic "int" through the bulk of the code, and carefully checked
type (and range) conversion going from memory to disk or network.</p>
<p>What bought this to mind was a peek into the OpenOffice developers
world. The question was what limits <strong>Calc</strong> (the OpenOffice spreadsheet
application) placed on the number of rows in a spreadsheet. The answer
lead past this page:</p>
<blockquote>
<p><a href="http://sc.openoffice.org/row-limit.html">sc: Increasing the row limit above 32000
rows</a></p>
<p>Position accessing methods There are a lot of class ScDocument methods
(see inc/document.hxx and source/data/documen*.cxx accessing a cell
position by MethodName( USHORT nCol, USHORT nRow, USHORT nTab ); where
at least the nRow parameter will have to be changed to long, but it
should be evaluated if all methods taking separated col/row/tab
parameters couldn't be changed to take one ScAddress (see below)
parameter instead. Similar, the class ScTable methods (see
inc/table.hxx and source/core/data/table*.cxx) MethodName( USHORT
nCol, USHORT nRow ); and the class ScColumn methods (see
inc/column.hxx and source/core/data/column*.cxx) MethodName( USHORT
nRow ); and the class ScAttrArray methods (see inc/attarray.hxx and
source/core/data/attarray.cxx) MethodName( USHORT nRow ); row
parameters have to be changed, also all MethodName( ..., USHORT
nStartRow, USHORT nEndRow, ... ); of all of those classes. Search(
USHORT nRow, short& nIndex ); of ScColumn and ScAttrArray and
similar are special in a way that the short& nIndex reference is
used to return a position within an array where the position may at
most be the number of rows used. This of course has to be changed as
well.</p>
</blockquote>
<p>My first inclination on reading the above is to want to strip out all
the overly-specific numeric types. Doubtless that would make me
completely unacceptable to the OO developer community. At the same time
this specific example helps prove my general point. The wide use of
very-specific numeric types means that a change to raise (say) the
number of rows in a spreadsheet involves massive changes to the source
code.</p>
<p>In fact, I would argue that at a design level this usage is flat
<strong>wrong</strong>:</p>
<p>MethodName( USHORT nCol, USHORT nRow );</p>
<p>The row and column numbers in a spreadsheet are exactly that -
<em>numbers</em>. At this level in the design there is no reason to use
anything more specific than an "int". Certainly the in-memory
representation of a spreadsheet might be limited to a smaller range.
Certainly the on-disk format chosen might be limited to a smaller range.
But ... either could change. A different algorithm or structure used for
in-memory storage could raise the limit. A different on-disk format
could raise the limit. Oddly enough the simpler declaration is much more
useful:</p>
<p>MethodName( int nCol, int nRow );</p>
<p>First, the compilers tend to generate slightly more efficient code.
Second, changes that raise limits for the in-memory or on-disk formats
will not require changes to this declaration. Third, the range limit
implied makes sense for the machine. On a 32-bit machine "int" limits
you to addressing 2 billion rows and columns. Even with sparse storage
you just are not going to be able to have 2 billion of anything on a
machine with (at most) 4GB of memory. On a 64-bit machine you <em>could</em>
use bigger memory to support bigger limits - <em>without changing the
code</em> - as long as you were not over-specific in your declarations.</p>
<p>I started out using specific/exact types. After years of practice and
varied experience, what I eventually found more effective is simple use
of the machine's "natural" types combined with careful and exact checks
"at the edges". The result is easier to write code with fewer errors
that is both portable and efficient.</p>
A pleasant surprise2008-03-08T00:00:00Zhttps://bannister.us/weblog/2008/a-pleasant-surprise
<p>Last week I had an intermittent problem with my Internet connection.
Rather more trouble than usual, in that the internet connection would
degrade, become unusable, and then start working again - with no
discernible pattern. Cox (the cable company) sent out a guy, who re-did
all the coax cable connectors, and then replaced the cable modem. The
next day the connection failed again - and this time the entire
neighborhood was out. Cox sent a guy out to work on the big box at the
end of the street. He was there for hours. Afterword the connection
worked ... until the next day. <em>Again</em> Cox sent out a guy to work on the
box at the end of the street, who <em>again</em> was there for hours. Seems the
last visit solved the problem.</p>
<p>This was pretty much the worst problem I have had with Cox Cable. I did
end up calling the Cox Support phone number several times. My initial
guess (based on the symptoms) - that the problem was outside my house -
was right. Kind'a wish they could take better advantage of a
well-educated guess. On the other hand, intermittent problems can be
hard to track down, and my opinion of the service from Cox Cable is
still very high.</p>
<p>Along the way - a bit of a pleasant surprise. When the Cox tech finished
working at my house, as a check he wanted to run a speed test, so I
visited the <a href="http://www.speakeasy.net/speedtest/">Speakeasy - Speed
Test</a> and got surprisingly fast
results:</p>
<p>Last Result:
Download Speed: 31134 kbps (3891.8 KB/sec transfer rate)
Upload Speed: 489 kbps (61.1 KB/sec transfer rate)</p>
<p>Since my Cox service is (officially?) 7mbps download, and 512kbps
upload, the above is not bad at all. I have seen a couple large
downloads peak at a bit over a megabyte/second (off sun.com), so ....
not bad at all.</p>
Good design, and connecting the dots2008-02-25T00:00:00Zhttps://bannister.us/weblog/2008/good-design-and-connecting-the-dots
<p>Four recent articles in Business Week that - to my mind - all circle
around a common topic.</p>
<p>The article <a href="http://www.businessweek.com/technology/content/feb2008/tc20080222_248414.htm">Motorola: Left to Its Own
Devices</a>
describes Motorola's declining fortunes, largely because customers do
not particularly like their cell phones. I own a Motorola Razr and
consider their fate well-earned. In the article <a href="http://www.businessweek.com/magazine/content/08_09/b4073054448185.htm">Sprint's Wake-Up
Call</a>
we see a multi-billion dollar company in trouble simply because service
to customers was poor. The notion in <a href="http://www.businessweek.com/magazine/content/08_08/b4072083481720.htm">The One-Guy
Theory</a>
is that the right guy in the right position can make or break a
business. The point touched on (but not well made) in <a href="http://www.businessweek.com/bwdaily/dnflash/content/feb2008/db20080214_532057.htm">Software You
Shouldn't Ever
Notice</a>
is that the end user experience with many products is still surprisingly
bad.</p>
<p>We see two multi-billion dollar businesses in deep trouble (Motorola and
Sprint) because they lost sight of their core business - a customer
making a phone call. We see that one guy in the right position can make
or break a business - even a very large business.</p>
<p>How do these connect?</p>
<p>Things we buy and use need to work. Well done user-centered design is -
or should be - at the core of customer's experience. That end-user
experience can make the difference between keeping or losing a customer.
Getting that experience right can determine the fate of a multi-billion
dollar business.</p>
<p>The Apple iPhone is a good example. The iPhone is a success simply
because it is a better designed combination of software and hardware
than any of it's competitors. Looked at one way, the iPhone should not
exist. The existing cell phone vendors should have long ago come up with
something nearly as good.</p>
<p>But they did not. This is where the "one guy" theory would seem to apply
on the design side.</p>
<p>The hardware in modern cell phones is almost absurdly powerful, yet I
find the end result presented to the user is amazingly bad. From my
background in software, physics, and engineering I have a pretty good
idea about what <em>should</em> be possible, and so am especially annoyed to
find products that - to my mind - are done so badly.</p>
<p>Have to admit that I am still amazed that the fate of multi-billion
dollar companies can hinge on something so simple ... but the evidence
is pretty clear.</p>
Good places to eat on the I-70 in Utah2008-02-24T00:00:00Zhttps://bannister.us/weblog/2008/good-places-to-eat-on-the-i-70-in-utah
<p>Just for the record ...</p>
<p>If you are travelling on the I-70 in Utah there are two eating places I
know of that are worth a stop.</p>
<p>One is the <a href="http://maps.google.com/maps?f=q&hl=en&geocode=&q=1325+N+Main,+Richfield+UT+84701&sll=37.0625,-95.677068&sspn=32.280566,57.524414&ie=UTF8%E2%89%AA=38.786815,-112.083077&spn=0.007744,0.014044&t=h&z=17">Subway in Richfield,
Utah</a>
(Subway Sandwiches, 1325 N Main, Richfield UT 84701, (435) 896-8627).
Yes, <a href="http://www.subway.com/">Subway</a> is a chain with thousands of
locations, and there are hundreds (at least) along the Interstates. Not
sure what the difference is, but the Subway in Richfield is very, very
good. The owners deserve credit. The Subway is right next to a gas
station, near the Interstate, which is a logical stopping point before
the long stretch east to Green River.</p>
<p>Another is the <a href="http://maps.google.com/maps?ie=UTF8&oe=utf-8&q=tamarisk&near=Green+River,+UT&fb=1&cid=38995503,-110156914,9295254099511590621&li=lmd&t=h%E2%89%AA=38.993063,-110.141882&spn=0.003727,0.007022&z=18">Tamarisk restuarant on Green River,
Utah</a>
(the map is centered on the restuarant - the Google placemark is way
off). Nothing fancy - just a nice place with decent fare, reasonable
prices, and right on the Green River. Most definitely a good place to
stop.</p>
White box programming2008-02-23T00:00:00Zhttps://bannister.us/weblog/2008/white-box-programming
<p>Inherited some code from a younger developer. Not real thrilled with the
code, so went about cleaning up. This is the client side of a
client/server application. Given this is at least my sixth iteration
with a client/server application, the bits done badly are pretty
obvious. From the general mash factored out much of the control and
model code, but left the UI code mostly untouched. After getting much of
the non-UI code cleaned up, started testing, then ran into:</p>
<pre><code> Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at javax.swing.plaf.basic.BasicProgressBarUI.updateSizes(BasicProgressBarUI.java:470)
at javax.swing.plaf.basic.BasicProgressBarUI.getBox(BasicProgressBarUI.java:427)
at com.sun.java.swing.plaf.windows.WindowsProgressBarUI.getBox(WindowsProgressBarUI.java:225)
at com.sun.java.swing.plaf.windows.WindowsProgressBarUI.paintIndeterminate(WindowsProgressBarUI.java:279)
at javax.swing.plaf.basic.BasicProgressBarUI.paint(BasicProgressBarUI.java:392)
at javax.swing.plaf.ComponentUI.update(ComponentUI.java:143)
at javax.swing.JComponent.paintComponent(JComponent.java:763)
at javax.swing.JComponent.paint(JComponent.java:1027)
at javax.swing.JComponent.paintChildren(JComponent.java:864)
at javax.swing.JComponent.paint(JComponent.java:1036)
at javax.swing.JComponent.paintChildren(JComponent.java:864)
at javax.swing.JComponent.paint(JComponent.java:1036)
at javax.swing.JComponent.paintToOffscreen(JComponent.java:5122)
at javax.swing.BufferStrategyPaintManager.paint(BufferStrategyPaintManager.java:285)
at javax.swing.RepaintManager.paint(RepaintManager.java:1128)
at javax.swing.JComponent._paintImmediately(JComponent.java:5070)
at javax.swing.JComponent.paintImmediately(JComponent.java:4880)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:723)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:679)
at javax.swing.RepaintManager.seqPaintDirtyRegions(RepaintManager.java:659)
at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueUtilities.java:128)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)
</code></pre>
<p>Though the fault is in pure Sun code, I doubt very much the fault is
Sun's. Rather somewhere in the mash of UI written by the local
programmer there is most likely something not quite right.</p>
<p>The point is - this is a good example from which to argue for white-box
programming. From Eclipse I cannot see the sources associated with the
above stacktrace, and cannot guess what might be the root problem. Given
sources I have at least some chance of figuring out the underlying
problem.</p>
<p>Doubtless if I can obtain the Sun/Java sources there is some way to get
Eclipse to pull in the sources (though getting and maintaining an exact
match between libraries and sources may be a minor pain).</p>
Fun with IIS 5.1 on Windows XP2008-02-18T00:00:00Zhttps://bannister.us/weblog/2008/fun-with-iis-51-on-windows-xp
<p>Or not.</p>
<p>Wasted at least a day tracking this down. It started with trying to run
a PHP page and getting an error:</p>
<p>winsock.dll unusable. 1009</p>
<p>Clear as mud. Lots of red herrings: FastCGI versus CGI, differing PHP
versions, directory permissions, metabase script maps, something not
quite right in the application install. Was not any of those. PHP pages
worked just fine in directories that allowed anonymous access. Add the
requirement for authentication and get the above error.</p>
<p>Turned out the answer was the permissions on the registry key:</p>
<p>HKEY_LOCAL_MACHINE\SOFTWARE\Classes</p>
<p>Needed to add "read" access for user IUSR_MERCURY (where "mercury" is
the name of the computer) to the remove the error. Not exactly obvious.</p>
<p>Along the way found - once again - there are a lot of scummy sites on
the web in popular places, looking to attract traffic with worthless
information. Search on the above error - you will find lots.</p>
<p>What finally lead to the solution:</p>
<blockquote>
<p><a href="http://groups.google.com/group/microsoft.public.inetserver.iis/browse_thread/thread/a92214f714dbc6cb/3a77216b7d181de6?lnk=st&q=Jackie+Jaynes+MSFT++invalid+default+script%0D%0A#3a77216b7d181de6">IIS5.0 "Invalid Default Script
Language"</a>
This error is usually caused by lack of permissions. Check the
following:</p>
<p>1. Make sure the Users group has Read/Execute permissions to the
\windows\system32\inetsrv folder and \inetpub\wwwroot and any
other content
folders for your site.
2. Make sure the anonymous account(IUSR_machinename) has Read
permissions
to the following registry key: HKEY_LOCAL_MACHINE\SOFTWARE\Classes
and all
subkeys
3. Make sure the Users group has Read permissions on the following
registry
key: HKEY_CLASSES_ROOT</p>
<p>Thank you,</p>
<p>Jackie Jaynes [MSFT]
Microsoft IIS</p>
</blockquote>
<p>Something to add to the PHP installation (or the like) as a check, it
seems.</p>
The Republicans are in deep trouble!2008-02-05T00:00:00Zhttps://bannister.us/weblog/2008/the-republicans-are-in-deep-trouble
<p>Once again I am hosting the local polling place. This my precinct tends
to be deeply conservative. There are lots of Republicans and very few
Democrats. In some elections the Republican candidate lost out (locally)
to a third party candidate, but rarely to a Democrat. Perhaps
"conservative" is the wrong label. Might be that "libertarian" is a
better fit. When Chris Cox was plucked out of the Senate to chair the
SEC, local voters went for Jim Gilchrist over the (intensely boring)
replacement offered by the Republican party.</p>
<p>This election is different. There are quite a number of former
Republicans changing to non-partisan or Democrat - which for this area
is amazing. No prior election has been anything alike (and I've been
doing this for ten years).</p>
<p>If this area is so strongly affected, the Republican party is in
<strong>very</strong> deep trouble.</p>
DOCTYPE works2008-01-23T00:00:00Zhttps://bannister.us/weblog/2008/doctype-works
<p>There is once again talk about versioned web pages. Unfortunately there
is also the same continuing confusion between theory and reality.</p>
<blockquote>
<p><a href="http://www.alistapart.com/articles/beyonddoctype">A List Apart: Articles: Beyond DOCTYPE: Web Standards, Forward
Compatibility, and
IE8</a>
<strong>The DOCTYPE switch is broken</strong></p>
<p>Back in 1998, Todd Fahrner came up with a toggle that would allow a
browser to offer two rendering modes: one for developers wishing to
follow standards, and another for everyone else. The concept was
brilliantly simple. When the user agent encountered a document with a
well-formed DOCTYPE declaration of a current HTML standard (i.e. HTML
2.0 wouldn’t cut it), it would assume that the author knew what she
was doing and render the page in “standards” mode (laying out elements
using the W3C’s box model). But when no DOCTYPE or a malformed DOCTYPE
was encountered, the document would be rendered in “quirks” mode,
i.e., laying out elements using the non-standard box model of
IE5.x/Windows.</p>
</blockquote>
<p>The above referenced article goes on to describe a hideously complex new
version mechanism, which if adopted is pretty much guaranteed to cause
grief. We do not need anything so complex. DOCTYPE works, but what
DOCTYPE means may not be what you expect.</p>
<p>This topic is very old and very familiar when developing distributed
applications. If you have two independent machines with a network in the
middle, sooner or later you are going to be running different software
versions on the two (or more) machines. This forces you to think through
the issues, and after twenty-odd years working on distributed
applications, on this topic I have no doubt as to what works.</p>
<p>What you have to do is version the data. In a distributed application,
this is the data that goes across the web. A single version number is
sufficient. Note that this version number is <strong>not</strong> the version of the
application.</p>
<p>The DOCTYPE version is all and exactly what we need. In theory the
DOCTYPE was meant to indicate exact compliance with a particular W3C
specification. <em>In reality DOCTYPE means something else.</em></p>
<p>Up until the release of IE7, a web page that declared
<code><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"></code> was tested and
worked under IE6 (at a very high probability), and may have been tested
on other then-current browsers. The DOCTYPE does <strong>NOT</strong> indicate that
the page works in an HTML 4.01 compliant web browser. There was (and
is?) no browser that exactly implemented HTML 4.01, so exact 4.01
compliance in the web page is impossible to assert. Lacking a reference
implementation of the HTML standard, web developers can only test
against the most widely-used web browser(s).</p>
<p>In effect the DOCTYPE string is the version on data - but only vaguely
related to the W3C specification.</p>
<p>On the release of IE7, the Microsoft folk fumbled. In changing the
interpretation of web pages (no matter how well-intentioned) they
changed to meaning of the data. When you change the meaning of the data,
you <strong>MUST</strong>
<a href="http://bannister.us/weblog/2007/why-ie8-needs-html-402/">bump the version number</a>.</p>
<p>If you lose the confusion between theory and reality, the DOCTYPE is all
we need to exactly version the data (HTML).</p>
Point of view2008-01-18T00:00:00Zhttps://bannister.us/weblog/2008/xkcd-a-webcomic-of-romance-sarcasm-math-and-language-by-randall-munroe
<p><a href="http://xkcd.com/372/"><img src="http://imgs.xkcd.com/comics/to_be_wanted.png" alt="view" />
xkcd</a></p>
Cache Valley Cheese2008-01-07T00:00:00Zhttps://bannister.us/weblog/2008/cache-valley-cheese
<p>If you happen to be driving down Interstate 15 a ways north of Cedar
City, Utah - you might see the sign for <a href="http://www.dfamilk.com/dfamart/cacheValley/home.html">Cache Valley
Cheese</a>. On the
last trip curiosity won and I pulled off in <a href="http://maps.google.com/maps?f=q&geocode=&time=&sll=38.272453,-112.647822&sspn=0.0078,0.016909&ie=UTF8%E2%89%AA=38.27092,-112.648401&spn=0.0078,0.016909&t=h&z=17&om=1">Beaver,
Utah</a>
to - I hoped - snag some really good cheese. (Heck, they advertise on the highway - they must be good.)</p>
<p>Let me save you the bother. Keep driving....</p>
<p>Bought locally branded cheddar, jack, and mozzarella cheeses. The
mozzarella tasted like jack (not a very good jack at that). The jack
tasted like ... the cheapest jack you could buy at the supermarket. The
cheddar was passable - OK to melt on hamburgers (for your less
liked/discerning guests), but not something you want to serve on it's
own. All had fairly high moisture content, and were ... rather sticky
(like Velveeta).</p>
<p>Generic industrial cheese with no character - not what I hoped to find.</p>
This is still bugging me...2008-01-03T00:00:00Zhttps://bannister.us/weblog/2008/this-is-still-bugging-me
<p>Follow this story.</p>
<ol>
<li>Sun introduces the
<a href="http://www.sun.com/processors/UltraSPARC-T2/">T2</a> with many CPUs on
one chip - an impressive and appropriate work of technology.</li>
<li>Tim Bray visits the question of how to make use of many CPUs for
generic tasks, and poses the <a href="http://www.tbray.org/ongoing/When/200x/2007/09/20/Wide-Finder">Wide
Finder</a>
as an example task.</li>
<li>Readers create a variety of interesting solutions over the next two
months, for which Tim posts 15(!) updates on his weblog.</li>
</ol>
<p>As sketched above, a very successful topic. The only problem is that the example task is
<a href="https://bannister.us/weblog/2007/wrapping-up-wide-finder">too lightweight</a>
to need distribution. Tim Bray used his soapbox to stir interest in a good question, though not with the right example. A reasonable mistake - better to pose the question at the right time, with risk of asking an imperfect question, rather than wait an indefinite time (maybe forever if otherwise busy) until your question is perfect.</p>
<p>What does bother me a great deal is <em>no one asked whether the example task was suitable for distribution</em>! A relatively small set of measurements show that a simple Perl script can process the file data as fast as it can be read off disk, and will be done before all the fancier solutions (those that require the file data already in memory) can get started.</p>
<p><em>Why did no one ask this question earlier?</em></p>
<p>Readers of Tim's weblog picked up the challenge and came up with a variety of interesting answers ... that solved the wrong problem. Presumably a good fraction of the readers are young and in or just out of school. That these folk charged off with great energy in the wrong direction - does not bother me much. Surely some portion of Tim's readership have a bit more experience. The performance of disk and file systems are not too difficult to understand. A relatively small set of measurements can clarify what sort of solutions fit the problem.</p>
<p>Does this specific case offer a more general clue? There are quite a number of open source projects that start with one or a few good ideas, then charge off (with great energy, initially) in what proves to be not really the right direction. Are we looking at the same root cause?</p>
Why IE8 needs HTML 4.022007-12-28T00:00:00Zhttps://bannister.us/weblog/2007/why-ie8-needs-html-402
<p>The
<a href="http://blogs.msdn.com/ie/archive/2007/12/19/internet-explorer-8-and-acid2-a-milestone.aspx">announcement</a>
that the code for IE8 now passes the
<a href="http://en.wikipedia.org/wiki/Acid2">Acid2</a> test is a very big deal. We
have a strong indication that Internet Explorer 8.0 will offer far
stronger support for web standards than prior versions of IE, and
perhaps even better compliance that competing browsers.</p>
<p>The folk at Microsoft on the Internet Explorer team have done a great
thing. At the same time they now have a problem. The problem comes if
the changes in IE disrupt existing web applications. Certainly
significant change in IE behavior will disrupt at least some web
applications. Given the very wide use of IE, the number of people
effected by even a few disrupted applications will be large.</p>
<p>Worth watching is the
<a href="http://mschnlnine.vo.llnwd.net/d1/ch9/0/IE8ACID2Final.wmv">video</a> from
the article <a href="http://channel9.msdn.com/showpost.aspx?postid=367207">IE 8: On the Path to Web Standards Compliance - ACID 2 Test
Pass Complete</a>.
About 10 minutes in you will hear the IE folk reflecting on the troubles
caused by improvements in IE7.</p>
<p>Microsoft needs a way to enable the new more-standards-compliant
behavior without risk of disrupting existing applications. The DOCTYPE
switch is the existing and best way to enable changes in browser
behavior. Web pages written to the most current web standards will use
the DOCTYPE:</p>
<p><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"></p>
<p>These pages by and large work now. Likely the developer had to put in
extra effort to make the pages work in IE6. Some of those pages will not
work as well when IE8 better implements the HTML 4.01 standard.</p>
<p>In theory what the DOCTYPE was meant to indicate was strict compliance
with a particular web standard. In reality what the DOCTYPE invokes is
each browser's approximation of the web standard - <em>at the time</em>. For
the majority of the 4.01 pages, this means web developers wrote for IE6.</p>
<p>What web developers need is a DOCTYPE that declares the better
approximation as offered by IE8. This has to be a new DOCTYPE. The
simplest possible answer is to use:</p>
<p><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.02//EN"></p>
<p>Where "HTML 4.02" simply indicates a better implementation of the HTML
4.01 standard. What the browser vendors will actually do I cannot say,
but this is one solution.</p>
In future...2007-12-26T00:00:00Zhttps://bannister.us/weblog/2007/in-future
<p>No matter how much you like the wild Santa Ana winds, leaving <strong>any</strong>
windows open is not a good idea. Especially when wildfire swept through
the hills around your home a few months back.</p>
<p>The next day I found a layer of gritty black powder on <strong>every</strong>
horizontal surface. Lots of cleaning followed ...</p>
From my daughter's last soccer game2007-12-06T00:00:00Zhttps://bannister.us/weblog/2007/from-my-daughters-last-soccer-game
<p><a href="http://www.flickr.com/photos/dreadedhill/2072264093/"><img src="http://farm3.static.flickr.com/2273/2072264093_23a08cd287.jpg?v=0" alt="untitled" /></a></p>
<p>My daughter was goalie for the first half of the game. This shot was
coming in high, fast and centered on the goal - too high catch or block,
but low enough to go in. Looked like a certain goal.</p>
<p>Last season the grandfather of one of the girls on the team was a
professional(?) soccer coach for goalies. He said nice things about my
daughter, and taught some bits to her and another girl during practice.
One of the bits he told her was to punch the ball upward when it was too
high to block.</p>
<p>So she punched the ball - and it worked!! I think this is the first and
only time she has used this bit in a game. Frankly I am pretty impressed
(and proud) that she remembered and used this move at the exact right
time!</p>
<p>This play got a big reaction from the parents on both sides.</p>
<p>I was at the other end of the field when this occurred. I thought the
ball had gone in. My daughter thought the ball had gone in. Then there
was this rising confusion of sound from the parents on both sides of the
field (ooh's ending in cheers). My daughter looked confused, then looked
around to see the ball behind the goal. (She went from a confused look
to a big grin.)</p>
<p>From the last game of the season. The team that won this game would go
on to the playoffs. My daughter was goalie the first half. The other
team scored only two goals - in the second half - goals that my daughter
could probably have stopped.</p>
<p>Bet the other team's parent were really glad she was not goalie in the
second half.</p>
<p>OK - enough of the proud father nonsense. :)</p>
<p><a href="http://www.flickr.com/photos/dreadedhill/2073057860/"><img src="http://farm3.static.flickr.com/2371/2073057860_3f8f6e1a11.jpg?v=0" alt="untitled" /> No goal! It worked!</a></p>
Wrapping up "Wide Finder"2007-11-30T00:00:00Zhttps://bannister.us/weblog/2007/wrapping-up-wide-finder
<p>For Tim Bray's <a href="http://www.tbray.org/ongoing/When/200x/2007/09/20/Wide-Finder">Wide
Finder</a>,
what you need is something that will lift data off the disk at the
maximum possible rate, and distribute the processing across as many CPUs
as needed. The end-to-end result cannot be generated faster than the
data can be read from disk. The first part of the problem is to get the
data off disk as fast as possible.</p>
<p>My notion was to find the smallest/simplest bit of code that would allow
any reasonable scripting language (Perl, AWK, Python, Ruby, whatever) to
hit optimal elapsed times on a many-CPU box (my take on Tim's notion).
Ripped out most of the unneeded bits from the
<a href="https://bannister.us/weblog/2007/the-wide-finder-project">previous</a>
test program
(<a href="http://svn.bannister.us/public/wide-finder-0">wide-finder-0</a>), wrote a
more efficient buffer rather than line-oriented reader, added in
<strong>getopt()</strong> (so the script run is no longer fixed), and created a
simple <a href="http://svn.bannister.us/public/wide-finder-1">feed-workers</a>
utility.</p>
<pre><code> Usage: feed-workers [ options ] files...
Where options are:
-n N number of worker processes
-r run name of executable to run as a worker (default is /usr/bin/perl)
-s script name of script (passed as argument to worker)
The lines read from given list of files are distributed equally among the workers.
</code></pre>
<p>The <a href="http://svn.bannister.us/public/wide-finder-1">feed-workers</a> program
is the one bit of help you need to efficiently read from the disk and
distribute processing across CPUs running scripts written in your
favorite higher-order language. The full "wide finder" looks like:</p>
<pre><code> feed-workers -n 4 -s scripts/reduce.pl logs/*| scripts/combine.pl
</code></pre>
<p>The results of a test run on a dual-CPU box:</p>
<pre><code class="language-sh"> preston@brutus:~/feed-workers$ time ./feed-workers -n 4 -s scripts/reduce.pl logs/* | scripts/combine.pl > _counts
Thu Nov 29 17:22:09 2007
Scanning: logs/log-00
Scanning: logs/log-01
Scanning: logs/log-02
Scanning: logs/log-03
Scanning: logs/log-04
Scanning: logs/log-05
Scanning: logs/log-06
Scanning: logs/log-07
Scanning: logs/log-08
Scanning: logs/log-09
Scanning: logs/log-10
Scanning: logs/log-11
Scanning: logs/log-12
Scanning: logs/log-13
Scanning: logs/log-14
Scanning: logs/log-15
Scanning: logs/log-16
Scanning: logs/log-17
Scanning: logs/log-18
Scanning: logs/log-19
Worker #29298 ended with status: 0
Worker #29297 ended with status: 0
Worker #29296 ended with status: 0
Worker #29295 ended with status: 0
Thu Nov 29 17:23:36 2007
Elapsed (ms): 86565, total (MB): 4096
Scanned 47 MB/s
real 1m26.738s
user 0m48.311s
sys 0m14.649s
</code></pre>
<p>This is run on a vanilla AMD Athlon 64 X2 4200 box with ~3GB usable
memory . Since the test files total 4GB, the files cannot be cached.</p>
<pre><code class="language-sh"> preston@brutus:~/feed-workers$ uname -a
Linux brutus 2.6.20-16-generic #2 SMP Sun Sep 23 18:31:23 UTC 2007 x86_64 GNU/Linux
</code></pre>
<p>The following measurements are to get some notion of overhead and
performance limits.</p>
<p>Just running the same input through <strong>/bin/cat</strong> without
<strong>feed-workers</strong>.</p>
<pre><code class="language-sh"> preston@brutus:~/feed-workers$ time cat logs/* > /dev/null
real 1m23.065s
user 0m0.096s
sys 0m3.960s
</code></pre>
<p>Running just the Perl scripts:</p>
<pre><code class="language-sh"> preston@brutus:~/feed-workers$ time scripts/reduce.pl logs/* | scripts/combine.pl > __counts
real 1m27.342s
user 0m42.895s
sys 0m4.288s
</code></pre>
<p>Feeding the same input to <code>/bin/cat</code> instead of a Perl script.</p>
<pre><code class="language-sh"> preston@brutus:~/feed-workers$ time ./feed-workers -n 4 -r /bin/cat logs/* > /dev/null
Thu Nov 29 17:26:22 2007
[snip]
Thu Nov 29 17:27:50 2007
Elapsed (ms): 88373, total (MB): 4096
Scanned 46 MB/s
real 1m28.698s
user 0m0.440s
sys 0m14.601s
</code></pre>
<p>Running the "wide finder" with only a single worker process.</p>
<pre><code class="language-sh"> preston@brutus:~/feed-workers$ time ./feed-workers -n 1 -s scripts/reduce.pl logs/* | scripts/combine.pl > _counts
Fri Nov 30 08:14:59 2007
[snip]
Fri Nov 30 08:16:22 2007
Elapsed (ms): 82939, total (MB): 4096
Scanned 49 MB/s
real 1m23.009s
user 0m43.723s
sys 0m14.681s
</code></pre>
<p>Looked at together we get a consistent picture.</p>
<pre><code> real u+s command
------ ----- --------------------------------
83 4 cat
87 47 reduce.pl
89 15 feed-workers + cat (x 4)
87 63 feed-workers + reduce.pl (x 4)
83 58 feed-workers + reduce.pl (x 1)
</code></pre>
<p>All times rounded to whole seconds. Given the limited tests, variance up
to 10% may not be significant.</p>
<p>Since the elapsed times for single-process 'cat' and 'reduce.pl' are
nearly identical, we can conclude that we are disk-limited, and throwing
more CPUs at the problem will not help. Given the user+system CPU time
is about half the elapsed time, as a benchmark, this example "wide
finder" problem is a little too lightweight. To really show off a "wide
finder", we want a processing task heavy enough that no one single CPU
can process that data at disk rates. We probably want a task 3 or 4
times "heavier" in terms of CPU usage.</p>
<p>Looking at the 'feed-workers + cat' and 'feed-workers + reduce.pl'
times, the elapsed times are about the same as the single process times.
Looks like <strong>feed-workers</strong> disk reader is using about 13% of one CPU,
so we could likely handle eight times the I/O rate before a single
process <strong>feed-workers</strong> became a bottleneck (without any further
optimization). This is a good thing, as you would need a <em>very</em> high-end
disk subsystem before you would have to think about multiple readers.
Also the reader would only become a bottleneck if the worker processes
could keep up with the increased rate. Taken together we can expect a
single reader to be optimal in almost all interesting cases.</p>
<p>Looks like starting a Perl (via fork/exec) costs us (very roughly) about
4/3 of second. A bit fat, but not too significant out of the entire
time.</p>
<p>Interesting that the 'feed-workers + reduce.pl (x 1)' time slightly
beats the 'reduce.pl' time, and matches the 'cat' time. This is exactly
the result you hope for on a dual-CPU box.</p>
<p>There might be some room for optimization in the <strong>feed-workers</strong> code,
but looks like we are already into diminishing returns for time
invested. The overhead added feeding multiple workers is small, and can
keep up with much higher than usual I/O rates. A solution based on
<strong>feed-workers</strong> - given enough CPUs - can process data as fast as it
can be read off disk (in the general case), and perform efficiently for
file sizes much, <em>much</em> larger than memory.</p>
<h4>Conclusions</h4>
<ol>
<li>The example "wide finder" problem is too lightweight to show
advantage on a multi-core CPU.</li>
<li>A single instance of the generic <strong>feed-workers</strong> reader should
prove optimal for almost all cases.</li>
<li>The initial reader implementation is efficient enough, as we get a
small performance improvement even on a dual-CPU box.</li>
<li>For one sort of problem, processing line-oriented records where
order does not matter, this a sufficient solution for distributing
across many CPUs without specialized code.</li>
</ol>
What you need for a "Wide Finder", and no more.2007-11-22T00:00:00Zhttps://bannister.us/weblog/2007/what-you-need-for-a-wide-finder-and-no-more
<p>[Replaced initial section with an
<a href="https://bannister.us/weblog/2007/wrapping-up-wide-finder">update</a>
for <strong>feed-reader</strong> results]</p>
<p>Guess I want to hit this part once more, before leaving it alone.</p>
<p>All the solutions that depend on
<a href="http://www.tbray.org/ongoing/When/200x/2007/11/16/WF-Parallel-IO">"parallel I/O"</a>
can only yield fast results when the file is already in memory. The are some (few) scenarios where you can expect the file contents to be already in the disk cache, but this is not the general case.</p>
<p>Do I really have to explain how <em>horribly</em> the "wide finder" examples that count on "parallel" I/O will degrade? If the file contents is not in the disk cache, attempting to read in "parallel" will force a lot of disk seeks. For test files - where the files are likely adjacent and unfragmented - the degradation from many small seeks will be significant. For real log files - accumulated over a long period of time. the files are more likely non-adjacent and somewhat-fragmented - the degradation from many longer seeks could prove profoundly painful.</p>
<p>Not a nice thing to do to your customers.</p>
Sitemap Protocol2007-11-21T00:00:00Zhttps://bannister.us/weblog/2007/sitemap-protocol
<p>This is a big deal. Digging information out of government sites, I have
found, is often obscure and difficult. A framework for making
information easily accessible can be both of general benefit, and help
oversight on government activities.</p>
<blockquote>
<p><a href="http://www.sunlightfoundation.com/sitemap_protocol">Sitemap Protocol | Sunlight
Foundation</a>
Google has been working with federal agencies to help them ensure
that their data are accessible through search engines.</p>
</blockquote>
<blockquote>
<p>The solution to this problem is a non-proprietary standard championed
by Google, called the sitemap protocol. Implementing this standard
helps automated web-crawlers (the stuff of search engines) find their
way around your entire site.</p>
</blockquote>
<blockquote>
<p>From the bill:</p>
<p>`(i) GUIDELINES- Not later than 1 year after the date of enactment of
the E-Government Reauthorization Act of 2007, the Director shall
promulgate guidance and best practices to ensure that publicly
available online Federal Government information and services are made
more accessible to external search capabilities, including commercial
and governmental search capabilities. The guidance and best practices
shall include guidelines for each agency to test the accessibility of
the websites of that agency to external search capabilities.</p>
</blockquote>
Dumb software design - overloading Windows Startup2007-11-21T00:00:00Zhttps://bannister.us/weblog/2007/dumb-software-design-overloading-windows-startup
<p>Visiting my father in Colorado and - as usual - resolving any problems
his computers have developed since my last visit. For context, my father
is an engineer, spent most of his career in aerospace, defense
electronics, more recently chip design from modems (2400 baud through
56K) and more recently cell phone chip sets. Not a software guy, but
definitely a techie.</p>
<p>I happened to be watching while he booted his "old" laptop (Winbook J4,
2Ghz Pentium, 512MB memory). The disk rattled. Icons appeared and
flickered. I think it was ten minutes later, and startup was still
incomplete. Took a minute(!) or so to get Windows Task Manager running.</p>
<p>Main problems:</p>
<ul>
<li>Too much <em>shit</em> loaded at startup.</li>
<li>Not enough memory (though 512MB should be <em>enough</em>).</li>
<li>A badly fragmented hard disk.</li>
<li>Norton's fat/slow/bloated "security" software.
<em>(<a href="http://blogs.zdnet.com/Ou/?p=327">verified</a>)</em></li>
</ul>
<p>First obvious problem was too many "quick start" helper applications
loaded at startup helped make startup slow (ironic that). Adobe,
QuickTime, Star Office, and AutoCAD were preloading junk into free
memory (of which there is a shortage, not an excess). A bit absurd that
none of these "helpers" seem to note the shortage of memory. Turned them
all off.</p>
<p>Still too damn slow.</p>
<p>Next, went through the "startup" list. Lots of stuff starting every time
that is not used. Makes the startup of the applications that <strong>are</strong>
used very slow. Turned off everything not needed.</p>
<p>Memory use is a bit better. Still too damn slow.</p>
<p>Looked at the process list. What the heck are all these processes!? A
good number are "update" processes - HP, RealPlayer, Norton (and more)
all have processes launched for the sole purpose of checking for product
updates. Dumb. Windows has support for "Scheduled Tasks". Processes
taking up CPU and memory for a task that Windows could do with far less
overhead - is not brilliant.</p>
<p>Started up the disk defragmenter. We spent the afternoon in Telluride
(as we are on vacation), got the kids season ski passes, wandered
around, ate lunch, and drove back. Found the defragmenter <em>still</em>
running!</p>
<p>Yes, the disk was badly fragmented ... but still this seems excessive.
Too little free memory, 17% free disk, and ... possibly ... Norton's
"security" software hogging far too many resources?</p>
<p>Will get to the bottom of this, eventually.</p>
<p><strong>Update:</strong> I have a long history of distrust of anti-virus software, as
I have seen bad effects on performance, and bad effects on system
reliability. Looking at all the processes used by Norton, and knowing
that some of the antivirus software overhead may be incurred in other
processes, I strongly suspected Norton could be part of the performance
problem. Looks like <a href="http://www.thepcspy.com/read/what_really_slows_windows_down/5">someone else asked the same question, and got an
answer</a>.</p>
<p>Norton is history. Installed AVG Anti-virus, which did indeed make a
notable improvement, both in Windows startup and in later application
startup.</p>
Netbeans love-hate2007-11-14T00:00:00Zhttps://bannister.us/weblog/2007/netbeans-love-hate
<p>Have to love Matisse - the GUI composer in Netbeans - and there are many
other interesting features, but I find too many sequences like the
following when using Netbeans:</p>
<p>click, drag or type ... !@#$%??
(go back) click ... ?!? ... (hold mouse still over object) press mouse
button down (wait) release button ... (now it worked, continue)</p>
<p>So my desktop box is "only" an Athlon XP 3400 (no X2, no x64), and there
is "only" 2GB memory ... but still. Mouse tracking, hit detection, event
queuing - should not be that difficult. Having in a past life written
GUI code on the original sub-5Mhz PC, there is just no way I can excuse
Netbeans for not keeping up on a box that is <em>thousands</em> of times
faster.</p>
<p>Love Matisse ... but starting to hate Netbeans.</p>
I Want My iTV2007-11-14T00:00:00Zhttps://bannister.us/weblog/2007/i-want-my-itv
<blockquote>
<p><a href="http://www.businessweek.com/magazine/content/07_47/b4059401.htm?campaign_id=rss_daily">I Want My
iTV</a>
"We know that Apple has destroyed the music business, in terms of
pricing, and if we don't take control they'll do the same thing on the
video side," NBC Universal (GE ) chief Jeff Zucker told an audience at
Syracuse University's S.I. Newhouse School of Public Communications on
Oct. 29.</p>
</blockquote>
<p>Nonsense. Apple succeeded in <em>creating</em> a market where others had
failed. At 99¢ a song, the "music business" is making as much or more
per song than they make with CDs. Downloads have none of the costs
associated with manufacturing physical CDs.</p>
<p>The "music business" failed to create an online market before iTunes,
and failed to create viable alternatives after iTunes succeeded. Jobs
created a viable market by offering a good deal to both consumers and
producers. This is capitalism at it's best. Apple <em>earned</em> their money
because Jobs is smart, and did the right things.</p>
<p>Zucker's comments could be more accurately re-cast as:
"We know that Apple created a viable online music business, and we
don't want him to do the same thing on the video side."
After all, if this keeps up outfits like NBC might wonder if folk like
Zucker are worth their salary.</p>
<p>This entire sideshow is so dreadfully predictable. The notion of
on-demand video is not new - but for a long time the costs were too
high. With cheap/fast hardware, common availability of internet
connections, and dropping prices for bandwidth - "iTV" is possible now.
The old models for video - created by then-current technology - are
breaking down in the face of new technology. The existing TV/cable
industry "channels" are about to become a lot less relevant. Eventually
the "industry" will adjust to reality. Lots of folks getting fat checks
off the status-quo will find their money has gone elsewhere. Outfits
that figure out how to fit the new reality will do well.</p>
<p>The landmark will be the first successful video produced, marketed, and
distributed entirely outside the existing TV/cable industry "channels".
Distribution is currently possible but still awkward. It will take a
little while for distribution - enhanced Tivo, or software like Miro -
to become easy. My guess is we are looking at 5-10 years out. There is
an outside chance (<em>way outside</em>) that the "industry" will get a clue,
and with Jobs help could make things arrive earlier.</p>
Dumb GUI example - menubars2007-11-14T00:00:00Zhttps://bannister.us/weblog/2007/dumb-gui-design-a-micro-example
<p>Back in the 1980's, the menubar was brilliant. Applications loaded off
floppy disk had to be small. Small applications could not have too many
functions. Functions could be completely enumerated in the menubar.
Browsing through the menubar pull-down menus could pretty much tell you
everything the program could do. On-line help was limited or
non-existent - as there just was not space - so application functions
needed to be fairly obvious. Generic support for menubars could built
into the base system, saving precious RAM for the application, and
saving programmer time. All around a simple and clean solution to a
common problem.</p>
<p>Menubars made so much sense that they became a habit. Whole new
generations of programmers picked up the habit, without quite knowing
the original basis. Everyone "knows" that <em>real</em> GUIs <em>must</em> have
menubars....</p>
<p>In 20-odd years applications have grown huge. The number of
easily-supported functions in applications has exploded. Crowded
menubars, long pull-downs, cascaded menus (another <em>really bad</em> idea),
menu choices that in turn lead to paged/tabbed/indexed dialogs ... all
are symptoms of a growth problem.</p>
<p>Which leads to today's annoyance. Was working with NetBeans and for some
reason javadoc and sources were not hooked up for the Swing libraries.
Right ... must be an IDE option somewhere, so pulled up:</p>
<p>[(from NetBeans)</p>
<p><img src="https://bannister.us/weblog/images/gui-example-menus.png" alt="untitled" />](/weblog/images/gui-example-menus.png)</p>
<p><em>Right.</em> Yep, I am sure it's in there somewhere.</p>
<p>We have all been down this path before. You know the
option/setting/command is there, and you are going to <em>SEARCH</em> until you
find it. Maybe you remember roughly where to look. How many times have
you opened a dialog, then realised <em>oh, it's not here...</em>. Maybe you
fire up a web browser, and <em>SEARCH</em> for "how to do...". Then once you
find the command/option/setting, it may not obvious how it works. Maybe
you hit the <strong>F1</strong> key hopefully ... I say <em>hopefully</em> because even
$$$ billions-per-year Microsoft software has no or useless on-line
help (at least in the places where you really hoped <strong>F1</strong> would work).</p>
<p>Um, hello? Anyone paying attention?</p>
<p>The old habit no longer makes sense. Time (way past time) to flip the
design completely around. Applications do a lot. Lots of users are going
to use only a small subset of an application. Push the stuff they do not
need to see into the background. Pull forward the bits they need to see.
Make <em>search</em> a part of the user interface design. Users are going to
hunt-and-peck at the UI, doing their own ad-hoc search - whether you
help them or not. Help them.</p>
<p>The really sad part is when web developers feel compelled to incorporate
pull-down menus into web pages (so it looks like a "real" application).
Talk about going in entirely the wrong direction.....</p>
The Wide Finder Project2007-11-12T00:00:00Zhttps://bannister.us/weblog/2007/the-wide-finder-project
<p><a href="https://bannister.us/weblog/2007/wrapping-up-wide-finder">[wrap up - added later]</a></p>
<p>I must be getting cranky in my old age. The discussion around Tim Bray's
"Wide Finder" bugs me.</p>
<blockquote>
<p><a href="http://www.tbray.org/ongoing/When/200x/2007/09/20/Wide-Finder">ongoing · The Wide Finder Project</a>
In my Finding Things chapter of Beautiful Code, the first complete
program is a little Ruby script that reads the ongoing Apache logfile
and figures out which articles have been fetched the most. It’s a
classic example of the culture, born in Awk, perfected in Perl, of
getting useful work done by combining regular expressions and hash
tables. I want to figure out how to write an equivalent program that
runs fast on modern CPUs with low clock rates but many cores; this is
the Wide Finder project.</p>
</blockquote>
<p>First, the example problem chosen by Tim Bray is crap, but the
underlying question is good. The example can be made to run at near-full
I/O speed, and this fact is distracting too many folks. The underlying
question - how to spread a common problem over lots of CPUs - is a
worthy topic.</p>
<p>Second, given the above context, optimizing the regex use is irrelevant
(though fun for folks with a twisted sense of fun - of which I am one).</p>
<p>Third, there are an amazing number of folk who <em>still</em> seem to be
clueless when it comes to optimizing disk I/O. Memory-mapped I/O is not
magic. Operating Systems optimize sequential I/O - have seen writings
from both Sun and Microsoft (and older), but have no references to
offer. Very likely stdio is faster than C++ streams (some history
there). Seeks are not free - so reading off <em>more</em> than one place on
disk is usually bad for performance.</p>
<p>In sum we can expect a single process/thread using stdio/fopen/fgets
could suck up all (or near all) the I/O throughput and deliver
near-optimal results. More than one thread doing disk reads is
non-optimal for most machines (like 90%+). Any approach that starts with
more than one thread doing disk reads is probably a Really Bad Idea.
(Think about the physics of a disk drive - it is not complicated.)</p>
<p>Still, a guess is not as good as a measurement. As a first cut, wrote a
simple program to measure reading a large file using stdio (no other
processing), and to measure the effect of applying a regex as in Tim's
example.</p>
<p>preston@mite:~/workspace/wide-finder-0$ time Debug/wide-finder-0 log-*
Scanning: log-00
Scanning: log-01
Scanning: log-02
Scanning: log-03
Scanning: log-04
Scanning: log-05
Scanning: log-06
Scanning: log-07
Scanning: log-08
Scanning: log-09
Scanning: log-10
Scanning: log-11
Scanning: log-12
Scanning: log-13
Scanning: log-14
Scanning: log-15
Scanning: log-16
Scanning: log-17
Scanning: log-18
Scanning: log-19
Elapsed (ms): 26120 total (MB): 4077 lines: 20000000
Scanned ?? MB/s
Scanning: log-00
Scanning: log-01
Scanning: log-02
Scanning: log-03
Scanning: log-04
Scanning: log-05
Scanning: log-06
Scanning: log-07
Scanning: log-08
Scanning: log-09
Scanning: log-10
Scanning: log-11
Scanning: log-12
Scanning: log-13
Scanning: log-14
Scanning: log-15
Scanning: log-16
Scanning: log-17
Scanning: log-18
Scanning: log-19
Elapsed (ms): 258260 total (MB): 4077 lines: 20000000 matched: 14571780
Scanned 15 MB/s
Final elapsed (ms): 284380</p>
<p>real 6m20.018s
user 4m18.864s
sys 0m25.522s
preston@mite:~/workspace/wide-finder-0$</p>
<p>Sources are at: <a href="http://svn.bannister.us/public/wide-finder-0">http://svn.bannister.us/public/wide-finder-0</a></p>
<p>Using stdio with a simple fgets() loop is able to suck in over ??MB/s on
my not-cutting-edge hardware. Looks I/O not CPU bound. The input files
total bigger than memory, so this is real not cached disk reads. My
guess is that a single CPU on a Niagara box will do at least as well (or
my faith in the Sun folk is misplaced).</p>
<p>What this tells us is - as expected - a single CPU doing disk reads is
right for this problem.</p>
<p>The second part adds applying a regex as in Tim's example. Throughput
drops to 15MB/s and process is (very!) CPU bound. For the purpose of
Tim's exercise, this is excellent! The next logical step would be to
find a way to distribute the CPU-hungry regex processing across multiple
CPUs.</p>
<p>Just to be clear ... for the purpose of Tim's topic, none of the
following is relevant.</p>
<ul>
<li>Comparisons between the performance of my box and another box.</li>
<li>Optimizing the file reader. (It is already I/O bound.)</li>
<li>Optimizing the regex processing. (Do I have to explain this?)</li>
</ul>
<p>What is relevant is distributing the regex processing across multiple
CPUs. My next iteration would be for the reader to place lines into some
sort of in-memory queue (or simple pipes), with a scalable number of
threads (~1 per CPU or as needed for the task) reading from the queue.
For this problem, outputs from each regex-thread by a single(?)
post-processing thread (merging the counted request strings). This is
where the problem gets interesting. It is easy to come up with very
specialized solutions. What would be more generally useful is a pipeline
something like:</p>
<p>(one instance of reader ) -> (N instances of regex/counter) -> (one
instance of merge process)</p>
<p>The reader should probably be C++ code (so we can get full I/O
throughput), but I'm tempted - just to prove Tim's point - to write the
intermediate and backend processes in AWK. :)</p>
<p>Lacking access to a T2 (or the like), I can write the code, but not do
any really interesting experiments. Oh well.</p>
Using Eclipse to improve NetBeans2007-11-01T00:00:00Zhttps://bannister.us/weblog/2007/using-eclipse-to-improve-netbeans
<p>Used NetBeans to put together a Swing application framework and to
prototype a GUI. The NetBeans folk follow the new Swing/JDesktop work
pretty closely, and the generated code is a time-saver. Matisse is good
solid step up from other "visual editors" I have used before, and is
also a time-saver.</p>
<p>Not that Matisse is perfect - it gets confused easily, and I have had to
start over or restore a prior version from version control more than
once. Not that the underlying implementation is simple, and I am using a
6.0 beta - so the problems are understandable.</p>
<p>Otherwise I find Eclipse somewhat preferable for general editing /
refactoring / debugging. I took the NetBeans-generated project and
copied into a subdirectory of a newly-created Eclipse Java project, then
adjusted source, libraries, and output to match. The end result is a
project that can be built under either Eclipse (generally) or NetBeans
(GUI work).</p>
<p>Eclipse took one look at the NetBeans-generated sources, and came up
with a bunch of warnings. :)</p>
<p>A couple decades back I was running all my "C" sources through <strong>lint</strong>
on a regular basis. Yes, I was one of those odd folk who actually <em>used</em>
lint. All my builds were done with the production compiler (Greenhills)
at the highest warning level. I had even ported the GNU C/C++ compiler
to our in-house system (a <em>very</em> tedious operation), and ran all the
sources through with "-Wall". The interesting bit is that each tool
could spot problems (or potential problems) that the others missed.</p>
<p>Now I'm using NetBeans to do what Eclipse cannot, and Eclipse to spot
dubious code that NetBeans missed. Kind'a familiar, this. :)</p>
<p>The potentially useful bit here is that the NetBeans folk could improve
Matisse-generated code by using Eclipse for an extra round of testing.
Wonder what the chances are?</p>
Point of view2007-10-29T00:00:00Zhttps://bannister.us/weblog/2007/point-of-view
<blockquote>
<p>Life is not about waiting for the storm to pass,
It's about learning to dance in the rain.</p>
</blockquote>
<p>Where is this quote from?</p>
<p>Brought to mind by the recent wildfires in coastal southern California.
Floods, earthquakes, and wildfires are a natural part of living in
southern California. Much of the Los Angeles basin is a flood plain.
Folk here are largely unaware of the massive system of dams, channels
and drains put in place decades ago. When heavy rains come, huge volumes
of water are quietly channelled into the ocean, unnoticed by most.</p>
<p>We have seen earthquakes <em>here</em> cause a few cracked buildings and minor
injury - that <em>elsewhere</em> might level an entire city. The earthquake
standards for buildings do largely work.</p>
<p>Wildfires burning around communities here - built in the 1980's and
90's - passed through causing essentially no damage. The surrounding
buffer zones - thinned, landscaped, and carefully maintained - did
exactly what they were meant to do.</p>
<p>The story further south, in San Diego, is different.</p>
Eating my words2007-10-29T00:00:00Zhttps://bannister.us/weblog/2007/eating-my-words
<p>Guy from work asked if I needed new equipment. Doing all my work on my
personal gear, and upgraded stuff as needed. Told him I was fine -
really did not need an upgrade.</p>
<p>Since then I found my time going into heavy refactoring of code
inherited from a departed developer. Refactoring as the original code is
not remotely close to my personal standards. Find I am reading up on
Swing (been a while - things have changed). Of course there is time
pressure (lots). Running through lots of code, ripping out and
refactoring as I go, and the !@#$% computer <strong>CANNOT KEEP UP!</strong></p>
<p>Serves me right, I suppose.</p>
<p>As a side note - the "Visual Editor" in Eclipse 3.3 is gone (so far),
and in Eclipse 3.2 is quirky and slow (at least in my usage). The
equivalent in NetBeans - "Matisse" - is excellent! On the other hand
NetBeans sucks at refactoring (slow/quirky), at least compared to
Eclipse. Been switching between NetBeans 6.0b1, 6.0b2, and 5.5.1 (you
don't want to know), then back to 6.0b1.</p>
<p>NetBeans gets noticeably better with each new release, but is still full
of quirks (too often you have to slow down and "explain" things at a
rate NetBeans can absorb). Eclipse is much better generally, but lacks a
decent GUI builder (critical to iterating - the only way to build a
decent GUI). Means I have both installed and switch as needed. Not
helping the time spent on the learning curve, guys.</p>
<p>Dammit - need to upgrade my hardware, again.</p>
Wildfires2007-10-22T00:00:00Zhttps://bannister.us/weblog/2007/wildfires
<p><a href="http://www.flickr.com/photos/dreadedhill/sets/72157602600618553/"><img src="http://farm3.static.flickr.com/2003/1684612632_cbaeb7d950.jpg?v=0" alt="untitled" /></a></p>
<p>The <a href="http://en.wikipedia.org/wiki/Santa_ana_wind">Santa Ana winds</a> are
blowing again. Strong winds - gusting here between roughly 20 to 40
miles per hour - carrying warm, dry air. In addition this is a dry part
of a fairly dry year. Most of the undeveloped hills in coastal southern
California are covered by
<a href="http://en.wikipedia.org/wiki/Chaparral">Chaparral</a> - and highly
combustible this time of year.</p>
<p>Today we have fires. There is a fire burning perhaps a mile from my
home. I can see clouds of orange-brown smoke out the window. Not a big
concern, as this community was built with fire in mind. Houses were
built with concrete tile roofs, and stucco sides. Talked to a
firefighter last time (years ago) when fire came near. He noted that the
risk to houses of this sort was usually from add-on wooden structures
built nearby - patio covers and gazebos. The neighbourhood is surrounded
by a buffer zone - cleared, landscaped, and lightly irrigated - and is
at the bottom of a slope. Fire burns more slowly downhill. Last time we
had a fire out here, it took all night for fire to burn from the top to
the bottom of the hill - then died when it reached the buffer.</p>
<p>On the other side of Los Angeles there is a big fire in the Malibu area.
Drove around the Malibu area a couple years back. Saw expensive homes
nestled amid thick stands of fragrant chaparral. Saw houses with rustic
wood-shake roofs and even wood-shake siding. All very nice and very
likely to be lost the next time fire passes through the area. My
feelings are decidedly mixed about the homes lost in the Malibu fire.
When homeowners choose to build homes in such insane fashion, should
firefighters be asked to risk their lives defending those homes from
fire? Should the government step in and offer aid when those houses
eventually burn?</p>
<p>The wildfires are burning. Last night went out and took pictures. Will
take more pictures during the day. Closed up the windows, to keep out
the worst of the smoke (not bad here in any case). Fire vehicles
occasionally roll through - looking for problems most likely - then
leave. Otherwise, the whole thing is mildly diverting.</p>
<p><a href="http://www.flickr.com/photos/dreadedhill/1693008644/"><img src="http://farm3.static.flickr.com/2243/1693008644_2af288951f_m.jpg" alt="untitled" /></a></p>
<p><strong>Update - 10am:</strong> Winds have died down - gusts are maybe 20 mph, with a
quite modest breeze between. Lots of folk cruising through, to look as
the fire started creeping down the hill visible from the street. Lots of
worried looking folks coming back from work to check on their homes.
Emergency vehicles cruising through looking for something to do.
Over-protective parents picking up their kids from school, enough so the
teacher cannot do lessons. Happy-chirpy daughter voice on the phone:
"Daddieee, can you pick me up??" (No school today!!) Later, she ran
around outside with the happy dog, while I took pictures and chatted
with the neighbours.</p>
<p>We should have more fires, maybe.</p>
<p><strong>Update - 6pm:</strong> Winds still occasionally gusting, but mostly just a
gentle 5-10mph breeze (if that). During the day the fire burned
clockwise around the community, from west in the morning, through north,
and now east in the evening. Lots of folk out looking. Lots of fire
crews cruising around and keeping an eye on things (just exactly as they
should). Despite the attempts to create sensationalism on the TV news,
the fact is - <strong>everything worked!</strong> The buffer zones around the
community kept the fire at a safe distance. So far as I know, <strong>not one
single house</strong> caught on fire.</p>
<p>Towards evening the fire burnt down the small thickly-grown canyon kept
for the hiking trail into the local "wilderness area". For a period of
time the fire was quite dramatic. The local school - Foothill Ranch
Elementary - is along one side of the canyon (kids get to see the
occasional deer, coyote, etc.). The TV news reported "firefighters are
trying to save the school!!". The firefighters caught on camera were
looking pretty relaxed, just keeping a close watch on the fire. In fact
<em>outside</em> the school there is a buffer zone - cleared, landscaped, and
maintained. Also <em>inside</em> the school fence there was another buffer
zone. Looks like the buffer zones worked <strong>exactly</strong> as designed.</p>
<p>Given how little real trouble we had - given how well the proper zoning,
construction, landscaping and maintainence worked - you have to wonder
about the areas where houses burned, and where firefighters had to risk
injury to protect property. Somehow it seems loss and risk of that sort
should be largely unnecessary.</p>
trackerd and Ubuntu 7.102007-10-20T00:00:00Zhttps://bannister.us/weblog/2007/trackerd-and-ubuntu-710
<p>If and when you upgrade to Ubuntu 7.10, best you run:</p>
<p>sudo apt-get remove tracker-utils</p>
<p>There is lots about this on the web (in bits and pieces). Boils down to
software that was promoted for general distribution <em>way before</em> is was
ready.</p>
<p>The short form, if you are developer - you do not write a background
indexer that saturates the disk, or drains a laptop battery. If you
can't get this right up front, you are not ready for general
distribution. If you do not know how to keep from saturating the disk
(or that you are running on battery), then you are <strong>really not ready</strong>.</p>
Product activation - Corel just lost a customer2007-10-19T00:00:00Zhttps://bannister.us/weblog/2007/product-activation-corel-just-lost-a-customer
<blockquote>
<p>Recently you requested personal assistance from our on-line support
center. Below is a summary of your request and our response.</p>
<p>If this issue is not resolved to your satisfaction, you may reopen it
within the next 7 days.
Thank you for allowing us to be of service to you.</p>
<p>To update your question from our support site, click the following
link or paste it into your web browser.</p>
<p>http://www.corel.com/rightnow/redirect_en.html?p_userid=preston@bannister.us&p_next_page=myq_upd.php&p_refno=070911-000219&p_created=1189536562</p>
<h2>Subject</h2>
<p>Activation problem</p>
<h2>Discussion Thread</h2>
<p>Response (Angelo) - 09/11/2007 11:08 PM
Dear Preston,</p>
<p>Thank you for contacting Corel Support Services. We have reviewed your
e-mail and determined that we can most effectively address your
inquiry if you contact us via telephone. A full listing of contact
numbers for Corel Customer Support Services can be found at:</p>
<p>http://support.corel.com/scripts/rightnow.cfg/php.exe/enduser/std_adp.php?p_faqid=754347</p>
<p>Regards,</p>
<p>Angelo
Corel Customer Support Services
http://www.corel.com
<em>[snip]</em></p>
<p>Customer (Preston Bannister) - 09/11/2007 02:49 PM
Fired up my copy of Paint Shop Pro today. Got a "Thank you for
purchasing ..." message. Did re-install XP a while back. Did create an
alternate user profile more recently. Perhaps I'd not used the
application since the re-install.</p>
<p>Clicked on the "Activate now" link and got the message:
"Sorry the serial number you are using has already been submitted the
maximum number of times for activation"</p>
<p>Right. So now I'm running in "trial" mode.</p>
<p>If this is going to be an ongoing problem, I am going to feel
uncomfortable upgrading PPS in future. No point in buying a product if
someday I find it no longer installs properly.
<em>[snip]</em></p>
</blockquote>
<p>Lots of words above, but no help. Just wasted about a half hour waiting
on the phone with Corel, after probably another half hour trying to get
support via email (above). If this happened to me once, odds are it will
happen again. I asked - newer versions of the product have the same
activation scheme. Not real keen about buying an upgrade anymore.</p>
<p>My 11-year-old daughter has become rather proficient at using GIMP. Have
used it a bit myself, though I am less than impressed with the UI. Given
that GIMP is portable, guess I will be spending more time puzzling out
the UI....</p>
CSS gone wrong - java.net2007-10-12T00:00:00Zhttps://bannister.us/weblog/2007/css-gone-wrong-javanet
<p>Argh. Had too many annoyances to clear out of late - I am all out of
tolerance. You are warned.</p>
<p>Opened up <a href="http://www.java.net/">java.net</a> again today. Saw the too
small text, again. Could hit "Ctrl-+", again ... but not today. Turned
on <a href="http://www.getfirebug.com/">Firebug</a> (a wonderful tool, BTW),
clicked "Inspect" and on the undersized text. The offending bit of
style:</p>
<p>body, th, td, p, div, dl, li, select, input, textarea, blockquote {
font-size: 12px;
}</p>
<p>Right. The font size is defined in pixels. Dumb. Always has been. For
those of you who were asleep when you should have been paying attention,
please remember, the number of pixels per inch is not the same for all
screens. Specify <em>anything</em> in pixels, and you <u>will</u> get different
sizes on different screens.</p>
<p>This is one of those common mistakes I have seen repeated over, and
over, and ... over the past twenty-odd years.</p>
<p>In CSS that is what "pt" (point) sizes are all about. If your system is
set up properly, point sizes will yield the same visible size,
independent of display resolution. Used Firebug to change the "12px" to
a proper "10pt". Much better! There are other "px" font sizes in the
style sheets that need to be cleaned out, but just the one change makes
the bulk of the text readable.</p>
<p>Oh right. The <strong>java.net</strong> site is using table-based layout. Grrr....</p>
<p>So just who exactly is responsible for the <strong>java.net</strong> site? In
<a href="http://www.java.net/about.csp">About</a> ... nope. Perhaps
<a href="https://java-net.dev.java.net/feedback.html">Feedback</a>? No obvious link
to whomever styles the website. A <a href="https://java-net.dev.java.net/servlets/Search?scope=project&resultsPerPage=40&query=css&Button=Go">general search on
"CSS"</a>
yields one possibly relevant hit on <a href="https://java-net.dev.java.net/servlets/ProjectForumMessageView?forumID=93&messageID=1965">font
size</a>.</p>
<p>Forum Wish List
From sarahb
Subject Re: Font size
Date 2004-03-30 21:45:48 GMT</p>
<p>Hi Patrick,</p>
<p>Thanks for your message. The CSS on our pages uses pixels
to set the font-size. Currently this causes IE's text
enlarging to not work. This is easy to get around,
though. All you need to do is go to Tools->Internet
Options (in IE) and choose Accessibility (near the
bottom). Then check the "Ignore font sizes specified on
Web pages" box.</p>
<p>There are a number of reasons we chose to use pixels to
set the font size. Here's a good reference for CSS issues
if you're interested:
http://www.aglasshalffull.org/css-resources/CSS-Issues.htm</p>
<p>Regards,
Sarah
java.net Producer</p>
<p>Well, that is an answer - if wrong.</p>
<p>Tracking things down this far was tedious. For some reason the
<strong>java.net</strong> site is <em>SLOW</em>. Bit disturbing, as Sun produces some
<a href="http://www.sun.com/featured-articles/2007-0807/feature/index.jsp">really wonderful
hardware</a>,
and given all the <a href="http://blogs.sun.com/dagastine/">interesting work</a>
going into optimized the JVM. Not exactly a showcase.</p>
Why some schools do better than others2007-10-08T00:00:00Zhttps://bannister.us/weblog/2007/why-some-schools-do-better-than-others
<p>Subject: Room 9 News
Date: Mon, 8 Oct 2007 12:22:34 -0700
From: "xxxx, xxxx (Foothill Ranch Elementary School)" <a href="mailto:Lxxxx@svusd.org">Lxxxx@svusd.org</a>
To: <a href="mailto:jxxxx@gmail.com">jxxxx@gmail.com</a>, <a href="mailto:nxxxx@aol.com">nxxxx@aol.com</a>, <a href="mailto:txxxx@aol.com">txxxx@aol.com</a>,
<a href="mailto:gxxxx@cox.net">gxxxx@cox.net</a>, <a href="mailto:pxxxx@bannister.us">pxxxx@bannister.us</a>, <a href="mailto:fxxxx@cox.net">fxxxx@cox.net</a>,
<a href="mailto:mxxxx@cox.net">mxxxx@cox.net</a>, <a href="mailto:txxxx@yahoo.com">txxxx@yahoo.com</a>, <a href="mailto:kxxxx@cebridge.net">kxxxx@cebridge.net</a>,
<a href="mailto:bxxxx@cox.net">bxxxx@cox.net</a>, <a href="mailto:jxxxx@yahoo.com">jxxxx@yahoo.com</a>, <a href="mailto:hxxxx@cox.net">hxxxx@cox.net</a>,
<a href="mailto:gxxxx@yahoo.com">gxxxx@yahoo.com</a>, <a href="mailto:pxxxx@mbzdirect.com">pxxxx@mbzdirect.com</a>,
<a href="mailto:jxxxx@gmail.com">jxxxx@gmail.com</a>, <a href="mailto:exxxx@pacbell.net">exxxx@pacbell.net</a>,
<a href="mailto:bxxxx@hotmail.com">bxxxx@hotmail.com</a>, <a href="mailto:kxxxx@cox.net">kxxxx@cox.net</a>,
<a href="mailto:dxxxx@mac.com">dxxxx@mac.com</a>, <a href="mailto:mxxxx@wittkieffer.com">mxxxx@wittkieffer.com</a>,
<a href="mailto:dxxxx@cox.net">dxxxx@cox.net</a>, <a href="mailto:pxxxx@cox.net">pxxxx@cox.net</a>, <a href="mailto:mxxxx@yahoo.com">mxxxx@yahoo.com</a>,
<a href="mailto:rxxxx@cox.net">rxxxx@cox.net</a>, <a href="mailto:dxxxx@yahoo.com">dxxxx@yahoo.com</a>, <a href="mailto:jxxxx@cox.net">jxxxx@cox.net</a>,
<a href="mailto:dxxxx@cox.net">dxxxx@cox.net</a>,
"Lee, Jim (Foothill Ranch Elementary School)" <a href="mailto:Jxxxx@svusd.org">Jxxxx@svusd.org</a>,
<a href="mailto:jxxxx@noevirusa.com">jxxxx@noevirusa.com</a>, <a href="mailto:sxxxx@cox.net">sxxxx@cox.net</a>, <a href="mailto:sxxxx@pb.com">sxxxx@pb.com</a>,
<a href="mailto:rxxxx@yahoo.com">rxxxx@yahoo.com</a>, <a href="mailto:kxxxx@accessmicrocorp.com">kxxxx@accessmicrocorp.com</a>,
<a href="mailto:exxxx@cox.net">exxxx@cox.net</a>, <a href="mailto:gxxxx@cox.net">gxxxx@cox.net</a>, <a href="mailto:hxxxx@cox.net">hxxxx@cox.net</a>,
<a href="mailto:dxxxx@shadycanyongolfclub.com">dxxxx@shadycanyongolfclub.com</a>, <a href="mailto:sxxxx@hotmail.com">sxxxx@hotmail.com</a>,
"Txxxx, xxxx (Foothill Ranch Elementary School)" <a href="mailto:Cxxxx@svusd.org">Cxxxx@svusd.org</a>,
<a href="mailto:jxxxx@hotmail.com">jxxxx@hotmail.com</a>, <a href="mailto:mxxxx@sbcglobal.net">mxxxx@sbcglobal.net</a>, <a href="mailto:sxxxx@cox.net">sxxxx@cox.net</a>,
<a href="mailto:kxxxx@cox.net">kxxxx@cox.net</a>, <a href="mailto:jxxxx@cox.net">jxxxx@cox.net</a>,
<a href="mailto:axxxx@yahoo.com">axxxx@yahoo.com</a>, <a href="mailto:bxxxx@rootmarketing.com">bxxxx@rootmarketing.com</a>, <a href="mailto:mxxxx@cox.net">mxxxx@cox.net</a>,
<a href="mailto:mxxxx@cbre.com">mxxxx@cbre.com</a>, <a href="mailto:txxxx@cox.net">txxxx@cox.net</a>, <a href="mailto:gxxxx@cox.net">gxxxx@cox.net</a>,
<a href="mailto:txxxx@advantevh.com">txxxx@advantevh.com</a></p>
<p>Dear Parents,</p>
<p>Many of you volunteered to come along on the field trip with us this
Friday. Unfortunately, we are only able to bring one parents with us!
I just did a blind drawing so that the selection would be fair. Axxxx
Hxxxx is the lucky winner, who gets to spend some quality time with
200 eleven year olds!</p>
<p>Thank you all for offering your time,</p>
<p>Ms. Pxxxx</p>
<p>Yes, the teacher is sending updates to 48 parent email addresses - for
the 32 kids in her class.</p>
<p>As one parent observed, in her old neighbourhood the teacher would be
lucky to get just one volunteer - and kids generally did not do as well.</p>
Hot memory2007-09-16T00:00:00Zhttps://bannister.us/weblog/2007/hot-memory
<p>Seem to have spent much of the past week out somewhere past the bleeding
edge...</p>
<p>Put together an Athlon64 box with 4GB memory a couple years back. The
box ran Linux, served as a Samba file server to the Windows boxes in the
house, and hosted test machine configurations running under VMware.
After several months of use, realized the
<a href="https://bannister.us/weblog/2006/always-always-always-run-memtest-on-new-memory">memory was not running at the rated speed</a>,
and wasted far too much time fiddling with settings (with some help from
the manufacturer) - without any improvement.</p>
<p>Since then the price for the Athlon64 X2 (dual processor) CPUs have
dropped to the impulse-buy range. Aside from the general performance
improvement, there are cases where testing against a dual-CPU box would
be helpful. So ordered an
<a href="http://www.newegg.com/product/product.asp?item=N82E16819103053">Athlon64 X2 4200+</a>
and a <a href="http://www.newegg.com/product/product.asp?item=N82E16835185125">new CPU cooler</a>
(I had hopes of overclocking). Dropped the new bits into the box,
updated the motherboard BIOS to the latest, and spent a thoroughly
unpleasant week afterwards.</p>
<p>Tried overclocking the CPU slightly - no joy (errors from Memtest).
Dropped the CPU clock to stock - no problem. Tried raising the memory
speed from DDR333 up slightly closer to the rated DDR400 - no joy. Even
more confusing, I got occasional errors running tests at DDR333 - which
I eventually realized <u>only</u> occurred immediately after testing at
a higher speed. That was the clue! When running tests above DDR333 found
the memory was blazing hot to the touch! Immediately turned the CPU
cooler so that it now pulls cool air over the memory (rather than
blowing slightly warm air as before). Ordered a memory cooler - but it
does not fit in my setup. Looked closely at the
<a href="http://www.newegg.com/Product/Product.asp?Item=N82E16820227210">memory (from OCZ)</a>
and realized the fancy metal "heat spreader" is too thick! - no air can
get in between the sticks of memory. For those folks with only one or
two sticks, this might not be a problem, but with four sticks the entire
set got <strong>very</strong> hot.</p>
<p>(Something almost funny about fancy-looking "heat spreaders" that cause
your memory to overheat. Almost not-really-at-all funny.)</p>
<p>Last time around I had meant to setup the box with a 64-bit version of
Linux, but somehow ended up installing 32-bit. This time meant to have a
full 64-bit setup, so installed the amd64 version of Ubuntu 7.04. The
installation was no problem, but then I made the mistake of getting a
bit ambitious. Only 3GB of memory is reported as available of 4GB
installed. Saw an error/warning in the Linux startup log, and chased
down a reference for how to make that last gigabyte usable (Ctrl-F1 when
in the Award BIOS setup, and ...). This looked great - 4GB usable
memory! - except for the fact the network interface stopped working. No
joy figuring out why. After much fiddling around (and re-installing
Ubuntu, again) reverted to the original settings.</p>
<p>Linux is suffering from an odd sort of fragmentation and perhaps a bit
too much popularity with unskilled users. Trying to find hard
information involves shifting through a lot of junk. Finding someone who
might know more ... I gave up after a while. I would be perfectly happy
to help another developer track down the problem, but I gave up on
finding the right starting point.</p>
Taxpayer bailout for sub-prime investors2007-09-01T00:00:00Zhttps://bannister.us/weblog/2007/taxpayer-bailout-for-sub-prime-investors
<p>Was afraid something like this was coming. I doubt Bush cares much about
individual voters - he cannot be re-elected and is increasingly
unpopular with voters.</p>
<blockquote>
<p><a href="http://www.businessweek.com/investor/content/aug2007/pi20070831_517036.htm?campaign_id=rss_daily">Housing: Bush Rides to the Rescue, Sort
Of</a>
... while the plan has borrower-friendly elements, it's far from
harsh toward business and wealthy individuals. For example, part of
the plan is to allow people who borrowed from private-sector lenders
to switch into lower-cost FHA-insured loans. So the lenders would get
fully paid off, and the risk of default would be transferred to the
FHA—and thus to taxpayers.</p>
</blockquote>
<p>Of course, there are a lot very wealthy people who stand to lose a
money, if the sub-prime market implodes. This is a great racket -
investors make large profits off high-risk investments, and if the risk
turns bad, they get a bailout from taxpayers.</p>
<p>A clearly written bit of background...</p>
<blockquote>
<p><a href="http://business.timesonline.co.uk/tol/business/industry_sectors/banking_and_finance/article2332084.ece">While you were away - fear and loathing in the markets - Times
Online</a>
Investors came to a shuddering realisation that much of the $300
billion (£150 billion) in home loans to America’s poor and others with
patchy credit histories wasn’t going to be paid back. Enticed into
home loans with attractive “teaser” initial terms, many were unable to
meet monthly interest bills once the loans had reverted to normal
money market rates. The rising interest-rate environment added to the
pain. And falling house prices in the United States meant that lenders
were left nursing losses even when properties were repossessed.</p>
</blockquote>
Where The Wild Things Are2007-08-29T00:00:00Zhttps://bannister.us/weblog/2007/where-the-wild-things-are
<p><a href="http://www.flickr.com/photos/malingering/1100102075/"><img src="http://farm2.static.flickr.com/1266/1100102075_04cb56505c.jpg?v=0" alt="dancers" /> AVP dancers in the sand on Flickr - Photo Sharing!</a></p>
Not the definition of "lean"2007-08-29T00:00:00Zhttps://bannister.us/weblog/2007/not-the-definition-of-lean
<p>Downloaded the current version of Ant. Checked the
<a href="http://svn.apache.org/viewvc/ant/core/trunk/src/script/ant?view=markup">script</a>
used to launch Ant - and found the script run every time I type 'ant' at
command line is <strong>326 lines long</strong>! <em>Right.</em></p>
<p>Here is the entire script I need to run Ant (on Linux).</p>
<p>ANT_HOME="/home/preston/tools/apache-ant-1.7.0"
java -classpath "$ANT_HOME/lib/ant-launcher.jar" org.apache.tools.ant.launch.Launcher $*</p>
<p>That is all. If I need more, I can alter the script. Altering the
script - for a programmer - should be at least as easy as figuring out
all the curious behaviours in the supplied startup script.</p>
<p>Here is the entire script I need to run Ant (on Windows).</p>
<p>@echo off
@setlocal</p>
<p>set JAVA_HOME=c:\tools\jdk1.5.0_10
set ANT_HOME=c:\tools\apache-ant-1.7.0</p>
<p>"%JAVA_HOME%\bin\java.exe" -classpath "%ANT_HOME%\lib\ant-launcher.jar" org.apache.tools.ant.launch.Launcher %*</p>
<p>There is one systemic fault that seems to affect all Apache and
similarly organized projects. Products of those projects tend to get
fat. Notions that are only slightly useful get stuffed into the code,
and usually no one is brave enough to trim out the excess. Over time
this makes the code harder to understand, steadily slower and fatter
when run, and more likely to exhibit unintended side effects when
changed.</p>
<p>Minimalism has no place is design-by-committee.</p>
User centered social networks2007-08-17T00:00:00Zhttps://bannister.us/weblog/2007/user-centered-social-networks
<p>Social networking sites generally try to keep users trapped within a
walled ghetto. Users are an asset. Sites do what they can to avoid
sharing their user information. Sites often try to limit links out to
other competing sites.</p>
<p>This is in direct conflict with users needs. Most ordinary folk are
naturally members of many communities. You might be a parent of school
age children. You live within a neighborhood, city, county, state and
country. You might have interests in photography, genealogy, hiking,
dating, religion, aviation - each of which is likely a largely-separate
community from the other. Discounting the craze for kewl "handles", you
probably want to have the same basic identity - your identity - across
all these communities.</p>
<p>Which makes this comment somewhat off target...</p>
<blockquote>
<p><a href="http://www.25hoursaday.com/weblog/2007/08/18/GoogleWorkingOnSocialNetworkAggregator.aspx">Google Working on Social Network Aggregator</a>
From my perspective, I'm skeptical of a lot of the talk about social
network portability because the conversation rarely seems to be user
centric. ... [snip]</p>
<p>A real social network is a community and users don't change
communities at the drop of a hat. What I find more interesting is
being able to bridge these communities instead of worrying about the
1% of users who hop from community to community like crack addled
humming birds skipping from flower to flower.</p>
</blockquote>
<p>Users interact with different "communities" all the time! Any one site
is unlikely to capture (a loaded word) all of your interests. You might
be unlikely to "hop from community to community" for any one particular
interest, but for disparate interests - such "hopping" is almost
guaranteed.</p>
Tanzanian Tech Support2007-08-08T00:00:00Zhttps://bannister.us/weblog/2007/tanzanian-tech-support
<blockquote>
<p><a href="http://blogs.law.harvard.edu/philg/2007/08/08/tanzanian-tech-support/">Philip Greenspun’s Weblog » Tanzanian Tech
Support</a>
When checking into the fairly upscale Hotel Seacliff here in Dar es
Salaam, I asked the reception clerk if there was an adaptor in the
room for a U.S. power plug. He seemed confused, so I pulled out a cell
phone charger to illustrate. He had been chatting with a woman on the
other side of the counter and said “She will go up with you to show
you how to make it work.”</p>
<p>Once up in the room, this woman displayed a charming childlike
ignorance of all things 90-250V. Her technical skills were not
required in any case because the outlet next to the writing desk
accepts European or American plugs directly. What was her ordinary job
function? “I work here in the hotel for companionship and massage.”</p>
</blockquote>
Security flaws, e-voting, and reform2007-08-03T00:00:00Zhttps://bannister.us/weblog/2007/security-flaws-e-voting-and-reform
<p>Let us get a couple things clear to start. First, the older paper-based
voting process is insecure, and always has been. The security of the
process relied on trustworthy people in the polling place, and upstream
where the votes were collected and counted. Most of the time this works,
but abuses do occur.</p>
<p>Second, adding paper-based records to e-voting machines - by itself -
proves nothing. Paper-based records can be faked, either at the polling
place (by subverting the voting machines), or upstream where votes are
counted. Reverting to a paper-based process is not a solution ... except
perhaps to those parties who are comfortable with subverting the
paper-based process.</p>
<p>So called "e-voting" is much worse - if done poorly. The point I want to
make is that with "e-voting" done right, it is <em>possible</em> to make the
entire voting process both <strong>more</strong> reliable and more secure than at any
time in the past!</p>
<blockquote>
<p><a href="http://www.cato-at-liberty.org/2007/08/02/more-e-voting-security-flaws/">Cato-at-liberty » More E-voting Security Flaws</a>
It’s far from a perfect bill. My preference would be to outlaw
touch-screen voting entirely, with or without a paper trail. One of
the biggest flaws in the legislation is that it will allow states to
use touch-screen voting machines with cheap cash-register-style
thermal printers in the 2008 and 2010. In my view, using cheap
printers would be a serious mistake; thermal printers frequently jam,
and the paper tapes they produce are brittle and hard to deal with.
Using such cheap printers dramatically increases the danger that
election officials won’t take the paper trail requirement seriously.</p>
<p>Crucially, the Holt-Davis bill doesn’t require states to use
touch-screen voting machines at all. States may, and in my opinion
should, return to using old-fashioned optical-scan paper ballots.
States have been using optical-scan technology for decades, and it has
far fewer security flaws than computerized voting machines.</p>
</blockquote>
<p>First, the above quote makes the mistake of focusing on the technology.
Focus instead on the end result. You do not care what technology is
used. You only care that whatever used is reliable. Second, reverting to
paper (optical-scan or not) does nothing to make the voting process
secure.</p>
<blockquote>
<p><em>TheHill.com - The urgency of e-voting reform</em>[^1]
The 2008 primary season won’t kick off until next January, but we’re
ready to offer one surefire prediction for Election Day 2008. If our
elected officials don’t move quickly, millions of Americans will make
their choice for the next president on unreliable electronic voting
machines without any paper record of their vote. Regardless of your
political leanings, that’s a troubling thought.</p>
</blockquote>
<p>Frankly, there is probably not enough time to fix things before the 2008
election. The government is not exactly known for fast and efficient
action - especially when there are very few in government who understand
the issues.</p>
<blockquote>
<p>If similar problems crop up in next year’s presidential election, it
will throw the country into the same kind of turmoil it experienced in
Florida in 2000. Fortunately, Congress is currently considering a
bipartisan bill, introduced by Reps. Rush Holt (D-N.J.) and Tom Davis
(R-Va.) and co-sponsored by a bipartisan majority of the House, that
would require all touch-screen voting machines in the 2008 general
elections to produce a paper record of each vote.</p>
<p>Voters would have the opportunity to review and approve the paper
record before he or she leaves the voting booth. To ensure that the
paper records are not just an afterthought, the legislation mandates
automatic audits of at least three percent of all votes cast. If
there’s a glitch in a voting machine’s software, the audit will
uncover discrepancies, and alert election officials to conduct a
manual recount of the voter-verified paper ballots.</p>
</blockquote>
<p>The desire to make things better is encouraging, but a paper trail - by
itself - proves nothing.</p>
<p>From an engineering point of view, this is a simple problem (though with
aspects that require careful thought). What we lack is understanding in
government that this is an exercise in engineering, and a focus on
pulling together the right people.</p>
<p>[^1]: Dead link.</p>
Java’s Fear of Commitment2007-08-03T00:00:00Zhttps://bannister.us/weblog/2007/java-fear-of-commitment
<blockquote>
<p><a href="http://www.redmonk.com/cote/2007/07/25/javas-fear-of-commitment/">People Over Process » Java’s Fear of Commitment</a>
Java is a general purpose, object oriented programming language. It’s
roots in early 90’s object oriented theory, more importantly, the
desires and goals of that theory can’t be overlooked when asking why
Java is the way it is. The culture of Java design is to push out
commitment to a given way of doing things (an “implementation”) as
much as possible. In Java culture, dependencies, esp. conceptual ones,
are nasty and to be avoided. They’re taboo, even.</p>
</blockquote>
<p>The problem with Java ... is not with Java.</p>
<p>To over-simplify - as skill increases, programmers learn increasingly
useful abstractions - procedures, objects, classes, metaprogramming,
etc. The final lesson is to learn minimalism - how to solve a problem in
the simplest and clearest fashion possible. Most programmers make it
only part way up the curve.</p>
<p>Repeating what I have said before:</p>
<blockquote>
<p><a href="https://bannister.us/weblog/2005/xen-java-and-web-hosting">Xen, Java and Web Hosting</a>
PHP - the most commonly available alternative - has a low threshold
for entry for new programmers, and the resulting works largely reflect
this. Lots of projects get started, generate early/flashy results,
then bog down. Look inside and you find the code is a mess. Pretty
much what you would expect from new, enthusiastic programmers with
limited skills. (Admittedly I wasn’t impressed with the internals of
the PHP interpreter either). PHP is good for small/simple webapps, but
beyond that is less desirable (my opinion).</p>
<p>Java projects tend to have a different malady. The threshold for entry
with Java is a bit higher, and requires that you understand
abstractions. Perhaps not surprisingly, the quality of Java code tends
to be higher, with the common failing of too many abstractions.
Occam’s Razor: Do not multiply concepts beyond necessity - could be
more often applied in the Java world (about which Bruce Tate has
written well).</p>
</blockquote>
<p>Java is a wonderful base for a skilled programmer. Java is efficient and
eloquent - with only the less-mature .NET platform as a challenger. Java
does not require you to use extraneous abstractions - though it
certainly makes them easy to write. The Java community offers a flood of
abstractions - some useful, and some less useful. You simply need to
exercise good taste in chosing what to adopt in you projects and
personal practices.</p>
Trillion Dollar Man2007-07-28T00:00:00Zhttps://bannister.us/weblog/2007/trillion-dollar-man
<p>For those who are a little foggy about our current President-Bush and
his spending habits.</p>
<blockquote>
<p><a href="http://www.cato-at-liberty.org/2007/07/26/trillion-dollar-man/">Cato-at-liberty » Trillion Dollar
Man</a>
The recent budget update from the Bush administration shows that
federal spending will be $2.918 trillion in fiscal 2008. That means
that spending increases under Bush will break the $1 trillion mark
when the new fiscal year begins in October. Spending was $1.863
trillion when he came to office in fiscal 2001.</p>
<p>Bush’s last budget year will be fiscal 2009, at which time he is
projecting to spend $3.016 trillion. Thus in eight short years, with
relatively low inflation, this president and spendthrift congresses
will have blasted through both the $2 trillion spending mark and the
the $3 trillion mark.</p>
</blockquote>
<p>Yes, in two terms (one turn at the office), President Bush as the
primary Republican of the 2000's has increased the size of federal
government spending by a solid TRILLION dollars. Cannot blame Democrats
for this profligate spending, as the Republican Congress was in charge
long before Bush took office, and during most of most of the reign of
President Bush (Jr.).</p>
<p>Just to make the point clear - from the nation's founding (call it
1776), it took 224 years to <em>almost</em> get to 2 trillion dollars in the
federal budget. Bush Junior added a cool trillion dollars in only eight
short years!</p>
<p>The lesson to take away from this? Do not look to either the political
parties - Republican or Democratic - for fiscal responsibility. Look
instead at your local representative (whatever his or her party), and
ask if this person is going to do a good, responsible job. Certainly the
Republicans - as a party - have proven in recent years that they cannot
be trusted any more than the Democrats - as a party.</p>
iPhone Use Disappoints; Apple Slides2007-07-28T00:00:00Zhttps://bannister.us/weblog/2007/iphone-use-disappoints-apple-slides
<p>Geez - who are these "analysts" and who is foolish enough to take their
advice? At the same rate (if sustained) AT&T could end up selling 35
million iPhones. How exactly does this count as "disappointing"?</p>
<p>At first I thought this was a joke...</p>
<blockquote>
<p><a href="http://www.nytimes.com/2007/07/25/technology/25phone.html?em">IPhone Use Disappoints; Apple Slides - New York
Times</a>
Apple’s shares slumped 6 percent on Tuesday after AT&T said the early
surge of iPhone buyers starting service on its network was smaller
than some analysts had anticipated.</p>
<p>AT&T, in reporting its second-quarter earnings, said 146,000 iPhone
owners activated service in the day and a half between the phone’s
debut and the quarter’s end. Given the frenzy around the phone’s
introduction, some analysts had predicted that AT&T would report as
many as 500,000 to 700,000 activations in that period.</p>
<p>The report sent shares of Apple down $8.81 to $134.89, while AT&T’s
shares fell 35 cents to close at $39.68.</p>
</blockquote>
Fewer mediocre "journalists" is good news2007-07-24T00:00:00Zhttps://bannister.us/weblog/2007/fewer-mediocre-journalists-is-good-news
<p>Caught this bit of nonsense on the way home.</p>
<blockquote>
<p><a href="http://marketplace.publicradio.org/shows/2007/07/24/PM200707244.html">Marketplace: No newspapers is bad
news</a>
Neil Henry: I had no idea the job cuts at the San Francisco Chronicle
would be this sudden, this deep, this personal. Some of my former
students facing unemployment.</p>
<p>We know what happened: Marvelous search engines like Google with
magical new powers to spread news and information. Along the way
they've profited enormously.</p>
<p>But for a host of reasons, the actual producers of the Web's news
content — the reporters and editors — get very little benefit from
this technological marvel.</p>
</blockquote>
<blockquote>
<p>And so we live in a world of paradox, don't we?</p>
<p>Internet companies provide more news every day, free of charge no
less! Yet highly skilled people doing the expensive work of digging,
finding and reporting the very best of it are endangered.</p>
<p>It's hard for me not to wonder if corporations like Google feel any
tug of civic responsibility. After all, their breathtaking success as
news aggregators has sprung indirectly from the fruit of professional
journalism.</p>
</blockquote>
<blockquote>
<p>Few things to me are more vital than journalism practiced according to
high standards. Simply put, Google could do much more to protect this
public trust: Offer support to journalism education and professional
groups dedicated to truth seeking and time-honored ethical values. And
assist newspapers directly, just as I think it's time for newspapers
to band together to sue to protect content.</p>
</blockquote>
<p>Journalism is flourishing to an extent never before seen - it's just not
coming from ex-journalism students. The number of people writing in
public about topics they know well is far greater than at any time in
the past.</p>
<p>By in large "professional journalism" is vastly overrated. Newspapers
are primarily in the business of selling advertising. Most of the
content that fills up newspapers is frivolous crap. As for "truth
seeking and time-honored ethical values" - few stories are carefully
researched, well informed, and objective. Most are quickly written by
someone with little knowledge of the subject, and little concern for
accuracy.</p>
<p>As the Google's "civic responsibility" ... the implicit assumption in
this statement is that we are losing something of value. We are not.</p>
O.C. sheriff is denied use of law enforcement data2007-07-23T00:00:00Zhttps://bannister.us/weblog/2007/oc-sheriff-is-denied-use-of-law-enforcement-data
<p>Amusing is an odd way...</p>
<blockquote>
<p><a href="http://www.latimes.com/news/local/la-me-ocsheriff17jul17,1,5197025.story?coll=la-headlines-california"><img src="http://www.latimes.com/media/thumbnails/photo/2005-05/17738595.jpg" alt="untitled" />O.C.
sheriff is denied use of law enforcement data - Los Angeles
Times</a></p>
<p>A law enforcement network that gathers intelligence on organized crime
has cut off the Orange County Sheriff's Department because of the
sheriff's association with various businessmen, including a Las Vegas
strip club owner with reputed mob ties now serving time for
racketeering.</p>
<p>Sheriff Michael S. Carona minimized the effect of the suspension,
saying it would have zero influence on his department's police work
and that he had never heard of the Law Enforcement Intelligence Unit
until the chairman contacted him last year about the potential
suspension.</p>
<p>Carona also downplayed his relationship with topless-bar owner Rick
Rizzolo, whom the Intelligence Unit identified as one of several
individuals who associate with the sheriff and "have pled guilty to or
are suspected of involvement in criminal activity … including
traditional organized crime activity."</p>
</blockquote>
<p>How should we read the part about "zero influence on his department's
police work"? Does that mean the information from the "Law Enforcement
Intelligence Unit" have no value, or does this mean Carona has no
interest in using their information?</p>
<blockquote>
<p>The intelligence network, a 51-year-old professional association that
collects and shares intelligence on organized crime, terrorism and
gambling, notified its membership of the decision in an internal memo
issued in June. The group comprises about 250 police agencies in four
countries.</p>
</blockquote>
<p>Might this organization know more about Carona than was made public?
Could it be that Carona is a lot dirtier than we might otherwise know?</p>
Example of configuring Trac and Subversion on Ubuntu2007-07-23T00:00:00Zhttps://bannister.us/weblog/2007/example-of-configuring-trac-and-subversion-on-ubuntu
<p>I chose to replace the stock Ubuntu <strong>apache2.conf</strong>. The stock
configuration created and maintained by Ubuntu is a somewhat clever
collection of included files, but ... the stock Trac and Subversion
install did not do what I wanted. Figuring out what was not working was
tricky enough, so I simplified and re-built the configuration from
scratch.</p>
<p>Since I am not especially familiar with configuring Apache, and since I
prefer exact control, reducing the configuration to a single file was a
lot easier to understand.</p>
<p>This Trac server was meant for use inside a company intranet. As such it
made sense to allow anyone already on the intranet to read anything in
Trac or Subversion. Only authenticated users are allowed to make
changes. Basic authentication is sufficient, in this context. The extra
protection offered by SSL (i.e. https://) was not needed. I did want
performance to be reasonably optimal.</p>
<p>What this does:</p>
<ul>
<li>Subversion access is via Apache (HTTP).</li>
<li>Multiple Subversion repositories are allowed.</li>
<li>Multiple Trac projects are allowed.</li>
<li>Anyone can browse Trac or Subversion, but only authenticated users
can make changes.</li>
<li>The same username/password file is shared between Subversion and
Trac.</li>
<li><strong>mod_python</strong> is used for (more) optimal Trac performance.</li>
<li>The <strong>Expires:</strong> header is set for static web files used by Trac.</li>
</ul>
<pre><code>#
# Apache2 configuration
#
TransferLog /var/log/apache2/access.log
ErrorLog /var/log/apache2/error.log
ServerRoot /etc/apache2
DocumentRoot /var/www
#LogLevel debug
ServerAdmin preston@bannister.us
ServerName trac.bannister.home
Listen 80
User www-data
Group www-data
AddDefaultCharset UTF-8
DefaultType text/plain
LoadModule dir_module /usr/lib/apache2/modules/mod_dir.so
LoadModule env_module /usr/lib/apache2/modules/mod_env.so
LoadModule info_module /usr/lib/apache2/modules/mod_info.so
LoadModule mime_module /usr/lib/apache2/modules/mod_mime.so
LoadModule alias_module /usr/lib/apache2/modules/mod_alias.so
LoadModule autoindex_module /usr/lib/apache2/modules/mod_autoindex.so
LoadModule dav_module /usr/lib/apache2/modules/mod_dav.so
LoadModule dav_svn_module /usr/lib/apache2/modules/mod_dav_svn.so
LoadModule auth_basic_module /usr/lib/apache2/modules/mod_auth_basic.so
LoadModule authn_file_module /usr/lib/apache2/modules/mod_authn_file.so
LoadModule authz_host_module /usr/lib/apache2/modules/mod_authz_host.so
LoadModule authz_user_module /usr/lib/apache2/modules/mod_authz_user.so
LoadModule authz_svn_module /usr/lib/apache2/modules/mod_authz_svn.so
LoadModule python_module /usr/lib/apache2/modules/mod_python.so
LoadModule expires_module /usr/lib/apache2/modules/mod_expires.so
TypesConfig /etc/mime.types
Alias /icons /usr/share/apache2/icons
#
# Access to Subversion
#
<Location /svn>
DAV svn
SVNParentPath /var/lib/svn
<LimitExcept GET PROPFIND OPTIONS REPORT>
Require valid-user
</LimitExcept>
AuthType Basic
AuthName "Subversion Repository"
AuthUserFile /etc/apache2/projects/users
AuthzSVNAccessFile /etc/apache2/projects/access
</Location>
#
# Access to Trac
#
<Location /projects>
SetHandler mod_python
PythonHandler trac.web.modpython_frontend
PythonOption TracEnvParentDir /var/lib/trac
#PythonDebug on
ExpiresActive On
ExpiresDefault A10
</Location>
<LocationMatch /projects/[^/]+/login>
AuthType Basic
AuthName Trac
AuthUserFile /etc/apache2/projects/users
Require valid-user
</LocationMatch>
<LocationMatch /projects/[^/]+/chrome>
Order allow,deny
Allow from all
ExpiresDefault "now plus 12 hours"
</LocationMatch>
</code></pre>
<p>The last part is a bit of a trick. Naturally it is possible to have
Apache serve the static files directly, but this approach is nearly as
efficient, and a lot less trouble. Since I am building Trac checked out
from Subversion (the 0.11dev trunk), the path to the static files
changes with each update and build. With this approach static files are
served through the python code - which is less efficient - but this only
happens once. The "Expires:" header allows the browser to use the local
cached static files on subsequent requests - which reduces server load
and improves response times.</p>
802.11g (NetGear) flaked out, 802.11n (NetGear) not better.2007-07-11T00:00:00Zhttps://bannister.us/weblog/2007/80211g-netgear-flaked-out-80211n-netgear-not-better
<p>Once again, my wireless network has become almost unusable.</p>
<p>A few years back, I hooked up a Linksys 802.11b router, and could use my
HP laptop from the garage (in front), anywhere in the house, and out in
the backyard. Speed was not as good as the wired network (not suitable
for downloading CD/DVD images), but quite usable. Over time the range
and data rate dropped off, until the wireless network became unusable.
By this time most of my neighbors had bought 802.11g routers. In theory,
802.11g should not interfere with 802.11b, but I do not believe the
theory.</p>
<p>So I bought an 802.11g router, and put an 802.11a/b/g network card in my
laptop. Once again I had a great wireless connection, and the data rates
were higher - a even a full rate 54Mbits out in the backyard. Over time
the range and data rate dropped off, until the wireless network became
unusable. Replaced the old NetGear router with a new DLink 802.11g
router, and once again had great connections ... for a while. Again the
range and data rate dropped off, until the wireless network became
unusable at the beginning of the year. Again replaced the router, with a
new NetGear model (with "RangeMax"). Again the connection was ... good
for a while, then got worse. Added a NetGear WN511T 802.11n card to my
laptop ... no joy. Got a new NetGear WNR854T 802.11n router and ... no
joy.</p>
<p>Do not know what my neighbors are running, but there are a lot more
(visible) networks nearby. Something nearby - wireless phones, networks,
or both - is causing me a lot of grief. Some of the time I can get still
get a connection from the backyard. Much of the time I cannot get a
reliable connection, even when a few feet from the router. I live in
southern California suburbia with perhaps 20-30 feet between houses on
the side, and houses roughly a 100 feet in front and back. (BTW, my
wireless phone is a rather nice 5.8Ghz Motorola model.)</p>
<p>After much experimenting, I had a bit more luck with the router set from
channel 6 (the default) to either channel 1 or 11. This works really
well ... but only part of the time.</p>
<p>At this point I am extremely frustrated. Are my NetGear routers no good?
Certainly the NetGear drivers are not helpful (often they fail without
any useful feedback). The NetGear support site is crap. I wasted much of
a day just trying to login (seems some - not all - of their login pages
are broken). No response to an email support request, and not much
useful information for diagnosing problems.</p>
<p>At this point I am half-inclined to acquire a field strength meter, just
so I can tell what the source is for the interference. Otherwise - short
of turning my house into a giant Faraday cage - randomly buying other
802.11n gear might(?!?) be my only hope.</p>
What to make of this?2007-07-01T00:00:00Zhttps://bannister.us/weblog/2007/what-to-make-of-this
<p>Read
<a hef="http://www.ocregister.com/ocregister/news/local/lakeforest/article_1749198.php">this
article</a> a couple days back. A man was sentenced to "144 years and
eight months in prison for beating and torturing his then-wife over a
four-day period". The crime occurred "at their Foothill Ranch home on
April 14, 2005" - my area, and generally otherwise relatively peaceful.</p>
<p>A couple years ago I heard some disturbing sounds - I generally have
most of the windows open - went out back to listen. Perhaps it was no
more than a TV through an open window (though I do not remember hearing
a neighbor's TV). Perhaps the sound was something else entirely. Since I
had no idea as to where the sounds came and heard nothing further -
there was nothing I could do. Could it be that this crime had occurred
not just in the same area, but not far from my backyard?</p>
<p>Went poking around for any earlier or more specific report and found
.... nothing. Do crimes like this happen routinely, without leaving any
imprint visible from the internet? Should they?</p>
Organized violence2007-07-01T00:00:00Zhttps://bannister.us/weblog/2007/organized-violence
<blockquote>
<p>“The West won the world not by the superiority of its ideas or values
or religion but rather by its superiority in applying organized
violence. Westerners often forget this fact, non-Westerners never
do.”
<em>from Samuel Huntington</em></p>
</blockquote>
<p>Ran across this quote before, most lately in a <a href="http://www.tbray.org/ongoing/When/200x/2007/07/01/On-Birthdays">post from Tim
Bray</a>.
The quote bothered me because it both contains an element of truth, and
seems somehow incomplete. In what respect the quote was incomplete -
this took a bit longer to elaborate.</p>
<p>The word you want to focus on is "organized".</p>
<p>Violence is not a special quality of the West. Far from it. So how was
it the "West won the world"? When one human attempts to kill another
human, the better trained, equipped, and supplied will win. On the
individual scale luck may be a significant factor. On the large scale
and over the long haul - luck only counts when opposing sides are near
evenly matched. Economic battles are not very different.</p>
<p>The West "won" because the sides were not evenly matched. Simply put,
the West was better organized. Better social organization, better
economic organization, better technology - we can argue about the
definition of "better" - but in this case the final sum was when it came
down to "organized violence", the West won. What made the difference was
the productive - not destructive - side of the equation.</p>
<p>The booming economies in China, India, and southeast Asia are enabled by
the infusion of "Western" ideas and organization. Those economies are
kept relatively safe by the threat of Western violence against those who
would disrupt existing order.</p>
<p>In the long run, the human race is still very young. Our notions of
social organization - on the large and small scale - are still very
uncertain. Within that context of approximation - there is no escaping
the conclusion that the West did indeed win the world on the superiority
of its ideas.</p>
<p>As a quote: “The West won the world by its superiority in farming." -
contains more truth - if not as memorable as the quote from Huntington.</p>
Must be upgrade time...2007-06-20T00:00:00Zhttps://bannister.us/weblog/2007/must-be-upgrade-time
<p>For rather a while I have not felt especially motivated to update my
computers. Even my old Athlon 2200+ laptop is adequate for almost
everything I do. With Eclipse, VMware, Tomcat, and Firefox running - I
tend to want more memory rather than more CPU.</p>
<p>Until today. Wanted to record a video of a short demo. Set a Windows
2000 VM under VMware to 1152x864, and used VMware Workstation's "Capture
Movie" to record the demo. Copied the AVI file to my laptop, fired up
Window XP's Movie Editor and ... boy oh boy could I use a lot more CPU!</p>
<p>Still mucking around trying to figure out how to convert the video
(encoded with the VMware VNC-derived codec) into more easily
distributable form (at full resolution, without requiring the viewer to
add the VMware codec. Each experiment takes ........ a long time with
the CPU running flat out.</p>
Hijacked?2007-06-17T00:00:00Zhttps://bannister.us/weblog/2007/hijacked
<p>Does it bug anyone else when a Google search returns a hit for a site
like "readablog" before the hit for your original article?</p>
<p>Clearly they have figured out how to game the search engines (or Google
at least). Clearly their aim is to sell advertising (as "view source"
shows) using weblogs as "free" content.</p>
<p>I do not mind aggregators (like Bloglines or Google Reader) in the
slightest as they offer added value to the user. I <strong>do</strong> mind sites
like "readablog" that offer no added value, and want to profit off a
mangled copy of my content by presenting it to search engines.</p>
Caught in the DreamHost(?) security breach2007-06-15T00:00:00Zhttps://bannister.us/weblog/2007/caught-in-the-dreamhost-security-breach
<p>Seems my account is caught in the DreamHost security breach. Checked my
pages (via "View Source" in the browser) after the first announcement
from DreamHost, did not see any junk, and let things alone. Since
DreamHost claimed to be notifying customers whose accounts were
compromised, and I had seen nothing from DreamHost (and still have not),
I assumed (for the moment) that I was not affected.</p>
<p>Wrong. Last night noticed some junk in one of my pages - hidden via
"display:none" - similar to <a href="http://mezzoblue.com/archives/2007/06/05/unsettling/">this
report</a>.</p>
<p>On 2007-06-13 between 15:31 and 15:35 someone ran a script and altered
the index.html and index.php files on my site. Last night I backed up
the entire site, then edited out the junk. Filed a support request
reporting the breach. I did <strong>not</strong> change my FTP password
(intentionally!) to see if the breach would be repeated.</p>
<p>It was. Checked again early this morning. On 2007-06-15 at 04:42 someone
again altered index.html and index.php files (a smaller number this
time). Changed my FTP password, backed up the changed files, and removed
the junk.</p>
<p>Digging a little deeper, ran "last -ad <em>myusername</em> | grep -v
<em>myhomeip</em>", and got:</p>
<p>xxxxxxxx ftpd24994 Fri Jun 15 04:42 - 04:43 (00:00) venus.websiteactive.com
xxxxxxxx ftpd28128 Fri Jun 15 01:28 - 01:28 (00:00) venus.websiteactive.com
xxxxxxxx ftpd4197 Wed Jun 13 15:25 - 15:35 (00:09) neptune.pronameservice.net
xxxxxxxx ftpd30356 Tue Jun 12 15:32 - 15:32 (00:00) hv111.steephost.com
xxxxxxxx ftpd555 Sun Jun 10 09:41 - 09:41 (00:00) gator188.hostgator.com
xxxxxxxx ftpd5386 Sat Jun 9 10:45 - 10:45 (00:00) 85.222.183.212
xxxxxxxx ftpd2599 Sat Jun 9 10:45 - 10:45 (00:00) 85.222.183.212
xxxxxxxx ftpd8498 Sat Jun 9 10:45 - 10:45 (00:00) 85.222.183.212
xxxxxxxx ftpd20735 Sat Jun 9 10:45 - 10:45 (00:00) 85.222.183.212
xxxxxxxx ftpd24834 Sat Jun 9 10:45 - 10:45 (00:00) 85.222.183.212
xxxxxxxx ftpd19653 Sat Jun 9 10:44 - 10:44 (00:00) 85.222.183.212
xxxxxxxx ftpd15132 Sat Jun 9 10:44 - 10:44 (00:00) 85.222.183.212
xxxxxxxx ftpd10851 Sat Jun 9 10:44 - 10:44 (00:00) 85.222.183.212
xxxxxxxx ftpd10095 Sat Jun 9 10:44 - 10:44 (00:00) 85.222.183.212
xxxxxxxx ftpd14762 Sat Jun 9 10:44 - 10:44 (00:00) 85.222.183.212
xxxxxxxx ftpd32292 Fri Jun 8 15:20 - 15:20 (00:00) gator188.hostgator.com
xxxxxxxx ftpd25266 Fri Jun 8 05:59 - 06:00 (00:00) 219.83.97.23
xxxxxxxx ftpd26076 Fri Jun 8 05:59 - 05:59 (00:00) 219.83.97.23
xxxxxxxx ftpd2712 Fri Jun 8 05:59 - 05:59 (00:00) 219.83.97.23
xxxxxxxx ftpd10378 Fri Jun 8 05:59 - 05:59 (00:00) 219.83.97.23
xxxxxxxx ftpd8738 Fri Jun 8 05:59 - 05:59 (00:00) 219.83.97.23
xxxxxxxx ftpd15500 Fri Jun 8 05:59 - 05:59 (00:00) 219.83.97.23
xxxxxxxx ftpd741 Fri Jun 8 05:58 - 05:58 (00:00) 219.83.97.23
xxxxxxxx ftpd9567 Fri Jun 8 05:58 - 05:58 (00:00) 219.83.97.23
xxxxxxxx ftpd31931 Fri Jun 8 05:58 - 05:58 (00:00) 219.83.97.23
xxxxxxxx ftpd17539 Fri Jun 8 05:58 - 05:58 (00:00) 219.83.97.23
xxxxxxxx ftpd17 Fri Jun 8 05:58 - 05:58 (00:00) 219.83.97.23
xxxxxxxx ftpd20698 Fri Jun 8 05:57 - 05:58 (00:00) 219.83.97.23
xxxxxxxx ftpd4417 Fri Jun 8 05:57 - 05:57 (00:00) 219.83.97.23
xxxxxxxx ftpd32161 Fri Jun 8 05:57 - 05:57 (00:00) 219.83.97.23
xxxxxxxx ftpd24593 Fri Jun 8 05:57 - 05:57 (00:00) 219.83.97.23
xxxxxxxx ftpd3318 Fri Jun 8 05:57 - 05:57 (00:00) 219.83.97.23
xxxxxxxx ftpd2887 Fri Jun 8 05:57 - 05:57 (00:00) 219.83.97.23
xxxxxxxx ftpd10251 Fri Jun 8 05:56 - 05:57 (00:00) 219.83.97.23
xxxxxxxx ftpd28277 Fri Jun 8 05:56 - 05:56 (00:00) 219.83.97.23
xxxxxxxx ftpd6156 Fri Jun 8 05:56 - 05:56 (00:00) 219.83.97.23
xxxxxxxx ftpd4639 Fri Jun 8 05:56 - 05:56 (00:00) 219.83.97.23
xxxxxxxx ftpd14610 Fri Jun 8 05:56 - 05:56 (00:00) 219.83.97.23
xxxxxxxx ftpd7016 Fri Jun 8 05:56 - 05:56 (00:00) 219.83.97.23
xxxxxxxx ftpd31218 Fri Jun 8 05:55 - 05:56 (00:00) 219.83.97.23
xxxxxxxx ftpd15428 Fri Jun 8 05:55 - 05:55 (00:00) 219.83.97.23
xxxxxxxx ftpd23894 Fri Jun 8 05:55 - 05:55 (00:00) 219.83.97.23
xxxxxxxx ftpd12686 Fri Jun 8 05:55 - 05:55 (00:00) 219.83.97.23
xxxxxxxx ftpd26025 Fri Jun 8 05:55 - 05:55 (00:00) 219.83.97.23
xxxxxxxx ftpd32523 Fri Jun 8 05:55 - 05:55 (00:00) 219.83.97.23
xxxxxxxx ftpd22799 Fri Jun 8 05:55 - 05:55 (00:00) 219.83.97.23
xxxxxxxx ftpd17447 Fri Jun 8 05:54 - 05:55 (00:00) 219.83.97.23
xxxxxxxx ftpd20174 Thu Jun 7 14:37 - 14:37 (00:00) hv111.steephost.com
xxxxxxxx ftpd29543 Mon Jun 4 04:33 - 04:33 (00:00) sv25.xserverzero.net
xxxxxxxx ftpd19850 Sun Jun 3 22:20 - 22:20 (00:00) server.site60.info
xxxxxxxx ftpd19848 Sun Jun 3 22:20 - 22:20 (00:00) server.site60.info
xxxxxxxx ftpd19843 Sun Jun 3 22:20 - 22:20 (00:00) server.site60.info
xxxxxxxx ftpd19840 Sun Jun 3 22:20 - 22:20 (00:00) server.site60.info
xxxxxxxx ftpd19836 Sun Jun 3 22:20 - 22:20 (00:00) server.site60.info
xxxxxxxx ftpd19833 Sun Jun 3 22:20 - 22:20 (00:00) server.site60.info
xxxxxxxx ftpd19830 Sun Jun 3 22:20 - 22:20 (00:00) server.site60.info
xxxxxxxx ftpd19829 Sun Jun 3 22:20 - 22:20 (00:00) server.site60.info
xxxxxxxx ftpd19827 Sun Jun 3 22:20 - 22:20 (00:00) server.site60.info
xxxxxxxx ftpd19825 Sun Jun 3 22:20 - 22:20 (00:00) server.site60.info
xxxxxxxx ftpd19821 Sun Jun 3 22:20 - 22:20 (00:00) server.site60.info
xxxxxxxx ftpd19819 Sun Jun 3 22:20 - 22:20 (00:00) server.site60.info
xxxxxxxx ftpd19812 Sun Jun 3 22:20 - 22:20 (00:00) server.site60.info
xxxxxxxx ftpd19809 Sun Jun 3 22:20 - 22:20 (00:00) server.site60.info
xxxxxxxx ftpd19805 Sun Jun 3 22:20 - 22:20 (00:00) server.site60.info
xxxxxxxx ftpd19804 Sun Jun 3 22:20 - 22:20 (00:00) server.site60.info
xxxxxxxx ftpd19798 Sun Jun 3 22:20 - 22:20 (00:00) server.site60.info
xxxxxxxx ftpd19797 Sun Jun 3 22:20 - 22:20 (00:00) server.site60.info
xxxxxxxx ftpd19792 Sun Jun 3 22:20 - 22:20 (00:00) server.site60.info
xxxxxxxx ftpd19790 Sun Jun 3 22:20 - 22:20 (00:00) server.site60.info
xxxxxxxx ftpd19788 Sun Jun 3 22:20 - 22:20 (00:00) server.site60.info
xxxxxxxx ftpd19787 Sun Jun 3 22:20 - 22:20 (00:00) server.site60.info
xxxxxxxx ftpd19785 Sun Jun 3 22:20 - 22:20 (00:00) server.site60.info
xxxxxxxx ftpd19782 Sun Jun 3 22:20 - 22:20 (00:00) server.site60.info
xxxxxxxx ftpd19781 Sun Jun 3 22:20 - 22:20 (00:00) server.site60.info
xxxxxxxx ftpd19779 Sun Jun 3 22:20 - 22:20 (00:00) server.site60.info
xxxxxxxx ftpd19775 Sun Jun 3 22:20 - 22:20 (00:00) server.site60.info
xxxxxxxx ftpd19774 Sun Jun 3 22:20 - 22:20 (00:00) server.site60.info
xxxxxxxx ftpd19772 Sun Jun 3 22:20 - 22:20 (00:00) server.site60.info
xxxxxxxx ftpd19770 Sun Jun 3 22:20 - 22:20 (00:00) server.site60.info</p>
<p>So it does look like the access is via FTP, using subverted sites, and
has been ongoing for at least a couple weeks (the <strong>last</strong> log only goes
back that far). This also tells us that the DreamHost folk are at
somewhat less than guru status, as if in their shoes I'd have written
scripts to look for this sort of pattern, notified customers, and
(possibly) blocked access from known subverted sites. For someone of
strong ability, this is not hard.</p>
<p>In fact I am more amused than bothered by this. All my stuff is backed
up, and I never assumed a webhosting account would be secure (at least
in any strong sense). I expect most webhost outfits are similar (or
worse). I am slightly bothered that they don't seem to have access to at
least one <em>really</em> sharp guy ... but not surprised.</p>
<p>So ... with proof on ongoing access, and after changing my FTP password,
by tomorrow we should know whether this was a one-time breach of the FTP
password list, or something deeper.</p>
<p>BTW - a hint for fixing the changed files (tedious but not difficult)
from the shell.</p>
<p>vi <code>find sitedirectory -type f -newer fileslightlyolderthanhack</code></p>
<p>Of course, if you have a <strong>really</strong> large number of changed files, you
want to restore from backup, or write a Perl script.</p>
<p><strong>Update 2007.06.16</strong>: Changing the password on the one account with FTP
access to the website files (on Friday morning) seems to be all that was
needed. Did get a reasonable response (and another response to my reply)
from DreamHost well within 24 hours on filing a support request. I am
satisfied with their response, though I stand by what I said above.</p>
50-year-old car unburied2007-06-15T00:00:00Zhttps://bannister.us/weblog/2007/50-year-old-car-unburied
<p><a href="http://www.tulsaworld.com/webextra/content/2007/buriedcarunearthed/default.aspx"><img src="http://www.tulsaworld.com/webextra/content/2007/buriedcarunearthed/images/bg-hdr-up.jpg" alt="unburied car" /> Tulsa World</a></p>
<p>This car was buried the same year - and not far from - where and when I
was born. In this field that makes me ancient (something my teenagers
will confirm).</p>
Mapping components - Javascript2007-06-14T00:00:00Zhttps://bannister.us/weblog/2007/mapping-components-javascript
<p>Accessing components in the DOM from Javascript using
<strong>getElementById()</strong> is tedious, somewhat verbose, and does nothing to
enhance the readability of the code. Generally there are two cases:
finding global elements within the page, and finding members within
(possibly repeated) components.</p>
<p>There are (of course) many ways to do this, but what I have settled on
is using the <strong>ID</strong> attribute to identify global elements (what ID was
meant for), and using the <strong>NAME</strong> attribute to identify members within
a component. This use of the <strong>NAME</strong> attribute is exactly analogous to
standard usage inside forms, just extended for use with non-form
objects.</p>
<p>The code to build a map of global objects:</p>
<pre><code class="language-javascript">DOM.byId = function() {
var map = {};
DOM.asArray(arguments).apply(function(name){
var v = name.split('.');
var o = map;
while (1 < v.length) {
var s = v.shift();
o = o[s] = o[s] || {};
}
o[v[0]] = document.getElementById(name);
});
return map;
};
</code></pre>
<p>The code to build a map of a component:</p>
<pre><code class="language-javascript">DOM.byName = function(root) {
var map = {};
var walk = function(o) {
var name = o.getAttribute && o.getAttribute('name');
if (name) {
var v = name.split('.');
var m = map;
while (1 < v.length) {
var s = v.shift();
m = m[s] || (m[s] = {});
}
m[v[0]] = o;
}
for (o = o.firstChild; o; o = o.nextSibling) {
walk(o);
}
};
walk(root);
return map;
};
</code></pre>
<p>Usage is quite simple:</p>
<pre><code class="language-javascript">var named = DOM.byId(
'grid1',
'textWidth',
'textHeight'
);
var grid1 = DOM.byName(named.grid1);
</code></pre>
<p>Now named (by ID) global objects in the DOM can be later referred to in
the Javascript code simply as <strong>named.grid1</strong>, <strong>named.textWidth</strong>,
<strong>named.textHeight</strong>. Named objects within a component (by NAME) can be
referred to as <strong>grid1.container</strong>, <strong>grid1.top.container</strong>,
<strong>grid1.top.strip</strong>, (etc.).</p>
<p>Note that both <strong>DOM.byId()</strong> and <strong>DOM.byName()</strong> map IDs and NAMEs
like "foo.bar" into a corresponding structure:</p>
<pre><code class="language-javascript">{ foo: { bar: reference to DOM element } }
</code></pre>
<p>Code in <a href="http://bannister.us/examples/js/base.js">base.js</a>.</p>
examples2007-06-14T00:00:00Zhttps://bannister.us/weblog/2007/examples
<p>Examples of Javascript code:</p>
<ul>
<li><a href="https://bannister.us/weblog/2007/programming-for-the-web-javascript">Programming for the web - Javascript</a></li>
<li><a href="https://bannister.us/weblog/2007/reading-parameters-from-url-javascript">Reading parameters from URL - Javascript</a></li>
<li><a href="https://bannister.us/weblog/2007/reading-and-saving-cookies-javascript">Reading and saving cookies - Javascript</a></li>
<li><a href="https://bannister.us/weblog/2007/simple-base64-encodedecode-javascript">Simple Base64 encode/decode - Javascript</a></li>
<li><a href="https://bannister.us/weblog/2007/yet-another-json-implementation-in-javascript">Yet another JSON implementation - Javascript</a></li>
<li><a href="https://bannister.us/weblog/2007/bouncing-json-requests-javascript">Bouncing JSON requests - Javascript</a></li>
<li><a href="https://bannister.us/weblog/2007/mapping-components-javascript">Mapping components - Javascript</a></li>
<li><a href="https://bannister.us/weblog/2007/auto-adjusting-sizer-javascript">Auto-adjusting sizer - Javascript</a></li>
<li><a href="https://bannister.us/weblog/2007/sudoku">Sudoku</a></li>
<li><a href="https://bannister.us/weblog/2006/another-fastcgi-install-script">Another FastCGI install script</a></li>
</ul>
<p>Examples of C++ code:</p>
<ul>
<li><a href="https://bannister.us/weblog/2007/mersenne-twister-random-number-generator">Mersenne twister - random number generator</a></li>
<li><a href="https://bannister.us/weblog/2005/building-a-better-string-class">Building a better string class</a></li>
</ul>
Auto-adjusting sizer - Javascript2007-06-14T00:00:00Zhttps://bannister.us/weblog/2007/auto-adjusting-sizer-javascript
<p>Took a couple years to get reasonably fluent at HTML/CSS/Javascript, and
pick out what seems a decent programming model. Reached the point where
most of the public examples of Javascript usage (in particular) look to
me as very poorly written. Still it seems like every time I turn out
another example, I find another useful idiom.</p>
<p>Take sizing of DOM elements. Say you want to put a sizable component
within a page. The DOM model for this is a mess. You can set the width
and height of an element <strong>o</strong> with <strong>o.style.width</strong> and
<strong>o.style.height</strong> (assuming the element is sizable). You can read the
width and height of an element with <strong>o.offsetWidth</strong> and
<strong>o.offsetHeight</strong>. Not exactly symmetric, and in fact - due to the DOM
layout model - these are in fact often not quite the same numbers. Yuck.</p>
<p>Looking at a bunch of repetitive code (button handlers to alter a
component's width/height), realized there was an common idiom that could
be extracted into a "sizer" object.</p>
<p>grid.sizer = function() {
var o = { dx: grid1.container.offsetWidth, dy: grid1.container.offsetHeight };
o.apply = function() {
grid1.container.style.width = o.dx + "px";
grid1.container.style.height = o.dy + "px";
o.dx = grid1.container.offsetWidth;
o.dy = grid1.container.offsetHeight;
}
return o;
};</p>
<p>(The component has been mapped by functions <strong>DOM.byId()</strong> and
<strong>DOM.byName()</strong> described
<a href="https://bannister.us/weblog/2007/mapping-components-javascript">here</a>.)</p>
<p>Now either width, height, or both can be set or adjusted using the
"sizer".</p>
<p>sizer.dx = 500;
sizer.apply();</p>
<p>sizer.dx += 100;
sizer.dy = 400;
sizer.apply();</p>
<p>Kind'a like a remote control for a component. But still not quite right,
as (depending on the CSS) the actual component size may be a little
different than what was set via the style. The difference is not readily
deducible from the DOM, and I did not want to kludge in anything browser
or style specific. The difference between the actual size and the size
wanted can be computed ... then it occurred to me that the "sizer" could
be made auto-adjusting.</p>
<p>grid.sizer = function() {
var ddx = 0, ddy = 0;
var o = { dx: grid1.container.offsetWidth, dy: grid1.container.offsetHeight };
o.apply = function() {
grid1.container.style.width = (ddx + (0 | o.dx)) + "px";
grid1.container.style.height = (ddy + (0 | o.dy)) + "px";
var now = { dx: grid1.container.offsetWidth, dy: grid1.container.offsetHeight };
ddx += o.dx - now.dx;
ddy += o.dy - now.dy;
o.dx = now.dx;
o.dy = now.dy;
}
o.adjust = function() {
var want = grid.sizer();
o.apply();
o.dx = want.dx;
o.dy = want.dy;
o.apply();
}
return o;
};
var sizer = grid.sizer();
sizer.adjust();
grid.layout();</p>
<p>The essential bit here is that the "sizer" remembers the difference
between the size as set, and the actual size in <strong>ddx</strong> and <strong>ddy</strong>. A
single upfront call to <strong>sizer.adjust()</strong> initializes <strong>ddx</strong> and
<strong>ddy</strong>. Note that on later changes to the component size, if the actual
size differs from what was wanted (due to CSS changes, browsers bugs,
whatever), then <strong>ddx</strong> and <strong>ddy</strong> are adjusted to match.</p>
<p>Simple, clean, and browser-independent.</p>
Safari on Windows!2007-06-12T00:00:00Zhttps://bannister.us/weblog/2007/safari-on-windows
<p>Generally I test web applications on Firefox (Windows, Linux) and IE
(Windows). On (rare) occasion, I have tested on Opera, but ... it is
hard to care about Opera. My one regret is that up until now I have not
been able to test with Safari. Personally, I would <em>like</em> to know the
things I create will work on the Macintosh, but this is not a priority
in my work-time (hence acquiring a Macintosh is hard to justify).</p>
<p>Yesterday I saw the announcement for the <a href="http://www.apple.com/safari/">Safari 3 Public
Beta</a>, and there is a Windows version!
Very cool. Grabbed the Windows version and ran a few
<a href="http://bannister.us/examples/js/">examples</a> through Safari, and ...
some did not work, and I cannot easily tell why. Poked around the Apple
developer site a bit, but lacking something like
<a href="http://www.getfirebug.com/">Firebug</a>, I probably will not take the time
needed to puzzle out what is going wrong.</p>
<p>Kind of funny, as before Firebug I had code for in-page Javascript
logging (for both IE and Firefox) that was essential when testing
Javascript code. Given Firebug (and the <em>lite</em> version for IE), is equal
or (much!) better, it made sense to chuck what I had written. Now, faced
with a similar need in Safari, I just do not want to spend the time.</p>
<p>Hopefully the developer tools for Safari on Windows will eventually
appear, and I can take another crack later.</p>
<p><strong>Update:</strong> A note has appeared on <a href="http://rakaz.nl/item/enabling_the_debug_menu_on_safari_for_windows">Enabling the debug menu on Safari
for
Windows</a>.
Enough of a hint to find why the
<a href="http://bannister.us/examples/js/parameters.html">parameters</a> example
did not work (that and <html debug="true"> does something useful with
Firebug Lite). Fixed.</p>
Bouncing JSON requests - Javascript2007-06-10T00:00:00Zhttps://bannister.us/weblog/2007/bouncing-json-requests-javascript
<p>Simple measure of round-trip times for bouncing a JSON request off a
server. The server-side script (bounce.php) is:</p>
<p> date('Y.m.d H:i:s'),
'uname' => php_uname()
);
echo json_encode($a);
?></p>
<p>The code to generate a JSON request (in
<a href="http://bannister.us/examples/json/bounce.html">bounce.html</a>) is in
effect:</p>
<p>var o = JSON.makeGET("bounce.php");
o.onResponse = function(v) {
// use v
};
o.sendGET();</p>
<p>Where <strong>v</strong> is the JSON response (click
<a href="http://bannister.us/examples/json/bounce.php">bounce.php</a> to see a
response).</p>
Simple Base64 encode/decode - Javascript2007-06-09T00:00:00Zhttps://bannister.us/weblog/2007/simple-base64-encodedecode-javascript
<p>While Mozilla/Firefox already have btoa() and atob() functions, this
gives you both a Unicode/UTF-8 and ASCII variant, as well as supplying
btoa/atob where there is a lack.</p>
<p>/* $Date: 2007-06-09 22:19:13 $ */</p>
<p>// Handles encode/decode of ASCII and Unicode strings.</p>
<p>var UTF8 = {};
UTF8.encode = function(s) {
var u = [];
for (var i = 0; i < s.length; ++i) {
var c = s.charCodeAt(i);
if (c < 0x80) {
u.push(c);
} else if (c < 0x800) {
u.push(0xC0 | (c >> 6));
u.push(0x80 | (63 & c));
} else if (c < 0x10000) {
u.push(0xE0 | (c >> 12));
u.push(0x80 | (63 & (c >> 6)));
u.push(0x80 | (63 & c));
} else {
u.push(0xF0 | (c >> 18));
u.push(0x80 | (63 & (c >> 12)));
u.push(0x80 | (63 & (c >> 6)));
u.push(0x80 | (63 & c));
}
}
return u;
};
UTF8.decode = function(u) {
var a = [];
var i = 0;
while (i < u.length) {
var v = u[i++];
if (v < 0x80) {
// no need to mask byte
} else if (v < 0xE0) {
v = (31 & v) << 6;
v |= (63 & u[i++]);
} else if (v < 0xF0) {
v = (15 & v) << 12;
v |= (63 & u[i++]) << 6;
v |= (63 & u[i++]);
} else {
v = (7 & v) << 18;
v |= (63 & u[i++]) << 12;
v |= (63 & u[i++]) << 6;
v |= (63 & u[i++]);
}
a.push(String.fromCharCode(v));
}
return a.join('');
};</p>
<p>var BASE64 = {};
(function(T){
var encodeArray = function(u) {
var i = 0;
var a = [];
var n = 0 | (u.length / 3);
while (0 < n--) {
var v = (u[i] << 16) + (u[i+1] << 8 ) + u[i+2];
i += 3;
a.push(T.charAt(63 & (v >> 18)));
a.push(T.charAt(63 & (v >> 12)));
a.push(T.charAt(63 & (v >> 6)));
a.push(T.charAt(63 & v));
}
if (2 == (u.length - i)) {
var v = (u[i] << 16) + (u[i+1] << 8);
a.push(T.charAt(63 & (v >> 18)));
a.push(T.charAt(63 & (v >> 12)));
a.push(T.charAt(63 & (v >> 6)));
a.push('=');
} else if (1 == (u.length - i)) {
var v = (u[i] << 16);
a.push(T.charAt(63 & (v >> 18)));
a.push(T.charAt(63 & (v >> 12)));
a.push('==');
}
return a.join('');
}
var R = (function(){
var a = [];
for (var i=0; i<T.length; ++i) {
a[T.charCodeAt(i)] = i;
}
a['='.charCodeAt(0)] = 0;
return a;
})();
var decodeArray = function(s) {
var i = 0;
var u = [];
var n = 0 | (s.length / 4);
while (0 < n--) {
var v = (R[s.charCodeAt(i)] << 18) + (R[s.charCodeAt(i+1)] << 12) + (R[s.charCodeAt(i+2)] << 6) + R[s.charCodeAt(i+3)];
i += 4;
u.push(255 & (v >> 16));
u.push(255 & (v >> 8));
u.push(255 & v);
}
if (u) {
if ('=' == s.charAt(i-2)) {
u.pop();
u.pop();
} else if ('=' == s.charAt(i-1)) {
u.pop();
}
}
return u;
}
var ASCII = {};
ASCII.encode = function(s) {
var u = [];
for (var i = 0; i<s.length; ++i) {
u.push(s.charCodeAt(i));
}
return u;
};
ASCII.decode = function(s) {
for (var i = 0; i<s.length; ++i) {
a[i] = String.fromCharCode(a[i]);
}
return a.join('');
};
BASE64.encodeASCII = function(s) {
var u = ASCII.encode(s);
return encodeArray(u);
};
BASE64.decodeASCII = function(s) {
var a = decodeArray(s);
return ASCII.decode(a);
};
BASE64.encode = function(s) {
var u = UTF8.encode(s);
return encodeArray(u);
};
BASE64.decode = function(s) {
var u = decodeArray(s);
return UTF8.decode(u);
};
})("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/");</p>
<p>if (undefined == btoa) {
var btoa = BASE64.encode;
}
if (undefined == atob) {
var atob = BASE64.decode;
}</p>
<p>Try it out on the <a href="http://bannister.us/examples/js/base64.html">test page</a>.
Code in <a href="http://bannister.us/examples/js/base64.js">base64.js</a>.</p>
Reading parameters from URL - Javascript2007-06-09T00:00:00Zhttps://bannister.us/weblog/2007/reading-parameters-from-url-javascript
<p>Another simple, minimal Javascript snippet - how to read URL parameters.</p>
<p>var PARAMETERS = {};
PARAMETERS.load = function() {
PARAMETERS.map = {};
window.location.search.substring(1).replace(/([^&=]+)(<a href="https://bannister.us/weblog/2007/%5B%5E&%5D*">=</a>)?(&|$)/g,function(s,k,q,v){
if (undefined === PARAMETERS.map[k]) {
PARAMETERS.map[k] = [];
}
PARAMETERS.map[k].push(decodeURIComponent(v));
});
for (var k in PARAMETERS.map) {
var a = PARAMETERS.map[k];
PARAMETERS.map[k] = ((1 == a.length) ? a[0] : a);
}
};
PARAMETERS.load();</p>
<p>That's all. Value for the parameter "who" is found at
<code>PARAMETERS.map.who</code> already decoded. Repeated parameters are turned
into an array, i.e.: "?a=1&a=2&a=3" becomes <code>[1,2,3]</code>.</p>
<p>Try it out on the <a href="http://bannister.us/examples/js/parameters.html">test
page</a>. Code can be
found in <a href="http://bannister.us/examples/js/base.js">base.js</a>.</p>
Reading and saving cookies - Javascript2007-06-09T00:00:00Zhttps://bannister.us/weblog/2007/reading-and-saving-cookies-javascript
<p>Another simple, minimal Javascript snippet - how to read, save and
delete cookies.</p>
<p>var COOKIES = {};
COOKIES.load = function() {
COOKIES.map = {};
document.cookie.replace(/([^ ;=]<em>)=([^;]</em>)/g,function(s,k,v){
if (undefined === COOKIES.map[k]) {
COOKIES.map[k] = [];
}
COOKIES.map[k].push(COOKIES.decode(v));
});
for (var k in COOKIES.map) {
var a = COOKIES.map[k];
COOKIES.map[k] = ((1 == a.length) ? a[0] : a);
}
};
COOKIES.encode = function(s) {
var v = s.replace(/%/g,'%0').replace(/;/g,'%1');
return ((v == s) ? s : ('%%' + v));
};
COOKIES.decode = function(s) {
return (/^%%/.test(s) ? s.substring(2).replace(/%1/g,';').replace(/%0/g,'%') : s);
};
COOKIES.save = function(k,v,t) {
if (undefined === t) {
t = '';
} else {
var now = new Date();
now.setTime(now.getTime() + t);
t = '; expires=' + now.toGMTString();
}
document.cookie = k + '=' + COOKIES.encode(v) + t;
COOKIES.load();
};
COOKIES.load();</p>
<p>Cookies are encoded and decoded as needed. Value for cookie "abc" is
accessible via <code>COOKIES.map.abc</code>. When there are multiple cookies with
the same name (and different path), the cookie value is an array. No
real attempt to support all the options when saving a cookie, since
<code>document.cookie = "name=value; path=/foo; expires=..."</code> is already
simple.</p>
<p>Try it out on the <a href="http://bannister.us/examples/js/cookies.html">test
page</a>. Code can be found
in <a href="http://bannister.us/examples/js/base.js">base.js</a>.</p>
sister & brother2007-05-27T00:00:00Zhttps://bannister.us/weblog/2007/sister-brother
<p><a href="http://www.flickr.com/photos/dreadedhill/515350341/" title="photo sharing"><img src="http://farm1.static.flickr.com/219/515350341_ad4dea7f89.jpg" alt="siblings" /></a></p>
<p>Aside from the usual sibling friction, they do get along amazingly well.</p>
Impostor outwits Stanford2007-05-26T00:00:00Zhttps://bannister.us/weblog/2007/impostor-outwits-stanford
<blockquote>
<p><a href="http://www.ocregister.com/ocregister/homepage/abox/article_1707838.php">O.C. impostor outwits
Stanford</a>
"Personally, I don't feel safe now that Stanford allowed this to
happen and that they're not doing anything to ensure the safety of
their students," Zhou said. "I think something's definitely wrong with
the system if this could happen."</p>
</blockquote>
<p>Yep. I am sure that 18 year old Asian females that really, <em>really</em> want
to go to Stanford are a threat. Scary.</p>
Semantics, AI, and the Web2007-05-17T00:00:00Zhttps://bannister.us/weblog/2007/semantics-ai-and-the-web
<p>On the never-ending river of discussion in the W3C HTML Working Group,
there are bits of fuzzy and malformed notions floating by that I hope -
somehow - we can clean up. In particular the distinction between
"Semantics" in the human sense and "semantics" as used (or misused)
within some very shallow and limited application-specific domain - this
is not generally clear.</p>
<p>The expertise within the working group is quite, er, varied - so the
lack of a common vocabulary is to be expected.</p>
<p>From the web there are roughly three sorts of Semantics that can be
deduced.</p>
<ol>
<li>What meaning can be derived from reading present-day web content.</li>
<li>What meaning is explicitly declared in existing and future web
content.</li>
<li>Meaning attached in cooperation between human authors and automated
agents.</li>
</ol>
<p>Humans are relatively good at (1), given sufficient domain-specific
knowledge relevant to topic at hand. Computers are less effective, as
the software just does not (yet) exist to approach human-level
understanding. This is a topic worth continuing research, but the
time-line between now and anything like complete results is probably
decades.</p>
<p>Without doubt there are folk who believe (2) is a viable option (it
seems to go with a specific personality type). In reality, outside a few
noble gardens of well-organized content, the vast majority of content
will remain without useful explicit organization.</p>
<p>Given that (1) is hard, and (2) is unlikely, can we find a third
feasible choice?</p>
<p>While we may be a long ways from (1), that is not the same as saying
there is no useful output from decades of AI research. Where asking your
average web author to classify content within a global deep network of
meaning is absurd, asking a small set of "is A like B" questions could
be enough to bridge the gap.</p>
<p>There is an array of pragmatic considerations. There has to be one agent
asking the questions, not one from every wannabe search engine. Linkage
might be explicitly declared in content by the author, but more often is
going to be via a look-aside through some shared pool. The conceptual
linkage may not have a human assigned name, derived instead from "is A
like B" answers. The deep knowledge structures built over time may
change, and must be able to change without involving the human authors.</p>
<p>At the end, the question comes to:
Is there anything useful the AI community has to say on the subject of
Semantics that is relevant to HTML authoring?</p>
Giuliani on freedom and authority2007-05-17T00:00:00Zhttps://bannister.us/weblog/2007/giuliani-on-freedom-and-authority
<blockquote>
<p><a href="http://blogs.ocregister.com/orangepunch/archives/2007/05/giulianis_scary_love_of_author.html">Giuliani's scary love of
authority</a>
"We look upon authority too often and focus over and over again, for
30 or 40 or 50 years, as if there is something wrong with authority.
We see only the oppressive side of authority. Maybe it comes out of
our history and our background. What we don't see is that freedom is
not a concept in which people can do anything they want, be anything
they can be. Freedom is about authority. <strong>Freedom is about the
willingness of every single human being to cede to lawful authority a
great deal of discretion about what you do.</strong>"</p>
</blockquote>
<p>The above does not exactly match up with my notion of "freedom".
Checking the Wikipedia page on
<a href="http://en.wikipedia.org/wiki/Freedom_(political)">Freedom</a> comes up
with a list of types:</p>
<blockquote>
<p>The concept of political freedom is closely allied with the concepts
of civil liberties and human rights. Most democratic societies are
professedly characterized by various freedoms which are afforded the
legal protection of the state. Some of these freedoms may include (in
alphabetical order):</p>
<ul>
<li>Freedom of assembly</li>
<li>Freedom of association</li>
<li>Freedom to bear arms</li>
<li>Freedom of education</li>
<li>Freedom of movement (or travel)</li>
<li>Freedom of the press</li>
<li>Freedom of religion (or belief)</li>
<li>Freedom of speech</li>
<li>Freedom of thought</li>
<li>Intellectual freedom</li>
<li>Sexual freedom</li>
</ul>
</blockquote>
<p>Perhaps Giuliani could start a new topic on "Freedom to submit to
authority". Then again, asking a politician about philosophy may be
about as useful as asking an actor about politics.</p>
Microsoft's last grasp2007-05-14T00:00:00Zhttps://bannister.us/weblog/2007/microsofts-last-grasp
<p>In so many ways the timing of this move seems to be ... unsurprising.</p>
<p><a href="http://money.cnn.com/magazines/fortune/fortune_archive/2007/05/28/100033867/index.htm">Microsoft claims software like Linux violates its patents - May 28,
2007</a>
(Article actually placed online May 14 2007: 5:54 AM EDT).</p>
<p>First, the similar gambit of litigating indirectly through SCO is
throughly dead. Second, the approach of clamping down on piracy and
ratcheting up prices is not working out as well as Steve Ballmer might
have hoped. Third, <em>last week</em> the Supreme Count handed down decisions
that seem likely to tremendously devalue software patents.</p>
<p>No doubt the Microsoft lawyers are warning that they have to move now to
get the most - or any - value out of software patents they presently
own. Likely they have learned from the SCO experience, and the
violations claimed are real. The Patent Office granted software patents
by the truck load for trivial "inventions". So much so that every
significant piece software is likely to violate many patents. Of course,
the problem with this approach is that Microsoft's software is also
certain to violate an insane number of patents.</p>
<p>Will Microsoft threaten or actually litigate? Take this as a measure of
sanity for Microsoft upper management. Threats are cheap, and have at
least some (if not much) payback. Litigation is incredibly dangerous for
Microsoft, given that Microsoft too is vulnerable to claims of patent
violation. Perhaps the Microsoft lawyers are counting on the eventual
devaluing of software patents to offer a no-lose worst case scenario.</p>
<p>There may be a path for Microsoft out of this, but one that Ballmer may
not be able to see.</p>
<p>The current strategy is to explore the high end of the price curve -
more money for less value - which requires clamping down on piracy,
which in turn means rude treatment of customers. In the long term this
is a boon to Microsoft's competitors, as customers are motivated to look
at alternatives. Screwing your customers is a very risky strategy.</p>
<p>The alternative is explore the low end of the price curve, and how to
offer the greatest value to the customer.</p>
<p>The opportunity is plain. Instead of a new version of Windows every few
years, release a new version every year (a few months prior to Xmas,
likely). Any new features ready at that time will ship - or wait until
the next year. This predictable schedule is good for retailers, and easy
for customers to understand.</p>
<p>Ever plug in a new piece of hardware, and have trouble getting it to
work? Windows offers to look for a driver (with options meaningless to
most users) ... then usually fails (duh). This is not a service to the
customer. Windows can ship with all the current most-used drivers, and
with an internet connection should be able to find almost anything. To
the customer this means you always get the best available drivers - and
things just work.</p>
<p>In fact, it might make sense to release more often - say every six
months. While changes to Windows itself are better left to less often,
there are any number of items that are worth more frequent update -
security patches, new drivers, virus signatures, malware removers, etc.
What Microsoft does (in this model) is look for every possible way that
update can improve the way the customer's computer works.</p>
<p>The model from the customer's point of view is simple. Once a year (or
more often) you buy the current update to Windows. Pop in the disk, and
an hour or so later you have a few new goodies and a better running
system.</p>
<p>Pricing is tricky. Say the yearly update is $40 and the six month
update is $20. Both are full unrestricted versions of Windows. At those
prices the customer is going to be a lot less interested in (possibly
risky) pirated versions of Windows - so Microsoft is going to make a lot
more sales. Folk who can afford to will probably buy both, just to be
sure they have all the latest. Even folk short on money can afford the
$20 update (can you see the market for pirated software imploding?).
Low prices, frequent updates, and regular positive experiences all build
customer goodwill - which makes inroads from competitors very unlikely.</p>
<p>My experience with folk like Ballmer suggests that by their very nature,
they cannot see this path, even when it is placed in front of them.</p>
Are political parties the problem?2007-05-12T00:00:00Zhttps://bannister.us/weblog/2007/are-political-parties-the-problem
<p>Signed up on the mailing list for the local (Orange County, California)
Republican Party. Looking for some way to make a positive difference.
Mailings from the Party offer:</p>
<ul>
<li>Opportunities to meet and donate money to current and recently
serving politicians. More money is better. Wear a suit.</li>
<li>Opportunities to work as free labor in service to someone else's
cause.</li>
<li>Opportunities to back an existing cause, chosen by someone else.</li>
</ul>
<p>So far it seems - as an individual voter - the organization serves no
useful purpose. Not a word about who or how the causes are chosen.</p>
<p>Reading the local political weblogs, I see a lot of:</p>
<ul>
<li>The person under discussion is in the other political party, so they
must be bad.</li>
<li>The person under discussion is in the same political party, so they
must be ok.</li>
<li>The item under discussion was backed by someone of the other
political party, so it must bad.</li>
<li>.... etc. There are the odd exceptions, presented as exceptions.</li>
</ul>
<p>Note that when politics becomes really local, political parties tend to
disappear.</p>
<p>I voted for a member for the local school board, because I'd met her at
local PTA and Boy Scout meetings, and thought she would do a good job.
Don't remember if her political party membership was ever mentioned.</p>
<p>Do you know the party membership of members of your local city council?
Did you vote for them mostly on issues, or mostly on their party
membership? My bet is that party membership matters more in larger
cities, and much less in smaller. When you know more about the
individual and where they stand on local issues, then party membership
matters less.</p>
<p>This ties in with a
<a href="http://bannister.us/weblog/2007/either-a-comedy-or-a-tragedy/">prior</a>
observation, that bad things seem to happen in politics when
representation becomes more remote. Perhaps the existence of political
parties are a symptom of the underlying problem. When you know a lot
more about the issues in question, and the (local) guy you are voting
for - political parties just do not matter very much.</p>
<p>How remote is too remote? The city of <a href="http://en.wikipedia.org/wiki/Santa_Ana%2C_California">Santa
Ana</a>, with a
population of about 380,000 (ignoring uncounted illegal immigrants),
offers one example. Political party seems to matter rather a lot. With
seven city council members, that works out to about 54,000 citizens (or
roughly 18,000 active voters) per representative.</p>
<p>The nearby city of <a href="http://en.wikipedia.org/wiki/Lake_Forest%2C_California">Lake
Forest</a> has a
population of about 59,000, and a five member city council, which works
out to about 12,000 citizens (or roughly 6,000 active voters) per
representative. Local issues seem to be dominant, with political party
affiliation almost invisible.</p>
<p>Is this enough to bracket the problem? Is one representative per 6,000
active voters workable, and one representative per 18,000 active voters
too remote?</p>
Programming for the web - Javascript2007-05-05T00:00:00Zhttps://bannister.us/weblog/2007/programming-for-the-web-javascript
<p>If you are going to write web applications, you are going to learn
Javascript.</p>
<p>In the early web browsers, Javascript was a bit underdone, and caused
some problems with security. Entire organizations chose to disallow the
use of Javascript in web browsers - and for good reason. In that time
frame, when designing a web application, you had to allow for browsers
in which Javascript was disabled. That time is gone. Many web
applications now require the use of Javascript, and even more will in
the future. From this point forward, using a browser with Javascript
disabled will be increasingly impractical.</p>
<p>As a side-effect of history, most Javascript examples offered in books
and on the web are very badly written. Javascript is a object-oriented
language, but nothing like C++ or Java. Want to create an object in
Javascript?</p>
<p>function makeCounter(by) { var n = 0; return { next: function() { n += by; return n; } }; }
var counter = makeCounter(2);</p>
<p>The variable <strong>counter</strong> now refers to a unique one-of-a-kind object,
and returns a new number each time <strong>counter.next()</strong> is called. Note
there is no declared <em>class</em>, and no need for the <em>new</em> operator. Note
the use of a
<a href="http://en.wikipedia.org/wiki/Closure_%28computer_science%29">closure</a>.
This is Javascript used to full advantage.</p>
<p>Closures give you the leverage you need to greatly simplify you code -
which is exactly what we need. The Javascript code attached to a web
page needs to be compact, as the code is downloaded and compiled each
time the web page is loaded.</p>
<p>Learning to use Javascript is not an option when learning to program web
applications. A browser without Javascript is not a viable future
option.</p>
HTML at the W3C2007-05-05T00:00:00Zhttps://bannister.us/weblog/2007/html-at-the-w3c
<p>A few weeks back I signed up for the <a href="http://www.w3.org/html/wg/">new W3C working
group</a> for what will most likely be called
HTML 5. As a change from past W3C practice, this working group has
relatively open membership, and the current membership is well past 300.
At first the flood of voices on the <a href="http://lists.w3.org/Archives/Public/public-html/">mailing
list</a> was a bit
overwhelming. Started picking out "voices" after a bit - sets of belief
based on particular points of view.</p>
<p>There does seem to be some measure of convergence. Though I am not at
all sure that consensus derived from some sort of average of the
viewpoints offered is going to yield an especially good result.
Compromise is not necessarily a good design principle.</p>
Code Talkers2007-05-04T00:00:00Zhttps://bannister.us/weblog/2007/code-talkers
<p><a href="http://xkcd.com/c257.html"><img src="http://imgs.xkcd.com/comics/code_talkers.png" alt="coders" /></a></p>
<p>Not the most effective approach. :)</p>
More reliable voting2007-04-30T00:00:00Zhttps://bannister.us/weblog/2007/more-reliable-voting
<p>Text about Rush Holt’s Voter Confidence and Increased Accessibility Act
via CATO, which serves as a reminder that lawyers and politicians should
not be allowed to design algorithms (or do math).</p>
<blockquote>
<p><a href="http://www.cato-at-liberty.org/2007/04/30/how-to-reform-e-voting/">How to Reform
E-Voting</a>
It bans the use of computerized voting machines that lack a
voter-verified paper trail. It mandates that the paper records be the
authoritative source in any recounts, and requires prominent notices
reminding voters to double-check the paper record before leaving the
polling place. It mandates automatic audits of at least three percent
of all votes cast to detect discrepancies between the paper and
electronic records. It bans voting machines that contain wireless
networking hardware and prohibits connecting voting machines to the
Internet. Finally, it requires that the source code for e-voting
machines be made publicly available.</p>
</blockquote>
<p>This proposal shovels too many irrelevant requirements on the problem.
Clearly the author cannot distinguish between essentials and what just
sounds good.</p>
<p>Early in my career I ran into an observation from Butler Lampson (in a
copy of <a href="http://research.microsoft.com/~lampson/33-Hints/WebPage.html">Hints for Computer System
Design</a>)
which can be paraphrased as:</p>
<blockquote>
<p>Only end-to-end checks matter - everything else is (or should be) an
optimization.</p>
<p></p>
</blockquote>
<p>The same principle applies in this case. To be sure an election is
counted accurately we need to be able to detect votes added, changed, or
deleted. On one end we have the voters casting their votes. On the other
end we have the recorded tally of all votes cast. Given a check that the
two ends match, we don't need anything extra in the middle.</p>
<p>No system is ever perfectly secure. With enough corrupt people in enough
places, any election (as with any other security system) can be
subverted. What we can do is make the expense and risk of detection very
high. We can make elections more reliable and more secure than was
possible in the past, with some clear design principles and relatively
simple software and hardware.</p>
<p>To insure votes are not changed after they are cast by the voter:</p>
<ul>
<li>Give the voter a record of their vote. No personally identifying
information, just an ID number (randomly generated and used only
once) and a list of votes.</li>
<li>Publish a public tally of all votes. Anyone can check that the
numbers add up. Any voter can verify that their votes are present
and accurate.</li>
</ul>
<p>To insure voters are not falsely added or removed:</p>
<ul>
<li>Print a list of all votes recorded at a polling place at close of
polls - one copy to post outside the polling place, and a reasonable
number of copies for anyone interested.</li>
<li>The published public tally of all votes must include the polling
place. Anyone can check that these totals match.</li>
</ul>
<p>To trust the local results both the hardware and software design must be
published for public review and approval far in advance of the election.
Interested parties must have an opportunity to spot-check the hardware
and software both before and after the election. Very likely
well-designed and well-reviewed software and hardware will see very wide
use (in this country and others). Counting votes is not complex. Getting
the hard parts of the design right need only be done once.</p>
<p>To trust the voter's receipt is genuine, record a cryptographic
"fingerprint" for each voter, and print the fingerprint on the voter's
receipt, the polling place tally, and the final public tally. Combined
with open, reviewed, and verified hardware and software designs (this is
essential) - this makes election results almost impossible to subvert
without detection. This is a huge improvement over the present.</p>
<p>Today, once you cast your vote, you have no idea if it was counted.
Today, when the votes leave my polling place, I have no way of verifying
that they were recorded. What we lack is an end-to-end check.</p>
<p>By itself, a "paper trail" does not prove anything, and "paper records"
used for recount are in not certain to be more reliable. Automatic
recounts - without an end-to-end check - do not prove a thing. The
end-to-end check is essential, and what we lack.</p>
<p>Banning wireless networks and connections to the Internet is silly. Both
are sources of possible problems (I would be extra-wary if a design used
either), but the problems are avoidable. Even though wireless networks
and the Internet are both insecure, software folk figured quite a while
ago how make secure connections across insecure networks (see <a href="http://en.wikipedia.org/wiki/Secure_Shell">Secure
Shell</a> for a widely used
example). I can sit in my backyard using a laptop connected to my
wireless network and from there to the public Internet - and connect
securely to computers anywhere on the Internet, using freely available
and publicly reviewed software (and have done this for years).</p>
<p>Open review is essential. Banning specific technologies is unnecessary.</p>
<p>We can make fairly simple use of existing technology to make voting more
reliable and more secure than was ever possible with paper ballots - if
the design is right.</p>
Getting the issues with "e-voting" completely wrong2007-04-27T00:00:00Zhttps://bannister.us/weblog/2007/getting-the-issues-with-e-voting-completely-wrong
<p>There are problems with "voting machines" as used now, but the problems
can be solved. This article from CATO paints entirely the wrong picture.</p>
<blockquote>
<p><a href="http://www.cato-at-liberty.org/2007/04/27/the-case-against-e-voting/">The Case Against
E-Voting</a>
Ars Technica has an article about problems created by e-voting
machines in the French elections on Sunday. Apparently, technical
problems caused long lines, causing some voters to be turned away from
the polls.</p>
<p>France’s problems are not an isolated incident. In November’s U.S.
election, one county in Florida (ironically, the one Katherine Harris
was vacating) seems to have lost about 10,000 votes, which happens to
be smaller than the margin of victory between the candidates. And
there were numerous smaller examples of e-voting problems all over the
United States in the 2006 elections.</p>
<p>Those incidents by themselves would be a good argument for scrapping
computerized voting. But the most important argument is more
fundamental: e-voting is not, and never can be, transparent. The most
important goal of any election system is that the voting process be
reliable and resistant to manipulation. Transparency is a critical
part of that. Transparency makes it more likely that any tampering
with the election process will be detected before it can do any
damage.</p>
</blockquote>
<p>First, a few places having trouble does not prove anything. For the past
several years I have volunteered to run the local polling place. The
transition from paper ballots to using "e-voting" was anti-climatic. In
fact, voters get through the voting process just a bit quicker (no long
lines), and with less than half the number of errors (both voters and
poll workers are human). Having worked several elections both before and
after the conversion - in the same neighborhood - I can be fairly sure
that things at the polling place are indeed better.</p>
<p>Are there problems with "e-voting" as currently practiced? Absolutely.
Are the problems insoluble? Absolutely not.</p>
<p>Yes, the hardware and software design of voting machines should be open
to public review. There is nothing sufficiently special about the
hardware or software to merit a proprietary design. Yes, there is
presently a risk of mass-stealing votes, if the folks upstream in the
voting process cannot be trusted - though this problem existed with
paper ballots.</p>
<p>There is a simple way to make "e-voting" more secure than anything we
have used in the past. What we need is a simple end-to-end check. At one
end we have the voter casting his votes. At the other end we have a sum
of all votes cast. What if you could verify that your vote was counted?
What if I (as a poll worker) could verify that the sum of votes from my
polling place was in the final count? Between the two, we (the voters)
would know that our votes were counted accurately, and that no voters
were under or over counted.</p>
<p>The end to end check is simple. The voter gets a printed slip with a
unique code, and a list of his or her votes. The code identifies the
vote, but not the voter. At the end of the election, a list of all votes
gets published on a government website. The voter can check the website,
and verify that his/her votes are present and correct.</p>
<p>At end of the day, the polling place produces a sum of all votes
collected at that location - the copies to poll workers, poll watchers
(and potentially any interested voter). That same sum should also appear
on the government website. Any voter can potentially verify that the
number of votes collected at the local site on election day matches the
published counts for the entire election.</p>
<p>There is a bit more to this. The software and hardware used must be open
to public review. The voter's slip and polling place printout must
include a list of encrypted signatures (so fake voter slips can be
caught).</p>
<p>The end result is in fact dramatically more open and reliable than
anything we could do in the past. Done right, "e-voting" can make
subverting elections vastly more difficult than any time in the past.</p>
Either a comedy or a tragedy2007-04-21T00:00:00Zhttps://bannister.us/weblog/2007/either-a-comedy-or-a-tragedy
<p>This is a bad joke, in more than one sense.</p>
<p>The folk that founded this country were pretty smart, but by no means
all-knowing. I have tremendous respect for the thought that went into
the founding of this country. Seems somehow between founding and the
present day, something fairly fundamental has gone wrong. Perhaps in a
thousand years the study of society and politics might be reduced to a
science, and if someone from that future dropped through a time-warp,
they might be able to point out in detail what mistakes we have made.
Lacking any convenient time-warps, we are stuck with having to figure
out things for ourselves.</p>
<p>I spend my work-time working on software, and in software one of the
problems we have to deal with is scale. We may have a solution that
works very well at first, but runs into trouble when the scope of the
problem suddenly grows. In the physical world you are not likely see the
scope of your problem suddenly change by a factor of a thousand or a
million. In the software world, such changes are not unusual. What
worked well for one user may not work well for a hundred, and fail
utterly when users number in the millions. A database may grow from a
hundred items to a hundred million in a few years. Scale is very much a
concern for many software projects. Not everyone who works on software
learns this lesson, and fewer still learn this lesson well.</p>
<p>After paying a bit of ongoing attention to politics, I am starting to
wonder if where things go wrong has a lot to do with scale.</p>
<p>The population of Orange County, California is currently somewhere in
excess 3 million. (The <a href="http://quickfacts.census.gov/qfd/states/06/06059.html">official
count</a> was
slightly lower, but illegal immigrants tend to go uncounted, and are not
exactly rare here.) Contrast this with the population of <a href="http://www.census.gov/Press-Release/www/releases/archives/facts_for_features_special_editions/004772.html">about 2.5
million for the entire United
States</a>
in 1776.</p>
<p>The original number of elected Representatives to Congress was meant
<a href="http://en.wikisource.org/wiki/Constitution_of_the_United_States_of_America#Section_2">"not exceed one for every thirty
Thousand"</a>.
In 2007 the actual number of Representatives is about one for every 690
thousand. When your representation becomes 23 times more remote, perhaps
things start to go wrong.</p>
<p>Given the county has a greater population than the entire United States
at it's founding, how does the government compare? The County of Orange
has a five elected Supervisors. The <a href="http://en.wikipedia.org/wiki/First_United_States_Congress">first
Congress</a> had
65 Representatives, and 26 Senators. Clearly representation is much more
remote than at this country's founding.</p>
<p>Now to descend from fine ideals to local politics...</p>
<p>Our current elected county Sheriff's prior experience was basically that
of a security guard for the county courts. Not an especially impressive
base for leading law enforcement for the entire county. He had
substantial political and monetary backing, and got elected. He did come
and speak at a local venue, before the first election. He spoke very
well, but at the end I realized somehow that I simply did not trust the
man. He subsequent record seems to reinforce that initial impression. If
representation was less remote, if other voters were more likely to hear
and meet there potential representatives, would better folk get elected?</p>
<p>Forward to the present, and this announcement...</p>
<blockquote>
<p><a href="http://www.ocblog.net/ocblog/2007/04/anderson_elevat.html">OC Blog: Anderson Elevated to Assistant
Sheriff</a>
OC GOP Central Committee member and Sergeant at Arms Jack Anderson
was appointed yesterday by Sheriff Carona to be one of four Assistant
Sheriff's. Until recently Jack was the captain overseeing South
Operations.</p>
<p>Also, Sheriff Carona elevated Assistant Sheriff Jo Ann Galisky to be
Under Sheriff (a newly created position).</p>
<p>Congratulations to Jack and Jo Ann!</p>
</blockquote>
<p>So the new Assistant Sheriff's qualifications are his political
connections, and as "Sergeant at Arms"? Impressive, but not in a good
way.</p>
<p>As to the female appointed to the newly created position of, er, "Under
Sheriff" ... I do not know what to say. I hope she serves well in that
position.</p>
Spreadsheets and Javascript2007-04-18T00:00:00Zhttps://bannister.us/weblog/2007/spreadsheets-and-javascript
<p>Another obvious observation...</p>
<p>I'm in the middle of exercise the aim of which is expression of an OLAP
hypercube into a web page, using HTML/CSS/Javascript (no applets, or
Flash, or ...). The presentation is very much like a spreadsheet, but
the data and UI manipulation models are very different. Add to this the
fact that end result is a definition (a "model") of how to build
hypercube and then generate a report from the cube. The model will be
used many times by a back-end "publisher" to generate reports (often in
very large volumes).</p>
<p>So in the end I have a sheet that must evaluate identically in the web
browser and in a back-end process.</p>
<p>Spreadsheets typically have a small expression language used to
calculate fields from other fields. The expression language is usually
something invented - not used anywhere else - and need their own little
specialized interpreter. In my case I have need for a similar
interpreter. I could have one implementation on the server, and do a
round-trip to the server every time a cell needed update. I could do an
implementation to run in the browser, and another implementation for the
back-end process, with the risk that the two implementations might
differ (and additional development and testing time). Neither
alternative is ideal.</p>
<p>What if the expression language used in the spreadsheet were Javascript?</p>
<p>With Javascript we get a much more expressive language, eliminate the
need to implement an interpreter, and get multiple well-tested
implementations (Rhino, Spidermonkey, JScript). The syntax may be a bit
more of a bother than the usual spreadsheet expression language, but
perhaps not enough to matter. There is the potential for security risks
that needs to be addressed (and should be quite solvable).</p>
<p>Have to chew on this one a bit more...</p>
Point of view and W3C HTML2007-04-17T00:00:00Zhttps://bannister.us/weblog/2007/point-of-view-and-w3c-html
<p>There is a W3C group working on the next standard for HTML. In tracking
the current discussion, things started to make more sense when the roles
and points of view of some participants became clear (or at least
clearer). Seems only fair (and perhaps necessary) to make my own
motivations clear.</p>
<p>I am a software developer. After looking at the mass of incompatible
behaviors during the browser wars, I intentionally stayed away from
making use of "dynamic" HTML until Netscape 4 and IE 5 were almost gone
from use. A few years ago I started on a somewhat ambitious (and risky)
project to replace a Windows desktop GUI application with a web
application. My goal was to produce an application that was <strong>better</strong>
than the Windows GUI it was displacing (not an easy thing to do). This
was a one-man project that pulled in a bits of everything.</p>
<ul>
<li>A Java applet, small as I could make it, but essential to the UI.</li>
<li>MAYSCRIPT enabled Java to Javascript, and Javascript to Java
interaction.</li>
<li>Heavy use of scripted behaviors.</li>
<li>Heavy use of CSS for carefully controlled layout.</li>
<li>Pure HTML 4.01 Strict pages - with quite a few runs through a
validator.</li>
<li>No use of browser specific code - except for the bit of script that
generates the tag to invoke the applet.</li>
<li>No document.write() - anywhere.</li>
<li>Testing iterations first under Firefox, and later under IE.</li>
<li>Server-side Java generating HTML pages, HTML fragments, and both
sending and receiving JSON data.</li>
<li>Server-side C++ called from Java to perform the heavy processing.</li>
</ul>
<p>The end result is both somewhat complex, near squeaky-clean in standards
compliance, and works well in both Firefox and IE. At the end of the
development cycle I did try firing up the product in Opera ... and it
<em>almost</em> worked. Was this a result of Opera not-quite meeting the
standards? Was the fault in my code for misusing the standards in ways
that just happen to work in Firefox and IE? Was the fault in standards
that allowed more than one reasonable interpretation? Frankly, I expect
it is a bit of all three. Unfortunately, I cannot invest the time needed
to figure this out, as our customers simply do not care about Opera.</p>
<p>The fact that standards-compliant browsers might differ in their
interpretation of standards-compliant code does not surprise me. This
expectation comes out of experience.</p>
<p>In my first job out of college, the guy in the next office was working
on what was to be the second validated Ada compiler. At the time, Ada
was meant to be the most carefully designed and throughly specified
programming language ever - and compilers written for the language had
to pass strict validation tests. The guy next door would call me over
when he hit a particularly tricky section. Ada was a fairly complex
language, with a fair number of "dusty corners" not explicitly covered
by the specification. As it turned out there were quite a number of
cases where we had to puzzle out what behavior made the most sense - and
there was not always a single clear choice.</p>
<p>The lesson I pulled from this experience is that the more complex a
specification, the more likely there are "dusty corners" where
thoughtful folk could come to reasonable but differing implementations.
Simpler is often better.</p>
<p>Also relevant to the W3C activity is my point of view in relation to
maintaining version compatibility. For most of the software projects I
have been involved with in the last twenty-odd years, maintaining
compatibility was an explicit concern. I will not claim we always got
things right, but I do try very hard not to screw the customer, and will
claim to have got better at this over time.</p>
<p>Since I find that my experience leads me to back views offered by Chris
Wilson (from Microsoft), just to be clear - I do not work for Microsoft,
never have worked for Microsoft (directly or indirectly), and probably
never will. My only remotely "special" relationship would be the fact
that I ate lunch with Bill Gates at the Windows developer's conference
in 1984 (yes, pre-Windows 1.0), and that's it. (Spent the next seven
years writing pure Unix code, BTW.)</p>
<p>My point of view is that of an application developer reasonably
proficient at use of HTML/CSS/Javascript (another other things), and
interested in improving the programming model offered to web application
developers.</p>
On Selling Music2007-04-08T00:00:00Zhttps://bannister.us/weblog/2007/on-selling-music
<blockquote>
<p><a href="http://www.tbray.org/ongoing/When/200x/2007/04/07/Music-Sales">ongoing · On Selling
Music</a>
Finally, I remain astonished that the subscription model hasn’t
caught on; it seems like awfully low-hanging fruit. There are any
number of artists I’d subscribe to for ten or twenty bucks a year in
exchange for an irregular flow of new material; live cuts, studio
work, collaborations, whatsoever, along with discounts and
front-of-the-line access to their regular output. Which is ten or
twenty bucks a year more than they’re getting out of me now. The
technology wouldn’t be hard to set up, either.</p>
</blockquote>
<p>I agree - a subscription model makes a lot of sense to me, for the
artists I like that are still producing work. The money for the artist
might be a smaller than regular sales, but also might serve as an
indication of future sales, and provide encouragement for the artist.
May not make a difference to mass-market music, but for the smaller folk
... ?</p>
Yet another JSON implementation - Javascript2007-04-07T00:00:00Zhttps://bannister.us/weblog/2007/yet-another-json-implementation-in-javascript
<p>Picked up the JSON string to/from object
<a href="http://www.json.org/json.js">implementation</a> from
<a href="http://www.json.org/js.html">json.org</a> a year or so back (which I see
has since changed). Did not care for the pollution of the stock classes
with <strong>toJSONString()</strong> methods (don't care much for the method name
either), so implemented the same function as methods scoped within a
global JSON namespace:</p>
<p>JSON.toJSON(object) returns string
JSON.isJSON(string) returns truth
JSON.parseJSON(string) returns object</p>
<p>Perhaps a matter of taste, but I do prefer three functions in an
isolated namespace over the approach in the <strong>json.org</strong> code. The
string encoder looked (and is) a shade inefficient. Checked by putting
together a <a href="http://bannister.us/examples/json/encoders.html">test page</a>.
Chose the string encoder in
<a href="http://bannister.us/examples/json/json.js">json.js</a> from timings in
Firefox and IE6 (your results may differ). Barring any editing errors,
this should work in IE6/IE7, and Firefox/Mozilla. The GET/POST
implementations may be a bit cleaner too.</p>
REST should not be "uniform"2007-03-29T00:00:00Zhttps://bannister.us/weblog/2007/rest-should-not-be-uniform
<p>There is one mistake I have seen repeated over and over (and over...) in
applications that work across the network - from the 1980's up through
the present. The symptom is an application that works fine in testing,
but performs very poorly when deployed. The cause is developers who fail
to use the network efficiently.</p>
<p>The example I first saw was when at FileNet in the 1980's, and we hooked
up a client workstation over a 56Kb/s connection. The drop in
performance was <strong>much</strong> greater than the difference in data rate with
the 10Mb/s local area network. Accounting for the difference was
initially a puzzle.</p>
<p>Networks have both overhead and latency. Latency is time it takes for a
message to travel across the network. When the test server is on the
same wire as the test client - the usual case in development - latency
is quite small, can be and (by mistake) frequently is ignored by
developers. At this stage of development an application that passes many
messages across the network can perform well. Developers tend to a
design nice uniform network API - much like the interface to a local
library. With an API of this sort, client startup might take hundreds or
thousands of messages sent across the network.</p>
<p>With a simple PING test, I see ~0.01ms for a round-trip to my local
server, ~10ms to my ISP's local mail server, and ~100ms to most major
sites on the web. The latency to cross the web is about a <strong>thousand
times</strong> the latency on the local network. The latency to cross my ISP's
intranet is about a <strong>hundred times</strong> the local latency.</p>
<p>Note that latency is essentially unaffected by the speed of your network
connection or your servers. If latency is a problem, acquiring a faster
network is unlikely to help. A faster network connection is really
better described as a higher capacity network, as the you can send more
bits per second, but the bits don't cross the network any faster.</p>
<p>At FileNet the 56Kb/s link went off-site, and had latency not very
different from a web connection today.</p>
<p>The problem comes when the application is deployed, and the server is no
longer local. A hundred calls across the network cost the application
perhaps 1ms of latency in developer testing (seldom a concern). A
hundred calls across the web could easy add 10 seconds, and make an
application noticably slow. On the local network you could make hundreds
or even thousands of calls without noticing a drop in performance. Move
the same application to the web (or a company WAN) and performance
becomes painfully slow. Once the problem hits you in the face (1980's in
my case), the answer should be obvious. For optimal performance you want
one call across the network for one user action. Program startup? One
network call. User clicks a button? One network call.</p>
<p>You <strong>must not</strong> design a network API the same way you would design a
local library.</p>
<p>Which leads us to
<a href="http://rest.blueoxen.net/cgi-bin/wiki.pl?RestInPlainEnglish">REST</a>. I
very much <em>like</em> the idea of using HTTP without any unnecessary added
abstractions. I like the idea of stateless interaction. When writing
client/server applications it became clear that using stateful
connections were as much a problem as an aid - even in the 1980's. What
I find disturbing is the repeated reference to a <a href="http://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm#sec_5_1_5">uniform
interface</a>,
and reference to using <a href="http://rest.blueoxen.net/cgi-bin/wiki.pl?HttpMethods">GET / PUT / POST /
DELETE</a> methods.</p>
<p>Put simply, a REST API should be asymmetric. For minimal latency, the
oft-used GET calls should return a collection of objects. Since <em>changes
usually cause side-effects</em>, the oft-used POST calls should return a
collection of objects. <strong>Latency matters.</strong> To avoid the risk of new
(and not so new) programmers repeating old mistakes, we need to offer a
model that accounts for latency. A good network API should <em>by design</em>
aim for one request/response per user action.</p>
<p>Note also that there is no point in trying to re-use the HTTP <em>method</em>
(i.e. GET, PUT, POST, DELETE, etc.) as a verb, since most applications
need a somewhat greater vocabulary. Shoehorning your application into
the HTTP verbs is probably a bad idea. Better to stick to GET for read
access, and use POST for changes. Note that using fewer messages to
minimize latency also helps an application to scale. The OS and web
server overhead for handling requests is pretty much fixed per message.
Fewer messages mean less overhead, and more capacity available to your
application.</p>
<p>If you take latency into account, then the REST model becomes:</p>
<ul>
<li><strong>GET</strong> <em>collection of nouns</em>
returns response: <em>collection of objects</em>.</li>
<li><strong>POST</strong> <em>collection of actions (where an action is a verb and a
collection of nouns)</em>
returns response: <em>collection of objects</em>.</li>
</ul>
<p>The REST model is a step forward, and better with an emphasis on
asymmetry and collections.</p>
Making sense of "Social Capital"?2007-03-29T00:00:00Zhttps://bannister.us/weblog/2007/making-sense-of-social-capital
<p>The rather twisted semantics of this <a href="http://www.cato-at-liberty.org/2007/03/27/undermining-americas-social-capital-with-redistribution/">CATO
article</a>
remind me of
<a href="http://en.wikipedia.org/wiki/Through_the_Looking-Glass">Alice's</a>
<a href="http://en.wikipedia.org/wiki/Humpty_Dumpty">Humpty-Dumpty</a>.</p>
<blockquote>
<p>"When I use a word," Humpty Dumpty said, in rather a scornful tone,
"it means just what I choose it to mean -- neither more nor less."</p>
<p></p>
</blockquote>
<p>I have a lot of sympathy for CATO's philosophical bent. Occasionally
they jump track and go crashing into the trees. Maybe this is simply
their way of paying the bills, and making their sponsors happy?</p>
<p>What exactly is "social capital"?</p>
<blockquote>
<p><a href="http://www.cato-at-liberty.org/2007/03/27/undermining-americas-social-capital-with-redistribution/">Cato-at-liberty » Undermining America’s Social Capital with
Redistribution</a>
America’s lowest-earning one-fifth of households received roughly
$8.21 in government spending for each dollar of taxes paid in 2004.
Households with middle-incomes received $1.30 per tax dollar, and
America’s highest-earning households received $0.41. Government
spending targeted at the lowest-earning 60 percent of U.S. households
is larger than what they paid in federal, state and local taxes. In
2004, between $1.03 trillion and $1.53 trillion was redistributed
downward from the two highest income quintiles to the three lowest
income quintiles through government taxes and spending policy.</p>
</blockquote>
<p>I am having trouble with the use of "received" here. On one side, each
of us benefits - to a greater or lesser degree - from living in this
country. On the other side, the country incurs expenses that must be
paid. Is the benefit derived independent of income, or proportional to
income? Probably a bit of both. This duality leaves lots of room to
"spin" the numbers so you can make an argument (whatever the argument).</p>
<p>The use of "redistributed" also seems rather dubious. Money is
disappearing into the black hole of government spending. Money is not
transferred <em>between</em> households (with minor exceptions).</p>
<blockquote>
<p>This huge shift of resources punishes those who produce and rewards
those who do not. This hurts economic performance by distorting
incentives.</p>
</blockquote>
<p>First, there is not an exact map between "those who produce" and income
levels. Income level measures how much you are rewarded, not how much
you produce. Do you really believe income is exactly proportional to how
much you "produce"? Second, the above statement seems to imply the
most-rewarded folk will be discouraged from producing. Is there any
evidence of this? So what would they do, stop producing? Leave the
country? Commit suicide? Somehow this seems unlikely.</p>
<p>An even more interesting measure is your "reward" after taxes, cost of
living, kids, retirement savings (etc.) ... another topic, though
closely related.</p>
ACM is sooo twenty years ago ...2007-03-29T00:00:00Zhttps://bannister.us/weblog/2007/acm-is-sooo-twenty-years-old
<p>From: acmhelp@hq.acm.org
To: preston@bannister.us
Subject: An Invitation to Join ACM</p>
<p>Dear Preston Lee Bannister,</p>
<p>Thank you for registering with the ACM Digital Library, ACM's vast collection
of more than 40 publications and archives, representing over 1.4 million
pages of text.</p>
<p>Since that 1.4 million pages is in a ghetto, when searching I would end
up launching two searches, one via Google over the general web, and the
second within ACM's little universe. That assumes the ACM has a decent
search engine. Sounds like a pain.</p>
<p>Now that you've had a chance to experience this valuable resource, we'd like
to introduce you to some of the additional benefits available to ACM members,
including:</p>
<p>Signing up gave access to nothing, so I have not "experienced" anything.</p>
<p>- Free, unlimited online access to 450 courses and 395 books in the
ACM Professional Development Centre</p>
<p>I do buy a fair number of books, but none have said "ACM" anywhere.</p>
<p>- Full year subscriptions to "Communications of the ACM," "MemberNet,"
"TechNews" and "CareerNews"
- Full access to the Guide to Computing Literature and the ACM Career Centre
and Job Board</p>
<p>This is better than similar resources on the web, how?</p>
<p>- A free email forwarding address</p>
<p>This would be better than <a href="mailto:preston@bannister.us">preston@bannister.us</a> in what way?</p>
<p>- A special first year introductory rate and a free gift for professionals</p>
<p>(Feel a bit funny about this, as I was a member for about 10 years,
ending about 15 years ago.)</p>
<p>- Special discounted member rates and a free gift for students
- And much more!</p>
<p>Learn more about ACM membership, and join today at:</p>
<p>http://campus.acm.org/public/qjstuwithbook/joinacm2.cfm?client_no=%27%2A%5CW%2CP%3CW%273%20%20%20%0A</p>
<p>(You may need to cut and paste the entire link above into your browser. If the URL wraps,
be sure to copy it completely, leaving no blank spaces.)</p>
<p>ACM's mission is to advance both the discipline and profession of computing.
For more than 50 years, ACM has been widely recognized as the premier organization
for computing professionals, and today, ACM helps over 80,000 professional and
student members worldwide gain access to the information they need and want.</p>
<p>Twenty years ago ACM membership fit the description above, and was
indeed valuable. Now ... not so much. Kind of sad, really.</p>
<p>Join now to take advantage of this very special offer!</p>
<p>Sincerely,</p>
<p>ACM Member Services
acmhelp@acm.org
http://www.acm.org</p>
<p>P.S. All ACM members must subscribe to the purposes of ACM. You can access
the ACM Code of Ethics at: http://www.acm.org/serving. ACM will never sell
or rent your email address.</p>
<p>Client No.: 1923043
Email on record: preston@bannister.us</p>
<p>Probably not ....</p>
Spinning a story2007-03-28T00:00:00Zhttps://bannister.us/weblog/2007/spinning-a-story
<p>Another slightly dizzy story from CATO.</p>
<blockquote>
<p><a href="http://www.cato-at-liberty.org/2007/03/27/respecting-property-rights/">Respecting Property
Rights</a>
This dramatic photo appears on the front page of today’s New York
Times.
<img src="http://www.cato.org/images/homepage/china_400.jpg" alt="untitled" />
Chinese authorities are respecting the legal rights of a landowner
who does not wish to sell her parcel. Maybe this incident will have a
Sputnik-like effect on American policymakers: “Hey, the commies are
getting ahead of us on property rights! Let’s reverse the Kelo ruling
and stop eminent domain abuse!”</p>
</blockquote>
<p>The original article paints a slightly different picture. Seems the
property owner's rights are going to be "respected" in a rather odd way.</p>
<blockquote>
<p><a href="http://www.nytimes.com/2007/03/27/world/asia/27china.html?ex=1332734400&en=6fa6ba29dc716c3b&ei=5124&partner=permalink&exprod=permalink">Homeowner Stares Down Wreckers, at Least for a
While</a>
[...] a house perched atop a tall, thimble-shaped piece of land like
Mont-Saint-Michel in northern France, in the middle of a vast
excavation.
[...] in a way that is common in China whenever an event begins to
take on hints of political overtones, the story virtually disappeared
from the news media after the government, bloggers here said, decreed
that the subject was suddenly out of bounds.
[...] “For over two years they haven’t allowed me access to my
property,” said Ms. Wu, [...]</p>
<p>“If it were an ordinary person they would have hired thugs and beat
her up,” murmured a woman dressed in a green sweater who was drawn by
the throng. “Ordinary people don’t dare fight with the developers.
They’re too strong.”</p>
<p>Ms. Wu will in all likelihood lose her battle. Indeed, developers
recently filed administrative motions to allow them to demolish her
lonely building. Certainly the local authorities are eager to see the
last of her.</p>
<p>“During the process of demolition, 280 households were all satisfied
with their compensation and moved,” said Ren Zhongping, a city housing
official. “Wu was the only one <em>we had to dismantle forcibly</em>.”</p>
</blockquote>
<p>Note the past tense on the quote from the city official. Not sure that I
would class this as respect.</p>
Sun is cool2007-03-24T00:00:00Zhttps://bannister.us/weblog/2007/sun-is-cool
<p>Oh boy, has a lot ever changed since I wrote
<a href="https://bannister.us/weblog/2004/sun-was-cool">Sun was cool</a>.
In the time between, Sun has done some very cool stuff.</p>
<p>Moving the <a href="http://en.wikipedia.org/wiki/Sparc">Sparc</a> family out of the hot-rod-single-CPU (i.e. PC) race into a
<a href="http://en.wikipedia.org/wiki/UltraSPARC_T1">high-net-throughput, power-efficient multi-core design</a>
is cool (no pun intended). Makes perfect sense. Far more daring than I then expected from Sun. Buying CPUs for "hot rod" applications from AMD (and now Intel) makes perfect sense, and covers the case where customers need x86 compatibility.</p>
<p>Maybe because my first job out of college involved writing hard disk
drives and file system code, but it has always seemed to me that we were
not getting all the performance possible out of disk storage. Seemed
that at the intersection of RAID, journaling, and copy-on-write you
could do something really interesting. Design is a bit tricky, and
requires serious thought. (One of those "interesting" problems I thought
would be fun to work on, given the chance.) Someone finally did the work
in <a href="http://www.sun.com/2004-0914/feature/">ZFS</a>. ZFS came from Sun (not
Microsoft, not IBM, or anyone else).</p>
<p><a href="http://www.flickr.com/photos/viktorious/446173571/in/set-72157600041085373"><img src="http://farm1.static.flickr.com/213/446173571_1840c4708b_m.jpg" alt="untitled" /></a>Even
more audacious is <a href="http://www.sun.com/emrkt/blackbox/index.jsp">Sun's Project
Blackbox</a>. The notion of
engineering the equivalent of a data center in standard shipping
container is brilliant. Today most "data-centers" are effectively built
one-at-a-time in the field. Getting a data center up and running is
expensive and risky. Each data center is probably a unique combination
of power, cooling, networks, and computers. Unique combinations are
going to have unique problems. Problems mean going back to the vendors -
often with many rounds of troubleshooting. Many iterations mean time and
money wasted.</p>
<p>When <a href="http://blogs.sun.com/jonathan/entry/a_logical_end_point">Introducing Project
Blackbox</a>
Jonathan touched on how designing the "datacenter" as an integrated unit
pays big benefits. By engineering the whole package, Sun can design and
load up <em>exactly</em> the right power, cooling and networks for the
computers needed. By assembling and testing the entire package at Sun,
the customer can expect to save ($$) a huge whack of the usual
"integration" time. Add to this a <a href="http://blogs.sun.com/jonathan/entry/the_rise_of_the_general">big box full of
disks</a> that
with ZFS you can let fail in place. (Ever buy a replacement disk for a
four year old RAID? If so fail-in-place should make sense to you.) The
benefits multiply, rather than add.</p>
<p>I thought the benefits of this all should be pretty obvious. Searching
the web I see there are more than a few folk who still do <em>not</em> get it.
No, the Blackbox is <em>not</em> just another mobile center. The mobile part is
useful, but almost incidental. The advantage is the fact that you get a
fully integrated, tested, and functional datacenter in a box. By
assembling the entire datacenter as a unit, Sun can save customers time
and money, while still turning a decent profit. This is a good deal all
around.</p>
<p>Would you consider buying a car or television as parts, and assembling
it yourself? In the usual case, <em>no</em>, as the do-it-yourself approach is
going to cost you both time and money, and in most cases, <em>there is no
advantage</em>.</p>
<p>Sure, other folk have done datacenter-in-a-box stunts before - but they
were nothing more than stunts. You need <strong>all</strong> the pieces before this
becomes an integrated whole, and an effective offering. Many of the
pieces require deep expertise on the part of the company behind the
product. Essential bits needed include ...</p>
<ul>
<li>You <em>need</em> an operating system throughly suited for large-scale
lights-out managed-system operation. Sun has Solaris.</li>
<li>You <em>want</em> hardware that performs well at a reasonable price. You
<em>need</em> hardware designed to work well with the operating system (no
corners cut). Sun designs and builds some very nicely done hardware.</li>
<li>You <em>need</em> cost effective and reliable storage. With ZFS the Sun
folk can take full advantage of mass-market hard disks. ZFS enables
a cost/performance/reliability combination no one else can match.
Sun's box-full-of-disks "Thumper" product without ZFS would be just
a stunt. With ZFS you have something very interesting.</li>
<li>You need broad expertise from the vendor. As a customer, this means
you have one place to go for a resolution.</li>
</ul>
<p>Big companies tend to get, well ... <em>beige</em>. Perhaps Sun was always
colorful on the inside, but on the outside ... for a while, not so much.
Sun has suddenly become colorful - in a creative and insightful sense.
Very cool.</p>
Fuzzy worlds2007-03-20T00:00:00Zhttps://bannister.us/weblog/2007/fuzzy-worlds
<p>This following is pure/idle/random speculation, and rather old from my
personal point of view.</p>
<p>Many years ago ran across the "grandfather paradox" in science fiction.
The stories always seemed to revolve around an effectively immutable
past. At the time, this struck me as wrong - given time-travel (a rather
big given) the past cannot be immutable. At the same time I expected
each individual's memory of their own personal past to remain unchanged.
Starting from the (apparent) paradox, this lead to a sort of
thought-experiment.</p>
<p>Assume an infinite universe. In an infinite universe, all combinations
of atom, molecules, planets, galaxies ... must occur. Nature seems to
tend to elegance, so identical combinations should (perhaps) exist once,
and this continuum of combinations must be somehow adjacent, along a
dimension of sorts. Identical combinations collapse to a singular
instance - something like a standing wave. This means every possible
world exists in a continuum along some dimension. Every possible past
and every possible future exist in this continuum. Many possible pasts
(an infinite number - or nearly so) could lead to a single future. A
single past could - based on a single quantum fluctuation - could lead
to more than one future (though in most cases not).</p>
<p>Assuming this model, the "grandfather paradox" cannot exist. By
traveling into and changing the past puts you onto a one of the infinite
different paths to the future. You cannot change the past from which you
came, but you can change another (though "change" is the wrong word).</p>
<p>Well fine - this was an entertaining bit of speculation derived from
reading science fiction as a teenager in the 1970's. Did not expect this
to have any measurable impact on "reality". Did not expect this to be in
any way measurable.</p>
<p>But what if it was measurable? What could we measure if this were in any
way an accurate model?</p>
<p>Before I thought the model was absurdly unmeasurable - after all we
could have two world-paths differing only by the single random quantum
fluctuation of a single atom - the combinations might in some sense
finite, but still for all practical purpose infinite. Many pasts might
collapse to a single future, and random quantum fluctuation light-years
away will almost never impact the combined weave of probabilities that
make up any one present. Assuming the tendency to elegance in the
universe - perhaps our present in the sum of many (a nearly infinite
number) of pasts that computed to the same present.</p>
<p>What if this were measurable?</p>
<p>As we look further out into the universe, we are looking out to regions
that have no impact on our present or future. Might we expect to see all
possible pasts - the further out we look - that compute to our single
(as we perceive) future? Would the universe look "fuzzy" the further we
look? Would we see all possible pasts? Could we measure when parts of
our present came from a differing pasts?</p>
<p>Could this collapse of combinations reach into the macroscopic levels?
Could you and I remember the past differently, as we are from different
threads of experience through the weave of possibilities? As long as our
differing memory has no effect on the future, could these threads of
experience cross between differing "realities"?</p>
<p>Oddly enough, starting with the premise of an infinite universe, and
adding the apparent elegance of nature, you end up with a weave of
near-infinite (though finite) set of possible pasts leading to a
near-infinite (though finite) set of futures. Is it possible this is
measurable, as we peer further out into the universe?</p>
<p>Idle speculation...</p>
Clarifying HTML2007-03-15T00:00:00Zhttps://bannister.us/weblog/2007/clarifying-html
<p>HTML and the DOM as currently defined are quite a hash. Given the
history of web browsers, this is understandable, if unfortunate. Browser
makers are not the only culprits, as the W3C HTML standards are ... a
little funky.</p>
<p>Sounds like the <a href="http://www.w3.org/html/wg/">W3C HTML working group</a> is
<a href="http://ln.hixie.ch/?start=1173385976&count=1">opening up</a> to more
general participation. The
<a href="http://www.w3.org/2007/03/HTML-WG-charter">charter</a> seems to have a bit
more of a pragmatic flavor. This could be a good thing. Followed the
steps for joining (as an individual).</p>
<p><strong>Possible goals for reinventing HTML:</strong></p>
<p><em>Do no harm</em> (or at least as little as possible)
: This means HTML5 documents should render in existing mainstream
browsers (IE6/7, Firefox, Safari) as much as is practical.</p>
<p><em>Allow for extensibility</em>
: HTML in combination with Javascript is a programming platform. Each
site is an application. The generated HTML is in effect a dialect,
potentially with node and attribute names meaningful only to that
site's application. Draw on Lisp/Scheme as a model (not for
specifics).</p>
<p><em>Provide a clear/simple/minimal model</em>
: HTML and the DOM are at present quite a hash. There should be one
clear model for a programmer to follow. This will mean removing some
of the left-over debris. When in doubt, leave it out.</p>
<p>Digesting HTML, CSS, the DOM, Javascript, and some of the (many)
variations tried in building web applications - took a while. With any
new area I need to <a href="http://en.wikipedia.org/wiki/Grok">grok</a> current
state before I feel comfortable working. The end result is a personal
internal model of how things work and could or should be used. In the
end I believe the model for HTML programming could and should be both
much simpler and more flexible. As a model I am back to drawing on a
approach probably very familiar to Lisp/Scheme programmers.</p>
<p>An HTML document is simply a tree of typed nodes. With each node there
are per-node attributes, and per-node-type common properties. Default
behaviors and <a href="http://www.w3.org/TR/REC-CSS2/sample.html">style</a> are
associated with each node type - some of which can be overridden (with
varying degrees of success).</p>
<p>As a programmer, I can (to some degree) re-invent the presentation and
behavior of existing HTML nodes to meet the needs of my application ...
with lots of little exceptions. I would like to simplify the model by
removing the exceptions. As a programmer, I could achieve the greatest
clarity of expression by adding named attributes and nodes as needed for
my application. An HTML page is a data structure, very much like a <a href="http://en.wikipedia.org/wiki/S-expression">Lisp
S-expression</a> - and I think
there is a benefit in treating it as such, and in making this treatment
explicit.</p>
Abstraction2007-03-11T00:00:00Zhttps://bannister.us/weblog/2007/abstraction
<blockquote>
<p><a href="http://www.oreilly.com/news/frank_0701.html">O'Reilly -- In Memory of Frank
Willison</a>
On The End of the World, and Yes, It's Nigh</p>
<p>"Partway through Elliotte Rusty Harold's talk about namespaces, I
realized where this relentless drive toward abstraction was taking us.
Every new level of abstraction draws the computer-based world closer
to the concepts we talk about in the real world. We've moved from
waves to bits to data to information to infosets to application
objects. As this process continues, some ambitious Comp Sci graduate
student will realize that somebody already created the tree structure
mapping the highest level of reality. That person was, of course, G.
W. F. Hegel. Hegel's dialectic led him to create a map of reality
that, at the top of the tree structure, divided everything into either
the material or the spiritual realm. That dichotomy was resolved in
God, and, my friends, that's about as far as you can go.</p>
<p>"That ambitious Comp Sci grad student, eager to get his Ph.D. and
begin making real money, will create The Two Final Infosets: MatterML
and SpiritML. Then, late one night, as rain falls in torrents and
lightning flashes outside his laboratory windows, he'll run XSLT to
transform the material world to the spiritual world. We'll be gone.
The last material object on earth will be that graduate student's open
copy of XML in a Nutshell. It makes an editor in chief proud, in a
perverse kind of way."</p>
</blockquote>
<p>Something for the Java folk too fond of piling on abstractions...</p>
Ghost town2007-03-10T00:00:00Zhttps://bannister.us/weblog/2007/ghost-town
<p><a href="http://www.angelfire.com/extreme4/kiddofspeed/chapter1.html"><img src="http://www.angelfire.com/extreme4/kiddofspeed/imag10.1.jpg" alt="untitled" />
A ride through
Chernobyl.</a></p>
Sudoku2007-03-09T00:00:00Zhttps://bannister.us/weblog/2007/sudoku
<p>Last week was helping my 10 year old daughter with her math homework.
The assignment was to solve a
<a href="http://en.wikipedia.org/wiki/Sudoku">Sudoku</a> puzzle. In fact, I was
there more for moral support as she did not need any help. I had shown
her in previous assignments how to solve a Sudoku puzzle using sets. She
whizzed through the puzzle, got to the very end, and realized there was
a mistake .... somewhere.</p>
<p>Rather than re-solve the puzzle manually, I wrote a Sudoku solver.
Probably nothing unique about this - I would bet this is a common-enough
exercise in programming courses. Still, as an application that ran
in-page in a web browser, this gave me an excuse to exercise DHTML and
Javascript in a slightly different way than anything I'd done previous.</p>
<p>The <a href="http://bannister.us/examples/sudoku/">default puzzle</a> is in fact my
daughter's last homework assignment. Each cell as shown contains either
the value, or a set of possible values. You can edit, save, and bookmark
the initial set of known values. For example, <a href="http://bannister.us/examples/sudoku/?a=4,0,0,2,0,1,0,0,0,0,2,0,0,0,0,0,0,0,0,6,8,0,0,5,0,0,0,0,0,4,0,0,0,3,0,0,8,0,0,5,0,0,0,7,6,1,0,0,7,0,4,5,0,0,0,0,0,4,0,3,0,8,0,0,0,0,0,7,0,6,9,0,0,0,0,0,0,0,2,0,0">a variant with fewer
knowns</a>
offers an example of an edited and bookmarked puzzle. Looks like I need
an additional algorithm. Here is <a href="http://bannister.us/examples/sudoku/?a=3,0,0,0,0,0,0,0,4,0,0,2,0,6,0,1,0,0,0,1,0,9,0,8,0,2,0,0,0,5,0,0,0,6,0,0,0,2,0,0,0,0,0,1,0,0,0,9,0,0,0,8,0,0,0,8,0,3,0,4,0,6,0,0,0,4,0,1,0,9,0,0,5,0,0,0,0,0,0,0,7">a puzzle the solver cannot
solve</a>
though it can with <a href="http://bannister.us/examples/sudoku/?a=3,5,0,0,0,0,0,0,4,0,0,2,0,6,0,1,0,0,0,1,0,9,0,8,0,2,0,0,0,5,0,0,0,6,0,0,0,2,0,0,0,0,0,1,0,0,0,9,0,0,0,8,0,0,0,8,0,3,0,4,0,6,0,0,0,4,0,1,0,9,0,0,5,0,0,0,0,0,0,0,7">a single additional known
value</a>.
Since the objective was a means to check my daughter's homework, this is
good enough.</p>
<p>Enable access to the test functions, and you can exercise the individual
steps in the solver algorithm, and time the overlap solver.</p>
<p>One interesting bit - in IE7 the Javascript code for this algorithm runs
in about half the time of taken in Firefox.</p>
Power failure2007-03-08T00:00:00Zhttps://bannister.us/weblog/2007/power-failure
<p>Late last night, we had a power failure. All the UPS units chirped
(which makes the dog a nervous shadow), until I went around and shut
them all off. Left the laptop running on the chance that power would
come back before the battery ran out.</p>
<p>This morning the laptop was off. During startup Windows popped up the
same dialog twice, telling me I needed to recharge the battery - this
while running on AC power. Dumb. The desktop and applications restored.
The "Web Publishing Wizard" was sitting on the final page - "To close
this wizard click Finish", and there is no "Finish" button. Dumb.</p>
<p>Years ago I used to try to report things like this to Microsoft. Since
a) they wanted money to accept bug reports, b) there was no reason to
expect anyone would look at the report, and c) it would be years before
a fix would appear - if ever - I gave up on reporting bugs to Microsoft.</p>
Publish or Perish2007-03-07T00:00:00Zhttps://bannister.us/weblog/2007/publish-or-perish
<p>Twenty-odd years ago I held subscriptions to perhaps a dozen ACM and
IEEE publications. (SIGPLAN, SIGARCH, SIGOPS, SIGGRAPH, SIGCHI, IEEE
Software, Communications of the ACM, and an irregular Pascal/Modula-2
publication come to mind ... there were probably others.) Those
publications were at that time, the only source of high-quality
high-volume information about computers and software.</p>
<p>I canceled my subscriptions in the very early 1990's. At the time it
seemed as though the articles were starting to repeat, and offered
mainly predictable observations. Put differently, I was no longer in
"catch-up" mode (my area of study in college was Physics, not Computer
Science). There were still things to learn, but not through the
journals.</p>
<p>My ACM and IEEE memberships expired a long time ago.</p>
<p>Today we have a flood of information on the internet, not all of which
is of high quality, but if you know how to look, the quality is there.</p>
<p>Lately I have run across a few references that lead to inaccessible
documents owned by ACM, IEEE, and other similar organizations. The
article was inaccessible without paying a relatively steep fee. In no
case have I had any reason to believe the article referenced was worth
the price asked.</p>
<p>Once publishing in such journals meant rather a lot. Peer-review meant
the quality of the articles was generally high. Individual and library
subscriptions meant your work and ideas got the widest possible
(relevant) distribution. Storage in libraries meant the greatest
availability for the longest time. There was no better alternative.</p>
<p>Today those journals are - for the most part - a
<a href="http://en.wikipedia.org/wiki/Ghetto">ghetto</a>. Isolated from the vast
stream of knowledge and discussion on the web, restricted access
journals are very nearly irrelevant. What sane person would subscribe to
such a publication?</p>
<p>For academics, the publication in such a journal was (and is,
presumably) the almost the only way to gain status. Once, this was a
good thing. Much of the most interesting work was done in or near
academia. Professional journals offered the best path for disseminating
that knowledge out to the broadest body of practicing professionals.</p>
<p>This is no longer the case. There is a wealth of direct sharing between
professionals on the web. Very few are likely to subscribe to the old
journals (published in print - how quaint), which means the journals are
largely academia talking to itself. The old model of restricted access
journals is clearly wrong.</p>
<p>There is a place for peer-reviewed publication of material archived so
that long-term reference is possible. But the material needs to be out
in the open, on the internet, to be in any real way relevant. Not sure
what the economic model would be to support such an archive, though the
long-term costs for storage and access are becoming less relevant.
Perhaps such an archive should be replicated by universities as a matter
of course (much as universities are expected to have substantial
libraries). Come to think of it, to be most relevant, such an archive
should on occasion use hindsight to acquire submissions. A work of value
found "in the wild" should be archived along with all works of equal
significance.</p>
<p>In any case, it seems that the old "publish or perish" dictate is far
less worthwhile if the work is only seen by other academics.</p>
Connecting the dots - Ubuntu and Java2007-03-07T00:00:00Zhttps://bannister.us/weblog/2007/connecting-the-dots-ubuntu-and-java
<p>Sun announced back on November 13, 2006 that they were going allow use
of Java under the GPL. As a developer, I think this is great news of a
<a href="https://bannister.us/weblog/2004/litmus-tests-for-java">variety</a>
<a href="https://bannister.us/weblog/2006/ubuntu-debian-and-java">of</a>
<a href="https://bannister.us/weblog/2006/java-and-gnome">reasons</a>.</p>
<p>Four months later, checking the
<a href="https://wiki.ubuntu.com/JavaRoadmap">Java Roadmap</a> and
<a href="https://wiki.ubuntu.com/JavaIntegration">Java Integration</a> topics on the
Ubuntu wiki and Launchpad seem to be ... stale. Seems that Sun has done
what they needed to do. What is left is for the Linux distributions to
incorporate Sun's Java as the preferred implementation of Java on Linux?</p>
<p>Who is driving this? Where is the discussion? The problem is too many
places to look, none obviously right.</p>
Why buy new server versions of Windows?2007-02-26T00:00:00Zhttps://bannister.us/weblog/2007/why-buy-new-server-versions-of-windows
<p>Just as businesses are starting to discover the benefits of
virtualization, Microsoft is changing the license terms for new versions
of Windows.</p>
<blockquote>
<p><a href="http://blogs.vmware.com/vmtn/2007/02/microsoft_licen.html">VMTN
Blog</a>
The goal from Microsoft seems to be to slow down the market and
downplay features they can't match, so that they have a chance to
catch up.</p>
</blockquote>
<p>In fact this is in direct conflict with the needs of their customers.
The move by Microsoft not at all surprising. Before virtualization,
businesses had to choose one operating system to install on their
servers, and there was often one application that forced that operating
system to be Windows. Once you installed an operating system on your
server, you would likely end up buying other applications that ran on
Windows - and Microsoft had a pretty strong lock on those customers.
With virtualization a business can ran exactly as many different
operating systems as they need, and new applications need not run on a
Microsoft operating system. This is a threat to Microsoft's lock on the
market - so naturally they want to prevent the use of virtualization
(except on their own terms).</p>
<p>Nothing surprising here.</p>
<p>The kicker is - if I were a business making use of virtualization, I
would be looking at two things right now:</p>
<ul>
<li>Moving services off Microsoft's operating systems where practical.</li>
<li>Buying up old licenses for Windows 2000 (and 2003?) Server that did
not limit use of virtualization.</li>
</ul>
<p>Right off the bat, I bet we could free up some licenses by moving file
and directory servers from Windows Servers to Samba on Linux (or
Solaris). The freed licenses could be used to host any legacy Windows
Server applications. In the mid-term I would be looking at moving any
databases hosted on Windows Server machines onto one of the many
non-Windows alternatives. Certainly if I were a forward-looking
business, I would not be fond of Microsoft limiting my choices while
cranking up costs.</p>
<p>With Samba, moving file and directory services off Microsoft servers is
dead easy. Moving databases off Microsoft servers is more difficult
(depending on the application), but given a bit of lead time, often
quite feasible.</p>
<p>This is a dangerous gambit for Microsoft. By restricting the choices
available to businesses currently using Windows Servers, they run the
risk of pushing customers off Windows more quickly.</p>
Structured documents, DITA, DocBook, and Wikis2007-02-24T00:00:00Zhttps://bannister.us/weblog/2007/structured-documents-dita-docbook-and-wikis
<p>Dived into reading about <a href="http://www.docbook.org/">DocBook</a> and <a href="https://bannister.us/weblog/2007/structured-documents-dita-docbook-and-wikis">DITA</a>
this week.</p>
<p>This all started with my long-standing annoyance with MS Word (or
OpenOffice at present) when editing documents with structure. Back in
the early 1990's, I was at a small outfit writing both software and
documentation. The documentation was somewhat long (hundreds of pages),
and illustrated well how poorly MS Word was suited to longer documents.
What to maintain a consistent format through the document? You need to
learn to use customized styles. Need to make a consistent change through
the document? You need to eliminate any deviations from your customized
set of styles. Possible ... but very tedious.</p>
<p>Skip forward to the more recent task of writing design documents. Style
is an annoyance, as the master "template" documents (done by someone
else) are a bit of a hash. My other long-standing annoyance is that
documents of this sort tend to be throw-away. Extracting information in
design documents is always done manually. The documents have structure,
but the structure is not in the document in any easily programmatically
accessable form. Seems the lack of consistent manageable style and the
lack of explicit accessible form - are simply two sides of the same
problem.</p>
<p>You <em>could</em> encode the structure of your documents as XML. You could
then apply transforms and stylesheets to get the appearance you want.
Certainly possible ... but rather than start from scratch, mucked around
looking at for what other folks had done. No point in re-inventing the
wheel, after all.</p>
<p>Found DocBook. DocBook has been around a fairly long time, and has much
supporting material (books, articles, and software support). On the
other hand, seems to be oriented rather heavily towards books (not
entirely appropriate in my context), and to be rather cumbersome to
learn and use. Might be convinced to make the effort, but would I want
to inflict this on all the other developers in the company? Nope, not
really.</p>
<p>Found DITA. As a more recent product, DITA seems to have learned from
DocBook. DITA is heavily used/supported by some folk at IBM. Might be a
bit lighter to pick up and learn than DocBook. There is an <a href="http://dita-ot.sourceforge.net/">open source
DITA toolkit</a>, though rather cumbersome
to learn and use. Would I want to inflict this on other developers?
Nope. Still too "heavy".</p>
<p>Had briefly hoped that OpenOffice (with it's basis in XML) might have
some sort of direct support. There is <em>some</em> support for DocBook that
kind'a/almost works. So much for the notion of generating structured
documents from a word processor.</p>
<p>Took another look at Apache <a href="http://cocoon.apache.org/">Cocoon</a> and
<a href="http://lenya.apache.org/">Lenya</a>. Seems like a CMS that processes
structured documents as XML might fit. But Lenya seems to be a dying
project, and as such a dubious bet.</p>
<p>So after burning much of the week, came up pretty much empty-handed.
After chewing on the question for a while, my opinion is that adopting a
"heavy" framework (like DocBook or DITA) would be a mistake for
occasional use in creating documents with lightweight structure. Better
to use something lightweight to begin with - like a wiki - with support
for exporting documents as XML with transformable structure.</p>
<p>But what to use as a base?</p>
OpenID is a big win2007-02-23T00:00:00Zhttps://bannister.us/weblog/2007/openid-is-a-big-win
<p>So if you are a developer the notion of single sign-on via OpenID sounds
like a good idea, but since it lacks authentication, you might not be
entirely convinced. Well, this story is going to sound familiar.</p>
<p>I wanted to check my plan with Verizon. Not sure how many minutes I have
every month, mostly because I never go over. Tried to login to the
Verizon website, and (of course) I could not remember my username on
their site. Tried the first most likely ... nope. Tried the second most
likely ... nope. OK, at this point I do not know if I got the wrong
username, or the wrong password. A few more random tries, and they might
lock my account.</p>
<p>Perhaps this sounds familiar? Lots of sites, each wanting a unique
login. On some of which your preferred username is disallowed or already
taken. On some of which your preferred password(s) are disallowed. Many
of which you do not visit very often, so you are not going to remember
your username/password, the next time you want to login.</p>
<p>Yep. I would <strong>really</strong> prefer that the Verizon site was OpenID enabled.</p>
Groundswell - means what?2007-02-22T00:00:00Zhttps://bannister.us/weblog/2007/groundswell-means-what
<p>Admittedly I am no expert on paid political organizations, but I have to
wonder: What is their motivation?</p>
<p>Lately the CATO folk(s) are writing about differing tax rates for
corporations and wealthy individuals, as though there was some sort of
competition between counties. Maybe there is - but I tend to suspect
this equation has more than one variable. From the latest missive:</p>
<blockquote>
<p><a href="http://www.cato-at-liberty.org/2007/02/22/tax-cuts-north-of-the-border/">Cato-at-liberty » Tax Cuts North of the
Border</a>
The rest of the world is responding to tax competition, and the high
corporate tax rate in the US is becoming an ever-larger problem for
American companies in the global marketplace. Unfortunately, there is
no groundswell — or even idle gossip — for a reduction in America’s
punitive corporate tax.</p>
<p></p>
</blockquote>
<p>Is "the rest of the world" <em>really</em> "responding to tax competition"?
What exactly is a "groundswell" for reducing corporate taxes? Sounds
like wishful thinking. Maybe if they repeat the idea enough times,
perhaps they can convince ... someone. A variant on "if I say it three
times, it must be true"?</p>
<p>Somehow I rather doubt there are many folks concerned about cross-border
differences in corporate tax rates. Kind'a completely misses my notion
of what might be called a "groundswell".</p>
<p>Is this in fact some sort of paid campaign? Could it be that some person
or entity is angling for a tax break, in this rather indirect fashion?</p>
Frustrated with WYSIWYG document editors2007-02-21T00:00:00Zhttps://bannister.us/weblog/2007/frustrated-with-wysiwyg-document-editors
<p>Much recent time has gone to writing design documents (fun). As usual,
this is sucking up more time than I would like, in part because I find
the available tools so poorly suited.</p>
<p>Lets set some requirements. (Oh goody, more requirements to write
down...)</p>
<ul>
<li>Documents should be readable by anyone on the distribution list -
i.e. no specialized reader software. Anyone has a web browser, Adobe
Reader, and a MS Word (or in my case - OpenOffice) installed.</li>
<li>Document templates should be in form a usable by all development
folk within the company. That pretty much rules out TeX or the like,
and any software with a stiff per-seat price.</li>
<li>It would be nice if the documents could be displayed from the web.</li>
</ul>
<p>Used <a href="http://docs.google.com/">Google's on-line document editor</a> to
write a "rationale" document - essentially somewhat free-form story
describing what have done, what we are doing, and what we are going to
do. For this purpose <strong>docs.google.com</strong> is pretty nice. Export to MS
Word *.doc format is decent. Export to HTML is ... the visual result is
pretty good, but the generated HTML is a little messy. Good enough for
this task.</p>
<p>For the documents with a bit more structure, there isn't anything very
satisfactory. Given the somewhat well defined structure, seems we would
be best off with some sort of structured document format. XML seems like
a logical choice, in that we could capture the logical structure of the
document. Editing and presentation are problems. Presentation less so,
as a transform to HTML is probably no more than tedious. Editing is not
so easy. How do you edit an XML document from a template without
distracting the writer? Mundane tasks - like embedding an image - are
trouble (you don't really want the image in a separate file).</p>
<p>We have MS Word documents as templates for the structured documents. I
find it incredibly annoying, every time I have to work with one of the
templates, as these are not good examples even of MS Word documents. I
could generate cleaned-up documents to replace the existing templates,
but ... I do not want to expend the energy needed to got updated
templates adopted by the company when I really want something better.</p>
<p>I suspect that OpenOffice could be adopted as a base for a structured
document editor. The model of bundled XML and associated files in a ZIP
seems an inherently extensible base. If I had a few months of free time
(which I do not), perhaps OpenOffice could adapted to the purpose.</p>
<p>Oddly enough, I find myself missing Interleaf. Many years ago FileNet
had a (somewhat unreliable) port of Interleaf on their machines (we are
talking about mid/late 1980's). Ignoring it's many failings, Interleaf
had one strength - in that you were more aware of and had more control
over the styles used in the document. As I remember (and this was long
ago), the named style for each composite document element was shown in a
gutter on the left(?) side of the screen. Changes to document format
could be affected by editing the stylesheet associated with the named
style.</p>
<p>MS Word has something similar in that there is an option (unknown to
most MS Word users) to display associated styles in a gutter. MS Word is
somewhat clumsy in this sort of use, as accidental or ad hoc local
modifications to a common style are hard to detect. Changing the format
of a common element is often only partly successful, in that you have to
visually scan the entire document for elements that did not format as
intended, then do a bunch of tedious poking around through dialogs
trying to find the problem. The pursuit of easy WYSIWYG has made MS Word
difficult to use if you want to maintain a consistent document format
and structure.</p>
<p>Unfortunately OpenOffice - the GUI in particular - is slightly worse in
this regard. The "Styles and Formatting" panel is far inferior to
displayed named styles outside the page margin. Worse, for some
reason(?) the named style shown in the panel is only sometimes the style
of the current document element (no idea why this is). Also, as with MS
Word, there is no easy way to detect a locally modified style.</p>
<p>What I'd really like to do is take a year off, and write a web-based
structured document editor, but ... oh well.</p>
Introducing RDFa - or re-implementing Lisp, kinda2007-02-17T00:00:00Zhttps://bannister.us/weblog/2007/introducing-rdfa-or-re-implementing-lisp-kinda
<p>Another almost-reinventing-Lisp in <a href="http://www.xml.com/pub/a/2007/02/14/introducing-rdfa.html">XML.com: Introducing
RDFa</a>, just
messier.</p>
<p>You could represent HTML as a simple Lisp expressions - for example:</p>
<p><a href="http://some/where" onclick="foo()">some content</a></p>
<p>maps simply to the equivalent:</p>
<p>(a ((href "http://some/where") (onclick (foo))) "some content")</p>
<p>You can then view the web browser as a sort of specialized interpreter
with built-in default behaviors for 'a' and 'href' nodes. CSS lets you
redefine some of those default behaviors, kinda (the semantics are less
than complete). You can attach addition behaviors using Javascript,
kinda (again, the semantics are incomplete).</p>
<p>If you were well acquainted with Lisp, the programming model increasing
exposed by new uses of HTML, CSS, and Javascript (as offered in RDFa) -
is rather old and familiar. As a markup format for documents, arguably
HTML is better suited than Lisp notation. As an underlying data model,
combined usage seems to be stumbling steadily closer to Lisp.</p>
<p>Don't know what to do about this, but it is amusing, kinda.</p>
Benchmarking and FastCGI2007-02-17T00:00:00Zhttps://bannister.us/weblog/2007/benchmarking-and-fastcgi
<p>An interesting, but not especially useful benchmark.</p>
<blockquote>
<p><a href="http://superjared.com/entry/quick-django-benching/">Quick Django Benching ::
SuperJared.com</a>
Today I did an unscientific benchmark to see which was quickest
between Apache's mod_python, Lighttpd's FastCGI and Nginx's FastCGI.
The Django application was a basic "Hello world" application that used
one variable in one template.</p>
<p>All of the web server configurations were stripped to their minimums.
I'm not going to pretend that this was a thorough benchmark, so these
results might be a bit off, but they're useful nonetheless.</p>
</blockquote>
<p>Not sure that this benchmark tells us anything interesting. There are a
couple dimensions we would want to explore, to get a better notion of
performance characteristics. Performance, ease of development, and ease
in scaling are relevant dimensions we want to explore. Note the
following applies to FastCGI, SCGI, and reverse proxies.</p>
<p>(Apologies to the folk that have been down this path before. You will
find nothing new in what follows.)</p>
<h3>What do we care about?</h3>
<p>First, performance has to be an issue. For small deployments where a
single ordinary server is sufficient, other concerns (ease of
deployment, portability, whatever) are going to dominate. As demand
increases, you get interested in how much performance you can get out of
a single machine. The above-referenced benchmark tells you something
about the single machine scenario (not much - but something). As demand
<strong>really</strong> increases you are interested in the performance and scaling
across a growing group of machines.</p>
<p>Say you start with a single-server configuration. Let's talk about
something like the classic web application scale-out.</p>
<p>As demand increases, you might want to think about partitioning your
application. Static contents (HTML, CSS, images) are better served by
the front-end HTTP service. The single-thread/async-IO HTTP services
(<a href="http://www.lighttpd.net/benchmark">lighttpd</a>,
<a href="http://www.acme.com/software/thttpd/benchmarks.html">thttpd</a>) tend to
beat to out Apache and other general-purpose HTTP services, while
putting less load on the server(s). If you application is heavy on
static content (say, a photo-sharing site), then Apache is at a heavy
disadvantage.</p>
<p>So you partition your application into static and dynamic content.
Static content is optimally served by lighttpd (or the like). Dynamic
content is served over FastCGI by your application code (Ruby, Python,
PHP, Java, or whatever). Performance serving static content is now
optimal.</p>
<p>As demand increases further, you find a single server box is no longer
adequate. At this point you buy another box, and move your application
code to the new box. Note that users do not see any change - they are
still hitting the same front-end HTTP server. FastCGI connects the old
front-end HTTP server to the new back-end application server. Note that
your front-end and back-end boxes can be configured differently, as
needed by the different sorts of load (static file serving versus
dynamic content generation). Note that your front-end box should be able
to easily saturate a 100MB network link on static content (so you have a
<strong>lot</strong> of headroom).</p>
<p>Lets say your application is heavy on serving static files, more than
dynamic content. As load increases you need to buy one (or more)
additional front-end servers. No problem - the second server can connect
over FastCGI to existing back-end server. Your front-end servers will be
configured specifically for your static content - light on CPU, fast
network throughput, fast access to your static content (disk and/or
cache). Also now you are safe against failure of any one front-end
server.</p>
<p>As load increases you need to add more back-end servers. No problem -
the ratio of front-end to back-end servers can be adjusted to exactly
match the needs of your application. Note that every front-end server
can connect to every back-end server, so adjusting for load and handling
fail-over is straight-forward.</p>
<p>Note also that the stripped-down/locked-up configuration of front-end
boxes suitable for exposure to the Internet is pretty straightforward.
The back-end boxes (which may need a more permissive and complex
configuration) do not need to be addressable from the Internet. Security
is somewhat simpler.</p>
<p>There is another scenario where FastCGI (or similar) is interesting.
Lets say your company has a single common internal-use web server. Odds
are, it is a Windows/IIS box (company policy, legacy, clueless network
administrators, or whatever reason). By hooking up via FastCGI you can
host your web applications on a box with whatever configuration is
suitable (Linux perhaps rather than Windows). Odds are the old/common
IIS box is going to go a long ways just serving static content and
forwarding FastCGI requests, before running out of gas. The folks
putting up the web application could be in an entirely different
compartment within the company, with domain-specific knowledge lacked by
the folks managing the IIS server. Once the FastCGI link is setup out
from the IIS server, no further demands need be placed on the IIS folks.</p>
<h3>What should we measure?</h3>
<p>First, we need to measure the relative performance of just serving
static files using lighttpd (or the like) over Apache. Nothing specific
about FastCGI use in this part of the benchmark. There is a range to
this benchmark - small, mid, and large-size files - all served from
cache (benchmarking disk throughput is a different item).</p>
<p>Next, we need to measure the throughput and latency servicing FastCGI
requests. The back-end process needs to be on a different machine, does
no processing (so we are not measuring back-end performance). Vary the
number of concurrent FastCGI connections (and matching number of
back-end threads/processes). Vary the back-end delay before responding
(to simulate light to heavy processing). Vary the amount of data in the
response from the back-end. We could vary the size of requests - but
these are usually small enough we can ignore size. Note that we are not
measuring back-end performance. This set of numbers is relatively
reliable as the processing performed by the HTTP is fixed (no variable
application specific code to complicate the measure).</p>
<p>Measuring back-end performance is a different issue, and only going to
be relevant for your specific application.</p>
<p>My guess is that we find:</p>
<ul>
<li>Much higher throughput serving static files - especially at high
loads (no surprise there).</li>
<li>Much higher numbers of concurrent connections to the front-end
server with good performance (on modest hardware).</li>
<li>As the responses get large, there will be a cross-over point where
there is no advantage to FastCGI. The rate at which responses can be
generated will be limited to what Apache in-process code can
generate using a modest number of threads. (Most applications should
not be generating large responses, so this is atypical).</li>
</ul>
<p>Separation of concerns is almost always a good idea in programming.
There is every chance the same notion applied to web application
architecture works out as well. Performance is more predictable when the
workload is uniform. Uniform workloads make choosing an optimal
hardware/software configuration easier. In at least some scenarios,
administration is easier.</p>
microformats revisited2007-02-15T00:00:00Zhttps://bannister.us/weblog/2007/microformats-revisited
<p>Microformats as generally described - a small chunk of data embedded in
an HTML in one of a small number of recognizable formats - makes a lot
of sense to me. Yesterday I actually visited the <a href="http://microformats.org/">microformats
website</a>, read the details of the current
proposal ... and found myself uncomfortable with the proposed
implementation. Using the same mechanisms for two quite distinct
purposes is usually a bad idea. Using CSS class names for both
presentation and as markers for data? Sounds like trouble.</p>
<p>Use of a single class name (i.e. "microformat_") would be alright if
used to wrap entire chunks of data. Not much chance of collisions
between use as a marker for metadata and presentation (CSS:
".microformat_ { display: none }"). Use of potentially dozens of class
names, applied to the data used also for presentation? Seems like a
recipe for bad programming style. The needs for use as data in a
microformat and for use in presentation often differ. Better to isolate
differing concerns.</p>
<p>So yesterday I went from generally interested in the use of
microformats, to somewhat dismayed at the proposed implementation. Today
an article shows up from Jon Udell expressing a similar dissonance.</p>
<blockquote>
<p><a href="http://blog.jonudell.net/2007/02/15/xmp-and-microformats-revisited/">XMP and microformats revisited « Jon
Udell</a>
Yesterday I exercised poetic license when I suggested that Adobe’s
Extensible metadata platform (XMP) was not only the spiritual cousin
of microformats like hCalendar but also, perhaps, more likely to see
widespread use in the near term. My poetic license was revoked,
though, in a couple of comments:</p>
<p><em>Mike Linksvayer: How someone as massively clued-in as Jon Udell could
be so misled as to describe XMP as a microformat is beyond me.</em></p>
<p><em>Danny Ayers: Like Mike I don’t really understand Jon’s references to
microformats - I first assumed he meant XMP could be replaced with a
uF.</em></p>
<p>Actually, I’m serious about this. If I step back and ask myself what
are the essential qualities of a microformat, it’s a short list:</p>
<p>1. A small chunk of machine-readable metadata,
2. embedded in a document.</p>
</blockquote>
<p>I do not know if XMP is "the answer" (I am tempted more by small chunks
of <a href="http://json.org/">JSON</a>), but I am reasonably certain the proposal
at microformats.org is trouble.</p>
Bitfrost for OLPC - The revenge of Microsoft Bob2007-02-15T00:00:00Zhttps://bannister.us/weblog/2007/bitfrost-for-olpc-the-revenge-of-microsoft-bob
<p>Reading through the <a href="http://wiki.laptop.org/go/Bitfrost">Bitfrost</a>
security specification for the OLPC project - very sensible stuff. I am
impressed.</p>
<p>Years ago Microsoft had a project to come up with a more usable version
of Windows. The result - Microsoft "Bob" - was a disaster. The OLPC
project is after something similar in intent, and looks as though the
result is going to be usable, and possibly even brilliant.</p>
<p>Unix is an operating system written by programmers for programmers.
Windows is an operating system written by programmers for early
adopters. Early adopters were generally programmers and other folk with
a similar mindset. I think Unix is pretty cool, and am perfectly
comfortable using Windows (though less inspired by each successive
version) - but I earn money writing software.</p>
<p>If you sit behind an ordinary non-techie trying to use either system, it
soon becomes clear that both Windows and Unix are horribly unsuitable
for most folk. If you were trying to come up with a usable, secure,
reliable design for use by the bulk of the population - what we have at
present is insanely bad.</p>
<p>By aiming mainly at children, the OLPC project looks to be solving the
harder problem. The foundation built by the OLPC project may prove the
base from which secure, usable, and reliable general purpose computers
can (finally!) be built for the bulk of the population. Of course, they
have the advantage of starting from a clean slate, and have the
cumulative experience from observing Windows on millions of desktops,
and common use of the Internet. Also the OLPC project can take for
granted hardware and software that did not exist when Windows was
conceived.</p>
<p>Looks as though - by design - computers based on the OLPC design will
need little or no anti-virus software. Anti-virus software on Windows
machines is extremely intrusive, and often takes a large whack out of
system performance. If you offer the consumer a choice between Windows
(almost guaranteed to become unusable in a few years) and a machine that
is secure, reliable - and a bit faster ... the trade-off is going to eat
large chunks out of the Windows market. Backwards compatibility with
Windows applications will only count for a steadily diminishing market.</p>
A bit of insight into local politics2007-02-10T00:00:00Zhttps://bannister.us/weblog/2007/orange-juice
<blockquote>
<p><a href="http://o-juice.blogspot.com/2007/02/adis-republicanos.html">¡Adiós
Republicanos!</a>
The thought of going to the O.C. GOP Central Committee and having to
hang out with the likes of Curt Pringle, Cunningham, John Lewis, Mike
Schroeder, Whitacre, Rosie Avila, Tan Nguyen, Trung Nguyen, Dave
Gilliard, Jon Fleischman, et al frankly makes me sick. Tell you what
guys, you can have your party. I have had enough of the lot of you.</p>
<p>I am declaring myself a Free Man. The fastest growing bloc of voters
does not hue to any party. I am talking of course about DTS (Decline
to State) voters. That is what I am going to do. Scott, if you are
reading this, please consider it my resignation from the O.C. GOP
Central Committee.</p>
</blockquote>
Other reasons cost overrun2007-02-08T00:00:00Zhttps://bannister.us/weblog/2007/other-reasons-cost-overrun
<blockquote>
<p><a href="http://www.cato-at-liberty.org/2007/02/08/unsurprising-news-from-the-pentagon/">Unsurprising News from the
Pentagon</a>
The Washington Post reports yesterday on cost overruns for weapons
procurement. “It is not unusual for weapons programs to go 20 to 50
percent over budget, the Government Accountability Office found.”
[...]
The same pattern occurs in federal highway projects, energy projects,
and many other government endeavors.</p>
<p>Part of the reason this occurs is that contractors and government
officials have a quiet understanding that the initial cost numbers
that are used to get projects launched should be low-balled. Both
sides know that later on, after projects are underway, excuses can be
found to raise the price tag. “The scope of work has expanded.” “We
couldn’t have foreseen those additional problems.” “The mission
requirements have changed.” “There are new regulatory requirements.”</p>
</blockquote>
<p>There are other sides to this story.</p>
<p>Often contractors underestimate costs in part because there is no other
choice. When you competitor comes in with an unrealistically low quote,
you can either go out of business, or match your competitor. I heard
this same story both a few decades and a few years back. In a sense, the
honest contractor is screwed. You have to underestimate costs to stay in
business.</p>
<p>The other problem is changing requirements. Talk to any good engineer.
If you change the requirements during a project, you are almost
guaranteed to raise costs. The officer in charge of the contract is
hoping for a promotion. To get that promotion, they want their project
to be really special, and often ask for more than was in the original
contract. When your customer is big, and the officer in charge wants a
change, the contractor says "Yes Sir!" and carries on as best they can.</p>
Buildix alternate download2007-02-01T00:00:00Zhttps://bannister.us/weblog/2007/buildix-alternate-download
<p>Playing with <a href="http://buildix.thoughtworks.com/">Buildix</a> from
ThoughtWorks. For some reason both direct downloads and the Bittorrent
download is <em>extremely slow</em>. Are these folks on dial-up? If your
company is on a limited-bandwidth connection, better to place downloads
on a webhost where bandwidth is cheap and plentiful. A simple/cheap
web-hosting account is bound to offer radically better than the ~12KB/s
(from Bittorrent) that I saw. As a software consulting outfit, these
folks should know better. Bit disturbing that ... :)</p>
<p>In any case, uploaded the Buildix VMware image to my webhost, from which
downloads should be much faster:</p>
<p><a href="http://bannister.us/downloads/buildix-vmware-1.1.zip">buildix-vmware-1.1.zip</a></p>
Wikipedia gets it wrong (badly)2007-01-25T00:00:00Zhttps://bannister.us/weblog/2007/wikipedia-gets-it-wrong-badly
<p>With Wikipedia the hope is that folk with bits of knowledge will
contribute to common pool. With enough eyeballs any bad additions should
get cleaned up or filtered out. The end goal is to have the highest
quality material on each subject.</p>
<p>Only the end result matters.</p>
<p>Folk at Microsoft felt that the Wikipedia article on
<a href="http://en.wikipedia.org/wiki/OOXML">OOXML</a> was less than accurate. They
could have edited article directly. They could have hired some anonymous
shill to edit the article in their favor. Instead they asked a <a href="http://www.oreillynet.com/pub/au/1712">very
knowledgeable outsider</a>, who in
turn was completely honest:</p>
<blockquote>
<p><a href="http://www.oreillynet.com/xml/blog/2007/01/an_interesting_offer.html">An interesting offer: get paid to contribute to
Wikipedia</a>
"So I was a little surprised to receive email a couple of days ago
from Microsoft saying they wanted to contract someone independent but
friendly (me) for a couple of days to provide more balance on
Wikipedia concerning ODF/OOXML. I am hardly the poster boy of
Microsoft partisanship! Apparently they are frustrated at the amount
of spin from some ODF stakeholders on Wikipedia and blogs."</p>
</blockquote>
<p>In terms of the end result, this is the best possible outcome for the
community. Rick is one of the best folks for the job, and anything Rick
writes will be subject to community review. I do not see a problem here.</p>
<p>The alternative is much less honest. Parties with an economic interest
could employ anonymous shills to tilt articles in their favor. By
excluding reviewed contributions by an outside expert, Wikipedia is
rewarding less ethical behavior. This is not a good outcome for the
community.</p>
Net Neutrality - put simply2007-01-22T00:00:00Zhttps://bannister.us/weblog/2007/net-neutrality-put-simply
<p>After reading some excessively convoluted arguments both for and against
"net neutrality", I realized there is a simple analogy, with - oddly
enough - <a href="http://blog.wired.com/27bstroke6/2006/06/your_own_person.html?entry_id=1512499">Ted
Stevens</a>
for inspiration.</p>
<p>The internet carries bits between consumers (you and me) and services
(Google, Yahoo, MySpace, etc.). When traveling across the internet, bits
are bits. To the big internet carriers (like AT&T) the bits all look the
same - that is unless the carriers spend extra money and add extra
equipment (and slow down traffic) to examine the bits as they go flying
past.</p>
<p>Bits on the internet are paid for on both ends - the services pay the
carriers to put bits on the Internet, and consumers pay to get bits off
the internet. Since services ultimately derive all their income from
consumers (directly or indirectly), we could simplify this to say that
consumers pay for the bits they get off the internet. Part we pay
directly in fees to our internet provider, and part we indirectly
through service subscriptions, and in the cost of goods we buy (those
advertised through services).</p>
<p>Think of the big internet carriers like bunch of water companies. In our
analogy imagine that the water comes from some inexhaustible supply, and
the water companies just own the pipes. One day the water company guys
get a little grumpy, because a lot more water is running through their
pipes, but they are not making more money. They notice that consumers
are taking a lot of baths, and the soap companies are making a lot of
money. To boost their revenue they decide to end "water neutrality". The
water company guys want to install equipment to monitor <em>how</em> you are
using your water, and what brand of soap you use. Their plan is to
blackmail the soap companies. If your soap company does not pay up, then
when you go to take a bath, all you get is a trickle. If the soap
company does pay up, you end up paying more for your soap.</p>
<p>In our imaginary scenario, the water company guys are betting that you
won't blame them for higher soap prices. In the real world, the carriers
are hoping consumers won't notice when they get fewer or slower
services.</p>
<p>The odd part of all this is that in fact there are plenty of pipes. In
the 1990's, the big carriers went a bit nuts and laid a lot of fiber -
so there is <em>far more</em> capacity than is used. The carriers spent a lot
of money, but because there is excess capacity, the prices for bandwidth
are dropping radically.</p>
<p>For consumers this is a great deal, as with falling prices on bandwidth,
the services offered on the internet just keep getting faster and
better. The carriers are a bit less excited.</p>
<p>The other joker is that most of the big carriers are also telephone
companies. The telephone companies get a lot of income off a service
(phone calls) that costs a lot less than they charge. There are a bunch
of smaller companies that sell telephone service across the Internet, at
much lower prices. If you were a telephone company guy, you would
<strong>really</strong> want to block off the cheaper service ... before it kills
your cash cow.</p>
<p>When asked about this, the answer from the carrier guys boils down to:
"Who me? I would <em>never</em> do anything like that!" ... while at the same
time seeking new laws so that they can.</p>
<p>"Net Neutrality" is simply telling the carriers to stick to the business
of moving bits, and to stay out of the blackmail business. To the
consumer "net neutrality" means more and better services on the Internet
for the same price.</p>
<p>... and that's pretty much it.</p>
How to boost the birth rate2007-01-22T00:00:00Zhttps://bannister.us/weblog/2007/how-to-boost-the-birth-rate
<blockquote>
<p><a href="http://news.softpedia.com/news/Matchmaking-Ads-to-Boost-Birth-Rate-in-Japan-22699.shtml">Matchmaking Ads to Boost Birth Rate in
Japan</a>
Alarmed by a falling birth rate and rapidly ageing population,
Japanese policymakers are thinking about allowing TV ads for
matchmaking agencies in the hope that an increase in couples will
result in more kids. Japan's population shrank in the year to October
for the first time since 1945, heightening worries about economic
decline due to a smaller workforce supporting a growing number of
pensioners.</p>
</blockquote>
<blockquote>
<p>"One cause of the falling birth rate is later marriages or no marriage
at all, so we see promoting marriage as one good way of dealing with
this problem."</p>
</blockquote>
<blockquote>
<p>According to a poll released last week by the Cabinet Office, only 48
percent of respondents said Japan was an easy place to raise children,
compared to Sweden at 98 percent and the United States with 78
percent. No specific reasons were given but the cost of child raising,
a lack of child care facilities, and attitudes that make it hard for
women to return to work after taking time off to raise children, are
frequently cited to explain the falling birth rate.</p>
</blockquote>
<blockquote>
<p><a href="http://www.post-gazette.com/pg/06229/714280-82.stm">Cash incentives aren't enough to lift
fertility</a>
The German Bundestag currently is considering reforms designed to
make it economically easier for women to bear children. Under the
proposed measures, backed by Chancellor Angela Merkel, the government
would pay women 67 percent of their salaries, with a ceiling of 18,000
euros, or about $23,000, for a 12-month parental leave. Men are
eligible for a two-month stipend, for a total of 14 months per couple.</p>
</blockquote>
<p>Boosting birth rates is easy if you solve the underlying problem. The
underlying problem is young people who feel they cannot afford to have
children. One-time payments are not going to solve the problem. Reducing
costs and offering some measure of security will make all the
difference.</p>
<p>Where can a couple in their mid-20's afford to:</p>
<ol>
<li>Buy a house in a safe neighborhood near decent schools.</li>
<li>Afford health care and all other family-related expenses, with only
one parent working.</li>
<li>Be reasonably confident of a steady income.</li>
<li>Raise two or more children without fear of the additional expense of
each child.</li>
</ol>
<p>Somewhere in the last few decades, the need for both parents to work -
just to get by - became the norm. This makes it harder to raise a
family. If both parents want to work, to get ahead financially (or
simply to get older children through college), this should be a
<em>choice</em>, not a necessity. I would bet that if you measured birth rates
within the United States, you would find lower rates where costs were
higher.</p>
<p>Young people do not have any control over these factors.</p>
First impressions - Visual Studio 20052007-01-22T00:00:00Zhttps://bannister.us/weblog/2007/first-impressions-visual-studio-2005
<p>Up to the present, I have been using Visual C++ 6.0 for a collection C++
source code that dates back to 1998. There is really no pressing need to
update to a new version of Visual Studio, though I do have a company
license for the current version. Still, there might come a time where
compatibility with other projects, or newer versions of Windows, might
become an issue - so there is some (weak) motivation to update.</p>
<p>A couple years ago I had a bit of spare time, and tried loading the C++
workspace into Visual Studio 2003. Got hundreds of warning messages -
all of which I had time to look at, turned out to be meaningless (as in
fixing would offer no benefit). Generally speaking I tend to be a bit
pedantic, and always use the compiler's highest practical warning
levels - "Level 3" with "Warnings as errors" in VC6, and "-Wall" when
compiled with g++ (the code is portable). The code is littered with
ASSERT() calls, pounded by unit tests before each release, and has lots
of mileage in customer use. So on seeing so many compiler warnings ... I
was a bit skeptical.</p>
<p>By a bit pedantic - years ago working on Unix, I would regularly run my
code through the Greenhills C compiler at the highest warning level (the
production compiler), the GNU C compiler with "-Wall", and <strong>lint</strong> ...
and not find <em>anything</em> amiss. I have some reason to suspect the
compiler warnings coming from VS might be bogus.</p>
<p>I gave up on VS2003, as I did not have time to wade through all the
false positives, and could not justify requiring the remainder of our
workgroup to do the same.</p>
<p>To take another run at things, created a virgin Windows 2000 VM (using
VMware), loaded VS2005, and installed all updates. At first, <strong>nothing</strong>
would compile - lots of D9028 and C1902 errors. Turns out I had sized
the VM to meet the recommended minimum requirements for VS2005, and that
will <strong>not</strong> work. After upping the VM to 512MB, the D9028 and C1902
errors went away. Looks like Microsoft needs to update their minimum
requirements. :)</p>
<p>Next up is a deprecation warning for using <strong>fopen()</strong> - seems that
Microsoft thinks the function is unsafe, since it returns a null. Turns
out Microsoft has chosen to "deprecate" a whole bunch of standard
portable functions, for which they recommend non-portable
Microsoft-specific replacements. <em>Right.</em></p>
<p>In this case they suggest you use the non-standard <strong>fopen_s()</strong>.
<em>Right.</em></p>
<p>FILE* f = fopen();
if (!f) {
// handle failed open
}</p>
<p>This is unsafe, how? If the programmer is not checking return values,
you are screwed with either <strong>fopen()</strong> or <strong>fopen_s()</strong>. In fact, the
notion that you can turn C/C++ into a "safe" language is dubious. I have
seen a lot of quite horrible C/C++ code, and small tweaks just are not
going to solve the problem.</p>
<p>Waded through and eliminated the compile errors - mostly by disabling
warning 4996 and altering scope of for-loop variables. Still failing the
regression tests. Something to look at later.</p>
<p>Clearly Visual Studio 2005 is an improvement over Visual C++ 6. If I had
not spent considerable time with Eclipse, I might be impressed. At least
so far, there is nothing compelling. I am tempted to stick with VC6. :)</p>
Not the intended effect?2007-01-21T00:00:00Zhttps://bannister.us/weblog/2007/not-the-intended-effect
<blockquote>
<p><a href="http://www.cato-at-liberty.org/2007/01/21/worse-than-hillary/">Cato-at-liberty » Worse Than
Hillary?</a>
For more than 15 years now, Hillary has been the incarnation of Big
Government. She votes with taxpayers only 9 percent of the time,
according to the National Taxpayers Union. She calls herself a
“government junkie.” She says, “There is no such thing as other
people’s children” and calls for ”a consensus of values and a common
vision” for 300 million people. She was best known in her White House
years for heading a team of 500 bureaucrats organized into 15
committees and 34 working groups to recreate in 100 days one-seventh
of the American economy. After health care, she told the New York
Times, her next project would be “redefining who we are as human
beings in the post-modern age.” Or, as the Times put it, “She wants to
make things right.”</p>
</blockquote>
<p>Wow. While less than enthusiastic about the "Big Government" part, I did
not know that Hillary Clinton was so effective. From the above, it seems
she can really get things done.</p>
<p>On the flip side, what are our choices as voters? In this decade, the
Republicans in power have acted as wild fans of "Big Government" and
poorly run expensive foreign adventures. Given the record increases in
government spending (and debit) under Republican leadership, clearly the
Republicans are not the party of "small government". So ... our choice
is "Big Government" Republicans or "Big Government" Democrats?</p>
<p>Can we have another choice, please?</p>
Near an inflection point - solid state disk2007-01-16T00:00:00Zhttps://bannister.us/weblog/2007/near-an-inflection-point-solid-state-disk
<p>Solid state disk is one of those technologies that never seemed to quite
arrive. Smaller in storage and (much) more expensive than hard disks,
solid state storage has never proved practical outside niche
applications. This may be about to change. After spotting an 8GB flash
card under $100, we may be near the point where solid state memory can
displace hard drives for a substantial number of mainstream
applications.</p>
<blockquote>
<p><a href="http://blog.labnotes.org/2007/01/12/solid-state-disk-change-the-game/">Labnotes » Solid State Disk Changes The
Game</a>
When SSD go mainstream, they’ll change the way we use computers. You
trade local storage – 32GB is not a lot of space for a modern
operating system, music collection and the occasional ripped DVD – for
the ability to live in the cloud: to always have access to more
information that any one computer can store.</p>
</blockquote>
<p>No information on pricing (likely $300-400, still a bit high). 32GB is
a little small for anyone storing video, photos, or large MP3
collections - but more than adequate for lots of folks. In fact, the
30GB disk on my laptop - while too small to store my MP3 collection -
has otherwise never been anywhere near full.</p>
<p>There is a bit of a snowball effect coming up. Given multi-gigabyte USB
flash drives and fast wireless networks, there is less need for CD/DVD
readers. Solid state memory can displace hard drives for many folk. In
the thin & light notebook category, there are bound to be offerings that
drop out the DVD and hard drives - with the end result of longer battery
life in a <em>much</em> thinner, lighter and quieter package. Taken together,
this is going to be compelling for quite a few folk.</p>
Reading your mail2007-01-13T00:00:00Zhttps://bannister.us/weblog/2007/reading-your-mail
<blockquote>
<p><a href="http://www.nydailynews.com/front/story/485561p-408789c.html">W pushes envelope on U.S.
spying</a>
President Bush has quietly claimed sweeping new powers to open
Americans' mail without a judge's warrant, ... The President asserted
his new authority when he signed a postal reform bill into law on Dec.
20. Bush then issued a "signing statement" that declared his right to
open people's mail under emergency conditions. That claim is contrary
to existing law and contradicted the bill he had just signed, say
experts who have reviewed it.</p>
<p>Bush's move came during the winter congressional recess and a year
after his secret domestic electronic eavesdropping program was first
revealed. It caught Capitol Hill by surprise.</p>
</blockquote>
<blockquote>
<p><a href="http://www.cato-at-liberty.org/2007/01/04/attorney-general-gonzales-and-mail-openings/">Attorney General Gonzales and Mail
Openings</a>
There is an “emergency” exception to the warrant requirement. For
example, if some bank robbers decide to take hostages and start making
demands, a SWAT team can move in without a warrant. When the emergency
exception is ordinarily relied upon, the search is done out in the
open - so the government’s actions are transparent. The homeowner or
business owner knows fairly quickly that agents conducted a search and
can bring any abuse to the attention of the news media, the courts, or
the legislature. <strong>Those “checks” on police power are not in place
with respect to mail openings.</strong> We just don’t know what may be going
on at the post office before we get our mail.</p>
</blockquote>
Asymmetric warfare and how to boil a frog2007-01-13T00:00:00Zhttps://bannister.us/weblog/2007/asymmetric-warfare-and-how-to-boil-a-frog
<p>My son just called up. His cell phone died. The phone is only a few
months old.</p>
<p>Seems like more and more gadgets are dying prematurely these days. Of
course, this could just be a side effect of the fact that we own more
electronic gadgets. This could also be an effect of price competition,
and the market seeking the lowest level of quality that consumers will
accept.</p>
<p>There is another possible explanation. Assume you were in the role of a
rising economic and military power - like China. If you were hoping to
one day achieve military dominance, somehow you need to undercut the
superiority of the US military. A direct attack is likely to be very
expensive, so you need to find something less obvious.</p>
<p>The superiority of the US military is largely based on technology
originally developed during the Cold War. Without the threat of imminent
destruction, the rate of US innovation is bound to drop. Certainly you
want to avoid any appearance as a direct threat. At the same time,
military technology is largely dependent on electronics. If you can
undercut prices, then you can kill off manufacturing in the US. You only
need to do this for a few critical components - no need to capture the
entire market (which might arose suspicion).</p>
<p>For example, capacitors are simple relatively low-tech components that
are used in practically every electronic device. Not a lot of innovation
going on with capacitors, so it is quite natural that the manufacturing
would shift to where costs were lowest. If you can insure that your
costs are lowest, you can slowly reduce the lifespan of the component,
so that any electronic device is bound to fail within a few years. You
might be able to manufacture components with a longer lifespan at the
same cost - but you make sure that components offered for export have a
short lifespan.</p>
<p>The consumer market is not going to care overmuch, as consumer devices
tend to have a short lifespan in any case. Slowly increasing failure
rates mean the US military spends an increasing amount of time and money
for maintenance, and has less money for improvements. Higher failure
rates mean lower readiness and a weaker military. If for any reason
replacements became scarce (due to some sort of conflict - economic or
military) then in the space of a few years the US military could become
radically less effective.</p>
<p>Never ascribe to malice - in this case what could be simply explained by
market forces. So I am not a big believer in the above. Still, it is a
possibility.</p>
<p>A simple strategy should suffice to nullify an "attack" like the above,
and return a long-term benefit to the country as a whole. Simply insure
that a sufficient pool of expertise exists so that we can resume
domestic manufacturing when needed. In the short term this means a
steady supply of high reliability components (with the side benefit of
lower maintainence costs and higher readiness for our military). In the
long term the disparity between domestic and foreign manufacturing costs
will diminish, and the country gains an economic benefit. Modest
long-term investments in improved manufacturing techniques both insure
that our domestic expertise does not die of old age, and is likely to
bring closer the day when domestic manufacturing is again competitive.</p>
2007 and ending needless repetition2007-01-13T00:00:00Zhttps://bannister.us/weblog/2007/2007-and-ending-needless-repetition
<p>The year now is 2007. Time for a bit of a reasoned rant.</p>
<p>Every time I start up Windows, Eclipse, Firefox, or an applet JVM (and
wait) - I am struck by the same absurdity. In each case we are repeating
the same exact computation as the last startup. The result of the
computation is almost always exactly the same. Yet even with a CPU
capable of processing <em>BILLIONS</em> of instructions per second ... I still
have to wait for the computer.</p>
<p>This is absurd. This is insane. Yet the same sort of ridiculous
repetition happens millions (or billions?) of times <em>every day</em>.</p>
<p>Let me put this into context.</p>
<p>Back in the 1970's, folks working with Lisp started seeing painfully
long startup times. "Big" Lisp (at the time) might require an entire
megabyte of memory (then huge), and the time to load all the bits and
pieces into memory was a pain. Someone (I do not know who) realized that
repeating the same computation every time at startup was silly. Instead
a single "image" of the end result could be saved to disk, and later
reloaded in a fraction of the time. The Smalltalk folk came to a similar
conclusion around the same time.</p>
<p>Save a result as a single image, and later reload need take only a
fraction of the time.</p>
<p>A bit later I worked on low-level code driving hardware for an ancient
ancestor of IDE. What struck me then was the speed with which the entire
contents of memory could be reloaded - when seeks were minimized. At a
5:1 interleave (best possible on that hardware) you could read or write
87KB/second. The entire current running application could be thrown out
of memory (and alter read) in under two seconds - far less than the
usual startup time.</p>
<p>Hard disks are wicked fast - then and now - when you don't send the head
skipping around the disk.</p>
<p>Skip forward to the present - nearly 30 years later - and people still
spend time waiting for computers. This is wrong.</p>
<p>Using the SysInternals Process Explorer, I see that Firefox startup
takes about 7 seconds elapsed, performs 4266 reads and 125 writes. Do
not know which of the various memory numbers to use, but my guess is the
25.9MB of "private data" most accurately reflects the equivalent size
needed if read from a single image. The Firefox EXE and DLLs total about
15MB, so I'd peg the "actual data read size" at somewhere between the
two numbers: 15-26MB (a very rough estimate). On the hand, the stored
form of a process is likely more compact than the in-memory form. Using
25MB as the equivalent single-image size should be a conservative
over-estimate. Loading Eclipse nets about 30 seconds elapsed and a 100MB
estimate.</p>
<p>Looks like current generation hard disks take about 13ms to start
reading (average seek + latency), then manage 30-60MB/s when reading. If
loaded as a single image, that puts the startup time for Firefox at
roughly 0.5 to 1 second, and Eclipse at 1.5 to 3 seconds.</p>
<p>Firefox takes 7 seconds to start, and should take 1 second (or less).
Eclipse take 30 seconds to start, and should take 3 seconds (or less).</p>
<p>But wait! There is more ... (er, less)</p>
<p>Unix variants have this thing called <strong>fork()</strong>. Calling <strong>fork</strong>
creates a new process that is an exact copy of the parent. This is
brilliantly simple idea, dating back to the 1970's. In the late 1980's
the hardware got smart enough to support something called "Copy On
Write" (or COW). Before COW forking a 100MB Lisp application meant you
ended up with 2 processes needing 200MB of physical memory (quite a
problem then!). With COW the two processes used the same physical memory
for all pages unchanged since the <strong>fork</strong>. This both saved memory (a
lot!), it also reduced the CPU cost of starting the new process.</p>
<p>Skip forward to the present. On boot, load the Mother Of All VMs (JVM,
CLR, or whatever). With a whole universe of classes pre-loaded the
entire image might come to ... 50MB? Figure an image load time of about
1 second, plus maybe another second to fiddle with the hardware. The
typical Unix boot process invokes a simple script interpreter (/bin/sh
or the like), loads dozens or hundreds of scripts, and invokes hundreds
of small executables. Embed a decent script interpreter in MOAV (say
Javascript) and you can get by with fewer scripts and vastly fewer
invoked executables. If starting an application means a fork, and
slurping in any extra bits needed - then you could expect sub-second
startups as routine.</p>
<p>Quite different from how we do things now - but I would bet there is
more than one way we could get there - a bit at a time,</p>
Remove before flight2007-01-02T00:00:00Zhttps://bannister.us/weblog/2007/remove-before-flight
<p><a href="http://photografik.net/reno/"><img src="https://bannister.us/weblog/images/People-02.jpg" alt="remove" /></a></p>
Mersenne twister - random number generator2007-01-02T00:00:00Zhttps://bannister.us/weblog/2007/mersenne-twister-random-number-generator
<blockquote>
<p><a href="http://en.wikipedia.org/wiki/Mersenne_twister">Mersenne twister - Wikipedia, the free
encyclopedia</a>
The Mersenne twister is a pseudorandom number generator developed in
1997 by Makoto Matsumoto (松本 眞) and Takuji Nishimura (西村 拓士)[1]
that is based on a matrix linear recurrence over a finite binary field
\mathbb{F}_2. It provides for fast generation of very high quality
pseudorandom numbers, having been designed specifically to rectify
many of the flaws found in older algorithms.</p>
</blockquote>
<p>Once again, ran across a reference to the "Mersenne twister" as an
especially good random number generator. The various implementations I
found on the web had rather too many bells and whistles for my taste.
Transliterated the algorithm in the Wikipedia article into C++, then
applied a bit of optimization. The result generates 32-bit unsigned
integers, and is simple, short ... and fast (41.1 million random values
per second on my AMD Athlon 2200+ laptop).</p>
<p>File: <a href="http://bannister.us/examples/rand/ZRandom.h">ZRandom.h</a></p>
<pre><code class="language-C++"> #ifndef __ZRANDOM_H__
#define __ZRANDOM_H__
//
// Mersenne twister - random number generator.
// Generate uniform distribution of 32 bit integers with the MT19937 algorithm.
//
class ZRandom
{
private:
enum { N = 624, M = 397 };
unsigned MT[N+1];
unsigned* map[N];
int nValues;
public:
ZRandom(unsigned iSeed = 20070102);
unsigned getValue();
};
#endif
</code></pre>
<p>File: <a href="http://bannister.us/examples/rand/ZRandom.cpp">ZRandom.cpp</a></p>
<pre><code class="language-C++"> #include "ZRandom.h"
ZRandom::ZRandom(unsigned iSeed) : nValues(0)
{
// Seed the array used in random number generation.
MT[0] = iSeed;
for (int i=1; i<N ; ++i) {
MT[i] = 1 + (69069 * MT[i-1]);
}
// Compute map once to avoid % in inner loop.
for (i=0; i<N; ++i) {
map[i] = MT + ((i + M) % N);
}
}
unsigned ZRandom::getValue()
{
if (0 == nValues) {
MT[N] = MT[0];
for (int i=0; i<N ; ++i) {
register unsigned y = (0x80000000 & MT[i]) | (0x7FFFFFFF & MT[i+1]);
register unsigned v = *(map[i]) ^ (y >> 1);
if (1 & y) v ^= 2567483615;
MT[i] = v;
}
nValues = N;
}
register unsigned y = MT[N - nValues--];
y ^= y >> 11;
y ^= (y << 7) & 2636928640;
y ^= (y << 15) & 4022730752;
y ^= y >> 18;
return y;
}
</code></pre>
<p>... and a simple test program
<a href="http://bannister.us/examples/rand/main.cpp">main.cpp</a></p>
<pre><code class="language-C++"> #include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include "ZRandom.h"
class ZTimer
{
clock_t t1;
clock_t t2;
public:
ZTimer() : t1(::clock()), t2(t1) {}
int elapsed() { return (int)(((t2 - t1) * 1000.0) / CLOCKS_PER_SEC); }
int split() { t2 = ::clock(); return elapsed(); }
};
int main(int ac,char** av)
{
enum { dtSample = 30000 };
{
ZRandom o;
ZTimer t;
int n = 0;
do {
for (int i=0; i<1000000; ++i) {
unsigned v = o.getValue();
}
++n;
} while (t.split() < dtSample);
int dt = t.elapsed();
printf("Computed %d million primes in %d MS - %0.1f m/s \n",n,dt,((n * 1000.0)/dt));
}
return 0;
}
</code></pre>
How not to introduce your project2007-01-02T00:00:00Zhttps://bannister.us/weblog/2007/how-not-to-introduce-your-project
<blockquote>
<p><a href="http://nuxleus.com/dev/">The nuXle.us Project</a>
The nuXleus Project has the specific intent to become a
User-Centric/Specific Application and XML messaging
virtualization-based appliance in which a primary,
user-specific/centric host machine can use as a secured proxy for all
web-based communications. During the early development and testing
phase we will be releasing ISO-9660 images, VMWare Player images, and
.img files which can be run via the QEMU emulator project. Once we
have figured out how to build the creation of a Virtual Server 2005
Virtual Hard Disk (.vhd) file into the build process we will then add
this to the list of images released by this project.</p>
</blockquote>
<p>After reading the above introductory paragraph, I instantly had no idea
what the project was about, though I could run it under VMware.</p>
<p>Could it be that I have sent similarly opaque texts in the past? Hope
not, but...</p>
Do web server logs return useful information, anymore?2006-12-30T00:00:00Zhttps://bannister.us/weblog/2006/do-web-server-log-return-useful-information-anymore
<p>Between the preponderance of web crawler visits, the scarcity of
meaningful <code>Referer:</code> links, and the use of aggregators (like <a href="http://www.google.com/reader/">Google
Reader</a> or
<a href="http://www.bloglines.com/">Bloglines</a>) - do the logs on the web server
tell us very much?</p>
<p>There are of course hints ... but I suspect the absolute numbers are no
longer meaningful.</p>
Department of Homeland (in)Security2006-12-30T00:00:00Zhttps://bannister.us/weblog/2006/department-of-homeland-insecurity
<p>Why you should always question authority - before they waste too much of
your kids money.</p>
<blockquote>
<p><a href="http://blog.wired.com/27bstroke6/2006/12/top_10_27bstrok.html">Top 10 27BStroke6 Posts of the Year -
2006</a>
27BStroke isn't even a year old yet, but we've already fallen prey to
the temptation to issue a top ten list.</p>
</blockquote>
<blockquote>
<p>Back in August 2005, a border-screening system supposedly unconnected
to the internet was brought done by the Zotob worm, though Homeland
Security denied it happened. Kevin Poulsen chronicled his attempt to
get the proof through government sunshine requests here at 27B. The
hilarity included government officials calling to ask Kevin to
withdraw his request, then telling a judge they lost the paperwork
several weeks before they called him.</p>
</blockquote>
<blockquote>
<p>When, last September, a spokeswoman for DHS's Bureau of Customs and
Border Protection (CBP) phoned me to ask that I voluntarily withdraw a
month-old Freedom of Information Act request, I had to wonder why.</p>
<p>The request was for any documents pertaining to an earlier failure of
a sensitive DHS system used to screen incoming visitors to the US.
Called US-VISIT, the system is a network of Windows PCs and mainframe
servers that takes fingerprints and digital photos of travelers as
they enter the country, and checks each visitor against scores of
national security and criminal watchlists.</p>
<p>The August computer failure led to long queues at airports across the
country, but was only tersely explained to the public. The DHS
initially said a computer virus had infected one of the mainframe
servers -- in Virginia. Later, the agency reversed itself and claimed
there was no virus, and the outage was a normal computer crash.</p>
<p>We now know that neither version was entirely true. But I'm getting
ahead of myself.</p>
<p>I declined to withdraw my request, and waited for DHS to produce some
documents. And waited, and waited. Patience is a virtue when FOIAing a
federal agency, and nothing is gained by jumping down bureaucrats'
throats when they invariably miss the (20 day) statutory deadline.</p>
<p>But six months later, agency personnel still hadn't produced a shred
of information, nor had they responded to an administrative appeal.
That's when I took them to court, wondering what they were hiding.</p>
<p>Now we know. According to documents filed (.pdf) in the case last
Thursday, they're hiding precisely 666 pages of documents about the
virus infection that they've publicly denied ever occurred.</p>
</blockquote>
<p>Yes, there are managers in government that will lie to protect their
turf.</p>
<blockquote>
<p>A computer failure that hobbled border-screening systems at airports
across the country last August occurred after Homeland Security
officials deliberately held back a security patch that would have
protected the sensitive computers from a virus then sweeping the
internet, according to documents obtained by Wired News.</p>
<p>The documents raise new questions about the $400 million US-VISIT
program, a 2-year-old system aimed at securing the border from
terrorists by gathering biometric information from visiting foreign
nationals and comparing it against government watch lists.</p>
<p>The Aug. 18 computer failure led to long lines at international
airports in Los Angeles, San Francisco, Miami and elsewhere, while
U.S. Customs and Border Protection, or CBP, officials processed
foreign visitors by hand, or in some cases used backup computers,
according to contemporaneous press reports.</p>
<p>Publicly, officials initially attributed the failure to a virus, but
later reversed themselves and claimed the incident was a routine
system failure.</p>
<p>CBP officials have released six pages of heavily redacted documents
about the Aug. 18 computer failure. Click here (.pdf) for the inside
story in black and white (mostly black).</p>
<p>But two CBP reports obtained under the Freedom of Information Act show
that the virulent Zotob internet worm infiltrated agency computers the
day of the outage, prompting a hurried effort to patch hundreds of
Windows-based US-VISIT workstations installed at nearly 300 airports,
seaports and land border crossings around the country.</p>
</blockquote>
<blockquote>
<p><a href="http://blog.wired.com/27bstroke6/2006/09/judge_orders_dh.html">Judge Orders DHS to Come Clean on Border Cyber
Attack</a>
A federal judge in San Francisco has ordered (.pdf) the Department of
Homeland Security's Bureau of Customs and Border Protection (CBP) to
give me additional documents on a cyber attack that shut down portions
of the national border screening system last year.</p>
<p>The government had argued that releasing more than six
partially-blacked-out pages on the August 2005 incident would make the
sensitive US-VISIT system vulnerable to computer intruders. After
reviewing the 672 pages of documents the government has in its
possession, U.S. District Court Judge Susan Illston is unconvinced.</p>
</blockquote>
<p>I must be in the wrong part of the industry.</p>
<blockquote>
<p>The $400 million US-VISIT program is a network of Windows PCs and
mainframe servers that takes fingerprints and digital photos of
travelers as they enter the country, and checks each visitor against
scores of national security and criminal watchlists.</p>
<p></p>
</blockquote>
<p>Heck, I try to make sure our small software group (costing maybe $1
million a year) returns at least equal value to the company. I cannot
imagine burning $400 million and screwing up so throughly.</p>
WHATWG - What for?2006-12-29T00:00:00Zhttps://bannister.us/weblog/2006/whatwg-what-for
<p>Another acronym I had not looked at previously -
<a href="http://www.whatwg.org/specs/web-apps/current-work/">WHATWG</a>. A
specification for web applications? Sounds unlikely. Between changing
practices and adequate existing function, what value is there in
freezing current thought into a specification? What is the real added
value here?</p>
<p>Reading through the WHATWG draft, I kept wondering if (or hoping?) this
were in fact some sort of elaborate joke. Posted on April 1? Nope.</p>
<p>To put this into context - after finally having reason to get thoroughly
familiar with the HTML DOM (what a mess), I realize that ignoring the
W3C standards process was a mistake. Put differently, if you were even
remotely involved with picking client-side names like "getElementById",
or choosing to leave out "innerHTML" - that I would take as reason to
doubt your judgement. You could say that the reverence with which I hold
the past web standards process is somewhat limited. Thought briefly
about joining the W3C, and trying to make a difference - then ran across
the <a href="http://www.w3.org/Consortium/join">membership requirements</a>. Seems
your thoughts are only of value if sponsored by an organization willing
to pay significant fees - an interesting (if dubious) selector.</p>
<p>Trying to get a handle on what motivates WHATWG, came across this gem:</p>
<blockquote>
<p><a href="http://www.w3.org/2004/04/webapps-cdf-ws/papers/opera.html">Position Paper for the W3C Workshop on Web Applications and Compound
Documents</a>
<strong>Scripting is here to stay</strong></p>
<p>But should be avoided where more convenient declarative markup can be
used.</p>
</blockquote>
<p>Which is pretty much what I expected - and I disagree. Having more than
one way to do the same thing is not necessarily good. Can you define
declarative markup for future dynamic behavior, or are you going to cast
in stone a
<a href="http://www.whatwg.org/specs/web-apps/current-work/#progress0">fraction</a>
of present behavior, which may be less used in the future? More crud in
the browser code....</p>
<p>There is an enormous amount of churn in the surface presentation and
underlying toolkits used to express web applications. This is good and
healthy when current/best thought is changing rapidly. To pick some
subset of this to cast into a specification, would seem to require more
wisdom than I could muster. Given the past record of the folks involved
in web standards ... I do not expect them to do any better. This may all
be very unfair to the folk involved in WHATWG. I cannot tell.</p>
<blockquote>
<p><a href="http://www.w3.org/2004/04/webapps-cdf-ws/minutes-20040602.html%20">W3C Workshop on Web Applications and Compound Documents (Day 2) Jun
2,
2004</a>
"Steve Zilles (Independent): To repeat my challenge, can we find the
key 5-7 things to focus on and not try to solve all the world's
problems?"</p>
</blockquote>
<p>An excellent question from Zilles. My impression of later work is an
attempt "to solve all the world's problems" (probably badly).</p>
<p>So, am I just a PITA, that doesn't "get it"?
<a href="http://lists.w3.org/Archives/Public/public-qa-dev/2006Jul/0011">Perhaps</a>
<a href="http://arstechnica.com/news.ars/post/20061029-8101.html">not.</a> <a href="http://blog.fawny.org/2006/10/28/tbl-html/">HTML
pretty much works.</a> Reading
through the working group notes, felt as though I were spying on Douglas
Adam's hairdressers. (Maybe in context, it would all make sense? Or
not.)</p>
<p>Part of my wariness comes from having worked with folk who like to
"specify" everything - even when it doesn't work. The sort of folk who
prefer complex solutions over simplicity. Form over function. Who prefer
a blizzard of words over clarity. They are always with us, the trick is
to not be caught following.</p>
The Sheriff's Revenge2006-12-27T00:00:00Zhttps://bannister.us/weblog/2006/the-sheriffs-revenge
<blockquote>
<p><a href="http://www.ocregister.com/ocregister/homepage/abox/article_1398852.php">Corona rival retires after facing
demotion</a>
SANTA ANA – Lt. Bill Hunt, suspended after challenging Sheriff Mike
Carona in the June election, retired Friday as he faced a demotion
that would have cut his salary nearly in half.</p>
<p>Today, San Clemente City Manager George Scarborough announced that
Hunt had been demoted to deputy II and transferred to patrol in
Stanton effective Dec. 29. The rank is one step up from entry level.</p>
<p>Hunt is a 21-year veteran who was chief of police services in San
Clemente. He was placed on administrative leave hours after Carona won
re-election in June. Carona has been vocal about his right to
discipline Hunt for critical comments made during the campaign. The
sheriff could not be reached today.</p>
<p>Hunt, also unavailable today, has said Carona was engaging in
political retaliation and was infringing on protected political
speech.</p>
<p>As a lieutenant, Hunt earned up to $123,905 a year. His new salary
range would have topped out at $77,708.80.</p>
<p>Sheriff's Department spokesman Jim Amormino confirmed that Hunt had
retired but said he is barred by law from discussing disciplinary
matters.</p>
</blockquote>
Got to be embarassing...2006-12-27T00:00:00Zhttps://bannister.us/weblog/2006/got-to-be-embarassing
<p>Pulled up an article in Wired on <a href="http://blog.wired.com/sterling/2006/12/the_2006_top_te.html">The 2006 top ten mistakes in web
design</a> and
the article text is in (tiny!) 7pt Times New Roman font. Um.....</p>
<p>If only they had posted on April 1.</p>
Clueless Congressman's staffer solicits a "Hacker"2006-12-27T00:00:00Zhttps://bannister.us/weblog/2006/clueless-congressmans-staffer-solicits-a-hacker
<p>The "technobabble" written by the "hacker" is (intentionally) hilarious
... and the politician's staffer has no clue. :)</p>
<blockquote>
<p><a href="http://www.attrition.org/postal/z/033/0871.html">Going Postal</a></p>
<p>From: Todd Shriber (nascar24_08530@yahoo.com)
To: lyger@attrition.org
Date: Wed, 9 Aug 2006 12:58:29 -0700 (PDT)
Subject: Question for you or other Attrition members</p>
<p>Lyger - I came across Attrition.org for the first
time. I enjoyed the site though I am not an expert
with computers. That brings me to my next point: I
need to urgently make contact with a hacker that would
be interested in doing a one-time job for me. The pay
would be good. I'm not sure what exactly the job would
entail with respect to computer jargon, but I can go
into rough detail upon making contact with a
candidate. Thanks for your help.</p>
</blockquote>
<blockquote>
<p>From: Todd Shriber (nascar24_08530@yahoo.com)
To: security curmudgeon (jericho@attrition.org)
Date: Wed, 9 Aug 2006 14:21:36 -0700 (PDT)
Subject: Re: Question for you or other Attrition members</p>
<p>I can supply all that. Forgive what I assume is dumb
question, but what are pigeons? I know you're not
talking about the bird.</p>
<p>--- security curmudgeon wrote:</p>
<p>> : What would you or anyone else need from me to see
> if you could it?
>
> For starters, college name, full name, and whatever
> number they track you
> by. Student ID or SS# or whatever else.
>
> And, are there pigeons on campus?</p>
</blockquote>
<blockquote>
<p>From: security curmudgeon (jericho@attrition.org)
To: Todd Shriber (nascar24_08530@yahoo.com)
Date: Wed, 9 Aug 2006 17:30:44 -0400 (EDT)
Subject: Re: Question for you or other Attrition members</p>
<p>: Wow, I feel dumb now. I honestly cannot rember if there were pigeons on
: campus or not. A lot of crazy squirrels, but I can't remember pigeons.
: Just for my own edification, why do you need to know that? I'll find out
: for you.</p>
<p>Hey, squirrels work fine. First, let's be clear. You are soliciting me to
break the law and hack into a computer across state lines. That is a
federal offense and multiple felonies. Obviously I can't trust anyone and
everyone that mails such a request, you might be an FBI agent, right?</p>
<p>So, I need three things to make this happen:</p>
<p>1. A picture of a squirrel or pigeon on your campus. One close-up, one
with background that shows buildings, a sign, or something to indicate you
are standing on the campus.</p>
<p>2. The information I mentioned so I can find the records once I get into
the database.</p>
<p>3. Some idea of what I get for all my trouble.</p>
</blockquote>
<p>Frankly, I expect the FBI to come knocking at the "hackers" door, after
some congress-critter calls for their arrest. This would be extremely
silly, but the like has happened before.</p>
Another FastCGI install script2006-12-23T00:00:00Zhttps://bannister.us/weblog/2006/another-fastcgi-install-script
<p>Wrote yet another script to install an ISAPI extension. Been through
this before, for a work project, and for a personal project.</p>
<p>Ran across the announcement of an FastCGI extension for IIS from
Microsoft. This is good news as I happen to believe FastCGI is an
excellent way of decoupling application function from the web server
specifics. It seems that Microsoft's original aim is to improve PHP
performance.</p>
<blockquote>
<p><a href="http://www.iis.net/default.aspx?tabid=1000051">FastCGI for IIS : Microsoft Internet Information
Services</a>
Microsoft is excited to announce a technical preview release of
FastCGI for IIS, a new component for Microsoft's Web server platform.</p>
</blockquote>
<blockquote>
<p><a href="http://blogs.iis.net/bills/archive/2006/10/31/PHP-on-IIS.aspx">BillS' IIS Blog : PHP on IIS7
w/FastCGI</a>
To make sure anyone can take advantage of FastCGI on all of our
existing platforms, we've built an ISAPI version of it that can run on
Windows XP and Windows 2003 (IIS 5.1 and IIS 6.0) as well as a new
module version for IIS 7.0. Check out the <a href="http://www.iis.net/default.aspx?tabid=1000051">IIS
FastCGI</a> page for more
information.</p>
</blockquote>
<p>Wanted to take another crack at this as:</p>
<ul>
<li>My familiarity using Javascript has improved considerably.</li>
<li>The <strong>fcgisetup.js</strong> script from Microsoft offers perhaps additional
clues as to the "right" way of doing things.</li>
<li>Wanted to make better use of ADSI and WMI function for service
control and configuration.</li>
</ul>
<p>The <strong>fcgisetup.js</strong> script from Microsoft is a good example of
Javascript written by a VBScript programmer, perhaps not the most
brilliant use of Javascript. :)</p>
<p>By using Javascript more fully, was able to produce a slightly smaller
<a href="http://bannister.us/examples/fcgisetup/fcgisetup.js">fcgisetup.js</a>
script that does a bit more. The rewritten script runs on Windows 2003
Server, Windows XP Pro, and Windows 2000 (though Microsoft's
<strong>fcgiext.dll</strong> does not work on 2000). Changes include:</p>
<ul>
<li>Uses ADSI and WMI exclusively to configure IIS and control services.</li>
<li>Eliminated use of external programs (iisreset and fcgiconfig).</li>
<li>The <strong>/v</strong> option provides a fairly complete trace of script
actions.</li>
</ul>
<p>Of course, I will offer the usual programmer's conceit - that the new
script is also more readable. :)</p>
<p>I did run into a couple puzzles. On Windows 2003 Server it is not
possible to <strong>/install</strong> and <strong>/add</strong> in a single script invocation -
some problem with ADSI (apparently). Not critical as you can just invoke
the script twice:</p>
<p>cscript /nologo fcgisetup.js /install
cscript /nologo fcgisetup.js /add "c:\program files\php\php-cgi.exe" php</p>
<p>Added <strong>NOTE:</strong> comments to the script to flag the troublesome bits on
Windows 2003 Server.</p>
Revisiting server-side Javascript2006-12-19T00:00:00Zhttps://bannister.us/weblog/2006/revisiting-server-side-javascript
<p>Over the past couple years a large chunk of my time has gone into
writing a web application to replace a desktop application. The
application requires some clever interactivity, a bit beyond what you
can do in HTML/Javascript, and so contains a small Java applet. On the
back-end some fairly intense processing is required, and so makes use of
a moderate-sized/heavily optimized C++ application. In between lies a
custom Tomcat instance hosting server-side Java, and some moderately
fancy client-side HTML/CSS/Javascript. Switching between all these
different forms of programming is frankly exhausting.</p>
<p>Over the same period of time I have experimented with a good chunk of
the new/popular/interesting toolkits, languages, and whatever - in
search of the best tools to use in my craft. There are too many good but
not overwhelming choices. Python or Ruby or Java or Perl or Smalltalk or
Lisp or ... at the end of the day I do not find any of the many choices
especially compelling compared to the others. What is needed is some
criteria filtering down the alternatives. The list boils down to some
clear choices:</p>
<ul>
<li>On the server-side C++ is going to be around forever for whenever
brute force processing is needed (not for many/most web
applications).</li>
<li>On the server-side Java is going to be around forever, has a huge
collection of libraries covering almost everything needed by a web
application, and can be quite efficient with all the work on the
<a href="http://blogs.sun.com/dagastine/entry/update_java_6_leads_out">JVM</a>.</li>
<li>On the client-side we can count on HTML 4.01/CSS 2/Javascript 1.5,
and can expect this set to stay pretty much fixed for years.</li>
<li>Between the browser and server shipping HTML and JSON seems
generally to make the most sense. Yes, I am mostly ignoring XML for
in the client and on the wire.</li>
</ul>
<p>What is missing is something a bit looser on the server. For many tasks
getting lots of function written is more important than high levels of
efficiency. This is where Lisp, Smalltalk, Perl, Python, Ruby, PHP, and
shell-scripting came in. Which do you pick and why? They all have
merits, but none seem like a clear winner.</p>
<p>For a cluster of reasons I am starting to believe that server-side
Javascript is the logical choice. In the first place, as a web developer
you pretty much have to get good at using Javascript for the client.
With closures and prototype objects, Javascript is a very decent
looser/higher-order language. While Javascript may not be quite as slick
as Python or Ruby (pick your favorite language/feature), the difference
is not enough to matter. Bits that add up in favor of Javascript:</p>
<ul>
<li>Using Javascript on the server means one less language for the web
developer to learn. Should help productivity.</li>
<li>As a scripting/higher order language, Javascript is good enough.</li>
<li>When using <a href="http://www.mozilla.org/rhino/">Rhino (Javascript implemented in
Java)</a> you get immediate access and
superb integration with all your server-side Java code.</li>
<li>When using <a href="http://www.mozilla.org/js/spidermonkey/">SpiderMonkey (Javascript implemented in
C)</a> (and/or
<a href="http://www.mozilla.org/projects/tamarin/">Tamarin</a>) you get
immediate access to all your C/C++ code.</li>
<li>Generating and consuming JSON data gets just a bit easier.</li>
</ul>
<p>Turning theory into practice, found <a href="http://helma.org/">Helma</a> as an
interesting example using Rhino. Looks like there are others, and that
Java-based server-side Javascript is relatively easy. The picture with
C/C++ based server-side Javascript is a bit fuzzier, mostly as there are
too many partial solutions.</p>
<p>The other piece of the puzzle is integration into IIS (for the Windows
folk) and Apache (for the Unix folk). Personally I like the notion that
the application/interpreter runs in a seperate process, lashed to the
web server with something like <a href="http://www.fastcgi.com/">FastCGI</a> (or
similar). There is an existing <a href="http://www.caraveo.com/fastcgi/">FastCGI extension for
IIS</a>, but new IIS versions tend to
break extensions in interesting (not) ways. The news of late is that
<a href="http://www.iis.net/default.aspx?tabid=1000051">Microsoft is offering a FastCGI
extension</a>. This is very
good news for folks deploying applications on Windows, as we hopefully
should see fewer problems with new IIS revisions.</p>
<p>The other compelling variation is server-side Javascript for
applications at web-hosting services. This is pretty exclusively the
domain of PHP at present. My webhost
(<a href="http://dreamhost.com/">DreamHost</a>) allows the use of FastCGI
(originally for PHP and Ruby). A C/C++ based server-side Javascript
interpreter lashed up via FastCGI could offer excellent performance. The
same code and skills could be largely re-used when developing in-house
applications (where the underlying implementation may be Java).</p>
<p>Starts to look like Javascript interpreters lashed to web servers via
FastCGI, and integrated into existing applications is the best common
path.</p>
HYDRAULIC CLUTCH - Google Patents2006-12-18T00:00:00Zhttps://bannister.us/weblog/2006/hydraulic-clutch-google-patents
<p>One of my father's stories is of an uncle who patented an automatic
transmission (or something similar) for automobiles, then bankrupted a
series of wealthy backers in battles with Detroit car makers. We have an
old newspaper article with photos, but up until now were not able to
find the patent.</p>
<p>Fortunately my great-uncle had an uncommon name. Searching Google
Patents for "Elmont Preston" came up with:
<a href="http://www.google.com/patents?vid=USPAT1474007">HYDRAULIC CLUTCH - Google
Patents</a></p>
<p>Pretty cool ... :)</p>
What Are XForms?2006-12-13T00:00:00Zhttps://bannister.us/weblog/2006/what-are-xforms
<p>I am totally not getting the purpose for
<a href="http://www.w3.org/MarkUp/Forms/wiki/What_Are_XForms">XForms</a>. This
smells like another out-of-control "standard" that promises the world,
and ends up delivering mostly bloat.</p>
<p>First off XForms are supported by approximately 0% of the world's web
browsers - a percentage that will not change anytime soon (if ever).
That means you have to transform XForms to ... HTML and JavaScript, or
(ick) Flash. I am underwhelmed. What does this gain over HTML and
JavaScript if the first instance? Oh, that's right - sprinkle on XML and
anything is automatically better (or not). Sounds like we are going to
get an XForms interpreter written in JavaScript and downloaded to the
browser (fat and slow), or interpreted on the server (overloaded and
laggy with latency).</p>
<p>Yes, I saw the browser plug-in <object>. The phrase "lead balloon"
comes to mind. I can imagine explaining to customers why they need to
install a plug-in on thousands of desktops, just to get forms that could
be as well implemented in JavaScript and HTML. I am not tempted.</p>
<blockquote>
<p>Traditional HTML Web forms don't separate the purpose from the
presentation of a form. XForms, in contrast, are comprised of separate
sections that describe what the form does, and how the form looks.
This allows for flexible presentation options, including classic XHTML
forms, to be attached to an XML form definition.</p>
</blockquote>
<p>So we are going to get automagic rendering that works wonderfully in a
big browser window and a tiny cellphone screen? More likely we get
something that works well on one but not the other - or on neither.
Optimal is not the word to describe this. If you are going to present a
user interface on radically <strong>different</strong> devices, for any sort of
decent result you are going to design a <strong>different</strong> user interface -
and this you cannot escape.</p>
<p>Since I am tending more toward populating, updating, and submitting
forms as JSON, injecting XML in the form of XForms seems more like a
step backwards - or at least sideways.</p>
<p>I am just not convinced that XForms buys us anything we cannot get with
HTML and a decent JavaScript library (or at least anything we want...).</p>
Weddings2006-12-10T00:00:00Zhttps://bannister.us/weblog/2006/688
<blockquote>
<p><a href="http://www.scripting.com/2006/12/09.html">Scripting News: 12/9/2006</a>
Weddings are womens' affairs. We men are at best props or spectators.
The prize is a woman. The judges are women. I look forward to
male-bashing from the usual feminazis.</p>
</blockquote>
<p>Heh :)</p>
Prelude to internal passports?2006-12-07T00:00:00Zhttps://bannister.us/weblog/2006/prelude-to-internal-passports
<p>There are folk who seem to be trying to turn this country into a police
state. In the past several years our country has acquired more of the
unpleasant features - more like the old USSR rather than the old USA.</p>
<p>Travel by airline is now heavily monitored. Travel by car is still free.
Fans of a police state will at some point try and control interstate
travel. So when this item went past, I have to wonder what it really
means. Especially given the actual number of "terrorist attacks" against
"surface transportation" is about zero. Are they going to propose
internal passports (in some form) for interstate travel?</p>
<p>I <em>really</em> want to be wrong about this.</p>
<blockquote>
<p><a href="http://www.cryptome.org/eo13416.htm">Strengthening Surface Transportation
Security</a>
Executive Order 13416--Strengthening Surface Transportation Security</p>
<p>By the authority vested in me as President by the
Constitution and the laws of the United States of
America, and to strengthen the security of the Nation's
surface transportation systems and thereby enhance the
protection of the people, property, and territory of
the United States of America against terrorist attacks,
it is hereby ordered as follows:</p>
<p>Section 1. Policy. The security of our Nation's surface
transportation systems is a national priority, vital to
our economy, and essential to the security of our
Nation. Federal, State, local, and tribal governments,
the private sector, and the public share responsibility
for the security of surface transportation. It is the
policy of the United States to protect the people,
property, and territory of the United States by
facilitating the implementation of a comprehensive,
coordinated, and efficient security program to protect
surface transportation systems within and adjacent to
the United States against terrorist attacks.</p>
</blockquote>
Your cell phone can be a remotely controlled microphone...2006-12-05T00:00:00Zhttps://bannister.us/weblog/2006/your-cell-phone-can-be-a-remotely-controlled-microphone
<p>... and you will have no idea ...</p>
<blockquote>
<p><a href="http://www.schneier.com/blog/archives/2006/12/remotely_eavesd.html">Schneier on Security: Remotely Eavesdropping on Cell Phone
Microphones</a>
The U.S. Commerce Department's security office warns that "a cellular
telephone can be turned into a microphone and transmitter for the
purpose of listening to conversations in the vicinity of the phone."
An article in the Financial Times last year said mobile providers can
"remotely install a piece of software on to any handset, without the
owner's knowledge, which will activate the microphone even when its
owner is not making a call."</p>
<p>Nextel and Samsung handsets and the Motorola Razr are especially
vulnerable to software downloads that activate their microphones, said
James Atkinson, a counter-surveillance consultant who has worked
closely with government agencies. "They can be remotely accessed and
made to transmit room audio all the time," he said. "You can do that
without having physical access to the phone."</p>
</blockquote>
Ten Men's Fashion Essentials2006-12-03T00:00:00Zhttps://bannister.us/weblog/2006/ten-mens-fashion-essentials
<p><a href="http://www.watchmojo.com/fashion/tip/059_men_essentials.php">Free Fashion Tip Video - Ten Men's Fashion
Essentials</a></p>
<p>Meant to pass as advice: white shirt with black shoes, belt, pants, tie,
jacket and coat. Essential? Sure, if you are a Mormon kid on
"missionary", or perhaps an interchangeable "office worker". Or is this
an old-east-coast thing? Nothing like clothes that say you have
absolutely no imagination.</p>
<p>Obviously this is a site aimed to capitalize on the increased use of
video on the web. Clearly they are in need of filler material, no matter
what quality.</p>
In Class Warfare, Guess Which Class Is Winning2006-12-03T00:00:00Zhttps://bannister.us/weblog/2006/in-class-warfare-guess-which-class-is-winning
<blockquote>
<p><a href="http://www.nytimes.com/2006/11/26/business/yourmoney/26every.html?ex=1322197200">In Class Warfare, Guess Which Class Is Winning - New York
Times</a>
It turned out that Mr. Buffett, with immense income from dividends
and capital gains, paid far, far less as a fraction of his income than
the secretaries or the clerks or anyone else in his office. Further,
in conversation it came up that Mr. Buffett doesn’t use any tax
planning at all. He just pays as the Internal Revenue Code requires.
“How can this be fair?” he asked of how little he pays relative to his
employees. “How can this be right?”</p>
<p>Even though I agreed with him, I warned that whenever someone tried to
raise the issue, he or she was accused of fomenting class warfare.</p>
<p>“There’s class warfare, all right,” Mr. Buffett said, “but it’s my
class, the rich class, that’s making war, and we’re winning.”</p>
</blockquote>
A small item2006-12-03T00:00:00Zhttps://bannister.us/weblog/2006/a-small-item
<p>This is another instance of trying to buy things that work well, and
last.</p>
<p>Months ago the comb in my back pocket started falling apart. Looks
pretty ratty with chunks of teeth missing. On the other hand I take out
the comb maybe once a day (if that), so once a comb starts to fall
apart, it can be months before I remember to buy a replacement when at
the store. Even buying the best comb (off the rack at the market), they
don't last very long. Due to poor quality, most of the time the comb in
my pocket is missing pieces. This has been going on for years....</p>
<p>What I really want is something a bit tougher. I do remember years
(decades) ago buying an Ace Hard Rubber Comb that proved quite tough,
and lasted a long time. Looking around, I found and bought the Ace
brand, but the comb seems to be made of plastic. Not a bad thing
necessarily, as there are some very tough plastics, but somehow I doubt
that's what came in the package.</p>
<p>OK, so I can understand how this happened. Combs are not a big market,
and can be made very <em>very</em> cheaply out of low quality plastic. At
various times combs became a fashion item with funky colors, shapes, and
materials dominating sales for brief periods. Basic combs made out of
better materials probably came to a very small portion of sales, and got
dropped by retailers.</p>
<p>I could hunt through all the local retailers ... but no guarantees of
any profit from the wasted time. Time to hit the internet, and if I can
find something better than the usual cheap plastic junk.</p>
<p>Found a columnist wondering <a href="http://www.caller.com/ccct/opinion_columnists/article/0,1641,CCCT_843_3529101,00.html">"What happened to Ace combs, phone
booths?"</a>,
but no help there.</p>
<p>Hit eBay. Found lots of cheap combs ... no hint of quality. Found <a href="http://www.cachebeauty.com/swedish_crown.htm">metal
combs</a> ... but I'm
thinking you want something with a bit of flex in your pocket. Found
combs of wood and "tortoise", too fragile for a pocket.</p>
<p>Found <a href="http://www.fuller.com/default.asp">The Fuller Brush Company</a>. I
still have the Fuller brush given to me by my grandmother when I was 13.
The brush is chipped and worn, but I have kept it, and it has outlasted
any number of newer cheap plastic brushes. A bit of whimsy, really. (Not
real crazy about their website organization.)</p>
<p>Eventually came across references to
<a href="http://uncommonscents.com/combs.html">Speert</a> combs, as something
better. Ordered a couple, so will see. There might be other decent
manufacturers, but if so I cannot tell. Rather a lot of effort for
something so simple.</p>
<p><img src="http://us.st11.yimg.com/us.st.yimg.com/I/uncommonscents_1922_18707491" alt="untitled" /></p>
Traces2006-12-02T00:00:00Zhttps://bannister.us/weblog/2006/traces
<p>While driving away from the <a href="http://www.flickr.com/map/?&fLat=38.963913&fLon=-110.228769&zl=1&map_type=hyb">airport near Green River,
Utah</a>,
spotted some odd shapes embedded in the apron. Not sure what those
shapes represented - could this be remnants of an old ICBM site? None of
the odd shapes visible on the ground are visible in the satellite photos
accessible via Yahoo Maps (and Google Maps is even less detailed).</p>
<p>There are a number of aspects of the airport at Green River that seemed
odd. Why the long road from the town, when the interstate is so close?
Why an airport at all - does use justify the upkeep?</p>
<p>Looking at the aerial images - they seem to tell a story. In that
water-scarce landscape traces survive long after roads are gone. There
is a trace of an older road crossing the airport runway. Looks like the
"Airport Road" largely follows the path of the older road - the
continuation of "Old Highway Hanksville" (perhaps the original name?).
So the airport was built across the path of a then-existing road that -
due to the interstate - had largely lost it's purpose?</p>
<p>The "Old Highway Hanksville" <a href="http://www.flickr.com/map/?&fLat=38.972286&fLon=-110.254261&zl=2&map_type=hyb">meets another old
road</a>
that <a href="http://www.flickr.com/map/?&fLat=38.974481&fLon=-110.25411&zl=1&map_type=sat">used to cross where the I-70 is
now</a>.
Given the I-70 was probably built in the 1960's, that would suggest the
airport was built sometime later.</p>
Insecurity on 9/11 no surprise2006-11-24T00:00:00Zhttps://bannister.us/weblog/2006/insecurity-on-911-no-surprise
<p>After 9/11 we heard "who could imagine such an attack" from quite a lot
of public figures. In fact there were quite a lot of folks who could
imagine exactly such a threat, and were trying to guard against just
such an occurrence. Perhaps if we had spent the bit necessary on the
good folks who knew what job needed doing before 9/11, then there is a
good chance the hijacking would have failed. Perhaps we would not have
the TSA pissing away billions on the bunch of silly schemes today.</p>
<blockquote>
<p><a href="http://www.usatoday.com/news/washington/2006-11-23-whistle-blower-faa_x.htm">Ex-employee says FAA warned before
9/11</a>
From 1995 to 2001, Bogdan Dzakovic served as a team leader on the
Federal Aviation Administration's Red Team. Set up by Congress to help
the FAA think like terrorists, the elite squad tested airport security
systems.</p>
<p>In the years leading up to the Sept. 11, 2001, terrorist attacks,
Dzakovic says, the team was able to breach security about 90% of the
time, sneaking bombs and submachine guns past airport screeners.
Expensive new bomb detection machines consistently failed, he says.</p>
<p>The team repeatedly warned the FAA of the potential for security
breaches and hijackings but was told to cover up its findings,
Dzakovic says.</p>
<p>Eventually, the FAA began notifying airports in advance when the Red
Team would be doing its undercover testing, Dzakovic says. He and
other Red Team members approached the Department of Transportation's
Office of the Inspector General, the General Accounting Office and
members of Congress about the FAA's alleged misconduct regarding the
Red Team's aviation security tests. No one did anything, he says.
<a href="http://cryptome.org/faa-pre-911.htm">via Cryptome</a></p>
</blockquote>
<p>Good bet that Dzakovic is credible as we have heard this story many
times before. Airport security has always been a bit of a (bad) joke.</p>
More about how votes are collected2006-11-20T00:00:00Zhttps://bannister.us/weblog/2006/more-about-how-votes-are-collected
<p>While I can account for how votes are collected at my polling place, I
really do not know anything about the upstream process. After I turn in
the votes collected in my precinct(s), how secure is the process from
that point on? At the end of the election day I am far too tired to hang
around and see where the votes go from there.</p>
<p>So the following bit from a local political weblog is of interest - and
encouraging.</p>
<blockquote>
<p><a href="http://www.ocblog.net/ocblog/2006/11/from_the_correa.html">OC Blog: From The Correa
Campaign...</a>
As to the other missive about the signatures, it is unfortunate that
someone has chosen to raise this issue and attack the credibility of
the Orange County Elections operations and safeguards. Had they spent
the last week and a half at monitoring the process, they would have
discovered like we did that the County does in fact have multiple
steps of review in place, and that every absentee and provisional
ballot is individually reviewed for both completeness and yes, the
signatures on the ballot envelopes are matched to their affidavits of
registration.</p>
<p>If the signature validator had any question whatsoever, they attached
an electronic challenge to the ballot and envelope and sent it on up
for further review. At that point, the signature went through several
additional reviews where it was either found to be legitimate and
placed back in the ballot pipeline or sent to the challenge room where
attorneys and staff for both camps would review each and every ballot
envelope. At this point, both camps found agreement on most
signatures, and where disagreement occurred, the Registrar himself
provided the final word on whether the signature was valid.</p>
<p>All in all, a clean process that went well for all involved.</p>
</blockquote>
<p>I would still like to follow the process through someday. Given an
occasional need to evaluate software security, I long ago developed that
nasty, suspicious, nearly paranoid state of mind needed on the occasion
to look for threats and weakness. :)</p>
Making politics more local?2006-11-19T00:00:00Zhttps://bannister.us/weblog/2006/making-politics-more-local
<p>Like many other American citizens I am not satisfied with much of our
political process. How do we end up with so much junk in politics? Each
major election we are asked to vote for folk we don't know into
positions of power. We try and make value judgments based on what is
really to little information (or too little truth).</p>
<p>I admit (in part) to making the problem worse. At one time (or more?) we
were asked if we wanted to make more positions elected, and I voted in
favor. It sounded like a good idea at the time. Fewer chances for
political appointees in exchange for favors (usually dirty). The result
is ballots with long lists of names - far too many to look at closely.</p>
<p>Back in 1776 the population of the US was about 2.5 million. That means
each member of the 435 member House of Representatives (assuming the
number was the same then?) would represent about 5800 people (and less
than 1000 voters). With numbers like that my small local suburb would
get three representatives. Odds are I would know a <em>lot</em> more about the
folk wanting to be my local representative.</p>
<p>There are two political figures I have seen locally. In both cases the
first-hand impression gathered seems to have proved accurate.</p>
<p>Maybe the main failing of our country's founders was in not accounting
for the effect of massive population growth. Maybe what we lack is true
local representation. What if we could vote for one representative who
would represent 5-10 thousand people to city, state, and federal
government? Certainly we would be far more likely to know something of
the character of our representative. Before we had to elect separate
representatives for city, state, and federal government - as each had to
physically travel to a different place to perform their role, and travel
took a lot longer.</p>
<p>Could a Congress with 30,000 representatives actually work?</p>
<p>Pulling back a bit - even local city governments seem to have a fair
amount of funny business. Are we seeing another example of the same
problem - too few truly local representatives? The writer below is
talking about <a href="http://en.wikipedia.org/wiki/Santa_Ana%2C_California">Santa
Ana</a>, a city of at
least 340,000 people.</p>
<blockquote>
<p><a href="http://o-juice.blogspot.com/2006/11/pulido-fears-ward-specific-elections.html">Pulido fears ward-specific elections because he doesn't want to lose
power</a>
The truth about ward-specific elections is that they allow ANYBODY to
make a reasonable run at the city council. That is what Ream and
Pulido fear the most. Up until this year they have absolutely
controlled most of the outcomes of our local elections by raising
thousands of dollars from special interests and public employee unions
and electing only those who agree to be Pulido hacks. This year we
figured out, inadvertently, how to defeat the Pulido puppets by
splitting the vote. Never again will Pulido be able to use his machine
to keep us down. If we can pass a ward-specific ballot measure, we
will be able to make sure that henceforth only those who are truly
known in their wards, and in the city, will be able to prevail. Pulido
won't be able to elect carpetbaggers from Huntington Beach, and empty
suits who do nothing to improve the city or their neighborhoods.</p>
<p>All we are asking is that the voters be allowed to decide for
themselves if they want ward-specific city council elections. What are
Pulido and Ream afraid of? They are afraid of losing power. And yet
that is coming to pass anyway...</p>
</blockquote>
Get out of Washington - use the Internet2006-11-17T00:00:00Zhttps://bannister.us/weblog/2006/get-out-of-washington-use-the-internet
<p>Was thinking this morning about how a Congressman had to maintain two
residences - one in their home district and one in Washington DC. Seems
that long-term congress-critters get to be more of DC than of the region
they nominally represent. The culture of DC is much centered around
political power, lobbying, and hangers-on of various sort.</p>
<p>I have long thought that keeping the majority of the national government
all in one place was a mistake. On the one side, a single small nuke
could wipe out Congress, the White House, and a fair number of federal
agencies. On the other hand, email and video conferencing largely
obviates the old need to physically meet.</p>
<p>The Internet was originally created by the military as a communications
network that could potentially withstand a nuclear attack. The network
was hoped to survive the destruction many nodes - and certainly the loss
of any one node. The same principle could be applied to the federal
government. Congress does not need to all be in one place. Federal
agencies could be distributed across the country.</p>
<p>Aside from protection against attack, there is a second possibly more
important benefit. Washington DC is the home to lobbyists of all sort -
a source of slight (or great) corruption. By distributing the government
across the country, this makes the job of a lobbyist rather harder (at
least for under-the-table dealings). Perhaps by breaking up Washington
DC we could end up with slightly cleaner government.</p>
<p>Just a speculation ...</p>
Bush in Vietnam2006-11-17T00:00:00Zhttps://bannister.us/weblog/2006/bush-in-vietnam
<p>Heard on NPR this morning that Bush was giving a speech in Vietnam.
Considering what the war in Iraq just cost the Republican Party in the
just-past election, this struck me as somewhat amusing. For the full
measure:</p>
<blockquote>
<p><a href="http://blogs.ocregister.com/orangepunch/archives/2006/11/bush_finally_makes_it_to_the_n.html">Bush finally makes it to The
Nam</a>
" Back in the mid-1960s, George W. Bush had an invitation from Uncle
Sam to join the U.S. military and, like his father at a similar age,
be sent to fight a war. He could have led an infantry platoon in The
Nam. He declined, instead going to Yale, pledging Skull & Bones, and
going to Harvard Business School. He eventually joined the Texas Air
National Guard, protecting Galveston from an invasion by the Viet
Cong.</p>
<p>If he had gone through infantry combat, he might have been not so
foolish as to send American ground troops to conquer and occupy Iraq."</p>
</blockquote>
<p>In the speech Bush said something like "If we don't quit, we win."
Typical political nonsense - bound to be true for some definition of
"win" and "quit".</p>
Lip-syncing to Romanian disco2006-11-15T00:00:00Zhttps://bannister.us/weblog/2006/lip-syncing-to-romanian-disco
<p>
<embed style="width:400px; height:326px;" id="VideoPlayback" type="application/x-shockwave-flash" src="http://video.google.com/googleplayer.swf?docId=-6377855743675143177&hl=en" flashvars="" />
</p><p>Not exactly new (<a href="http://en.wikipedia.org/wiki/Numa_Numa">wikipedia
page</a>) - amusing none the less.</p>
<p></p>
Missing absentee ballots - error or malice?2006-11-13T00:00:00Zhttps://bannister.us/weblog/2006/missing-absentee-ballots-error-or-malice
<p>This last election there were are fair number of folk who came into my
polling place who were marked on the roster as "AV" (meaning "absentee
voter"), but who claimed <strong>not</strong> to have received their absentee ballot.</p>
<p>Now I have not thought anything odd of this before. Perhaps the RoV
(Registrar of Voters) mailed the ballot to the wrong address - voters
move and often forget to notify the RoV. Perhaps the ballot was lost in
the mail (though odds of this are probably low). Voters appear on the
roster that have moved out or died (not unusual in number). Voters
appear at the polling place who have moved in and believe they are
registered, but are not on the roster (they <strong>are</strong> allowed to vote -
tagged as "provisional" so the RoV will verify). The "absentee" voters
may have misplaced their ballots. Collecting votes is not a perfect
process, and you have to expect some human error.</p>
<p>Many of the "absentee" voters who show up at the polling place - saying
they did not receive their ballot - are unsure if they can vote (they
can). I have to assume a fair number of the "absentee" voters with lost
ballots do not vote.</p>
<p>If you knew which voters you did <em>not</em> want to vote, and you could
arrange to "lose" absentee ballots (anywhere between the RoV and where
the voter picks up their mail) ... you could probably change the
election numbers somewhat.</p>
<p>More likely this was simple human error - but I cannot rule out the
possibility of malice.</p>
Server-side parsing of HTML to DOM2006-11-11T00:00:00Zhttps://bannister.us/weblog/2006/server-side-parsing-of-html-to-dom
<p>Ran into an unexpected problem.</p>
<p>Had this bit of inspiration for what I thought would be an optimally
performant wiki/weblog, and started putting together a prototype. The
client-side Javascript went together pretty easily. The server-side is
presenting more of a problem.</p>
<p>The basic notion is I want to send an HTML fragment to the server. The
server-side code would then:</p>
<ol>
<li>Read and parse an HTML file from disk into a DOM tree.</li>
<li>Replace a DIV identified by a ID attribute with the HTML fragment
received from the client.</li>
<li>Save the edited HTML into a file on disk.</li>
</ol>
<p>Pretty simple, right?</p>
<p>The application-specific code on the server is very small. I was hoping
to keep the server-side code simple so multiple implementations (PHP,
Perl, Java) would be feasible. This would allow widest possible usage.</p>
<p>Granted a parser for sloppy HTML is not trivial. One the other hand, you
only need one good open source HTML parser for all the languages
implemented in C/C++. I know there are a couple for Java. By now I had
hoped that HTML -> DOM (and back) would be relatively common.</p>
<p>Guess I was wrong.</p>
<p>Pulled up the PHP documentation and found the <a href="http://us3.php.net/manual/en/ref.dom.php">DOM
functions</a>. Hmmm, PHP4
apparently only supported XML, which is not good enough. I want a parser
able to tolerate less-than-perfect HTML. PHP5 apparently has a more
tolerant parser, though I'd hoped not to have to require the very latest
version. Oh well ... wrote code to slurp the HTML fragment from the
client (OK), slurp the HTML file off disk (OK), find the DIV to replace
with getElementById() ... nope. The file is HTML 4.01 Strict (been
through the validator) and getElementById() works from browser
Javascript. Looks like the newish PHP DOM functions may be a bit buggy
still.</p>
<p>Don't see an alternative, so PHP may be a non-starter.</p>
<p>My web host allows use of PHP, Perl, Python, and Ruby ... so off to do
some reading.</p>
<p><strong>Update:</strong> Found my way around the problem with the PHP DOM functions.
A bit of a hack, but not too bad. What I really want is an assignable
equivalent to <strong>innerHTML</strong>, as this would be simpler and more
efficient. Oh well, sometimes you work with what you have.</p>
Diet and Nutrition2006-11-11T00:00:00Zhttps://bannister.us/weblog/2006/diet-and-nutrition
<p>Listening to an older
<a href="http://www.npr.org/templates/story/story.php?storyId=1151055">NPR program</a> -
a couple of doctors trying to sell diet books - served as a reminder of
why precisely my respect for the "nutritional community" seems to drop a
notch every year. In part as over time I have gotten better at picking
out a sharp (or not so sharp) mind out of a forest of words. Listening
to the radio program, after mentally pruning out the excess verbiage -
neither the "low-fat diet" doctor or the "low-carbohydrate" diet doctor
impress me as anything near first-rate minds.</p>
<p>This is not surprising. I saw the weeding-out process applied to pre-med
students while in college. What you largely get are folk able to grind
forward in a single direction, without variation or creativity.</p>
<p>What this gets you is a large number of "studies" performed by guys with
"doctor" in their title. When you look closely at the methodology of
their study ... you find stunning gaps. You very often find the
"controlled study" is not at all well controlled (at least not by
standards derived from studying Physics).</p>
<p>Back in high school did a lot of running (a 120 pound kid eating 11,000
calories a day), and after did a lot of cycling. Did long distance
riding (30-70 miles a day) and events like one day 100 and 200 mile
rides. Diet was absolutely crucial to success, and boiled down to the
following observations as to which foods made the best fuels:</p>
<ul>
<li>Sugar is good only for a short-term boost - maybe 30 minutes. Good
if you screwed up and let your blood sugar drop, and useless
otherwise.</li>
<li>Meat, fats, and oils digest too slowly and are not a good source
when lots of energy is needed.</li>
<li>Carbohydrates are your main fuel - crackers and bananas (washed down
with copious water and some fruit juice) you can eat and burn while
riding all day.</li>
</ul>
<p>Afterwards, when much less physically active, it seemed logical to cut
out the fuel - the carbohydrates - leaving mostly slow-burning foods
(meat, fats and oils) in the diet. I had a hard time understanding why
the "nutritional community" was recommending low-fat high-carbohydrate
diets. It seemed counter-intuitive. Since your body tends to digest
carbohydrates more quickly, you end up hungry between meals, which makes
it harder to resist impulse eating.</p>
<p>Heard on NPR from a nurse who switched from the low-fat to
low-carbohydrate diet: " Carbohydrates made me hungry. "</p>
<p>Later I switched my diet to low in carbohydrate with most calories
coming from lean meat and oils (olive, canola, etc.). I found with the
slower to digest foods that I was not getting hungry between meals, and
it was much easier to limit my intake.</p>
<p>You want my entirely non-professional dietary advice for typical
minimally active suburbanites?</p>
<ul>
<li>Sugars are pure, absolute, unadulterated dietary evil - fruit sugars
a bit less so. My bet is that we will eventually figure out that
sugars killed more people than tobacco.</li>
<li>Simple carbohydrates (white bread, white rice) are evil most days.
Unless your day is going to be physically very active - stay away.</li>
<li>Carbohydrates in general are fuel. If you are going to be active,
you might eat more. Otherwise you want very little.</li>
<li>Lean meat is good. Oils are generally good (fats liquid at room
temperature). Fats solid at room temperature are probably bad.</li>
<li>Salad with a bit of oil is good (small carbo with slow digesting
oil).</li>
</ul>
<p>... but I am not a "professional" ...</p>
Adobe, Mozilla, and Tamarin2006-11-09T00:00:00Zhttps://bannister.us/weblog/2006/adobe-mozilla-and-tamarin
<blockquote>
<p><a href="http://www.hecker.org/mozilla/adobe-mozilla-and-tamarin">Frank Hecker, Mozilla : Adobe, Mozilla, and
Tamarin</a>
What does this all mean? Let's start with users of Firefox and other
applications based on Mozilla technology. They'll get future versions
of Firefox and other Mozilla-based products that will run
JavaScript-based applications significantly faster, including in
particular AJAX-enabled web applications commonly thought of in
connection with the Web 2.0 meme. (In its own testing Adobe has seen
up to a ten times speedup of ActionScript applications due to the
introduction of the AVM2 technology.) Since Firefox and Firefox
extensions are partly written in JavaScript (as are other applications
built on Mozilla's XUL technology), users will also likely see
performance gains in some areas of Firefox itself.</p>
</blockquote>
<p>This raises the bar in some interesting ways. Web applications are
becoming increasingly dependent on Javascript. This may give
Mozilla/Firefox a substantial speed advantage over Microsoft's Internet
Explorer. Microsoft is then left with a bit of a dilemma. If Microsoft
is still trying to bias towards rich client (i.e. Windows native)
applications, they will not want to do anything that might radically
enhance what can be done with a web application. If they decide they
cannot ignore the performance gap, they must either enhance their
JScript engine to match, or adopt the Tamarin code.</p>
<p>This puts Adobe in the position of forcing Microsoft to enhance Internet
Explorer. Somewhat amusing. :)</p>
Election day - lots on the ballot2006-11-07T00:00:00Zhttps://bannister.us/weblog/2006/election-day-lots-on-the-ballot
<p>This time around I have two precincts at my polling places, a bit more
than 2000 voters, a long ballot, and (fortunately) a full complement of
poll workers (4 besides myself). Much busier this morning than the last
few elections. Number of folk voting here was 151 between 7am and
11:18am (the polls close at 8pm). Looks like a stronger voter turnout
that recent elections.</p>
<p><strong>Update:</strong> A long, busy, very tiring day. Pretty good turnout - 520-odd
voters came out of 2000-odd voters in my area, plus a fair pile of
absentee ballots turned in at the polling place. Seems about an equal
number voted absentee. Busy from about 3pm to closing time (8pm). We did
get a line outside, but at the worst I think the wait was under an hour.</p>
<p>Seems like I got pretty much what I asked for from the
<a href="http://ocvote.com/">RoV</a>. After the last election I told them we could
handle more voters given a full complement of poll workers and a couple
more machines - and that it what I got. With this <strong>long</strong> ballot the
bottleneck was the voting machines - we could have used a couple more.</p>
Wrong and Right fats - over-thinking the problem?2006-11-04T00:00:00Zhttps://bannister.us/weblog/2006/wrong-and-right-fats-over-thinking-the-problem
<p>Cooking is a minor hobby of mine, and you end up working with different
sorts of fats - olive oil, butter, fat from meats (chicken, beef, pork).
Both in cooking and in the later cleanup, each is different.</p>
<p>Could it be that the kinds of fat that are "good" or "bad" for human
consumption can largely be determined by simple feel?</p>
<p>Olive oil is liquid at room temperature, feels slippery on the finger,
and with a little agitation disburses easily in water. Cleanup with a
bit of warm water and soap is very easy. In contrast, beef fat is solid
at room temperature, and feels somewhat sticky. Cleanup requires very
hot water (well above body temperature) and is a bit of a pain.</p>
<p>Could it be that this simple measure tells us a great deal about the
artery-clogging risk of various fats?</p>
<p>Add to this huge use in "processed" foods of fats altered to be sticky
and have a melting point much above body temperature - in the pursuit
long shelf life. Disgusting stuff ... oddly not found in the cooking
section of your local market. Sounds darn near ideal for clogging
arteries.</p>
<p>There is another joker.</p>
<p>Take a good swig of an ice-cold drink. Feels good, especially on a hot
day. Now take an equal amount and dump on someone's back. Bet they
yelled. Our skin is very sensitive to cold, but our insides not. That
cold liquid you drank passes very near your major arteries. Eat a fatty
meal followed by a cold beverage - seems a good bet that any fat with a
high melting point in your blood will instantly stick to your arteries.</p>
<p>Add to this the American tendency to consume almost all beverages cold
... and suddenly the idea of consuming a bit of red wine at room
temperature makes a lot of sense. :)</p>
Slightly broken weblog ... and inspiration2006-11-01T00:00:00Zhttps://bannister.us/weblog/2006/slightly-broken-weblog-and-inspiration
<p>Oh boy. The WordPress 2.0.5 update came out, and my hosting provider
(DreamHost) offered an auto-update from the then installed 2.0.4
version. The prior updates were only slightly bumpy, but this time
<em>Something Broke</em>.</p>
<p>Was the fault in WordPress, DreamHost, or mine? Cannot muster any
enthusiasm for debugging someone else's server-side PHP code (yuck).
Since programming is my day job, this is not my idea of "fun".</p>
<p>Ever had one of those times when a number of incomplete slightly-related
notions seem to come together? Maybe it was an after-effect of the cheap
Halloween candy I consumed after the trick-or-treaters stopped. In any
case, found I could not sleep and a common thread seemed to emerge from
a cloud of somewhat-related questions and notions.</p>
<ul>
<li>Good distributed system design pushes compute load where practical
to the clients. Web-browsers with their built-in HTML parsers,
Javascript interpreters, and mostly-idle CPUs should be used over
server-side code where possible.</li>
<li>Web sites, wikis, and weblogs access is overwhelmingly reads, with
few writes. Seems if you are going to build HTML on the server, you
want to do this once on write. Read access from a static file would
be exactly optimal. Taken together, you want to generate the page
HTML on write, and save as a static file.</li>
<li>Recent work has allowed me to become comfortable with using in-page
Javascript to fetch JSON data and HTML fragments from the server,
and incorporate into the client-side web page.</li>
<li>Server-side HTML generation (like ASP/JSP/PHP pages) has always felt
wrong to me. Need a better alternative.</li>
<li>Seems that the notion of a wiki and a weblog should not be distinct.</li>
<li>Standard web servers are hideously efficient at serving static
files. Seems we should take advantage of this - and other built-in
behaviors.</li>
<li>One of my father's neighbors has a small business (related to solar
home construction). Their website is typically lame. I could help
them do better, but a collection of static HTML pages gets unwieldy
fast. Could adapt WordPress, but that would require continuing
support on my part to keep them running - not sure I want to be on
the hook. Could adapt one of the existing open-source CMS
implementations - but last time I looked they all sucked in one way
or another.</li>
<li>The company I work for is in the process of updating the company
website in a big way, and things are not going as well as they
could. The outside consulting outfit that did the initial work ...
as far as I can tell, their work sucks. (Lots and lots of companies
run into the same exact problem.) Seems there should be a better
way...</li>
<li>Wikis, weblogs, and company websites should allow efficient indexing
by search engines. At the same time, when there are multiple views
on the same data, you probably only want the search engines to index
one. Pages composed dynamically on the client-side are unlikely to
fare well with search engines. For example, in the case of a weblog
you do not really want search engines returning hits on composite
views (all articles on one date, or under a category or tag).</li>
<li>When editing the presentation of an HTML page, I really want to use
best-of-breed tools (like
<a href="http://www.newsgator.com/NGOLProduct.aspx?ProdID=TopStyle">TopStyle</a>).
Directly viewable plain-HTML templates seem best. Editing mashed up
combinations HTML and some server-side programming language is a
pain (as in PHP/ASP/JSP) if you care about presentation.</li>
<li>Someone spent the time to do a decent <a href="http://goessner.net/articles/wiky/">client-side wiki-markup to
HTML bi-directional converter</a>
(very cool).</li>
<li>Someone else spent the time to build decent client-side in-page
<a href="http://www.htmlarea.com/">text editors</a> (of which there is <a href="http://tinymce.moxiecode.com/">more
than one of interest</a>).</li>
<li>There are various server-side templating system, none of which I
have found inspiring. Why parse HTML on the server when there are
already perfectly serviceable HTML parsers in the web-browser?</li>
</ul>
<p><strong>Update:</strong> Found the problem. Running PHP via FastCGI and stock
WordPress yields the following errors in the Apache <strong>error.log</strong>:</p>
<p>FastCGI: comm with server "/home/dreadedhill/bannister.us/php5-wrapper.fcgi" aborted: error parsing headers: duplicate header 'Status'</p>
<p>Right ... I'd found this when turning on FastCGI with an earlier version
of WordPress. Found <a href="http://wordpress.org/support/topic/67420?replies=4">an
article</a> in the
DreamHost Wiki with the fix.</p>
Two for one2006-10-29T00:00:00Zhttps://bannister.us/weblog/2006/two-for-one
<blockquote>
<p><a href="http://www.usatoday.com/news/nation/2006-10-10-internet-defamation-case_x.htm">USATODAY.com - Jury awards $11.3M over defamatory Internet
posts</a>
"What's interesting about this case is that (Scheff) was so vested in
being vindicated, she was willing to pay court costs," Lidsky says.
"They knew before trial that the defendant couldn't pay, so what's the
point in going to the jury?"</p>
</blockquote>
<blockquote>
<p>Bock says that when she moved back to her repaired house over the
summer, she knew the trial was approaching but did not know the date.
She says she doesn't have the money to pay the judgment or hire a
lawyer to appeal it. She adds that if the goal of Scheff's lawsuit was
to stifle what Bock says online, it worked.</p>
<p>"I don't feel like I can express my opinions," Bock says. "Only one
side of the story was told in court. Nobody heard my side."</p>
</blockquote>
<p>So the lesson here is that you should feel free to speak your mind, but
only if can afford to be sued. Since this is more than most average folk
can afford, it seems that free speech is reserved for the affluent.</p>
<p>In principle, is this different from hiring a gang of thugs to beat up
someone you don't like?</p>
Pity the "average" user2006-10-29T00:00:00Zhttps://bannister.us/weblog/2006/pity-the-average-user
<p>Of late I had noticed a general "slowness" on my laptop, and spikes in
CPU use when none should occur. The first thought was that perhaps I'd
picked up some bit of malware. I do not run any sort of virus scanner on
my machines (my kids, yes, but not mine). None of my machines have ever
picked up anything nasty (and I do mean <em>never</em>). But perhaps one of the
cleverer bad guys out the figured out a way around my habitual caution.</p>
<p>Ran a virus scanner ... nothing. Ran SpyBot ... nothing.</p>
<p>The CPU use was occurring in one of the standard anonymous <strong>svchost</strong>
processes. Checked for anything I might have installed lately that could
be the problem. Nope. A search on <a href="http://www.google.com/search?hl=en&q=svchost+cpu+use&btnG=Google+Search">"svchost CPU
use"</a>
yields a bunch of ... mostly folklore. The one useful bit of advice was
to install <a href="http://www.sysinternals.com/Utilities/ProcessExplorer.html">Process
Explorer</a>
from the familiar SysInternals site (invaluable to a software developer
on Windows).</p>
<p>With Process Explorer was able to see the thread burning up CPU was
spending it's time in <strong>wbemcore</strong>. Another
<a href="http://www.google.com/search?hl=en&lr=&q=svchost+cpu+use+wbemcore&btnG=Search">search</a>.
Turns out the <a href="http://www.hanselman.com/blog/SvchostexeSucksCPUAndRebuldingTheWMIWBEMRepository.aspx">first item
returned</a>
contained specific instructions that solved my problem.</p>
<p>But ... even I find this problem obscure! This is a new re-installation
of Windows XP, only a couple months old. How is some poor average user
going to solve a problem like this? Their only recourse is the
re-install Windows (and all their applications), or buy a new computer.</p>
<p>Clearly this is a bit less than ideal.</p>
If Drugs Were Legal - Google Video2006-10-27T00:00:00Zhttps://bannister.us/weblog/2006/if-drugs-were-legal-google-video
<p>
<embed style="width:400px; height:326px;" id="VideoPlayback" type="application/x-shockwave-flash" src="http://video.google.com/googleplayer.swf?docId=2908621023073531157&hl=en" />
</p><p><a href="http://video.google.com/videoplay?docid=2908621023073531157">If Drugs Were Legal - Google
Video</a></p>
<p></p>
For the record - drug use screwed up a large part of my little brother's
too short life. Even worse, I grew up in the 1970's - even had a friend
who sold drugs on the side - and never used anything illegal (how lame
is that?).
I hate cell phone companies.2006-10-27T00:00:00Zhttps://bannister.us/weblog/2006/i-hate-cell-phone-companies
<p>Was looking for a new cell phone service for my son.</p>
<p>Naturally cell phone services just <em>love</em> teenage customers - especially
when attached to their parent's service plan. Teenagers have a tendency
to talk ... which translates into occasional (very) expensive overages,
or requires their parents to buy plans that are much more expensive
every month. Either case has to make the service company very happy.</p>
<p>Just as naturally, as a parent of two teenagers, I want to limit how
much I end up paying.</p>
<p>The cell phone service companies like to offer plans that sound good on
the surface, but when you look closer contain a "let's screw the
customer" zinger. After (once again) reading though the service plans
offered by a number different outfits - it seems pretty clear I was
going to get screwed, the only question was how badly.</p>
<p>There is a tremendous market opportunity for a company that simply
offers a good service at a good price without screwing around with the
customers. What a cell phone service <em>should</em> charge is a fixed monthly
fee (since part of their costs are fixed), plus a variable fee based on
the number of minutes used. I would like to buy a phone, prepay for a
year of service, and prepay for a several months worth of "minutes" -
and expect to receive a modest discount for prepaying. No need for
printing and mailing monthly bills. No need for processing monthly
payments.</p>
<p>About a year ago I setup my son with a T-Mobile "To Go" plan. Bought the
phone up front. Prepaid for $100 for 1000 minutes (usable for one
year). When he ran low on minutes (every few months) I would buy another
1000 minutes off the T-Mobile website. My son did a good job of
moderating his use, and only burned 200-300 minutes per month. All told,
a very satisfactory arrangement - I was even considering switching over
my Verizon service when the current agreement ran out.</p>
<p>Coverage with T-Mobile is not quite as good as with my Verizon service
when driving across country, but just fine the rest of the time.</p>
<p>After about a year, suddenly the "minutes" started disappearing from his
account at an unusual clip - in September nearly 1000 minutes
disappeared. Now my son is not especially chatty by nature. He claimed
that his usage was not much changed, and from what I have seen I believe
this to be true. Oddly enough T-Mobile will not provide a list of the
charges against your account - so there is no way of spotting any
erroneous items.</p>
<p>Without any sort of accountability, you have to wonder if T-Mobile is
lying to increase their profit.</p>
<p>I let the minutes run out on the T-Mobile phone, and started looking for
a reasonable replacement. Another round of reading through cell phone
company agreements has left me throughly disgusted with all the major
outfits offering service. His new phone is on the way. Will have to see
if the new service works out any better.</p>
Better schools - make sure of what you measure2006-10-27T00:00:00Zhttps://bannister.us/weblog/2006/better-schools-make-sure-of-what-you-measure
<blockquote>
<p><a href="http://dailynews.com/news/ci_4557582">LAUSD added more charter schools in
fall</a>
via
<a href="http://www.cato-at-liberty.org/2006/10/27/it%E2%80%99s-not-fair-your-schools-are-designed-to-work-better/">Cato-at-liberty » It’s Not Fair, Your Schools Are Designed to Work
Better!</a></p>
<p>District officials, as well as the president of the teachers union,
bristle at assertions by the Charter Schools Association that middle
and high school charters are significantly outperforming their
district counterparts.</p>
<p>A fairer comparison would be with the district's magnet schools, which
outperform charters, school board member Jon Lauritzen said.</p>
<p>"I think it's basically unfair to compare an entity that is able to
take their entire budget and focus it entirely on their own schools,"
he said. "They have some real advantages over our schools in the
flexibility of actually providing the type of education that a
particular community wants, whereas we are trying to provide a
curriculum that works for everyone all across the school district."</p>
</blockquote>
<p>Lauritzen is right about the comparison. Probably the strongest factor
is a school's success is the attitude of the parents. Motivated students
usually come from motivated parents. Motivated parents will make an
extra effort to place their kids in better schools. So both "magnet" and
"charter" schools are getting the best students. The ordinary public
schools are getting the average students (and worse). Comparing student
performance between the different schools tells you much more about the
students than the schools.</p>
<p>For one dramatic example - in Orange County I have met public school
teachers who took a substantial pay cut to come the Irvine school
district from Los Angeles. In the LA school district teaching was very
difficult, due to unmotivated students and disinterested parents. In
Irvine - as at my local public school - parents are very interested, and
the kids reflect their parent's interest.</p>
<p>As another example, I went to one classroom activity where the teacher
ended up with more(!) parent volunteers that students. One of the
parents mentioned that at her kid's old school (in Santa Ana?) the
teacher would be lucky to get more than one or two volunteers. When I
see a request for parent volunteers, the teacher usually specifies the
<strong>maximum</strong> number of volunteers she can use. (Come to think of it, I do
not remember a teacher ever specifying a <em>minimum</em>...) Public schools
can do well when the parents (and students) are motivated.</p>
<p>I like the idea of both "charter" and "magnet" schools, as it gives
motivated parents the chance to place their kids in a better learning
environment - with other motivated students. But you cannot compare
<em>schools</em> when the <em>student</em> populations are very different.</p>
UCSD Students Fear2006-10-16T00:00:00Zhttps://bannister.us/weblog/2006/ucsd-students-fear
<blockquote>
<p><a href="http://cryptome.org/teach-fear.htm">UCSD Students Fear "Operation College
Freedom"</a></p>
<p>Some of us on campus tried to do the simple act of circulating a letter
opposed to wasting so much money on this ["Operation College Freedom"]
in the name of the war on terror and further militarizing our campus.</p>
<p>Unfortunately, the climate of fear at universities in the US has gotten to
such a height that no one would sign on. We even asked for suggestions and
changes in the wording, but no one replied with those either.</p>
<p>Maybe the letter wasn't all that great, but 3 people specifcally told us
that they were "scared" to put their names on the letter.</p>
</blockquote>
Terrorist threat (not) from a 14-year-old girl2006-10-16T00:00:00Zhttps://bannister.us/weblog/2006/terrorist-threat-not-from-a-14-year-old-girl
<blockquote>
<p><a href="http://www.wired.com/news/wireservice/0,71953-0.html?tw=rss.index">Wired News: SS Nabs Teen for Online
Vent</a>
Federal authorities had found the page and placed Wilson on their
checklist. They finally reached her this week in her molecular biology
class. The 14-year-old freshman was taken out of class Wednesday and
questioned for about 15 minutes by two Secret Service agents. The
incident has upset her parents, who said the agents should have
included them when they questioned their daughter.
.....
They also said the agents should have more quickly figured out they
weren't dealing with a real danger. Ultimately, the agents told the
teen they would delete her investigation file.</p>
<p>Assistant Principal Paul Belluomini said the agents gave him the
impression the girl's mother knew they were planning to question her
daughter at school. There is no legal requirement that parents be
notified.</p>
</blockquote>
<p>Oh yes, this is a fine example of how good government should behave in a
free society (not). Got to suppress the terrorist threat from teenage
girls. Without this sort of constructive expenditure of government
resources, we could have - who knows how many? - presidential
assassinations.</p>
<p>This should scare a lot of teenagers into <strong>not</strong> wanting to question
our government. Make them into good little conformists. Next time you
are at your local high school, check out the posters and notices. How
many are about obediance? Are we educating informed and active citizens,
or scared serfs? What do you think?</p>
Political revenge and the Orange County Sheriff2006-10-16T00:00:00Zhttps://bannister.us/weblog/2006/political-revenge-and-the-orange-county-sheriff
<blockquote>
<p><a href="http://www.latimes.com/news/local/orange/la-me-hunt16oct16,1,882030.story?coll=la-editions-orange&ctrack=1&cset=true">Suspended Lawman's Wait for Resolution Stretches to 4
Months</a>
Hunt was suspended the day after he failed to unseat Carona in a
politically charged fight that created divides throughout the
department. Carona was backed by most area politicians, but Hunt
earned the support of the department's deputies. In the end, it was
statements Hunt made during the campaign — such as suggesting that
Carona's administration had been tarnished by scandal — that
apparently led to his suspension.</p>
</blockquote>
<p>This is an instance where we could use a bit more of a free market - and
illustrates a problem. The most qualified potential opponents to a
locally-elected Sheriff are going to be largely found within his own
department. If playing the role of both an opponent and employee is
essentially impossible, then the position of the elected Sheriff is
perhaps too secure.</p>
<p>Years ago, Carona was the head of what amounts to a group of security
guards for the Orange County courts - not exactly the sort of experience
essential to heading a large police organization. When Carona first ran
for Sheriff, two of the candidates (one of them Carona) came and spoke
at a local venue. My
<a href="http://bannister.us/weblog/2005/first-impressions/">first impression</a>
of Carona - admittedly tenous - was that I did not trust the guy.</p>
<p>Looked at from another aspect, this may illustrate why meeting
politicians on a local level may be a very good idea. Televised speeches
and written articles can be carefully crafted by intermediaries to hide
a candidate's true nature. On a direct physical meeting there are all
sorts of clues that may give away the candidate's character, to the keen
observer.</p>
Wholesale - not retail - vote fraud2006-10-11T00:00:00Zhttps://bannister.us/weblog/2006/wholesale-not-retail-vote-fraud
<blockquote>
<p><a href="http://www.cato-at-liberty.org/2006/10/11/voter-fraud-and-other-political-facts/">Cato-at-liberty » Voter Fraud and Other Political
Facts</a>
The House bill to require photo ID for voting rests on the premise
that voter fraud is a significant problem. It turns out that premise
is a little shaky. A report prepared for the U.S. Election Assistance
Commission has found little evidence of polling-place fraud, according
to USA Today.</p>
<p>The Commission on Federal Election Reform (Carter-Baker Commission)
found “no evidence of extensive fraud in U.S. elections or of multiple
voting,” though it does occur and could affect a close election. To
inspire confidence in the system, the Commission recommended using the
national ID card created by the REAL ID Act as a voter registration
card. Proof of citizenship would be required to get a driver’s
license, tightening government control of the citizenry just a little
more."</p>
</blockquote>
<p>Stealing enough individual votes is expensive and risky (too many people
involved). Better to change the votes at one upstream point.</p>
<p>I volunteered to host and run the local polling place several years
ago - in part to see how things worked, and in part to guarantee that at
least the local part of the voting process was handled honestly. The
thing is - once the votes leave my hands, I cannot offer any sort of
guarantee as to what happens to the votes afterward.</p>
<p>Looked at as a system of security, the collection of votes is very
vulnerable to subversion upstream. In any sort of system you want to be
reliable, you want to look for and avoid single points of failure.
Lacking any sort of checks and balances, the points where votes are
collected in mass look most vulnerable.</p>
<p>We can do better, but that will take both the will and the right
expertise.</p>
What is next?2006-10-11T00:00:00Zhttps://bannister.us/weblog/2006/what-is-next
<p>Ever reach a point where you settled, but not enthusiastic?</p>
<p>Professionally, I have enough experience (or ego - take your pick) to
think I am pretty damn good at what I do. At the same time, I am finding
it rather hard to stay motivated.</p>
<p>On the one side, of all the work I have done over the past 25-odd years,
most has become obsolete and fallen out of use. An understandable
consequence of working in a rapidly evolving field ... but still.</p>
<p>On the other side, I am in the middle of a multi-year effort that I know
will pay off nicely for both my employer and their customers ... but it
is not going to make any real difference to me, on any practical level.
And yes, I have enough knowledge (or ego) to believe that without my
participation the same effort will take years longer, or fail.</p>
<p>Almost every prior employer offered a stock option plan, or something
similar, so that you felt that if you made an extraordinary
contribution, there was at least a chance that when the company did
well, you would also be well-rewarded. My current employer is different.
As a privately owned company, there are no stock options. The company
owner (an individual) makes a practice of acquiring other software
companies, and thinning out the staff (but so far as I have seen, never
to the point of degrading customer service). Logically, given the
maturity of the industry and the needs of customers, from an outside
perspective this all makes sense.</p>
<p>My current employer, like many others, has dabbled in out-sourcing.
Taken in combination, it is entirely possible I could finish an
extraordinary piece of work, and find my job exported the next day ...
not real encouraging.</p>
<p>Current crazy southern California housing prices mean I could sell my
house and retire to somewhere nicer. But ... I like to work, and have a
weakness for tackling the bleeding-edge almost-undoable. I could go and
work for one of the really interesting software companies, but they tend
to locate in dense suburban areas ... the kind of places I want to move
away from.</p>
<p>The last several years I have been able to work from home. Divorced with
shared custody of my kids, that is a tremendous advantage. The idea of
commuting to work in a cubicle or office, just is not appealing.</p>
<p>So ... what is next?</p>
Impact of the web on a tailor2006-10-11T00:00:00Zhttps://bannister.us/weblog/2006/impact-of-the-web-on-a-tailor
<p>The tailor-made clothing business is getting squeezed out of Savile Row
in London. One tailor who keeps a very decent weblog has seen a pretty
good bump in his business. Seems he is primed to take full advantage.</p>
<blockquote>
<p><a href="http://www.englishcut.com/archives/000204.html">english cut: bespoke savile row tailors: coming
together...</a>
Thankfully, because of modern communication and transport we can work
anywhere. OK, the logistics mean that a suit which would usually be
made in three months on the Row, may now take three months and three
days, but no big deal. You won’t be lining landlords' pockets, and
tailors will be able to sleep at night, without worrying about the
big, bad landlord and his neverending price hikes.
...
So you will have gathered by now that I’m hatching a cunning plan. My
aim is to have the very best available skills in tailoring based here
at, or near Warwick Hall, working together in an environment conducive
to creating beautiful clothes, without anyone having to worry about
the rent and the cost of living. These people are all trained on the
Row, are at a prime age, and amongst the very best in their
profession. We have the potential to build a really vibrant tailoring
community here in Cumbria, as good as anything on the Row, that will
not only turn out some of the best tailoring in the world, but also
ensure the craft's long-term survival and the happines of the people
working in it.</p>
<p>I hope to have all these people, including most importantly, the new
apprentices, all under one roof.
<img src="http://www.englishcut.com/stable481.jpg" alt="Digs for a less-simple
tailor." />
The roof will be a converted 18th Century stable block here on the
Warwick Estate. A beautiful Georgian loft, with views across the
countryside. I'm am in the process of arranging the rebuilding of the
stable block as we speak.</p>
<p>God willing, here we will be able to really secure the future of this
craft, without being crucified by West End London rents ...</p>
</blockquote>
<p>Sounds like future 007 movies will have to be written with Bond getting
his suits from Warwick.</p>
Dreams, and other nonsense2006-10-11T00:00:00Zhttps://bannister.us/weblog/2006/dreams-and-other-nonsense
<p>I had a dream last night (when I wrote this) - probably nothing unusual
in that. What was unusual was remembering much of the rather vivid dream
in the morning.
......
The first segment was in the amber light of late afternoon, near
sunset. What folk were left (humankind was scarce) lived in a series of
artifical caverns, with the entrance a large opening in the east of a
large hill.</p>
<p>Before sunset you had to be back in the caverns, because the night was
dangerous. The night was owned by folk that were once human, who looked
human, but were now something else. They could not go about in daylight,
but if they caught you out at night, you would become one of them. Once
"touched" you would no longer age in the normal fashion, but would
become something evil.</p>
<p>I did not much like living in the caverns, and had wandered further
afield during the day than most. As I came back toward the large
brightly light entrance, the side of the hill and the ground below were
in shadow. As I came to a plain bridge crossing a small stream, I could
see the Touched in the shadows, and knew the entrance could no longer be
reached.</p>
<p>Careful to avoid notice, I went south along the east side of the stream.
After a bit I came to a place were the stream could be crossed. The
hills were lower, so the ground between was still lit by the sun. I
climbed west and up into the hills.</p>
<p>In the hills were the few homes of those individualistic enough to not
want to live in the caverns. To survive the night I needed to find
shelter. But approaching any of the homes was dangerous. Some had fallen
and were inhabited by the Touched. Those not fallen would be suspicious
of and possibly hostile to the unexpected visitor.</p>
<p>(... don't remember what came between ...)</p>
<p>In the next segment, I stepped out the front door on a night brightly
lit by a full moon. The neighborhood was much like the endless anonymous
miles of suburbs in west-central Orange County. My house was small and
single story built in the style of fifty or so years ago, as were the
other houses in the neighborhood. There were no street lights near.</p>
<p>Across the street was a fair sized park, and across the park was the
usual four lane divided arterial road, lit with traffic and street
lights.</p>
<p>My house was on a corner. I do not know what brought me outside. It was
late. The neighborhood was dark and quiet. It seemed that everyone else
was asleep.</p>
<p>I noticed a locomotive - of the large old steam kind used just prior to
WWII - coming east down the street toward me. I looked for tracks in the
street, but expected and found none. This was unusual enough, but as the
locomotive banked silent and graceful around my corner, I noticed the
wheels were about a foot off the ground. The locomotive went north on
the street between my house and the park. At the end of the short block,
it then took the next left, moving away from the park just a bit more
quickly than I could follow.</p>
<p>After an astonished moment, I went back inside. What else could I do?
Ask my mostly-sleeping neighors if they had noticed a floating
locomotive in the middle of the night?</p>
<p>A few hours later I became aware of a gathering in the park across from
where I had seen the locomotive make its last turn. Dozens of others had
seen the same odd event, and were gathered to find some sort of
explanation.</p>
<p>A few official looking folk had showed up and were going to explain
events as soon as everyone had gathered. Rather than wait around for the
last few stragglers to show up, I went back to my house for a short
time. When I came back out, I found the crowd disbursing, with no memory
of any unusual events. Going back to where the crowd had been, there
were a few confused folk who still retained memories of the odd event.</p>
<p>Somehow at this point I found that I could fly, or more exactly, float -
much as had the odd locomotive. The few who had not lost their memory,
when encouraged, found that they could float as well, though with
difficulty as great concentration was needed.</p>
<p>(... another lost transition ...)</p>
<p>Later a new artificial tunnel was found that spanned clear across the
continent. Who had created the tunnel was a mystery, though a supply of
gadgets were found that needed to be installed before the tunnel was
usable. As built the tunnel was unlit and somehow dangerous. There were
small units that had to installed in the ceiling at regular intervals,
and could only be installed by those who had been given the gift of the
odd limited form of flying. Walking was somehow impossible in the
unequiped sections of tunnel.</p>
<p>In spite of the unexplainable existance of the tunnels, they did not
attract much attention. The tunnels were only really usable for walking,
being too small for cars, and somehow unsuitable for any other sort of
use.</p>
<p>(... another gap ...)</p>
<p>We were at a very large aircraft hangar or warehouse with the stacks of
boxes containing the gadgets to be installed in the tunnels. Those who
had the limited gift of flight were receiving practice at flight, and
instruction on the equipment to be installed - though the instructors
had neither the gift of flight, or a clear understanding of the purpose
of the gadgets.</p>
<p>There were long rows of the large buildings with a wide span of concrete
between. Impatient with the instructors and the slow pace of the other
students, I went outside the large open hangar door, and a distance up
the sloped span of concrete, into the shade cast by the row of buildings
on the other side. There I was joined by a similarly impatient fellow
student. We had not been there long before a water came over the top of
the building, as though from a large intermittent-stream type sprinkler.
To avoid getting wet, we were forced back into the open hangar.
......
Where do dreams - discounting trite abstractions like "the subconscious
mind" - where does this odd stuff come from?</p>
Talent - better cheap and imported, or home-grown?2006-10-11T00:00:00Zhttps://bannister.us/weblog/2006/654
<blockquote>
<p><a href="http://www.cato-at-liberty.org/2006/10/11/the-global-contest-for-talent-and-brains/">Cato-at-liberty » The Global Contest for Talent and
Brains</a>
The 109th Congress failed to enact meaningful immigration reform to
allow more low-skilled immigrants to enter the Untied States legally.
An even bigger failure was its neglect of our need to attract and keep
more highly skilled workers from abroad.</p>
</blockquote>
<p>The other long-term part of the equation is making highly skilled
professions attractive to young Americans. When MIT engineering
graduates go to work as salesmen for mortgage brokers - because the pay
is better - you have a problem. When wages are declining and employment
uncertain, you can expect young people to largely go into different
fields. Easing the entry of cheap highly-skilled workers - more likely
to later leave with all their acquired experience - could be a rather
large long-term strategic mistake.</p>
<blockquote>
<p>" ... now India and China are sucking back their expats, and America’s
European competitors have woken up to the importance or retaining
their talent. "</p>
</blockquote>
<p>This "suction" will only get greater in the future. What strategy makes
the most sense in the long term?</p>
Today's handy tip - LRF replacement2006-10-04T00:00:00Zhttps://bannister.us/weblog/2006/todays-handy-tip-lrf-replacement
<p>When the <a href="http://www.digitallivingtoday.com/excite/yourdough/sales_droids/index.html">little rubber
feet</a>
(LRF) come off the bottom of your laptop - you could use this as an
excuse to buy a new laptop. On the other hand, if you are feeling a bit
less acquisitive, you might try re-attaching those annoying little bits
of rubber-like material. That is, you could try - if you can find the
detached feet.</p>
<p>Tried without success to re-attach the feet with super glue, rubber
cement, and hot glue. After the last attempt realized the rubbery "hot
glue" material might serve as pretty good feet all by itself. After the
first trial, ripped off the remaining rubber feet, and smeared on "hot
glue" replacements.</p>
<p>So far the replacements have served better and longer than the
originals. :)</p>
Deflecting the blame2006-10-01T00:00:00Zhttps://bannister.us/weblog/2006/deflecting-the-blame
<p><img src="http://www.ocmetro.com/NEW_SITE/current_issue/images/right1_campbell.gif" alt="untitled" /><a href="http://www.ocmetro.com/NEW_SITE/current_issue/political_columns_right.php"><strong>A
contract against America</strong>
What congressional Democrats won’t tell you about their plan for
America.
BY JOHN CAMPBELL
</a></p>
<p>Picked up the latest <a href="http://www.ocmetro.com/">OC Metro</a>, scanned the
latest local political column, and found the replacement Republican
congressman playing "shift the blame".</p>
<blockquote>
<p>" One factor contributing to the Republican successes of 1994 was the
“Contract with America” under which most Republican congressional
candidates signed on to a pledge of 10 things they would do if given
the majority in Congress. "</p>
</blockquote>
<p>Did those 1994 Republicans come remotely close to what they promised?</p>
<blockquote>
<p>" I like to call this list of proposals that are out of step with the
American public the Contract Against America: "</p>
</blockquote>
<p>(If you are not sure to which political party this should apply ... join
the club.)</p>
<blockquote>
<p>1. Increase spending:</p>
</blockquote>
<p>In case you did not notice, the Republican Party has a President and a
majority in both sides of Congress. What they have done with that
overwhelming control is <strong>spend money</strong> so fast they made the Democrats
look like rank amateurs. Incredibly disappointing if you thought the
"Contract the America" meant something.</p>
<blockquote>
<p>2. Increase taxes:</p>
</blockquote>
<p>Unless you believe money grows on trees, the money spent today has to be
collected as taxes - sooner or later. If you collect taxes today to
cover the money you spend, you're done. If you spend money now and
collect taxes later, you have to pay interest (and more interest the
longer you wait). The recent firehose of Republican spending means we
are going to pay taxes <strong>big time</strong> in the future - with added interest.</p>
<blockquote>
<p>3. Amnesty and open borders:</p>
</blockquote>
<p>OK, I am confused. Was it President Bush who had an amnesty plan for
illegal immigrants?</p>
<blockquote>
<p>4. Cut and run:</p>
</blockquote>
<p>As opposed to using Iraq as a giant pork barrel and leaving a mess for
the next generation. Inspiring choice that.</p>
<blockquote>
<p>5. An energy policy of “no”:</p>
</blockquote>
<p>Whereas Bush is promoting either Hydrogen (literally a waste of energy,
not a source) or more drilling for oil (only a very small fraction of
what we need). Neither is even remotely a viable long term strategy, or
even a short term strategy. Wait - which one is supposed to better??</p>
<blockquote>
<p>6. “Hillary Care” socialized medicine:</p>
</blockquote>
<p>The Republican solution, at least so far, is to do nothing useful
whatsoever. When healthcare costs increase at a rate that far exceeds
the rate of inflation - for what, three or fours decades? - you might
think we should try and do ... something. When businesses all across the
nation stagger under the ever-increasing costs of healthcare plans for
their workers - you might think the critters in Congress would see there
is a problem the private sector cannot address on it's own. Instead the
Republicans have spent the past several years pretending the problem
does not exist.</p>
<blockquote>
<p>7. Impeach the president:</p>
</blockquote>
<p>Wait ... wasn't that what the Republicans wasted a lot of time and money
trying to do to Clinton? Lets see ... Clinton got a blowjob in the White
House. Bush blew away about a trillion or two taxpayer dollars (plus a
several thousand soldiers), and tried to turn the United States into a
police state. Which one should be impeached?</p>
<blockquote>
<p>8. More unfunded and unfundable pensions and benefits:</p>
</blockquote>
<p>When you spend a lot more (a huge, gigantic, astronomical amount more)
than you collect in taxes, a lot of things are going to be "unfundable"
in the future.</p>
<blockquote>
<p>9. Bankrupt Social Security and Medicare:</p>
</blockquote>
<p>See numbers 1, 2, and 8 above.</p>
<blockquote>
<p>10. More for trial lawyers:</p>
</blockquote>
<p>Hmmm ... you know what? I cannot call this one. Given recent history and
the fact the Republican politicians are pretty much all lawyers, I won't
be placing any bets.</p>
<p>While the Democrats are by in large fairly uninspiring, the Republicans
in control gave us a huge train wreck. So the clear choice is ... not at
all clear. What is very clear is that the current power block in the
Republican party is not serving Republican voters or doing good for the
country as a whole.</p>
This is a laptop.2006-09-30T00:00:00Zhttps://bannister.us/weblog/2006/this-is-a-laptop
<p><a href="http://www.ego-lifestyle.com/news-photos-jackiesummerfair2006.htm"><img src="http://www.ego-lifestyle.com/img/new/photos/jackiesummerfair/05.jpg" alt="laptop" /></a>
No, I am not kidding...</p>
Calif. eliminates city-by-city cable deals2006-09-30T00:00:00Zhttps://bannister.us/weblog/2006/calif-eliminates-city-by-city-cable-deals
<p>Good news for California consumers:
<a href="http://www.msnbc.msn.com/id/15066073/">Calif. eliminates city-by-city cable deals - U.S. Business -
MSNBC.com</a></p>
<p>While I have have a very high opinion of my current cable/Internet
providor (Cox Communications), a little competition would be a good
thing. The wholesale cost for bandwidth on the internet is way down, so
you might expect more as an end user. Absent effective competition, the
cable company lacks motivation to either raise performance or lower
prices.</p>
Avocados - Proof of Atlantis2006-09-30T00:00:00Zhttps://bannister.us/weblog/2006/avocados-proof-of-atlantis
<p>Avocados are a curious fruit. Aside from tasting good and being good for
you, avocados have some odd properties.</p>
<ul>
<li>Avocados only ripen <strong>after</strong> picking.</li>
<li>Fruit can be stored <strong>on the tree</strong> for long periods.</li>
<li>The evolutionary model - why avocados evolved - does not seem to
make sense.</li>
</ul>
<p>The odd bit about history is that what we know thins out remarkably past
a few thousand years. Most of the artifacts of civilization do not last
very long (when figuring in thousands of years). Given how only a few
thousand years erases almost all traces - of a civilization 10,000 or
100,000 years old there may be no surviving trace. Evidence of far older
civilizations - say an intelligent offshoot of dinosaurs 100,000,000
years back - may be impossible to find.</p>
<p>Buildings crumble, metal rusts, even surface traces eventually get
erased by the wear and churning of the Earth's crust - but plants
reproduce and spread from location to location. If there were a truly
ancient civilization it is possible that the only remaining trace would
be plants that they bred to produce food. How would you spot such a
plant? Look for behavior that makes sense when used to produce food for
humans, but not otherwise.</p>
<p>Avocados seem to be just such a plant.</p>
<p>OK, so I do not really think that this <strong>proves</strong> anything about ancient
civilizations (let alone Atlantis). On the other hand, we cannot quite
rule out the possibility. Fun to think about. :)</p>
Yet another puff-piece about a non-existant shortage2006-09-28T00:00:00Zhttps://bannister.us/weblog/2006/non-existant-shortage
<p><a href="http://www.cato-at-liberty.org/2006/09/28/americas-help-wanted-signs/">America’s “Help Wanted” Signs</a>
based on:
<a href="http://www.washingtonpost.com/wp-dyn/content/article/2006/09/27/AR2006092701996.html">Visas for Skilled Workers Still Frozen - washingtonpost.com</a></p>
<p>Oh please, not
<a href="http://bannister.us/weblog/2006/engineering-gap-fact-and-fiction/">again</a>.
Last I knew the salaries for engineers were pretty flat. If there is a
shortage, you would expect salaries to rise. So, I'm guessing the
shortage is (another) myth.</p>
<p>They never have trouble getting this stuff published.</p>
Missing backstory for spinach?2006-09-19T00:00:00Zhttps://bannister.us/weblog/2006/missing-backstory-for-spinach
<p>Seems like this is a simple sort of connect-the-dots story.
<a href="http://www.msnbc.msn.com/id/14911423/">California farmers plow spinach fields under - U.S. Business -
MSNBC.com</a></p>
<p>Most of the agro-workers in California are illegal immigrants. Illegal
immigrants working in the fields do not get any sort of health care.</p>
<p>E.Coli is a bacteria common in every human stomach. There are lots of
different strains of E.Coli - so what lives in one person's stomach
without harm might make another guy very sick.</p>
<p>So we get a very sick Mexican (most likely) taking a dump (a symptom of
this strain) in a spinach field. The harvested spinach all goes into one
batch washed together - contaminating the entire batch. The bagged
spinach is eaten by a large number of folk - some who die from the
unfamiliar E.Coli strain.</p>
<p>Maybe we do care about the health of farm workers.</p>
Is T-Mobile "To Go" ripping off customers?2006-09-10T00:00:00Zhttps://bannister.us/weblog/2006/is-t-mobile-to-go-ripping-off-customers
<p>Got my son a pre-paid T-Mobile "To Go" phone. For the first several
months he did a good job, and only burned through about 200 minutes a
month.</p>
<p>Lately it seemed like his minutes were dropping a bit fast, so we
started paying closer attention. Odd since I have not noticed a change
in his usage. Seems that in a week his minutes dropped by over 120
minutes with only 20 calls showing in the phone's log. Since my son
generally seems to make fairly short calls, the ~6 minutes average per
call sounds wrong. Poked around on the T-Mobile site, and there seems no
way to tell how the minutes are used. Surely they have the data, why is
it not accessible online?</p>
<p>Seems like on the last two days, the minutes dropped by ~30 each day.
Seems rather high ... but there is no way to check how the minutes were
consumed. Sent an inquiry into T-Mobile. No response, as yet.</p>
<p><strong>Update:</strong> No response to email at all after <strong>three</strong> weeks. This
stinks. Called their customer number after watching his account drop by
~500 minutes in two weeks(!). Guess what? They cannot (or perhaps more
likely <strong>will not</strong>) let you see a list of charges against your "To Go"
phone. Right. So if there are bogus charges appearing on your account,
you have no way of knowing.</p>
<p>Has my son really started burning ~33 minutes on his phone every single
day? If so, I have not seen it.</p>
<p>At this point I simply do not trust the T-Mobile company or "To Go"
service. After the minutes run out, we will look for another provider
(not T-Mobile!).</p>
Ten states in eight days2006-09-05T00:00:00Zhttps://bannister.us/weblog/2006/ten-states-in-eight-days
<p>Left California for my nephew's wedding in Milwaukee. I-15 through
Nevada, Arizona, and Utah. I-70 across Utah into Colorado. I-76 up to
Nebraska. I-80 across Iowa into Illinois, then shorter segments into
Wisconsin. Coming back will jog south to Flagstaff, crossing a bit of
New Mexico. Final score - ten states in eight days. :)</p>
<p>Crusing through Utah, Colorado, and Nebraska is very nice. Iowa a bit
less so - though they have (badly configured) free wireless at rest
stops. Illinois and Wisconsin were not so nice (more traffic, not very
nice rest stops). California is not nice. Nevada is a bit better. Next
trip - stay in the middle (east of California and west of Iowa), and
head more north.</p>
Worth repeating - what Al Gore really said about the Internet2006-08-27T00:00:00Zhttps://bannister.us/weblog/2006/worth-repeating-what-al-gore-really-said-about-the-internet
<p>Doing my 2¢ to kill a meme...</p>
<blockquote>
<p><a href="http://www.snopes.com/quotes/internet.asp">Urban Legends Reference Pages: Internet of
Lies</a>
Claim: Vice-President Al Gore claimed that he "invented" the
Internet.</p>
<p>Status: False.</p>
<p>Origins: Despite the derisive references that continue even today, Al
Gore did not claim he "invented" the Internet, nor did he say anything
that could reasonably be interpreted that way. The "Al Gore said he
'invented' the Internet" put-downs were misleading, out-of-context
distortions of something he said during an interview with Wolf Blitzer
on CNN's "Late Edition" program on 9 March 1999.</p>
</blockquote>
<p>As it turns out, it is reasonably accurate to say Al Gore was a strong
supporter in Congress of the early Internet, and thus helped create the
Internet we have today. On this topic, Vint Cerf has got to know as much
or more than pretty much anyone else.</p>
<blockquote>
<p><a href="http://web.archive.org/web/20000125065813/http://www.mids.org/mn/904/vcerf.html">Vint Cerf responded to
MSNBC</a>
Vint Cerf responded to MSNBC</p>
<p>From http://www.msnbc.com:80/news/249325.asp (which has apparently
subsequently timed out). See also ``Revisionist Internet History.''
—jsq</p>
<p>Vint Cerf responded to MSNBC's questions about the Net's origins with
this e-mail:</p>
<p>VP Gore was the first or surely among the first of the members of
Congress to become a strong supporter of advanced networking while he
served as Senator. As far back as 1986, he was holding hearings on
this subject (supercomputing, fiber networks...) and asking about
their promise and what could be done to realize them. Bob Kahn, with
whom I worked to develop the Internet design in 1973, participated in
several hearings held by then-Senator Gore and I recall that Bob
introduced the term ``information infrastructure'' in one hearing in
1986. It was clear that as a Senator and now as Vice President, Gore
has made it a point to be as well-informed as possible on technology
and issues that surround it.</p>
<p>As Senator, VP Gore was highly supportive of the research community's
efforts to explore new networking capabilities and to extend access to
supercomputers by way of NSFNET and its successors, the High
Performance Computing and Communication program (which included the
National Research and Education Network initiative), and as Vice
President, he has been very responsive to recommendations made, for
example, by the President's Information Technology Advisory Committee
that endorsed additional research funding for next generation
fundamental research in software and related topics. If you look at
the last 30-35 years of network development, you'll find many people
who have made major contributions without which the Internet would not
be the vibrant, growing and exciting thing it is today. The creation
of a new information infrastructure requires the willing efforts of
thousands if not millions of participants and we've seen leadership
from many quarters, all of it needed, to move the Internet towards
increased availability and utility around the world.</p>
<p>While it is not accurate to say that VP Gore invented Internet, he has
played a powerful role in policy terms that has supported its
continued growth and application, for which we should be thankful.</p>
<p>We're fortunate to have senior level members of Congress and the
Administration who embrace new technology and have the vision to see
how it can be put to work for national and global benefit.</p>
</blockquote>
<p>Of course, there were lots of folks around at the same time, who did not
have a clue about the importance of the Internet. If you were one of
those political blockheads, you would want to do anything to deflect
attention away from your cluelessness. Better make fun of the guy who
<strong>did</strong> have a clue.</p>
<p>(In fact there still at least a few in Congress <a href="https://bannister.us/weblog/2006/27b-stroke-6">without a
clue</a>.)</p>
Subtext - and alternate representations of program structure2006-08-21T00:00:00Zhttps://bannister.us/weblog/2006/subtext-and-alternate-representations-of-program-structure
<blockquote>
<p><a href="http://alarmingdevelopment.org/?p=44#more-44">Alarming Development » Blog Archive » Alice in
Subtext-land</a>
"Let’s face it: syntax is a simple and intuitive way to represent
structure. But a fundamental principle of Subtext is to avoid
syntactically encoding programs so that their semantics are explicit
and immediate. It should be possible to use syntactic techniques as a
visualization in the UI instead of as a representation of the source."</p>
</blockquote>
<p>Like a lot of other software folk, I find the attempts at "Visual
Programming" intriguing ... but not always compelling. It sure <em>seems</em>
like there should be a better representation for programs that would
accelerate the development process ... but no one has yet come up with
anything useful.</p>
<p><a href="http://subtextual.org/AboutMe.htm">Jonathan Edwards</a> is taking another
run at this problem. I wish him luck. Parts of the offered
<a href="http://subtextual.org/demo1.html">demo</a> are compelling ... and other
parts less so.</p>
<p>The example data based execution, live/dead code highlighting, and
presentation of intermediate values is all rather interesting. I can't
help but feel the difference between program text and the in-memory form
is over-stated, or at least mis-stated. On current machines translation
from text to in-memory form (and back) takes a very small fraction of a
second - not a significant chunk of time in the development process
(unless repeated far more often than truly necessary).</p>
<p>At one point in the demo, as an aside, Jonathan says he might actually
write more test cases, given the illustrated dynamic evaluation against
example data. It was meant as a joke, but perhaps this is a clue. The
graphic representation of low-level program structure might not be
(usually) compelling, but the ability to evaluate against example data -
and minutely inspect the evaluation - might be very useful indeed.</p>
<p>Eh. This is more of a brain-dump than a hard-edged outline. I see both
graphic and textual forms as alternate representations of the same
underlying program structure. I do not see either form as exclusively
superior. Reading program source to puzzle out the inputs (values read)
and outputs (values changed) is tedious and error-prone. Flipping the
representation to a form that makes the inputs (and where used) and
outputs (and where changed) could be a big boost. Maybe the graphic form
is more useful at a larger granularity (for composition and presentation
of structure), the text form the compact detailed view, and the minute
graphic form for the rare occasion when a detailed view of an example
computation is needed.</p>
Patriotic Girl Reporter2006-08-17T00:00:00Zhttps://bannister.us/weblog/2006/patriotic-girl-reporter
<p><a href="http://www.flickr.com/photos/borisvienna/212474998/"><img src="http://static.flickr.com/82/212474998_c75a2bd57e.jpg" alt="reporter" /> Orwells reporter lady on Flickr - Photo Sharing!</a></p>
Mobile phone advertising offered as journalism in Wired News?2006-08-17T00:00:00Zhttps://bannister.us/weblog/2006/mobile-phone-advertising-offered-as-journalism-in-wired-news
<p>Ran across a puff-piece in Wired News covering new cell phones. Gosh,
they really sound wonderful.
<a href="http://www.wired.com/news/technology/gizmos/0,71600-0.html?tw=rss.index">Wired News: Mobile Phones Worth Gabbing
About</a></p>
<p>Why are the published cell phone reviews so uncritical - and essentially
untrustworthy?</p>
<p>Every cell phone I have owned up to and including my current Motorola
Razr is a design disaster. I had higher hopes for the Razr - a (then)
brand-new design from a company with a long history as a manufacturer of
mobile phones. Instead I got arguably the worst-designed phone so far of
all those I have owned. This not-so-wonderful phone offers:</p>
<ul>
<li>A battery that dies unpredictably and cannot be counted on to last
an entire day (when almost unused).</li>
<li>A screen unreadable in daylight.</li>
<li>Buttons too small for an adult male's fingers.</li>
<li>A camera billed as 1 megapixel that in quality is only passable at
640x480.</li>
<li>Obscure icons that have to be deciphered with the phone's manual.</li>
<li>A truly painful user interface when doing anything with photos.</li>
<li>Buttons on the outside edge so that you will trigger at least one
when picking up the phone, with no obvious way of telling which
button was pressed, or how your phone was affected.</li>
<li>A USB port for charging and data transfer - which would have been
very cool except that it complains if connected to any other than a
Motorola "approved" charger, and is completely unrecognized by your
computer without additional (somewhat overpriced) software.</li>
</ul>
<p>I could go on - and have <a href="http://bannister.us/weblog/index.php?s=design+phone+user">with prior
phones</a>.</p>
<p>We really very badly need someone doing good critical reviews of cell
phones.</p>
Judge Halts NSA Snooping (maybe)2006-08-17T00:00:00Zhttps://bannister.us/weblog/2006/judge-halts-nsa-snooping-maybe
<blockquote>
<p><a href="http://www.wired.com/news/politics/0,71610-0.html?tw=rss.index">Wired News: Judge Halts NSA
Snooping</a>
A federal judge ruled Thursday that the government's warrantless
wiretapping program is unconstitutional and ordered an immediate halt
to it.</p>
</blockquote>
<p>Think they will really shut this down? Want to bet?</p>
<p>Expect at the very least they (NSA and the Administration) will drag
their feet as long as possible. The next act will be to report the
program shut down, and continue operation under a different name.</p>
<blockquote>
<p>The government argued that the program is well within the president's
authority, but said proving that would require revealing state
secrets.</p>
</blockquote>
<p>"<a href="http://technologyfront.com/journalism/2000/07/25.html">Trust</a>
<a href="http://www.triskele.com/actuary/2004/02/29/trust-us-were-the-government/">us</a>,
<a href="http://www.soonerthought.com/archives/924">we're</a>
<a href="http://michaelw.net/Articles/Trustuswerefromthegovernm.html">from</a> the
<a href="http://www.house.gov/paul/tst/tst2003/tst082503.htm">government</a>."</p>
Why bother?2006-08-08T00:00:00Zhttps://bannister.us/weblog/2006/why-bother
<blockquote>
<p><a href="http://weblog.infoworld.com/udell/2006/08/08.html">High-priority media
apps</a></p>
<p>For most people, most of the time, a faster computer won't make much
of a difference. There's nothing CPU-intensive about reading and
writing email, surfing the web, or using most other applications. The
notable exception to the rule, of course, is audio and video
processing. Nowadays I often find myself staring impatiently at
progress meters in Audacity, Audition, Camtasia Studio, and iMovie
while I filter and compress large media files. No matter how fast your
computer, in these situations you need it faster.</p>
<p>To hurry things up, I boost the priorities of these apps. If a process
is already running you can do that with Task Manager on Windows, or
the renice command on OS X. But since I nearly always want to give
these media apps as many cycles as I can, I'd rather just bump their
priorities at launch. You can do that with scripts containing [...]</p>
</blockquote>
<p>Given that on an otherwise-idle machine very little CPU is going to
anything else, boosting the process priority is very unlikely to make a
human-perceptible difference. In other words, unless you want video
games running in background (bad idea), boosting the process priority is
pretty much a waste of time.</p>
<p>In fact, if writing a similar application, I would likely <strong>drop</strong>
priority of the thread doing the heavy processing. Why? Because if the
machine is otherwise idle, altering priority makes little or no
difference in processing time. On the other hand, if the user wants to
do something else (in foreground), my application should not interfere.
Put differently - the customer is always right. Anything the user wants
to do in foreground (at normal priority) should take precedence over
another application performing heavy processing in background.</p>
<p>I am somewhat concerned that Jon's example will prompt less thoughtful
application designers to make exactly the <strong>wrong</strong> design decision, and
run compute-heavy threads at elevated priority.</p>
<p>The best advice Jon could offer to his friends to minimize processing
time is to shut down any unneeded applications, and simply leave the
machine alone.</p>
Cost of living2006-07-31T00:00:00Zhttps://bannister.us/weblog/2006/cost-of-living
<p><img src="http://www.ded.mo.gov/researchandplanning/images/indicators/cost_of_living/colm-2005q4.jpg" alt="costs" />
Hmmm - maybe Idaho?</p>
Training wheels for motocycles2006-07-29T00:00:00Zhttps://bannister.us/weblog/2006/training-wheels-for-motocycles
<p><a href="http://www.mtcvoyager.com/"><img src="http://www.mtcvoyager.com/images/top_logo.gif" alt="wheels" /></a></p>
Killing off a ghost2006-07-24T00:00:00Zhttps://bannister.us/weblog/2006/killing-off-a-ghost
<blockquote>
<p><a href="http://www.boeing.com/news/releases/2006/q3/060721a_nr.html">Boeing to Consolidate Southern California
Facilities</a>
ST. LOUIS, July 21, 2006 -- Boeing [NYSE: BA] has announced plans to
consolidate company facilities in Southern California over the next
four years. The Boeing facility in Anaheim, with about 3,700
employees, will relocate to the Huntington Beach facility.</p>
</blockquote>
<p>I grew up a few miles away from the massive Autonetics plant in Anahiem
(later Rockwell, recently Boeing). During the Cold War a tremendous
amount of engineering work took place at this location - any sort of
complete accounting would be impressive. Much of the very early
microelectronics technology was born here (all classified at the time).
Workers were told to transfer know-how from Autonetics to Fairchild, and
the Intel founders came from Fairchild. This along with many other
projects live on in technologies we use every day. This plant was the
very peak of high technology at the time.</p>
<p>The place now is a mere ghost of it's former self - and soon to be gone
entirely.</p>
<blockquote>
<p>"This plan provides a strong foundation for long-term stability and
competitiveness," said Gary Toyama, Boeing Integrated Defense Systems
(IDS) vice president, Southern California region. "Our vision is to
integrate and optimize our capabilities to meet customer
requirements."</p>
<p>Nearly all of the moves will occur within a 25-mile radius. Design and
construction in Huntington Beach will start immediately, with minor
employee moves. Significant employee relocations are anticipated to
start early in 2007 and will continue through 2010.</p>
<p>"As our programs change and mature, we will adjust accordingly to
provide a stable environment, reduce operation costs and maintain our
competitiveness in the marketplace," said Toyama.</p>
</blockquote>
<p>What this means is that Boeing is looking to shed a lot of employees.
Engineering jobs seldom pay especially well anymore (especially in the
defense industry were the pool of jobs is shrinking). Many employees are
going to live where housing is less expensive - a good long drive from
the existing Anahiem plant, and the new Huntington Beach location is
even further. Many older employees will retire rather than face the
unpleasant commute across Orange County.</p>
<p>If they were truly looking to reduce costs, they might chosen to shift
jobs to where costs were lower - outside the county entirely. The shift
to Huntington Beach just does not - for the stated reasons - make any
obvious sense.</p>
<blockquote>
<p>The company will work closely with the City of Anaheim to redevelop
the property in a manner that maximizes its economic benefit, both for
Boeing and the community. Boeing Realty Corporation will manage the
disposition of the Anaheim site.</p>
</blockquote>
<p>You can interpret this bit just as simply. Real estate in Orange County
is pricey. Closing the Anahiem location sheds the maximum number of
employees, and frees up land to be sold.</p>
<p>I would bet the leakage of weapons technology out of the country is
probably greater now than any time since WWII. For an engineer working
in the defense industry - poor pay and an uncertain future make the
temptation to "sell out" greater than ever. If presented with an
opportunity, why would you care - if neither you company or your country
seems to care in the slightest about your future?</p>
Giant Little Girl2006-07-21T00:00:00Zhttps://bannister.us/weblog/2006/giant-little-girl
<p>From <a href="http://www.thesultanselephant.com/">The Sultan's Elephant</a> event
in London.</p>
<p>
<embed style="width:400px; height:326px;" id="VideoPlayback" type="application/x-shockwave-flash" src="http://video.google.com/googleplayer.swf?docId=-1522158746296131750" />
[Giant Girl
Doll](http://video.google.com/videoplay?docid=-1522158746296131750&q=type%3Agpick)
</p>
<p>
One of an entire collection of videos...
<embed style="width:400px; height:326px;" id="VideoPlayback" type="application/x-shockwave-flash" src="http://video.google.com/googleplayer.swf?docId=-40569225333424244" />
[Sultan's
Elephant](http://video.google.com/videoplay?docid=-40569225333424244)
</p>
<p>
<object width="425" height="350"><param name="movie" value="http://www.youtube.com/v/zSwIFNJpxZQ" />
<embed src="http://www.youtube.com/v/zSwIFNJpxZQ" type="application/x-shockwave-flash" width="425" height="350" />
</object>
[The Sultan's Elephant](http://www.youtube.com/watch?v=zSwIFNJpxZQ)
</p>
Wonderful surreal nonsense...
<ul>
<li><a href="http://www.flickr.com/groups/30876692@N00/">Flickr: The Sultan's Elephant in
London</a></li>
<li><a href="http://www.nantes.fr/ext/royal%5Fde%5Fluxe%5F2005/">crashed ship</a></li>
<li><a href="http://spiritsdancing.typepad.com/spirits_dancing/2005/06/royal_de_luxe_n.html">... and a lot more
links.</a></li>
</ul>
Engineering Gap? Fact and Fiction2006-07-18T00:00:00Zhttps://bannister.us/weblog/2006/engineering-gap-fact-and-fiction
<blockquote>
<p><a href="http://www.businessweek.com/print/smallbiz/content/jul2006/sb20060710_949835.htm">Engineering Gap? Fact and
Fiction</a></p>
<ol>
<li>Shortages usually lead to price increases. If there were a
shortage of engineers, salaries should have risen. Yet in real terms,
engineering salaries have actually dropped (see BusinessWeek.com,
9/15/05, "Good Time to Learn Accounting").</li>
</ol>
</blockquote>
<blockquote>
<p><a href="http://www.mercurynews.com/mld/mercurynews/news/opinion/14523129.htm?template=contentModules/printstory.jsp">Shortage of skilled workers is a convenient
mirage</a>
Know any scientists or engineers who have been laid off in the last
five years?</p>
<p>Most readers would be able to answer ``yes'' to that question, but
you'd never know it from reading op-ed pieces by local academics and
senior managers from industry.</p>
</blockquote>
<blockquote>
<p>Thousands of highly trained scientists and engineers still roam
Silicon Valley looking for work after having been cut adrift by the
same types of people who now claim that they can't find anyone to
hire. And thousands more are now working in different fields at
substantially lower salaries, having given up searching for an
equivalent to their previous positions. ``No one I know who has
looked at the data with an open mind has been able to find any sign of
a current shortage,'' said demographer Michael Teitelbaum in the Wall
Street Journal's Nov. 16 front-page story, ``Behind `Shortage' of
Engineers: Employers Grow More Choosy.'' In a column titled ``A
Phony Science Gap?'' (Feb. 22), the Washington Post's Robert J.
Samuelson explained in detail why ``it's emphatically not true, as
much of the alarmist commentary on America's `competitiveness'
implies, that the United States now faces crippling shortages in its
technological elites.''</p>
</blockquote>
<blockquote>
<p>When the time comes for students whose parents grew up in the United
States to choose a college major, they will remember those
dinner-table conversations. When the best students, being rational,
start to desert science and engineering, businesses will have nobody
to blame but themselves. The solution will be the same one that
existed before the Reagan administration, as Harvard economist Richard
Freeman told Samuelson: ``If we want more (scientists and
engineers), we have to pay them better and give them better
careers.''"</p>
</blockquote>
Wiretapper's secrets?2006-07-16T00:00:00Zhttps://bannister.us/weblog/2006/wiretappers-secrets
<p>Great irony here...</p>
<blockquote>
<p><a href="http://www.wired.com/news/technology/1,71022-3.html">Wired News: Crashing the Wiretapper's
Ball</a>
"It's ironic that spooks so often remind us that we've got nothing to
fear from their activities if we've got nothing nasty to hide, while
they themselves are rarely comfortable without multiple layers of
secrecy, anonymity and plausible deniability."</p>
</blockquote>
<p>I believe secrecy in government, when allowed, should only be limited
and temporary. <strong>Everything</strong> done by government should be a matter of
record, and eventually public. This might be a confirmation of sorts.</p>
<blockquote>
<p>"The best conversation I had was with Robert van Bosbeek of the Dutch
National Police. I asked him if he was tempted to buy anything.</p>
<p>"Not really," he said with a laugh. "But it's always good to see
what's on offer. Basically, we're three or four years ahead of all
this."</p>
<p>He said that in the Netherlands, communications intercept capabilities
are advanced and well established, and yet, in practice, less
problematic than in many other countries. "Our legal system is more
transparent," he said, "so we can do what we need to do without
controversy. Transparency makes law enforcement easier, not more
difficult.""</p>
</blockquote>
New Friendster Message from Shawnna - 07/16/06 05:20 PM2006-07-16T00:00:00Zhttps://bannister.us/weblog/2006/new-friendster-message-from-shawnna-071606-0520-pm
<p>I feel so special!</p>
<blockquote>
<p><img src="http://photos.friendster.com/photos/19/18/30418191/31465974844461m.jpg" alt="special" />
<strong>From:</strong> Shawnna
<strong>Date:</strong> Sunday, July 16, 2006 5:20 PM
<strong>Subject:</strong> hey
<strong>Message:</strong> hey cutie, saw you online.. wanna kill some time
together?
hit up herearepages.com/shawnna for some more pics and my cam</p>
<p>XoXo
Shawnna</p>
</blockquote>
<p>I am sure that Shawnna and I have much in common! Heck, she is only two
years older than my son.</p>
Google's (not) Costly Rebellion2006-07-16T00:00:00Zhttps://bannister.us/weblog/2006/googles-not-costly-rebellion
<p>Another clueless (paid) journalist...</p>
<blockquote>
<p><a href="http://biz.yahoo.com/fool/060703/115194956316.html?.v%3D2&quicken=2">Google's Costly Rebellion: Financial News - Yahoo!
Finance</a>
According to a story published in today's edition of The New York
Times, Big Goo builds its own servers and could even get into the
business of creating its own chip designs.</p>
<p>There's already plenty of hubbub over whether these initiatives will
be good for the company or the industry at large. I have my opinions,
but I'm loath to share them. I believe doing so would detract from the
larger issue at hand -- namely, that Google has dramatically altered
the competitive dynamics in its industry. And that may prove to be
really, really bad.</p>
</blockquote>
<p>Put yourself in Google's shoes. You are continuously buying new servers,
both to expand capacity, and to replace older servers that are no longer
useful. Profitability for your company is critically dependent on:</p>
<ul>
<li>Minimizing initial cost per unit of performance for your
applications.</li>
<li>Minimizing replacement costs for failed hardware.</li>
<li>Minimizing ongoing power and cooling costs.</li>
<li>Maximizing performance for your applications.</li>
</ul>
<p>Google has bought and continues to buy large amounts of hardware. Big
customers get special treatment from hardware vendors. Big customers can
and often do require changes to the vendor's stock offerings.</p>
<p>Now if I were in Google's shoes, I would carefully benchmark each
hardware vendor's offering with my applications. I would also be looking
for features to add or eliminate that would make a significant
difference to my applications. I might find that I need more (or less)
memory in each node. I might find that better network connections (more
or faster NICs) are an advantage in my application. I might find that
some CPUs (cough, AMD and Sun Niagrara, cough) suck a lot less
electricity and yield better performance.</p>
<p>Doubtless I would share my results with interested hardware vendors. The
guys willing to best change their stock offerings to suit my needs - at
the best price - are most likely to get my business.</p>
<p>Now the question comes down to what Google actually makes. They are not
going to get into the business of manufacturing CPUs, memory, or disk
drives. The racks they can get custom-fabricated locally ... no need to
get each server individually wrapped.</p>
<p>They might get their power supplies custom-designed. I'd guess a smart
designer with a few extra dollars in the parts budget could turn out a
more reliable and efficient power supply. This expertise is fairly
specialised - not too likely Google would do this in-house. Power is a
<strong>big</strong> deal in a Google-scale server farm.</p>
<p>I would bet that the hard-drive maker with the best power consumption
per drive (Western Digital?) gets big orders from Google.</p>
<p>They might get the motherboards custom-designed. They can eliminate
features they do not need, specify parts with the best cost-effective
reliability, and add bits as needed. I would guess that having two or
more NICs on each motherboard might be a win for many of Google's
applications. (Think fewer ethernet collisions...)</p>
<p>They might get semi-custom designs out of the fabricators of "glue"
chips. Not sure if this is worth the effort - but something to look at.</p>
<p>All the above are simply guesses about why Google makes servers for
their own in-house purposes, based on what makes sense given the current
market and technology. Digging a bit further, came up with...</p>
<blockquote>
<p><a href="http://www.theledger.com/apps/pbcs.dll/article?AID=/20060703/ZNYT01/607030371/1001/BUSINESS">A Search Engine That's Becoming an Inventor |
theledger.com</a>
"Nobody builds servers as unreliably as we do," Mr. Hölzle said in a
speech last year at CERN, the Swiss particle physics institute. Google
is reducing cost while maintaining performance by shifting the burden
of reliability from hardware to software individual hardware
components can fail, but software automatically shifts the local task
and the data to other machines.</p>
</blockquote>
<blockquote>
<p>While Google's servers are built on inexpensive parts, the designs it
uses have been modified every year or so, to improve their efficiency
and increasingly to customize them to Google's applications. The
current generation uses the powerful Opteron chip from Advanced Micro
Devices, which uses less power than the Intel chips Google had used.</p>
<p>Google is among Advanced Micro's five largest clients, and the largest
that does not make computers to resell, according to a semiconductor
industry executive with knowledge of Advanced Micro's business.</p>
</blockquote>
<p><em>Oddly enough Dell <a href="http://www.theinquirer.net/default.aspx?article=32628">just
announced</a> they
will be building server hardware with AMD chips.</em></p>
<blockquote>
<p>Google is increasingly doing business with Sun Microsystems as well.
Sun, known for systems that are both reliable and expensive, would not
seem a natural match for a company that emphasizes economy and
self-sufficiency. But Eric E. Schmidt, Google's chief executive, is a
former Sun executive, and Sun has developed a new microchip that is
especially efficient in electricity use.</p>
<p>Moreover, Google increasingly needs systems that are less likely to
fail than those it uses for its search engine in order to handle
important information, like e-mail and payments in its new Google
Checkout service.
Beyond servers, there are signs that Google is now designing its own
microchips. The company has hired many of the engineers responsible
for the Digital Equipment Corporation's well-regarded Alpha chip.</p>
</blockquote>
<blockquote>
<p>Mr. Hölzle said Google had considered custom semiconductor design, but
he declined to say if the company had built any. He said that, in
general, Google did not want to build anything from scratch if it
could buy something that was just as good.</p>
</blockquote>
<blockquote>
<p><a href="http://computerworld.co.nz/news.nsf/0/BCFA4BB3447790ACCC2571A4001C6703?OpenDocument">We build our own servers because it's more efficient:
Google</a>
Energy efficiency is a subject Hölzle speaks passionately about.
About half of the energy that goes into a datacentre gets lost due to
technology inefficiencies that are often easy to fix, he says.</p>
<p>The power supply to servers is one place that energy is unnecessarily
lost. One-third of the electricity running through a typical power
supply leaks out as heat, he says. That’s a waste of energy and also
creates additional costs in the cooling required because of the heat
added to a building, he says.</p>
<p>Rather than waste the electricity and incur the additional costs for
cooling, Google has power supplies specially made that are 90%
efficient.</p>
<p>“It’s not hard to do. That’s why to me it’s personally offensive [that
standard power supplies aren’t as efficient]”, he says.</p>
<p>While he admits that ordering specially made power supplies is more
expensive than buying standard
products, Google still ultimately saves money by conserving energy
and cooling, he says.</p>
</blockquote>
<p>In a sense, none of this is rocket-science. Google is simply covering
all the bases.</p>
What makes a good "Databox"?2006-07-12T00:00:00Zhttps://bannister.us/weblog/2006/what-makes-a-good-databox
<p>What is a good, reliable way to store and preserve your personal data? A
topic I have had reason to chew on, of late. Yes, I got bit.</p>
<p>A week or so back (when dealing with some other hardware problems), I
heard a dwindling screech from my home file server box. Not good, the
disk with most of the data died.</p>
<p>No problem - I had a backup (if slightly old) on another machine - or so
I thought. Turns out, I couldn't find the backup. Most likely at some
point I reformatted a hard disk during an install, not recalling that
presence of the backup. Not good - big time.</p>
<p>OK - so clearly the approach of backing up to another system (with
space) did not work out. I do not like to <em>repeat</em> mistakes.</p>
<p>Considered buying a RAID box from Buffalo or Infrant. These standalone
RAID boxes offer great protection against disk failure, are quiet, and
use less power than a PC. But what would happen if some other part in
the box failed? Would I be able to get replacements (say) ten years from
now? Would there be any other way to get the data off the RAID? Guess I
could buy <em>two</em> RAID boxes and ... maybe not.</p>
<p>Another interesting notion was to run ZFS (very cool, BTW) on a generic
box. Replacements would be less of a issue. But ZFS requires Solaris.
Setting up Solaris on generic hardware is bound to be more trouble. Once
setup a Solaris box (at least at this time) is going to be less useful.
If I am going to leave a box powered on all the time, hopefully it could
serve more than one role (like hosting VMware for testing). The
OpenSolaris distributions are still very much bleeding edge - and I
don't need <em>another</em> hobby.</p>
<p>With some reluctance, I discarded the notion of using ZFS. Today there
is a posting from Tim Bray on this topic.</p>
<blockquote>
<p><a href="http://www.tbray.org/ongoing/When/200x/2006/07/12/Home-Storage">ongoing · The Databox</a>
"The Databox has one or two cheap-ish CPUs running Solaris, ten or so
cheapish disks, and offers a half-terabyte or so of completely
reliable, completely maintainable, network-accessible storage for your
data, which lives in ZFS, striped and replicated across the disks. "</p>
</blockquote>
<p>As much as I like this idea, for personal use it lands somewhat on the
impractical side. To get the power and noise down, you are likely to end
up with purpose-built hardware. A solid, reliable file server could be
in use for a <em>long</em> time. With no guarantee of available replacement
hardware, a non-disk failure years from now could put you in a really
bad position.</p>
<p>Generic hardware and generic software gives you the best chance of
finding replacements in the long-term.</p>
<p>Probably the most reliable setup would be to have two generic PCs
powered on. One would act as the file server. The second could store an
"rsync" copy, and be configurable to become the file server. This would
protect against any single hardware failure, and replacements are not
special in any way. But this means <strong>two</strong> PCs powered on all the time,
with the attendant noise and power consumption. Ick.</p>
<p>Settled on having one box with two identical 300GB disks. One disk will
hold the files served, and the second will hold an "rsync" mirror of the
first. I can setup cron jobs to run "rsync" nightly, and compressed tars
(say) weekly. Less often, I could copy off a compressed tar to another
box. Once setup, one less chance for human error.</p>
<p>Yes, I know I could use an software RAID to replicate files. With
nightly "rsync" runs I get some protection from accidental deletions -
at least until the next "rsync".</p>
<p>Incidentally, I bought Maxtor 300GB disks (the local Staples had a good
price). Seems this was a minor mistake. Curious about whether the power
supply was adequate, went and looked up the power requirements for
various 300GB drives. Seems current generation Western Digital drives
use about half the power, and can be got for pretty much the same price
(online) as the Maxtors. The dual Maxtors are almost too hot to touch
(~120°F), even with an extra fan pulling air around the drives.</p>
<p>Just about finished setting up the new file server (which is also my CVS
and Subversion server, hosts VMware images of various Windows OS
versions, etc). Ran Memtest86+ on the memory (which turns out is not up
to spec!). Ran SpinRite on the disks. This is all in a very solid steel
mid-tower PC Power & Cooling case, with well-reviewed very quiet
Seasonic power supply (and vinyl floor tile for additional noise
suppression - I kid you not).</p>
<p>In fact, though I did not have a complete backup of the old file server,
I did not loose much. The small personal stuff is replicated online.
Almost all my photos are up on Flickr. The mp3 files are on an iPod (or
can be re-ripped from CD). The CVS archive has multiple backups. About
all the leaves is the installation files for software I've bought and
downloaded - may have lost some license keys. The Magnatune WAV files
are gone. The downloaded ISOs and license keys from MSDN can be grabbed
again. Could have been worse.</p>
Always, always, ALWAYS run memtest on new memory!2006-07-07T00:00:00Zhttps://bannister.us/weblog/2006/always-always-always-run-memtest-on-new-memory
<p>Several months back I put together a test box with 4GB of what I thought
was <a href="http://www.newegg.com/Product/Product.asp?Item=N82E16820227210">relatively "premium"
memory</a>.
As it turns out, I was mistaken.</p>
<p>The latest Ubuntu 6 install CD offers a menu choice to run <a href="http://www.memtest.org/">Memtest86+
v1.65</a>. This box is going to be my long-term
(hopefully) home file server. Since I had not run a memory test before,
seemed like a good idea to run one now. At this point the box had been
running for 8 months without any <em>noticable</em> errors.</p>
<p>First thing I noticed was that the motherboard BIOS had auto-detected
the memory as DDR300 with 2.5-3-2-5 timings. This considerably slower
than DDR400 with 2-3-2-5 as spec'd by the manufacturer. So I used the
manual settings in the BIOS to match what I thought I'd bought - and
about an hour or so later got errors(!!). Dropped the timings from
2-3-2-5 back to 2.5-3-2-5 and dropped the memory clock rate back one
notch. Again, got errors about between 1-2 hours into the first pass.
After dropping the clock rate a couple more times, finally at DDR333 ran
for 12 hours (over 7 complete passes) without a single error.</p>
<ul>
<li>Looks like the DDR400 memory I bought is really DDR333.</li>
<li>Looks like the BIOS autodetect guessed right!</li>
<li>Not running a thorough memory test earlier was a mistake.</li>
</ul>
<p>From the errors I saw, I suspect that only one of the four sticks is
under-spec, and the other three might indeed perform at DDR400. By now
there is no point in figuring out which (and waste hours more).</p>
<p>So ... if for no other reason, get a Ubuntu 6 install CD for the
bootable memory test! It also comes with a pretty nifty operating
system.</p>
<p><strong>Update:</strong> Got an email from a OCZ support guy. He suggested bumping
DRAM voltage by +0.2V. Tested - no change.
BTW - Memtest86+ is slightly inaccurate when reporting the DDR rate
(i.e. DDR333 is reported as DDR315).</p>
<p><strong>Update:</strong> Got the following e-mail from OCZ back in July, then
nothing.</p>
<blockquote>
<p>From: "Sean K. Sinha" <sean@ocztechnology.com>
To: "'Preston L. Bannister'"
Subject: RE: Under-spec memory?
Date: Wed, 12 Jul 2006 10:23:45 -0700</p>
<p>Preston,</p>
<p>Let's evaluate and replace your memory for you under warranty, as it
should
be able to run at DDR400 with the voltage increase. You are not
trying to
run at a 1T Command Rate/CPC Enabled with four modules inserted,
correct?</p>
<p>We are sorry about the problems you have experienced. Please provide
us the
following information for RMA.</p>
<p>Then we will send you an email with RMA# and instructions for
shipping.
Please allow up to 24 hours for a response. If you have any other
questions, please feel free to let us know.</p>
<p>We would be happy to take care of it for you.</p>
</blockquote>
<p>After a couple months (and a couple reminders sent by me) nothing more
has come from OCZ. Seems the "Lifetime Warranty" they offer does not
mean anything.</p>
<p>Was reminded of this when shopping for a 4GB SD memory card for my
camera. No, I will not be buying an OCZ product.</p>
27B Stroke 62006-07-01T00:00:00Zhttps://bannister.us/weblog/2006/27b-stroke-6
<p>Senator Ted Stevens (R-Alaska) explained his understanding (not) on how
the internet works.</p>
<blockquote>
<p><a href="http://blog.wired.com/27BStroke6/index.blog?entry_id=1512499">27B Stroke
6</a>
I just the other day got, an <strong>internet was sent by my staff</strong> at 10
o'clock in the morning on Friday and I just got it yesterday. Why?</p>
</blockquote>
<p>Yes, this guy is voting on issues fundamental to the Internet - and
voting the wrong way.</p>
Say what?2006-06-26T00:00:00Zhttps://bannister.us/weblog/2006/say-what
<p>Doubtless I have been guilty of just such an obscurity...</p>
<blockquote>
<p><a href="http://weblog.infoworld.com/udell/2006/06/26.html#a1476">Jon Udell: Say
what?</a>
"By syndicating metadata, I'm inviting others to more richly
contextualize their aggregations of our stuff."</p>
</blockquote>
<p>Sounds like something you might say after a reading of Vogon poetry.
Come to think of it, I am not really sure what the heck the above phrase
is supposed to mean. Of course, I can pretend with the best...</p>
<p>A long time ago I ran across a notion, something like - "Anything you
understand well you can explain to a child." - or the converse - "If you
cannot clearly explain an idea to a child, you probably do not fully
understand the subject yourself." Kind of a sanity check on your level
of understanding. :)</p>
<p>I am sure that the notion Jon is trying to express would be a lot
clearer - to everyone (including Jon) - if expressed more simply.</p>
New Ubuntu and VMware Server install2006-06-26T00:00:00Zhttps://bannister.us/weblog/2006/new-ubuntu-and-vmware-server-install
<p>So ... a machine dies in Virginia - the one hosting a wiki and a Notes
server for our development group at work. Bit of irony here - seems it
is the RAID card that died. The hardware is an old desktop box with a
collection of 9GB disks in a RAID 5 configuration. Probably not
worthwhile to re-build the machine.</p>
<p>Had a Windows XP box in the local office that was not seeing much use -
it was used to host installs of software prototypes, and for testing
with different databases (Oracle and Microsoft SQL Server), among other
things. Had wanted to put <a href="http://vmware.com/">VMware</a> on the box
eventually, to support testing with multiple server configurations (for
folk in the office - I have my own test box here at home). Given the
dead box is Virginia, seemed hosting the Notes server and wiki on this
box was the best alternative.</p>
<p>Downloaded and burnt a CD with the Ubuntu 6.06 "desktop" install. Fired
up the install and ... everything just worked. Simpler and slicker than
a Windows installation.</p>
<p>Was not sure, but thought that the free VMware Server might be
appropriate. Downloaded the VMware Server installation files and
documents (not real clear what was required - so grabbed everything).
Hint: The installation instructions are in the "Server Administration
Manual". Once the install instructions were found, installation was very
straightforward.</p>
<p>Copied over some pre-configured virtual machines from my home test box
(using a paid copy of VMware Workstation) - clean/base installs of
Windows NT Server, Windows 2000 Server, and Windows 2003 Server (I have
a developer's license, so this is all legit). Fired up the VMware Server
console on the new Ubuntu box - and after a bit of housekeeping, the
various Windows instances were ready to go.</p>
<p>Now for the very cool part - installed the "VMware Server Console" on my
Windows box, and I can now start, control, and interact with the VM's
running on the Ubuntu box - as though they were running locally! OK - if
you've played with VMware server products before, this is probably old
hat. I had not, so this was a pleasant surprise.</p>
<p>The free version of VMware Server is lacking the "clone" operation in
VMware workstation (fair enough). Copying an entire VM image is a bit of
a pain (copy the folder containing a rather large amount of data), but
do-able. Odds are the VM hosting the Notes server and wiki will
eventually be transferred to a machine run by the IT folks, running a
full version of VMware (once they procure more hardware).</p>
<p>Setting this all up was a lot easier than I had expected. Something
amusing about using Linux to make Windows installations easier to use.
:)</p>
Your data isn't yours, with AT&T2006-06-23T00:00:00Zhttps://bannister.us/weblog/2006/your-data-isnt-yours-with-att
<p>AT&T has rewritten their privacy policy so in essence "privacy" is gone.</p>
<blockquote>
<p><a href="http://www.sfgate.com/cgi-bin/article.cgi?file=/chronicle/archive/2006/06/21/BUG9VJHB9C1.DTL&type=business">AT&T rewrites rules: Your data isn't
yours</a>
AT&T has issued an updated privacy policy that takes effect Friday.
The changes are significant because they appear to give the telecom
giant more latitude when it comes to sharing customers' personal data
with government officials.</p>
<p>The new policy says that AT&T -- not customers -- owns customers'
confidential info and can use it "to protect its legitimate business
interests, safeguard others, or respond to legal process."</p>
<p>The policy also indicates that AT&T will track the viewing habits of
customers of its new video service -- something that cable and
satellite providers are prohibited from doing.</p>
<p>Moreover, AT&T (formerly known as SBC) is requiring customers to agree
to its updated privacy policy as a condition for service -- a new move
that legal experts say will reduce customers' recourse for any future
data sharing with government authorities or others.</p>
<p>The company's policy overhaul follows recent reports that AT&T was one
of several leading telecom providers that allowed the National
Security Agency warrantless access to its voice and data networks as
part of the Bush administration's war on terror.</p>
<p>"They're obviously trying to avoid a hornet's nest of
consumer-protection lawsuits," said Chris Hoofnagle, a San Francisco
privacy consultant and former senior counsel at the Electronic Privacy
Information Center.</p>
</blockquote>
<p>To a degree, I cannot blame AT&T for this move.</p>
<blockquote>
<p>AT&T is also believed to have participated in President Bush's
acknowledged domestic spying program, in which the NSA was given
warrantless access to U.S. citizens' phone calls.</p>
</blockquote>
<blockquote>
<p>But the company also asserted that it has "an obligation to assist law
enforcement and other government agencies responsible for protecting
the public welfare, whether it be an individual or the security
interests of the entire nation."</p>
</blockquote>
<p>Government spying programs expose AT&T to potentially massive liability
from customers. To protect themselves they probably had no choice but to
change their written public policy.</p>
<blockquote>
<p>The new version, which is specifically for Internet and video
customers, is much more explicit about the company's right to
cooperate with government agencies in any security-related matters --
and AT&T's belief that customers' data belongs to the company, not
customers.</p>
</blockquote>
<p>My choice is to not be a customer of AT&T, as much as possible. I only
hope Cox (my internet, cable, and phone service) will not cave in
similar fashion.</p>
Kind of annoying, actually2006-06-15T00:00:00Zhttps://bannister.us/weblog/2006/kind-of-annoying-actually
<p>About a decade ago I was working on an application that used strings
quite a lot - enough to be a major factor in performance. At the time I
came up with a simple, lightweight C++ string class that took full
advantage of the most optimal code - at the time - and benchmarked as
radically faster than either the Microsoft or standard C++ string
classes. I have re-used the same string class (which is simple enough to
write from memory) in just about every C++ application since.</p>
<p>A while back I
<a href="https://bannister.us/weblog/2005/building-a-better-string-class">documented a series of exercises</a>
to check whether the string class code was still optimal on current
compilers and CPUs. Quite a lot has changed in ten-odd years - so
possibly what was once optimal might not be now. Some interesting
observations came out of the exercise:</p>
<ol>
<li>The specialized x86 instructions for string operations are now
slower than performing the same operation with generic x86
instructions.</li>
<li>Out-of-line calls to the library string functions generally equals
or beats simple inlined code.</li>
<li>The default optimization settings for Microsoft C++ compiler enable
the use of x86 string ops - which is not optimal for current
generation CPUs.</li>
<li>My simple string class does indeed still radically outperform the
standard C++ string class.</li>
</ol>
<p>The aim of the exercise was to check my assumptions against current
generation compilers and hardware. The end goal was to determine the
best performing string class for use in my applications. The upshot was
I added a single #pragma to the string class implementation, and
performance is once again optimal for current generation hardware.</p>
<p>I do indeed have a better string class - by measured performance.</p>
<p>For some reason I am still getting a trickle of hits from
<a href="http://www.gerd-riesselmann.net/archives/2005/01/building-a-better-c-string-class/">this article</a>,
where the article - and the comments - are just plain wrong. Kind of
annoying, this.</p>
Freedom of expression2006-06-15T00:00:00Zhttps://bannister.us/weblog/2006/freedom-of-expression
<blockquote>
<p><a href="http://go.reuters.com/newsArticle.jhtml?type=oddlyEnoughNews&storyID=12540348&src=rss/oddlyEnoughNews">Oddly Enough News Article |
Reuters.com</a>
A former Nazi officer living on a Wisconsin farm has built a memorial
to Adolf Hitler in his bunker-like tractor storage shed, much to the
chagrin of local officials.</p>
<p>A court order was being sought to stop Ted Junker, 87, from opening to
visitors a 30- by 50-foot (9- by 15-meter) concrete building that he
has spent $200,000 outfitting with photos of Hitler, a
swastika-emblazoned flag and other items.</p>
</blockquote>
<p>Whether or not you agree with this guy's point of view, he should have
the right to express himself. Putting up a display inside a building on
his farm - seems pretty harmless. Or about as harmless as free speech
ever needs to be.</p>
Breakage - or misapplication?2006-06-15T00:00:00Zhttps://bannister.us/weblog/2006/breakage-or-misapplication
<p>So .... there's this
<a href="http://www.tbray.org/ongoing/When/200x/2006/06/15/Binary-Search-Breakage">thread</a>
across weblogs discussing the <a href="http://googleresearch.blogspot.com/2006/06/extra-extra-read-all-about-it-nearly.html">"breakage" of binary
search</a>
when the search algorithm uses an array, and the index into the array
approaches the maximum value for a 32-bit signed integer ... and I am
having trouble classifying this as a bug.</p>
<p>Let's talk about sizes a bit. Programs on 32-bit machines can address at
most 4GB of memory - with most desktop machines limited to less. Given
that the smallest possible meaningful object is an <code>int</code> (which requires
4 bytes), no 32-bit program could create an array over ~1 billion
items - which makes the "bug" found impossible.</p>
<p>Of course, doing a binary search of anything close to a billion integers
is ... dubious. Other algorithms could yield much better results.</p>
<ol>
<li>For integers, address-based lookup on a bitmap would be O(1) and
require at most 0.5GB storage. (There is also a huge saving in the
initial sort, and any re-sort on changes.) On pure performance this
is the winner. Just on the basis of storage this is the better
solution (over an array) when the number of integers approach 128
million.</li>
<li>For smaller (but still large) numbers of integers, you could "snap"
the value - use half for address-based lookup (replacing up to 16
comparisons), and half for binary search (over at most 64K values).
Storage needed is a few times 256KB (pointers plus heap overhead)
plus 2 bytes per value - half the storage needed for single array.
Performance is less than (1), but less storage is needed if the
number of values is less than ~250 million.</li>
<li>For even smaller numbers of integers, I might be tempted to "snap"
out the low byte for use in address-based lookup into 256 buckets,
and binary search an array of integers in each bucket. Storage is
slightly more than a single array, but we've saved ~8 comparisons
on lookup. For a long-lived application where the set of values to
be searched may change over time, we are going to save some time
when maintaining the sort order on smaller buckets. We might want to
benchmark to discover the cross-over points in performance.</li>
</ol>
<p>In most applications what you are searching over is objects, not
integers. Objects are referenced through pointers, contain more than an
<code>int</code> probably cost a couple words of heap overhead. So in the usual
case you limited to ~250 million objects (or much less).</p>
<p>Now with 64-bit machines and a matching 64-bit JVM we have the
possibility of Java programs that could address more than 4GB of memory.
We are talking about server-class machines. (The number of desktops
configured with more the 4GB is statistically insignificant - much
smaller than the number of crooked politicians). On a server-class
machine if you are going to the trouble of loading billions of objects
into memory, odds are you are going to do a <u>lot</u> of searches, and
performance matters.</p>
<p>While binary search scales well, with billions of objects some form of
hashing and address-based lookup is certain work very well and chop a
huge chunk off the runtime - and the time saved is likely critical to
the application. When time is critical, and data and the number of
repetitions is large, you also need to think about the impact of sparse
data on the processor cache. If the frequently-accessed data can fit
within the processor cache, odds are you gain another healthy boost in
performance.</p>
<p>With long-lived applications you also need to be concerned with the
performance cost of maintaining your data structures when the values
searched change over time. A large single array is almost certainly an
expensive choice.</p>
<p>Taking the above into account, my suggested "fix" for binarySearch would
be something like:</p>
<p>IF count of objects remotely close to 1 billion
THEN throw AbuseOfAlgorithmException() AND terminate programmer.</p>
<p>Seems to me the "bug" is more with the programmer's choices than the
algorithm.</p>
REST notes2006-06-12T00:00:00Zhttps://bannister.us/weblog/2006/rest-notes
<blockquote>
<p><a href="http://www.xfront.com/REST-Web-Services.html">REST Web Services</a>
Create a URL to each resource. The resources should be nouns, not
verbs. For example, do not use this:</p>
<p>http://www.parts-depot.com/parts/getPart?id=00345</p>
<p>Note the verb, getPart. Instead, use a noun:</p>
<p>http://www.parts-depot.com/parts/00345</p>
</blockquote>
<p>To this I would add the modification, use instead:</p>
<p>http://www.parts-depot.com/parts?id=00345</p>
<p>In the KISS spirit this does the right thing most of the time without
further elaboration. Typically the response to URLs containing "?" query
strings are not cached. This is the right default as applications
typically cannot return a meaningful "last-modified" time without extra
work. So no extra work always returns the correct (uncached) response -
by default.</p>
<p>Of course, if you <strong>do</strong> want to put in the extra work, and it makes
sense for your application, you <em>could</em> add the modification time to the
response header. The point is that the simplest form is always correct
if you use a query string, and optimization is still possible.</p>
Impressed with Ubuntu Upgrade2006-06-11T00:00:00Zhttps://bannister.us/weblog/2006/impressed-with-ubuntu-upgrade
<p>I have Ubuntu running on two machines - one with 4GB memory on which I
run VMware-hosted versions of Windows (for testing), and one with 2GB
used as an alternate desktop. Ubuntu offered the nicest
initial-installation experience for Linux (so far). Both were setup
about a year ago with Ubuntu 5.</p>
<p>One rough spot with Linux installations has been major upgrades. Seems
in the past I always ended up doing an installation from scratch. When
Ubuntu 6 came out, I was expecting the same.</p>
<p>So once I saw the annoucement for Ubuntu 6, hit the Ubuntu site, and
bounced over to the download page. Read a note about upgrades needing a
different path, and bounced over to the page with instructions.</p>
<blockquote>
<p><a href="https://wiki.ubuntu.com/DapperUpgrades">DapperUpgrades - Ubuntu
Wiki</a>
<strong>Upgrading with the Update Manager application</strong>
This is the simplest way for most users, ...</p>
</blockquote>
<p>Fired up the "Update Manager", and sure enough - it offered to install
Ubuntu 6! Once started it ground away for something like an hour. After
the Update Manager finished and a reboot - I had Ubuntu 6. This
qualifies as the smoothest major upgrade ever - Linux <em>or</em> Windows!</p>
<p>I am impressed. Everything seems to work...</p>
<p>The fact that you can upgrade Ubuntu via the "Update Manager" deserves
to be on the front page, not buried four levels down! Even if you are
installing Ubuntu for the first time, it is important to know that your
next major upgrade can be done online.</p>
<p>After upgrading the second box VMware seems to have stopped working.
This was not a surprise as VMware has hooks into the kernel. Doubtless I
can get this working again, but I do not need it just now.</p>
Schneier on Security - Diebold Doesn't Get It2006-06-09T00:00:00Zhttps://bannister.us/weblog/2006/schneier-on-security-diebold-doesnt-get-it
<blockquote>
<p><a href="http://www.schneier.com/blog/archives/2006/05/diebold_doesnt.html">Schneier on Security: Diebold Doesn't Get
It</a>
If you can't get the threat model right, you can't hope to secure the
system.</p>
</blockquote>
<p>I firmly believe that most government officials are decent, honest folk.
On the other hand we know from experience that there are always a few
who are not - and that is when problems occur. The threat model has to
address when those few folk end up in the wrong position.</p>
<p>In short the Diebold spokesperson has just announced that the maker of
election machines has no clue about security. Not reassuring...</p>
Mission Accomplished!2006-06-09T00:00:00Zhttps://bannister.us/weblog/2006/mission-accomplished
<p>Comment from a guy who thinks losing the gold standard is the cause of
many woes...</p>
<blockquote>
<p><a href="http://blogs.ocregister.com/orangepunch/archives/2006/06/mission_accomplished.html">Orange Punch - Mission
Accomplished!</a>
Zarqui's dead. Saddam's in the klink. Iraq has a democratic
government.</p>
<p>Time for the U.S. to leave.</p>
<p>Three years ago, on May 1, 2003, President Bush stood on an aircraft
carrier and proclaimed, "Mission Accomplished!" (see photo).</p>
<p><img src="http://blogs.ocregister.com/orangepunch/missionaccomplished2.jpg" alt="untitled" /></p>
<p>Well, it's taken three years longer than that, but as we said back
when I was in the U.S. Army a quarter century ago, "Close enough for
government work."</p>
</blockquote>
<p>Outside folks scamming off big government contracts in Iraq, support for
the "war" in Iraq is getting hard to find.</p>
Java and Gnome2006-06-09T00:00:00Zhttps://bannister.us/weblog/2006/java-and-gnome
<blockquote>
<p><a href="http://blogs.sun.com/roller/page/webmink?entry=jdk_on_gnu_linux_something#comment12">JDK on
Linux</a>
It has been disturbing watching Mono .Net applications making inroads
within the Gnome community (Beagle, F-Spot, and Tomboy). Having Sun's
high-quality JVM implemenation included on all Gnome-based
distributions could lead to viable market for Java based apps on the
desktop.</p>
</blockquote>
Evidence from AT&T Whistle-Blower2006-06-09T00:00:00Zhttps://bannister.us/weblog/2006/evidence-from-att-whistle-blower
<blockquote>
<p><a href="http://www.wired.com/news/technology/1,70908-2.html">Wired News: AT&T Whistle-Blower's
Evidence</a>
In 2003 AT&T built "secret rooms" hidden deep in the bowels of its
central offices in various cities, housing computer gear for a
government spy operation which taps into the company's popular
WorldNet service and the entire internet. These installations enable
the government to look at every individual message on the internet and
analyze exactly what people are doing. Documents showing the hardwire
installation in San Francisco suggest that there are similar locations
being installed in numerous other cities.</p>
</blockquote>
An interview with "Homeland Security"2006-06-09T00:00:00Zhttps://bannister.us/weblog/2006/comments-for-27b-stroke-6
<blockquote>
<p><a href="http://blog.wired.com/27BStroke6/comment.blog?a=render&entry_id=1498202">27B Stroke
6</a>
I just got off the phone with the DHS, in an interview for the
Security Architect position.</p>
<p>Here are a few of the questions he asked me, with my answers (Okay,
not verbatim). I should point out that he made it clear he was
seriously strapped for time.</p>
<p>Q: How do you feel about port 80?
A: It's better than port 23, but not as good as port 666....</p>
<p>Q: What would you do to secure TN 3270 emulators?
A: Disconnect them and upgrade to the 21st century.</p>
<p>Q: What is your experience with FISMA, FIPS, and FSH?
A: Limited. I'm allergic to acronyms beginning with "F."</p>
<p>Q: What do you know about firewalls?
A: People think they stop malicious activity. They're wrong.</p>
<p>Q: What would you do if you were asked to testify before Congress?
A: Wear an ill-fitting suit and lie through my teeth so I wouldn't
stand out.</p>
<p>Humor (or pallid attempts thereto) notwithstanding, how do you answer
broad questions like this, especially when the interviewer interrupts
you after three or four words to move on to the next question? For
example, after he asked me the 3270 question, he interrupted my answer
with, "you obviously don't have any experience with mainframes; let's
move on."</p>
<p>I very nearly replied, "I've been working with mainframes since O/S
360, fucker. How about you?" But of course, I didn't.</p>
</blockquote>
Javascript on the server2006-06-04T00:00:00Zhttps://bannister.us/weblog/2006/javascript-on-the-server
<p>This is all - at least in part - a bit premature.</p>
<p>Since the amount of time I have spent writing web applications is
relatively limited, in the past I have largely stayed away from offering
value judgements as to which techniques are most useful. As far as new
technologies and techniques in general are concerned, you could say that
I am a conservative early adopter. What that means is that I tend to try
out new things very early, but only incorporate new bits in my work when
I am throughly convinced of their value.</p>
<p>By way of example - in the early 1990's a friend (Rick) and I were
working on projects where we were able to use C++ for the first time.
While both perhaps equally interested in useful new technologies, our
approach differed. As soon as Rick identified a notion, he cast the
notion into a C++ class, and quickly built up a considerable class
library. My collection of classes was much less impressive, as I only
cast ideas into classes when I thought I thoughly understood the
abstraction captured. Later when discussing alternatives for the next
phase of work, Rick repeatedly had to say that he would need a large
rewrite to support many of the alteratives. Rick had run headlong into
the problem that would later be described as a "brittle" class
hierarchy. At the time it seemed that I was not as far "forward", but
then I did not have to spend as much time going back.</p>
<p>Now I am not saying that my approach is better (I have great respect for
Rick). Rather I suspect that in the long run our differing approaches
work out about the same.</p>
<p>Several months back my first significant web application went to
customers. This was a one-person project, where I did everything from
the front-end HTML/CSS/Javascript/Java applet (with one bit of
AJAX-style code), through the server-side JSP/Java (on a custom embedded
Tomcat instance), and the backend C++ code (for the compute-intense
processing). While it took longer to develop than I'd like (over a
year), I believe the end result is pretty decent. A bit of a stretch for
a one-person project, but necessary for the problem solved.</p>
<p>All through the project I was looking for better ways to doing things.
There are a few notions I have settled that seem to make a lot of sense
(and that I likely will not have to refactor out later). This part as
least seemed clearly a good idea:</p>
<ul>
<li>Web page style goes in CSS files (*.css).</li>
<li>Web page structure goes HTML files (with rare compromise needed for
style).</li>
<li>Web page client side behavior goes into Javascript (*.js) files.</li>
</ul>
<p>I do not like style information in HTML. I do not like Javascript
embedded in HTML. I do not like Javascript generating HTML or CSS. I
strongly suspect the preceding value judgements will not change.</p>
<p>While the combined programming model for HTML/CSS/Javascript is perhaps
a bit of a mess, the combined sum is probably more than sufficient for
building all sorts of interesting web applications. In fact, with IE6
and Mozilla/Firefox as a base, I am pretty much disinterested in new
CSS/HTML standards (as in potentially more trouble than they are worth).</p>
<p>On the server side, I was looking for something better than JSP. The
mixture of Java and HTML - I just do not like. I am looking for that
"sweet spot" that allows the most work completed for the least effort.
JSPs just seem - inefficient and inelegant. But what is a better
approach?</p>
<p>I have found
<a href="http://www.newsgator.com/NGOLProduct.aspx?ProdID=TopStyle">TopStyle</a>
the best tool for working with CSS and HTML - especially when pushing
the boundaries a bit for the best possible presentation. Note that my
measure of "best" is a user interface that appears simple and obvious to
the end user - no matter how much grief this causes the programmer.
Flashy graphics and special effects are irrelevant, and usually
undesirable.</p>
<p>I do not like the mix of program code and HTML in a JSP (or ASP, or PHP)
page. Using a best-of-breed HTML/CSS editor (like TopStyle) is necessary
for more than the simplest presentation (and when this is not a job you
can foist on someone else). Trying to build and edit the structure and
style of JSP pages using an HTML/CSS editor is … less than ideal when
you are pushing CSS style and Javascript behavior. The JSP-aware editors
tend to be less efficient when iterating on HTML/CSS structure and
style.</p>
<p>You can attach style information (stored in *.css files) to a standard
HTML file using the ID and CLASS attributes. At least in principle it
seems you could attach behaviors and make dynamic modifications using
the same basis - with no need for the HTML file to contain anything
other than standard HTML.</p>
<p>There are lots of techniques, toolkits, and class libraries out there
for web programming - arguably too many. At this point I have probably
at least tried most of them. The problem with toolkits is that you get a
bundle of ideas - some good, a few great, and a fair number lousy.
Separating out the great from the lousy is hard.</p>
<p>In fact during this project I made a mistake that cost me months of
wasted time. I was looking for some variation of HTML with markup as
attributes - and settled on
<a href="http://jakarta.apache.org/tapestry/">Tapestry</a> as this seemed closest
to what I thought ideal. As it turns out, this was a very bad choice.
Tapestry is written to the model of a web page as a TV channel, and
heavily oriented to keeping page/view/application state in a server-side
session. Since for my needs I wanted URLs that could be bookmarked, and
in fact had no need for server-side session state … the upshot was that
I ended up ripping out the Tapestry code, and made better progress with
simple JSP.</p>
<p>As an aside, I tend to view as suspect "frameworks" that require special
handling for bookmarking or the "back" button. If the view changes
enough so the user perceives a distinct "place" in the user interface (a
"place" that a bookmark of the back button could return to), we are
probably better off loading a distinct page with a distinct URL. Page
reloads are not always to be avoided - even in the "web 2.0" / AJAX
world. :)</p>
<p>So I am looking for something better. What I am looking for is a “sweet
spot” - an approach efficient both in execution and in programmer time.
I do believe I have lately found at least part of that “sweet spot”.</p>
<p>Good performance in a web application can only be achieved by striking
the right “balance” in your implementation. Since there is typically one
server and many clients, where possible you want to shift computation to
the client, and away from the server. Since the communication channel
between the server and client is limited, you want to minimize the
volume of data sent between the client and server. Since client-side
application behaviors (typically Javascript) have to be downloaded,
where possible you want to shift code complexity toward the server, and
away from the client.</p>
<p>It seems that part of the key is to ship the variable data from the
server to the client in <a href="http://www.json.org/">JSON</a> format. The HTML,
CSS, and Javascript are then largely or entirely static files (which
means standard web browser caching pays a big benefit). Since we
generally end up needing the data in Javascript data structures (at one
time or another), shipping the data in JSON format makes a lot of sense.
JSON needs no additional code (as this is simply a Javascript data
structure). JSON is generally smaller than XML or HTML - uses less
server-side compute to generate, and less client-side compute to ingest.</p>
<p>The other key is to generate variable HTML against variable data using
client-side Javascript and (hidden) in-page HTML structures as
templates. The base is a pretty simple bit of code.</p>
<p>//
// Clone and transform the template with the given id.
// Alter the cloned fragment by applying the map of ids and functions.
// Apply the associated function to each node with an id in the map.
//</p>
<p>window.expandTemplate = function(id,fm) {
var apply = function(node) {
var f = fm[node.id]
if (f) {
node.removeAttribute("id")
f(node)
}
for (var o = node.firstChild; o; o = o.nextSibling) {
apply(o)
}
}
var o = document.getElementById(id)
if (!o) return null
o = o.cloneNode(true)
o.removeAttribute("id")
apply(o)
return o
}</p>
<p>Unfortunately this is too simple to call a toolkit, or to be worth
coming up with a fancy new name. On the other hand, when I find that a
small bit of code is getting a lot done - it does seem to be the right
track. (This would be clearer with a full example - which someday I will
get around to putting up.)</p>
<p>Note that this approach is a big win, as “o.cloneNode(true)” is almost
certain to be radically more efficient than…</p>
<ol>
<li>Building the HTML string on the server.</li>
<li>Shipping the HTML string across the network.</li>
<li>Parsing the HTML string on the client.</li>
<li>Building the HTML document structure on the client.</li>
</ol>
<p>In most cases - not only have we reduced the overall compute needed to
generate a page, we have shifted compute load from the server to the
clients, and reduced the amount of data sent across the network. This is
one of those win-win-win scenarios. :)</p>
<p>Once you are shipping variable data from the server to the client in
JSON (or simply Javascript) format, it seems to make sense to ship data
from client to server also in JSON format. Encoding Java data structures
into JSON format is relatively straightforward. Transforming data sent
from the client from JSON into Java classes … is a bit more open to
interpretation. It is not clear that you always - or even usually - want
to transform a dynamic JSON structure into a more static Java structure.</p>
<p>At this point - when I am wondering if using server-side Javascript
might not be the most efficient way of coding handlers for JSON data
sent from client - Tim Bray posts:</p>
<blockquote>
<p><a href="http://www.tbray.org/ongoing/When/200x/2006/06/04/Phobos">Go Visit
Phobos</a>
… while the server-side JavaScript notion is pretty weird, go have a
look at the code; writing an AJAX app all in one language is seductive
on the face of it.</p>
</blockquote>
<p>Perhaps server-side Javascript is not weird at all - especially when the
Javascript implementation can call easily into Java as needed. Given
that one implementation choice is to store structures to disk in JSON
format, using Javascript all the way through makes some sense.</p>
<p>Personally I am not yet fully convinced I have found the “sweet spot”,
but the combination of client-side Javascript and JSON format on the
network looks a bit more than promising.</p>
Understanding RAID-Z2006-06-01T00:00:00Zhttps://bannister.us/weblog/2006/understanding-raid-z
<p>A good, clear explanation of the difference between RAID-Z and prior
RAID implementations.</p>
<blockquote>
<p><a href="http://blogs.sun.com/roller/page/bonwick?entry=raid_z">Jeff Bonwick's
Weblog</a>
"RAID-Z is a data/parity scheme like RAID-5, but it uses dynamic
stripe width. Every block is its own RAID-Z stripe, regardless of
blocksize. This means that every RAID-Z write is a full-stripe write.
This, when combined with the copy-on-write transactional semantics of
ZFS, completely eliminates the RAID write hole. RAID-Z is also faster
than traditional RAID because it never has to do read-modify-write.</p>
<p>Whoa, whoa, whoa -- that's it? Variable stripe width? Geez, that seems
pretty obvious. If it's such a good idea, why doesn't everybody do it?</p>
<p>Well, the tricky bit here is RAID-Z reconstruction. Because the
stripes are all different sizes, there's no simple formula like "all
the disks XOR to zero." You have to traverse the filesystem metadata
to determine the RAID-Z geometry. <strong>Note that this would be impossible
if the filesystem and the RAID array were separate products</strong>, which
is why there's nothing like RAID-Z in the storage market today. You
really need an integrated view of the logical and physical structure
of the data to pull it off."</p>
</blockquote>
<p>My first job out of college included programming drivers for disk
controller that was an ancestor of IDE (think
<a href="https://bannister.us/weblog/2004/vintage-software">WD1000</a>).
Having spent so much time thinking about how to get optimal performance
out of a disk drive, when the RAID notion was published, naturally I was
interested. Spent some time mulling over the problem, and came to a
similar conclusion - so the above explanation immediately made perfect
sense. Of course, ideas do not always work out when implemented. Could
be I'd missed something critical, which would explain the previous RAID
implementations. I am delighted that someone translated the hazy notion
into working code!</p>
<p>As Tim Bray wrote <a href="http://www.tbray.org/ongoing/When/200x/2006/05/31/ZFS-Rules">"This stuff
matters."</a>,
with a link to <a href="http://blogs.sun.com/roller/page/roch?entry=when_to_and_not_to">"WHEN TO (AND NOT TO) USE
RAID-Z"</a>.
I found Roch's explanation ... troubling ... which lead me to hunt down
the RAID-Z explanation above.</p>
<p>I strongly suspect that Roch's opening statement is wrong.</p>
<blockquote>
<p>"RAID-Z is the technology used by ZFS to implement a data-protection
scheme which is less costly than mirroring in terms of block
overhead."</p>
</blockquote>
<p>When a data block is bad, you must have a good copy somewhere else to
recover the data. That means that with an N disk array, a RAID that can
tolerate a single disk failure can store at most data equivalent to N/2
disks (slightly less due to some worthwhile bookkeeping overhead). You
cannot get around this basic requirement.</p>
<p>On the other hand, you can take advantage of the replicated data to
increase read performance - at least in principle. To get any sort of a
handle on whether this works out, you have to look at the physics of
current generation disks, and the constraints of current generation
controllers. Though the underlying physics have not changed, my exact
knowledge is near 25 years out of date.</p>
<p>Write performance is also very much dependent on current disk and
controller implementations. Given that the time to program disk
controllers is much smaller than the time required to the disks to
perform the requested operation, you could easily have all disks
performing concurrent operations. The physics say that the write
performance to a N disk RAID should be at equivalent under full load to
an N/2 independent disks - and under light to moderate load performance
of a RAID should be near equal to independent disks. Controller or
motherboard implementations may preclude full performance.</p>
<p>Current generation SATA controllers dedicate a channel (and cable) to
each drive. Looking at the published numbers (always a bit chancy), it
looks like SATA transfer rates are 2 to 3 times the disk transfer rates,
and SATA transfer rates are far below memory transfer rates. What this
suggests is that even a "dumb" controller doing large contiguous read or
write operations should be able to keep 2 to 3 disks active
concurrently. A "smart" controller (with dedicated DMA per channel)
should in this case be able to keep all drives active concurrently - up
to the memory transfer limit of perhaps 5-10 drives (as a WAG). Of
course, most read or write operations are preceded by a seek. Given that
current average latency on seek is about twice the time for a full-track
write (about 0.5 to 1MB - another WAG), you might expect under more
typical(?) usage to keep 10-20 drives concurrently active.</p>
<p>Quoting from Roch:</p>
<blockquote>
<p>To store file data onto a RAID-Z group, ZFS will spread a filesystem
(FS) block onto the N devices that make up the group. So for each FS
block, (N - 1) devices will hold file data and 1 device will hold
parity information. This information would eventually be used to
reconstruct (or resilver) data in the face of any device failure. We
thus have 1 / N of the available disk blocks that are used to store
the parity information. A 10-disk RAID-Z group has 9/10th of the
blocks effectively available to applications.</p>
</blockquote>
<p>It seems to me that in the usual case - allowing for single disk
failure - a single filesystem storage quanta (a "block") would have to
be written to exactly two drives. You also need to write some
bookkeeping information that - with integration between the RAID and the
filesystem - could cost only a fraction of an I/O. Under light to
moderate load (the likely usual case), keeping the bookkeeping
information on a third drive may be more performant.</p>
<p>The upshot is that I expect a 10-disk array would in fact to have
(10-1)/2 blocks (or 45%) of the blocks of storage effectively available
to applications. This differs from Roch's statement.</p>
<blockquote>
<p>Now let's look at this from the performance angle in particular that
of delivered filesystem blocks per second (FSBPS). A N-way RAID-Z
group achieves it's protection by spreading a ZFS block onto the N
underlying devices. That means that a single ZFS block I/O must be
converted to N device I/Os. To be more precise, in order to acces an
ZFS block, we need N device I/Os for Output and (N - 1) device I/Os
for input as the parity data need not generally be read-in.</p>
</blockquote>
<p>My expectation is exactly one device I/O per block on read (plus perhaps
a fractional I/O for bookkeeping), and two device I/O on write (plus the
fractional bookkeeping I/O - all of which may be concurrent).</p>
<blockquote>
<p>Effectively, as a first approximation, an N-disk RAID-Z group will
behave as a single device in terms of delivered random input IOPS.
Thus a 10-disk group of devices each capable of 200-IOPS, will
globally act as a 200-IOPS capable RAID-Z group. This is the price to
pay to achieve proper data protection without the 2X block overhead
associated with mirroring.</p>
</blockquote>
<p>Again, assuming an N disk RAID that allows for single disk failure, my
expectation for loaded read performance is typically the equivalent of
(N-1) independent disks. For loaded aggregate write performance, I
expect the equivalent of (N-1)/2 independent disks - approaching (N-1)
performance under lighter loads. To allow for single disk failure you
cannot get around the same sort of 2X block overhead as mirroring, but
with careful design (including perhaps skewing storage across the array)
you could get higher typical performance numbers.</p>
<p>Admittedly my exact knowledge of the hardware is <em>way</em> out of date.
Still, I suspect that Roch's write-up is inaccurate.</p>
<p>I am aware that the above could be explained in greater detail. Unlike
Jeff (or Roch?) this is not my day job, so you are pretty much on your
own if you find the above hard to follow. :)</p>
<p>The above leads to an interesting side-speculation. If generic SATA
controllers are just slightly "dumb", then with a bit of semi-custom
silicon Sun could field inexpensive boxes with ~2-5 times the SATA
RAID-Z performance of generic boxes. Don't know how this compares to
actual current hardware.</p>
<p>My rough estimate is that for current technology the "sweet spot" for
RAID arrays is in the range of 4 to 8 drives. In this range a RAID would
yield the biggest bang-for-the-buck for the widest range of
applications. A 10-disk RAID-Z array would yield maximum benefit for
practically all applications, with slightly better storage utilization.
Outside this range few applications would benefit. Just a guess... :)</p>
<p><strong>Update:</strong> Roch pointed out something I'd missed, so the above needs
update ... (later).</p>
chandanlog(3C) - The Story of OpenGrok - the Wicked Fast Source Browser2006-05-31T00:00:00Zhttps://bannister.us/weblog/2006/chandanlog3c-the-story-of-opengrok-the-wicked-fast-source-browser
<blockquote>
<p><a href="http://blogs.sun.com/roller/page/chandan?entry=the_story_of_opengrok_the">chandanlog(3C): The Story of OpenGrok - the Wicked Fast Source
Browser</a>
it takes lot more effort to make things simple than to make things
complicated.</p>
</blockquote>
<p>Oh yes.</p>
The Value of Privacy2006-05-19T00:00:00Zhttps://bannister.us/weblog/2006/the-value-of-privacy
<blockquote>
<p><a href="http://www.schneier.com/blog/archives/2006/05/the_value_of_pr.html">Schneier on Security: The Value of
Privacy</a>
Two proverbs say it best: Quis custodiet custodes ipsos? ("Who
watches the watchers?") and "Absolute power corrupts absolutely."</p>
<p>Cardinal Richelieu understood the value of surveillance when he
famously said, "If one would give me six lines written by the hand of
the most honest man, I would find something in them to have him
hanged." Watch someone long enough, and you'll find something to
arrest -- or just blackmail -- with. Privacy is important because
without it, surveillance information will be abused: to peep, to sell
to marketers and to spy on political enemies -- whoever they happen to
be at the time.</p>
<p>Privacy protects us from abuses by those in power, even if we're doing
nothing wrong at the time of surveillance.</p>
<p>We do nothing wrong when we make love or go to the bathroom. We are
not deliberately hiding anything when we seek out private places for
reflection or conversation. We keep private journals, sing in the
privacy of the shower, and write letters to secret lovers and then
burn them. Privacy is a basic human need.</p>
<p>A future in which privacy would face constant assault was so alien to
the framers of the Constitution that it never occurred to them to call
out privacy as an explicit right. Privacy was inherent to the nobility
of their being and their cause. Of course being watched in your own
home was unreasonable. Watching at all was an act so unseemly as to be
inconceivable among gentlemen in their day. You watched convicted
criminals, not free citizens. You ruled your own home. It's intrinsic
to the concept of liberty.</p>
</blockquote>
The bad guys won...2006-05-18T00:00:00Zhttps://bannister.us/weblog/2006/the-bad-guys-won
<blockquote>
<p><a href="http://www.wired.com/news/technology/0,70913-0.html?tw=rss.index">Wired News: Under Attack, Spam Fighter
Folds</a>
A startup whose aggressive antispam measures drew a blistering
counterattack from spammers two weeks ago that brought down the
company's servers along with a wide swath of the internet is
shuttering its program targeting junk e-mailers.</p>
</blockquote>
<p>The spammer's business works because they can spew out millions of
emails for essentially no cost. Given the low cost the business is
profitable if only a tiny fraction of the volume of spam generates a
response. Clearly a very profit from spam, with the very many burdened
by wasted time and extra cost. Nasty business.</p>
<p>The spammer's business model breaks if each spam email sent out
generates a reply.</p>
Sure to spike Apple sales2006-05-18T00:00:00Zhttps://bannister.us/weblog/2006/sure-to-spike-apple-sales
<p><img src="http://static.flickr.com/55/140952881_0784dc87a8.jpg?v=0" alt="Apple
promo" />
<a href="http://www.flickr.com/photos/sexyswedishbabe/140952881/">nothing comes between me and my apple on Flickr - Photo
Sharing!</a></p>
Just forget you ever saw this...2006-05-18T00:00:00Zhttps://bannister.us/weblog/2006/just-forget-you-ever-saw-this
<blockquote>
<p><a href="http://www.wired.com/news/technology/0,70916-0.html?tw=rss.index">Wired News: Court Deals AT&T a
Setback</a>
SAN FRANCISCO -- A federal judge Wednesday shot down telecom giant
AT&T's efforts to recover and suppress internal documents that a
former AT&T technician says demonstrate the company's collusion in
illegal government surveillance.</p>
</blockquote>
<p>Once long ago documents took substantial time and effort to copy. The
widespread use of copying machines in the 1970's and 80's radically cut
the needed effort. though copying a substantial document was still time
consuming. With the current use of computers, inexpensive mass storage,
and the Internet - once in digital form, the cost to make practically
unlimited number of copies is essentially zero.</p>
<p>The wording in this situation is rather obsolete. If the "original"
documents given to the court was on some sort of physical media, that
could be "recovered" by AT&T. This would be meaningless as doubtless
copies have been made. A request to "gave back" the document(s) is
meaningless (how many copies would you like?). Once in digital form,
there is no distinction between an original and an identical copy.</p>
<p>The only meaningful request is to require the destruction of all copies
of a document. In effect saying "forget you ever saw this..."</p>
Old oak2006-05-17T00:00:00Zhttps://bannister.us/weblog/2006/old-oak
<p><img src="http://static.flickr.com/47/148578968_575c5c3901.jpg" alt="untitled" />
<a href="http://flickr.com/photos/dreadedhill/148578968/">Old oak on Flickr - Photo
Sharing!</a></p>
<p>Playing with
<a href="http://www.cs.ubc.ca/~mbrown/autostitch/autostitch.html">autostitch</a>
again. :)</p>
Why is a "family values" organization making porn harder to block?2006-05-13T00:00:00Zhttps://bannister.us/weblog/2006/why-is-a-family-values-organization-making-porn-harder-to-block
<blockquote>
<p><a href="http://news.com.com/Adult+industry+welcomes+.xxx+domain+rejection/2100-1047_3-6071748.html">Adult industry welcomes .xxx domain
rejection</a>
Adult companies have joined conservative groups in celebrating an
Internet regulator's decision to reject the creation of a domain for
adult Web sites.</p>
</blockquote>
<p>Now just this by itself ought to give most anyone pause. Why are
pornographers apparently in agreement with "conservative groups"?</p>
<blockquote>
<p>On Wednesday, the Internet Corporation for Assigned Names and Numbers
(ICANN) voted against the proposal, which would have led to the
creation of an .xxx domain suffix for pornography sites. Conservative
groups in the U.S., such as the Family Research Council, have welcomed
the decision.</p>
<p>"This would have been a landgrab for pornographers, and ICANN did
absolutely the right thing," Charmaine Yoest, a vice president of the
Family Research Council, told Bloomberg.</p>
</blockquote>
<p>Right now there is no effective way to block off pornographic content
from entering your home or business. Creation of the ".xxx" domain would
be a huge step forward, as blocking the ".xxx" domain (at your request)
would be dead easy. Your ISP could offer this as a service. The box that
connects your home (or business) to the Internet could offer this as a
feature.</p>
<p>Pornographers pay at least lip service to the notion of excluding minors
from access to "mature" content. Some are quite sincere - others less
so. Those that sincerely want to keep pornographic material away from
children should be quite willing to move all pornographic material to
the ".xxx" domain.</p>
<p>Once pornographic material is segregated, it can be blocked. Blocking
the ".xxx" domain from schools, libraries, businesses, and homes would
be easy.</p>
<p>On the flip side, doubtless a significant chunk of the pornographers
business comes through access from those locations.</p>
<p><em>So who the heck is the "Family Research Council" and why are they
siding with pornographers?</em>
Pornography is a very profitable business. It is possible the FRC is a
front for less-ethical pornographers? (Don't you just love organizations
with names that tell you almost nothing, or are misleading?)</p>
<p>Looking at the FRC website, in no place could I find even nominal
interest in the viewpoints of their members. So who sets their policy?</p>
<p>From the FRC website, and the <a href="http://en.wikipedia.org/wiki/Family_Research_Council">Wikipedia
article</a> it
appears the organization represents the views of <a href="http://en.wikipedia.org/wiki/James_Dobson">one rich
guy</a> with a <a href="http://en.wikipedia.org/wiki/Focus_on_the_Family">popular radio
program</a>.</p>
<p>While they may not be interested in your opinions, you - of course - are
free to agree with his opinions ... wholesale.</p>
<p>So either this one guy is either operating in a clue-free zone
(probable), or he has an interest in the pornography business on the
side (possible).</p>
<blockquote>
<p>"Adult companies do not want an .xxx domain because there is no
additional profit in it (in fact, there is additional cost) and
exposes them to possible future regulation. What's the point of moving
an extremely popular and profitable Web site from a .com to an .xxx
domain?"</p>
<p>Alexander added that adult companies actually want to make content
more mainstream and claimed the majority were therefore opposed to the
.xxx domain.</p>
<p>"The idea in the adult entertainment industry is to mainstream adult
content to the point where it is not different from selling any other
commodity, such as groceries," Alexander said. "The more publicly
mainstream porn becomes, the more money the adult entertainment
companies make...Creating an 'Internet red light district' goes
against mainstreaming adult content, so most of the producers I know
were against the .xxx suffix from the beginning of the debate."</p>
</blockquote>
<p>Lets all be sure to give the FRC the appropriate credit for helping out
the pornographers. As a father, you can be certain that I will.</p>
NSA on Mothers Day2006-05-13T00:00:00Zhttps://bannister.us/weblog/2006/nsa-on-mothers-day
<blockquote>
<p><a href="http://www.schneier.com/blog/archives/2006/05/nsa_eavesdroppi.html">Schneier on Security: NSA
Eavesdropping</a>
<strong>“</strong> The NSA would like to remind everyone to call their mothers
this Sunday.
They need to calibrate their system. <strong>”</strong></p>
</blockquote>
Bob Hoover flying aerobatics with a stopped engine2006-05-11T00:00:00Zhttps://bannister.us/weblog/2006/bob-hoover-flying-aerobatics-with-a-stopped-engine
<p>
Saw Bob Hoover perform this routine at Oshkosh in 1973(?). At that time
Hoover flew for Rockwell, the manufacturer for the Aero Commander (the
airplane in the video).
</p><p><object width="425" height="350"><param name="movie" value="http://www.youtube.com/v/9ZBcapxGHjE" />
<embed src="http://www.youtube.com/v/9ZBcapxGHjE" type="application/x-shockwave-flash" width="425" height="350" />
</object>
<a href="http://www.youtube.com/watch?v=9ZBcapxGHjE">YouTube - Stopped engine
aerobatics</a></p>
<p></p>
BIRD FLU Hits Florida Trailer Park2006-05-08T00:00:00Zhttps://bannister.us/weblog/2006/bird-flu-hits-florida-trailer-park
<p><img src="https://bannister.us/weblog/images/birdflu.jpg" alt="ex-birds" />
(No idea where ultimately this came from...)</p>
Rendezvous - Video2006-04-25T00:00:00Zhttps://bannister.us/weblog/2006/rendezvous-video
<p>
<embed style="width:400px; height:326px;" id="VideoPlayback" align="middle" type="application/x-shockwave-flash" src="http://video.google.com/googleplayer.swf?videoUrl=http%3A%2F%2Fvp.video.google.com%2Fvideodownload%3Fversion%3D0%26secureurl%3DlwAAANkXZrVNuT6CNbPjGoY0O7cZP44hMbOSrER8D6VTm5L6pcvAjx2u3ymWPAucD3yjv4YvEA8mMaKXiSQcxOezB8bsoa_lBQ_TTxnhomVPWalhytYevVREJIHKVDjpwKHe2lmMEekKEKVQoOkYCYyjC0QuP7VFhXZPehlEYrsk3IdxxKaop-h53wKTmbcxJPU29dAsJd3MCSLILQPhJHvZdB4%26sigh%3DKxYgg17tWHN_1d6nkV0TJ6GBdAM%26begin%3D0%26len%3D519599%26docid%3D2851488008488190547&thumbnailUrl=http%3A%2F%2Fvideo.google.com%2FThumbnailServer%3Fapp%3Dvss%26contentid%3De19be60cb4080c87%26second%3D5%26itag%3Dw320%26urlcreated%3D1146018176%26sigh%3D6myiJsCNflZ8IBgLydXfgm0FGxg&playerId=2851488008488190547" allowscriptaccess="sameDomain" quality="best" bgcolor="#ffffff" scale="noScale" wmode="window" salign="TL" flashvars="playerMode=embedded" />
</p>
Insane - yet fun...
Paul Cornish2006-04-25T00:00:00Zhttps://bannister.us/weblog/2006/paul-cornish
<p>A personal bookmark of sorts.</p>
<p>Spent a lot of time cycling during college. At one point a group from
OCW (Orange County Wheelmen) was doing regular Wednesday evening
training rides (during the summer, so it was still light). The group
naturally tended to sort out by ability level, and I ended up mostly
riding with a guy ... whose name I had long forgotten. About the only
things I remembered was that he was a very strong sprinter, raced, and
claimed to hold the record for a solo ride across the country (somewhat
of an odd combination).</p>
<p>Wandering around the web, ran across a reference in <a href="http://www.ultracycling.com/records/transconrecords.html">Ultracycling: UMCA
Solo Transcontinental Cycling
Records</a>.</p>
<p>Transcontinental Solo Senior Man
17 Mar 73 - Paul Cornish, Tustin, CA
SM - NY (presumably Santa Monica to New York)
13:05:20 / 09.38 (Time (dd:hh:mm) / Average Speed)</p>
<p>When we tried sprints - he would be almost instantly dozens of yards
ahead. Shortly after he would burn out and be unable to maintain speed,
and I'd catch him. Even burned out he could muster enough to tuck in
behind me as I passed. Drafting he could maintain the same speed - so I
couldn't lose him. Somewhere between amusing and frustrating, that was
... :)</p>
<p>Have no idea what happened to the guy.</p>
Handy hint2006-04-25T00:00:00Zhttps://bannister.us/weblog/2006/handy-hint
<blockquote>
<p><a href="http://www.schneier.com/blog/archives/2006/03/the_future_of_p.html">Schneier on Security: The Future of
Privacy</a>
One of my friends used to rot13 the name of someone asking for
information and make a plausable sounding name to provide. (He could
do rot13 in his head.) This allowed him to get new junk mail and
figure out who sold the information. It also served the purpose of
poisoning these databases with a lot of invalid information.</p>
</blockquote>
Algorithm - Find Greatest Sequence2006-04-23T00:00:00Zhttps://bannister.us/weblog/2006/algorithm-find-greatest-sequence
<p>Someone posted a weblog entry (do not remember where) with a puzzle:</p>
<blockquote>
<p>How to efficiently find a subsequence of values with the greatest sum
within a larger sequence.</p>
<p></p>
</blockquote>
<p>The simplest algorithm is to try all subsequences. This runs in time
O(N^3), so is not useful except for very small sequences (say 100 or
much less).</p>
<p>For some reason this problem stuck with me until I came up with an
efficient O(N) algorithm. The basic notion is to first collapse runs
like-signed to a single number. Next the sequence is scanned for triples
that can be collapsed (either positive or negative), and the scan is
repeated until no more triples can be combined. (Think of drops of
condensation beading together.)
<del>Attached an archived Eclipse project containing the <em>implementation and tests</em>.</del></p>
<blockquote>
<p><em>NOTE 2016.07.01:</em> The formerly attached code is lost.
Could be easily re-created from the above description.</p>
</blockquote>
This proves, what?2006-04-21T00:00:00Zhttps://bannister.us/weblog/2006/this-proves-what
<p>Watching a video about global warming, and this picture was flashed up
as evidence.</p>
<p><img src="https://bannister.us/weblog/images/gangotri_glacier.jpg" alt="Retreating Glacier" title="gangotri_glacier" />
<a href="http://earthobservatory.nasa.gov/Newsroom/NewImages/images.php3?img_id=16584">EO Newsroom: New Images - Retreat of the Gangotri
Glacier</a></p>
<p>Hold on ... what does this prove?</p>
<p>Note that the area lost between 1780 and 1935 (155 years) looks to be
about twice the area lost between 1935 and 2001 (66 years). Given that
the amount of greenhouse gases generated by humans in the past century,
what caused the larger retreat before 1935? If human generation of
greenhouse gasses was the dominant influence, you might expect most of
the loss would have been <strong>since</strong> 1935 rather than before.</p>
<p>If you were just looking at this glacier for evidence, you would have to
conclude that "global warming" was already occurring (at least for this
glacier) before human mass generation of greenhouse gasses. You would
also have to conclude that humans have not had a big effect on the
already-warming climate.</p>
<p>Of course, this is assuming there is a linear relation between
temperature and the area lost by the glacier. At the very least, any
change in slope of the valley probably could influence the rate of
shrinkage.</p>
<p>So ... what does this prove?</p>
The Early Bird Specials2006-04-01T00:00:00Zhttps://bannister.us/weblog/2006/the-early-bird-specials
<p><a href="http://www.flickr.com/photos/emdot/120309813/in/set-72057594077481910"><img src="http://static.flickr.com/49/120309813_b09fa65911.jpg" alt="early" /></a> From <a href="http://www.flickr.com/photos/emdot/sets/72057594077481910/">The Early Bird Special - a photoset on Flickr</a></p>
Improbable2006-03-25T00:00:00Zhttps://bannister.us/weblog/2006/improbable
<p><a href="http://www.flickr.com/photos/dreadedhill/117552192/"><img src="http://static.flickr.com/34/117552192_54cefe195c.jpg?v=0" alt="untitled" />
Bird on cactus</a></p>
<p>This variety of bird is one I have seen before, but seldom and never
this close. He flew over, landed on the cactus, then sat there looking
at me long enough to get out the camera. Pretty unusual to land so close
and hang around after seeing me.</p>
<p>This bird was the start of a series of improbable events.</p>
<p>A bit further down the trail I noticed a skunk about twenty feet away
going the same direction, parallel to the trail. After a few dozen feet
the skunk disappeared into some brush. I see skunks maybe a few times
each year.</p>
<p>Just a little further down the trail an unusual animal popped out of a
hole in the ground, directly in front of me, in the middle of the trail.
I have seen what I thought was the local burrowing critter a few times -
a mole-like creature with gold/gray/brown fur. The critter I saw today I
have never seen before. A weasel-like critter with black snout, a white
mask that extended as stripes down lower sides, and a brown back.</p>
<p>Closer to the bottom of Dreaded Hill came across a small black case
containing a multi-function bike tool, no doubt jarred off a passing
mountain bike on the descent. Now it is not unusual to find lost water
bottles on the (rather steep) descent, but this is the first time for
something like this.</p>
<p>Each event by itself was unusual, but not surprising. Taken in
combination, the combined probability is a bit exteme. By the time I got
to the bottom of the hill, I half-expected to bump into Alice and the
White Rabbit around the next bend in the trail.</p>
<p>Improbable.</p>
Sound familiar?2006-03-20T00:00:00Zhttps://bannister.us/weblog/2006/sound-familiar
<blockquote>
<p><a href="http://www.theactorsgang.com/Shows/1984.htm">1984</a>
"Imagine a world
where people fear that their opinion cannot be expressed freely,
where leaders are not held accountable for their deceptions,
where perpetual war is waged against an unseen enemy" ...</p>
</blockquote>
<p>That last part sounds kind'a like today.</p>
Microsoft iPod2006-03-20T00:00:00Zhttps://bannister.us/weblog/2006/microsoft-ipod
<p>
<object width="425" height="350"><param name="movie" value="http://www.youtube.com/v/aeXAcwriid0" />
<embed src="http://www.youtube.com/v/aeXAcwriid0" type="application/x-shockwave-flash" width="425" height="350" />
</object>
[YouTube - Microsoft
iPod](http://www.youtube.com/watch?v=aeXAcwriid0&search=ipod%20microsoft)
</p>
Ubuntu, Debian, and Java2006-03-19T00:00:00Zhttps://bannister.us/weblog/2006/ubuntu-debian-and-java
<p>I have to admit to being considerably annoyed.</p>
<p>On my Ubuntu box spent time getting Eclipse and Java setup. For
ideological reasons, Ubuntu comes with a third-rate Java JVM, so I
followed the twisty paths to get the current Sun Java JRE and JDK
installed. After a bit more magic to get Eclipse to use Sun Java,
startup and response times dropped quite a bit. Installed Apache Tomcat
(manually of course - the same ideological nonsense).</p>
<p>Yes, I know all about the license differences. I first read the GPL back
in 1985, and thought it was a sort of <a href="http://c2.com/cgi/wiki?GoldenHammer">golden
hammer</a> then, and my opinion has
not changed.</p>
<p>At this point I'm a bit aggravated. Went on to install the relevant
Eclipse plugins (Tomcat, Freemarker, Visual Editor, UML, and CDT) ...
only to find the online help does not work.</p>
<p>Turns out they turned it off.</p>
<blockquote>
<p><a href="http://lists.debian.org/debian-java/2005/12/msg00068.html">Re: Eclipse - integrated help is not
available</a>
"The Breezy repository didn't include Tomcat 5, because it was too
late. So the we had to disable the help system for the Eclipse
packages in Breezy."</p>
</blockquote>
<p>Right. Like no one is going to care. Took some digging to figure out why
it was broken.</p>
<p>Tried to figure out just who got this nonsense started and about what
they care. Came up with this gem:</p>
<blockquote>
<p><a href="http://cvs.alioth.debian.org/cgi-bin/cvsweb.cgi/website/DebianJavaInSarge.txt?rev=1.1&cvsroot=pkg-java">DebianJavaInSarge</a>
"Most notably there are very much improved and new free java runtimes
in sarge, which are <em>capable of running several programs</em>. Also a lot
of software got packaged and moved to the main section. If you find
Java packages in the main section then it is buildable and runnable by
the free runtimes."</p>
</blockquote>
<p>Let's nail this to the floor, shall we? The Sun JVM for Linux is free to
developers. The Sun JVM for Linux is free to customers. Developers and
customers just want their applications to work. Something the sort'a
kind'a works ("capable of running several programs" - <em>indeed</em>) is a
non-starter. So for all practical purposes, developers and customers
want to run the Sun JVM. It makes no sense to waste time with anything
else.</p>
<p>Admittedly Sun appears to be part of this roadblock. With all the good
words out of <a href="http://blogs.sun.com/roller/page/jonathan">Jonathan</a> I
don't believe they are actually trying to screw up the works, but it is
always possible I am mistaken.</p>
<p>Now if for ideological reasons there has to be a separate repository for
Java-on-Debian, so be it, but let's not pretend to install Java support,
only to then force folks to grudge around and to try and find something
that works!</p>
It's Google and users, not Microsoft2006-03-11T00:00:00Zhttps://bannister.us/weblog/2006/its-google-and-users-not-microsoft
<blockquote>
<p><a href="http://www.redherring.com/Article.aspx?a=16030&hed=Google+Buys+Writely+&sector=Industries&subsector=InternetAndServices">Google Buys
Writely</a>
In an overt challenge to Microsoft, search giant Google said Thursday
it had acquired Writely, an online word processing tool, for an
undisclosed amount.</p>
</blockquote>
<p>Years ago the press reported all about how whatever Microsoft was doing
was a "challenge" to IBM. Now it is Google compared against Microsoft.</p>
<p>Just to point out the obvious - Google buying an outfit with a decent
web-based word processor <strong>J</strong>ust <strong>M</strong>akes <strong>S</strong>ense. This has nothing
to do with "challenging" Microsoft, and has everything to do with
delivering a compelling service to Google's users.</p>
<p>Can we please drop the lame "challenge" metaphor?</p>
(non)expert advice from ZNet2006-03-08T00:00:00Zhttps://bannister.us/weblog/2006/nonexpert-advice-from-znet
<p>My sister sent me a link to this article.</p>
<blockquote>
<p><a href="http://blogs.zdnet.com/Spyware/?p=787">Windows Defender Beta 2 vs. spyware | Spyware Confidential |
ZDNet.com</a>
"As promised a few days ago, I finally got a virtual machine upgraded
to Service Pack 2 for testing Windows Defender Beta 2. For the sake of
convenience, I'll refer to it as WD for most of this post. When I
wrote about WD previously, I mentioned the review at PCMag.com where
WD was tested against 6 keyloggers, which is not a particularly
valuable test in my opinion." [...]</p>
</blockquote>
<p>Have to admit that I stopped reading computer magazines with the demise
of <strong>Byte</strong>. Did not realise they had sunk so far. To be fair, the early
years of Byte had quite a few clueless articles written by various
authors who did not really understand what they were trying to cover. In
the later years the Byte crew included some reasonably sharp folks.</p>
<p>In this instance the writer identified by ZNet as a "spyware researcher
and consultant" is clearly not very good. She starts her review by
running a scan with each spyware tool, and reporting the counts from
each - and then uses the numbers as an absolute measure. This would only
make sense if each application counted things <u>exactly</u> the same -
and they don't.</p>
<p>The end result is what you are interested in with a spyware scanner. The
methodology is simple - cleanup with tool A, and scan with tools A, B, C
(etc.) for all combinations (you can eliminate some combinations if some
tools <em>always</em> return a subset of what another tool returns). The
tool(s) that remove everything harmful are all winners - if any do a
complete job. The counts reported by each tool are mostly meaningless -
either it's clean or it's not (though you do want to look for false
positives).</p>
<p>Using a VM as a base for the test was the right idea, but reconnecting
to the network in the middle of the test pollutes the results. Better to
connect a disk/folder to the VM - if you know how to use the tools.</p>
<p>So this is what ZNet is offering as an expert? Ouch.</p>
Catapult!2006-03-08T00:00:00Zhttps://bannister.us/weblog/2006/catapult
<p>
<embed style="width:400px; height:326px;" id="VideoPlayback" align="middle" type="application/x-shockwave-flash" src="http://video.google.com/googleplayer.swf?videoUrl=http%3A%2F%2Fvp.video.google.com%2Fvideodownload%3Fversion%3D0%26secureurl%3DoAAAAO1SjiGHwSR6Glq8yoNC4MIqyHLalUTUSi4EoPtfGWhg7hGSYAdArQXe2F64MeedAIxYLqlLtO9jreiVJ3P71LCpsNaon5N2vK3Q7k4r0QyK5Jv0_1wNo8T4gW9ZuMFD8pKQEFbF8j1SDard-plvYLngtrvb8NCJSSFOwOHDrF4dgWVUlvQY7cqEilIPA1qvQym83G5v8etWFbZn1NvgazHm39JXPr11g9Zv4IcMCz3e%26sigh%3DN7zbo-cnMleGa5t0lw67p8yDfyk%26begin%3D0%26len%3D30066%26docid%3D70722051211331357&thumbnailUrl=http%3A%2F%2Fvideo.google.com%2FThumbnailServer%3Fcontentid%3Dc2888030165ee29%26second%3D5%26itag%3Dw320%26urlcreated%3D1141866054%26sigh%3DbheWBEITPqJckmmr5Q-X0k2-dlU&playerId=70722051211331357" allowscriptaccess="sameDomain" quality="best" bgcolor="#ffffff" scale="noScale" wmode="window" salign="TL" flashvars="playerMode=embedded" />
</p><p><a href="http://video.google.com/videoplay?docid=70722051211331357">VW GTi Commercial (Catapult) - Google
Video</a>
Someone had way too much fun building that catapult. Too big for the
<a href="http://blogs.sun.com/roller/page/jag?entry=t_shirt_hurling_contest_questions">contest</a>?</p>
<p></p>
Misplaced concern over Google book scans2006-03-06T00:00:00Zhttps://bannister.us/weblog/2006/misplaced-concern-over-google-book-scans
<p>Why is there such a furor - within some circles - over Google scanning
books? Frankly the entire thing seems just a little bit silly. By
scanning out-of-copyright works and putting them on the web, a vast
resource suddenly becomes infinitely more available. Any kid (or adult)
anywhere suddenly has access to vast libraries that would have been out
of reach before. This is a wonderful thing!</p>
<p>Yes, Google is going to put small quiet ads next to the text of the
books. The Google folks make an effort not to be excessive or annoying.
So ... I get all works (at least the older ones) from all the major
libraries of the world (eventually) accessible from anywhere I can get
an Internet connection? There is <strong>no possible way</strong> this can be a bad
thing! Yes, there is the "cost" of the small column of associated text
ads. That is a very small cost for a pretty fantastic service.</p>
<blockquote>
<p><a href="http://www.moorishgirl.com/archives/003784.html">MoorishGirl: Google's Manifest
Destiny</a>
... publisher Nigel Newton (the chief executive at Bloomsbury) rants
against Google's plans to digitize out-of-copyright works and library
materials, all the better to sell you those darn ads. Rightfully, I
think, he calls those plans a "land-grab" ...</p>
</blockquote>
<p>First off, there is no possible way this can be a "land grab". Use of
the term assumes exclusive ownership - and this can never be true.
Google can copy the content of all the libraries of the world, and the
libraries still contain exactly as much material as before. Anyone else
can (and likely will) make another copy and offer a similar service
under different terms.</p>
<blockquote>
<p><a href="http://books.guardian.co.uk/review/story/0,,1721946,00.html">Google's literary
land-grab</a>
Nigel Newton is chief executive of Bloomsbury Publishing Plc. This is
an edited version of a speech given on Thursday to the Guardian
Review's World Book Day forum.</p>
</blockquote>
<p>Note that publishing companies stand to lose some parts of their
business. The money they make out of publishing out-of-copyright works
will largely go away. Access to older superior works will diminish the
market for similar newer works. This is a good thing for consumers and
society, but not a good thing for publishers.</p>
<blockquote>
<p>There are two aspects to this land-grab. The first involves scanning
out-of-copyright work, provided by the great libraries, and
surrounding it with such advertising. That's not illegal, though it is
of cultural concern.</p>
</blockquote>
<p>So ... access with advertising is worse than no access? In the physical
world would an ad on the table next to a book diminish the "cultural"
value of the contents of the book? Ordinary folk are deluged with much
more intrusive advertising every day, and seem to cope.</p>
<p>(The funny thing at this point is the original article contains a large
intrusive ad embedded in the text. Hopefully the irony is not lost.)</p>
<blockquote>
<p>The second part of Google's literary predations, in the case of
American libraries, involves scanning in-copyright works - for the
purpose of publication - without direct prior permission of the
copyright holder. That is to say, the author or his or her estate.
Google's decision to scan first and ask permission later with
copyrighted works is playing fast and loose.</p>
</blockquote>
<p>This is simple pragmatics. It matters not in the slightest if Google
scans copyrighted works - as long as the scans are not made publically
available. When doing mass-scanning you want to do it in the most
efficient manner possible. What matters is if Google distributes the
copied materials without permission - and so far as I can tell, this
they will not do. The end result is that copyrighted works will only be
distributed with permission - and that is all that matters.</p>
<blockquote>
<p>Publishers also have serious responsibilities in this matter. [...] No
one will write much in future if they don't receive money for it
because books are suddenly free on the net.</p>
</blockquote>
<p>Publishers put words on paper, then distribute the paper. Publishers
exist because the means for putting words on paper require capital.
Publishers exist because they built up human networks to distribute
books. What happens to publishers when works are less often distributed
on paper, and more often distributed more directly over the web? That
future is coming, and must scare the Dickens out of publishers ... which
makes the next statement rather predictable.</p>
<blockquote>
<p>Publishers also have the responsibility to make sure that when it
comes to hosting electronic content in future, it is their own
websites that host the downloads and the scans of text and audio.</p>
</blockquote>
<p>As a random guess - it would be ok for "publishers" to scan
out-of-copyright works, but not Google? Right.</p>
<blockquote>
<p>University and copyright libraries also have serious responsibilities
in their dealings with Google. I believe that libraries such as the
Bodleian and Harvard may have misinterpreted the missions with which
their universities have entrusted them in handing over part of their
collections for scanning.</p>
</blockquote>
<p>The role of libraries is to make information (once primarily in books)
more available - without fee (or only very minor fees). Profit is not a
part of their mission.</p>
<blockquote>
<p>They may also have thrown away the biggest commercial opportunity in
the history of their academic institutions by regarding content as
somehow free (though they do get their own copy of the digital file).</p>
</blockquote>
<p>A "publisher" is concerned with commercial opportunities, a library
should not.</p>
<blockquote>
<p>Yes, scanning a huge collection overnight is a huge expense but it
does not have to happen overnight. The collections were written over
two millennia; the online solution might decently take a long time.</p>
</blockquote>
<p>Yes, please slow down Google - the publishers would like to make money
just as in the past. Nevermind the fact this is a great benefit to
society as a whole - and for the entire world. Nevermind that
"publishers" were created as an artifact of technology (the printing
press) and are doomed to be diminished by a change in technology (the
web).</p>
<p>Doubtless you have guessed by now my sympathy for publishers is limited.</p>
<p>As a kid I had access to a decent but small local library, and had
little money to buy books. In the near future a kid in the same
situation will have access to the bulk of the contents of the world's
greatest libraries. <strong>This is an astounding and wonderful thing!</strong> The
libraries opening their stacks to Google get this.</p>
<p>By comparison the fact that publishers as a whole will make less money
is of no importance.</p>
Argh - Windows (re-)installation woes2006-02-26T00:00:00Zhttps://bannister.us/weblog/2006/argh-windows-re-installation-woes
<p>It is that time again - time for the annual re-install of Windows. Seems
like I need to re-install Windows on my PC pretty much once a year,
every year. As a developer I occasionally have to do rude things to my
machine, and eventually something goes wobbly, and it's time.</p>
<p>The machine was running Windows XP Pro, and I was looking to
(re-)install XP Pro, so I wasn't expecting any difficulty. Wrong. The
installation gets to "34 minutes remaining" and (apparently) setting up
devices ... and stays there forever. Re-booted to see if the second try
would detect the prior attempt and go down a different path - nope.
Re-booted and tried the "repair" option - nope. Installed Linux (Ubuntu)
without trouble, and then re-tried the XP install - nope. Installed
Windows 2000 without trouble, and re-tried the XP install (in case
upgrading from Win2K might do better) - nope.</p>
<p>Wish I had some idea what was tripping up the XP install. With Linux I
can Alt-Shift-F1 into a console and poke around while the install is
running. Something similar in Windows would be a help. The hardware is
pretty generic - a <a href="https://bannister.us/weblog/2006/argh-windows-re-installation-woes">Shuttle XPC SN43G</a> box with 1GB memory, a 120GB
ATA disk, and an ATI Radeon 6800 with dual DVI driving two Dell 2405FPW
panels.</p>
<p>Argh. I am seriously tempted to install Linux, and use VMware to host my
build-and-debug environment for work on Windows software. One big
(REALLY big) advantage with VMware is the ability to revert to an
earlier snapshot. I might never have to re-install Windows again. :)</p>
<p><strong>Update:</strong> Did figure this out (much) later. The power supply was
overloaded. Shuttle offers upgraded power supplies for these boxes.
Ordered, installed, and the problem went away.</p>
If the quote fits...2006-02-18T00:00:00Zhttps://bannister.us/weblog/2006/if-the-quote-fits
<p>The new garage doors were installed this week. The old slab-wood doors
originally installed by the builder were not in the best of shape - in
fact one was starting to crack. Could not quite justify replacing them
before. After all ... doors - if they open and close ... (shrug).</p>
<p>Looked up the quietest openers in Consumer Reports, went around to four
different places (a fifth was closed) to look at door prices and models.
Settled on insulated (quieter) double-walled steel doors (more durable)
designed not to amputate fingers, and no windows (tacky). The new
doors - they go up, they go down - very quiet though. Going to have to
paint the walls now, as the doors make the garage look much nicer.</p>
<p>Total with installation was well under $3K. There was a moment when one
of the installers stopped and looked at the car in the garage, puzzled.
Perhaps he was wondering why I was installing doors worth more than the
car. Amusing.</p>
<p>Another major item off the list of things the house needs, about which I
am unreasonably pleased. As to the rest of the house...</p>
<blockquote>
<p>Rita Rudner:
"Most men don't even live like people. They live like bears with
furniture."</p>
</blockquote>
<p>... which is not far from the truth. Too much mess ...</p>
Senate plans no probe of NSA spy program2006-02-17T00:00:00Zhttps://bannister.us/weblog/2006/senate-plans-no-probe-of-nsa-spy-program
<blockquote>
<p><a href="http://www.cnn.com/2006/POLITICS/02/17/eavesdropping/">CNN.com - Senate plans no probe of NSA spy program - Feb 17,
2006</a>
"An investigation at this point basically would be detrimental to
this highly classified program and our efforts to reach some
accommodation with the administration," said Sen. Pat Roberts,
R-Kansas.</p>
</blockquote>
<p>This is the news I was dreading, and hoped would not come to pass.</p>
<p>Spying on US citizens at home is a line that should never be crossed,
and the critters in Congress do not care. For what some foolish reason I
thought this was just too much, even for a much-compromised politician.</p>
The Coming Tug of War Over the Internet2006-02-16T00:00:00Zhttps://bannister.us/weblog/2006/the-coming-tug-of-war-over-the-internet
<p>First we have the Washington Post proving that the product of
"professional journalists" can be very badly wrong. So much for
<a href="http://www.tbray.org/ongoing/When/200x/2006/02/16/OSBC">"professional fact-checking and editing
support"</a>.</p>
<blockquote>
<p><a href="http://www.washingtonpost.com/wp-dyn/content/article/2006/01/21/AR2006012100094_2.html">The Coming Tug of War Over the
Internet</a>
Companies like Google and Yahoo pay some fees to connect to their
servers to the Internet, but AT&T will collect little if any
additional revenue when Yahoo starts offering new features that take
up lots of bandwidth on the Internet. When Yahoo's millions of
customers download huge blocks of video or play complex video games,
AT&T ends up carrying that increased digital traffic <em>without
additional financial compensation</em>.</p>
</blockquote>
<p>Um ... I am pretty sure the companies providing network bandwidth to the
Internet are already fully compensated. Cannot claim that I know the
details of contracts between Google (and the like) and their network
providors, but from what I have heard, they pay for every bit of data
they send out. So AT&T is <strong>exactly</strong> compensated for each increase in
traffic. I have <strong>never</strong> heard of a network company carrying bandwidth
for free.</p>
<p>To the network providors, a bit is a bit is a bit. They cannot
distinguish between bits from iTunes downloads or bits from some obscure
weblog. That is - they cannot distinguish without adding the equivalent
of speedbumps and choke points to the Internet. In other words - they
have to spend money <strong>to slow traffic down</strong>!</p>
<blockquote>
<p><a href="http://www.tbray.org/ongoing/When/200x/2006/01/22/Washington-Post-Goof">ongoing · WaPo Still Screwing
Up</a>
So this “journalism” thing... it’s a profession where you can just
make random shit up and print it whether it’s right or wrong, and
ignore feedback, and you just don’t do those “retraction” or “update”
or “apology” things?</p>
</blockquote>
The Normal Family2006-02-14T00:00:00Zhttps://bannister.us/weblog/2006/the-normal-family
<p><a href="http://www.flickr.com/photos/dreadedhill/99550802/" title="photo sharing"><img src="http://static.flickr.com/40/99550802_b0df5be4d1.jpg" alt="normal" /></a>
<a href="http://www.flickr.com/photos/dreadedhill/99550802/">The Normal Family</a></p>
<p>Sung to the tune of "The Adams Family" theme song.
" ... it's the Normal Family ..."</p>
<p>This Art (if you can call it that) was put up for potential buyers of
new homes in Foothill Ranch. Just their way of letting you know this was
a classy family-oriented area.</p>
<p>Absurd. Have to get some better pictures.</p>
Lighting my way home2006-02-14T00:00:00Zhttps://bannister.us/weblog/2006/lighting-my-way-home
<p><img src="http://static.flickr.com/31/98490489_08524eff53.jpg" alt="untitled" /></p>
<p><img src="http://static.flickr.com/19/buddyicons/42723019@N00.jpg?1135486011" alt="untitled" />
<a href="http://www.flickr.com/people/hkvam/">Helga Kvam</a> <a href="http://www.flickr.com/photos/hkvam/98490489/">"Lighting my way
home"</a></p>
<p>Very much worth viewing larger.</p>
Search Engine Traffic2006-02-13T00:00:00Zhttps://bannister.us/weblog/2006/search-engine-traffic
<blockquote>
<p><a href="http://www.pcworld.com/news/article/0,aid,124688,00.asp">PCWorld.com - Search Engine Traffic
Soars</a>
MSN saw the steepest drop-off as its share of searches fell to 10.9
percent from 14 percent, Nielsen/NetRatings says.</p>
</blockquote>
<p>The fact that Microsoft sets the default search engine to MSN has always
bugged me. What this means is that for the majority of non-techie users,
switching to another search engine may not happen as often as it should.
In effect MSN has an unfair advantage in the competition between search
engines. To hear that - despite their advantage - MSN usage is minor and
dropping, seems like justice.</p>
A reminder2006-02-10T00:00:00Zhttps://bannister.us/weblog/2006/a-reminder
<p>Arthur, my little brother died at 8 AM on February 10, 1999.</p>
<p>He was riding his motorcycle to work when a car slowed,
he didn't,
and a few minutes later he was dead.</p>
<p>Someone once asked, if you could go back in time, what would you do?
Only one answer came to mind.</p>
Where'd it go?2006-02-09T00:00:00Zhttps://bannister.us/weblog/2006/whered-it-go
<p>Checking through the site's logs, it belatedly sunk in the I wasn't
getting any incoming requests from Google searches (aside from image
search). Before I was getting perhaps one or two per day(?), and found
my postings generally in the first page of Google results obtained by
the incoming visitors. Now incoming visitors are generally from MSN or
Yahoo search. Why the change?</p>
<p>A several months back, I changed the link structure offered by WordPress
to use "permalinks" instead of query parameters. Maybe that made the
difference. Maybe Google changed their algorithm, and values weblogs
less.</p>
<p>Oh well.</p>
Missile launch at sunset2006-02-02T00:00:00Zhttps://bannister.us/weblog/2006/missile-launch-at-sunset
<p><img src="http://static.flickr.com/27/94779918_990df74759_b.jpg" alt="untitled" />
<a href="http://www.flickr.com/photos/dreadedhill/94779918/in/photostream/">Missile launch from the Pacific Ocean past Catalina
Island?</a></p>
Cartoons and Islam2006-02-02T00:00:00Zhttps://bannister.us/weblog/2006/cartoons-and-islam
<p><img src="https://bannister.us/weblog/images/dmcartoon.jpg" alt="untitled" />This would be funny if it
wasn't tragic.</p>
<p>Cartoonists draw Muhammad with a bomb in his turban (see the
<a href="http://en.wikipedia.org/wiki/Jyllands-Posten_Muhammad_cartoons_controversy">Jyllands-Posten Muhammad cartoons
controversy</a>)
or driving an rental truck containing a bomb (the cartoonist's original
image is apparently gone from the internet) and a bunch of islamic-folk
go positively postal.</p>
<p>Um, we're talking about cartoons here. Death threats are an
over-reaction, to put it mildly.</p>
<p>OK, so maybe it's just some wacko marginal fringe - every religion has
them. Certainly the Arab and Islamic folk I have met all seem very
decent. (Yes, I know not all Islamic folk are Arab - but we're talking
about stereotypes here.)</p>
<blockquote>
<p>The foreign ministries of eleven Islamic countries demanded action
from the Danish government, and Libya eventually closed its embassy in
Denmark in protest after the government refused to censure the
newspaper or apologise.</p>
</blockquote>
<p>If true then it's not just the fringe/wacko element here. Clearly
someone is unclear about the concepts of free speech and censorship (or
perhaps are simply hostile). This is also disturbing.</p>
<p>Taken by themselves, the cartoons poke fun at the image Islam presents
to the rest of the world. They could be interpreted as poking fun at our
stereotypes of Islam. But the reaction only confirms and validates the
stereotypes.</p>
<p>Unfortunate.</p>
Imagine a past traveller...2006-02-01T00:00:00Zhttps://bannister.us/weblog/2006/imagine-a-past-traveller
<p><img src="http://static.flickr.com/27/90315556_c3e31e6a95_b.jpg" alt="Island in a dry
lake." />
<a href="http://www.flickr.com/photos/dreadedhill/90315556/">Dry Lake at Zzyzx panorama
(small)</a></p>
<p>Standing in the middle of this landscape, try to imagine a past traveler
on foot or horseback. The view must have been terrifying. Vast
landscapes with no sign of water, and only scraps of life barely
surviving in the desert. Few would have travelled this landscape, and
fewer still survived. More wasteland over the horizon behind you, and
more (how much?) waiting over the horizon ahead. With life so scarce,
you could be travelling to your death.</p>
<p>This view meant life to a traveller crossing the dry lake, as in this
view is an
<a href="http://www.flickr.com/photos/dreadedhill/90112473/in/set-72057594053755347/">oasis</a>.
An oasis with plentiful water, grass for your horse, and enough game to
keep you alive a while longer. Do you see it? Could the lone unguided
traveller find the oasis? You might come across <a href="http://www.flickr.com/photos/dreadedhill/90102628/in/set-72057594053755347/">this
pool</a>
only to realise that the
<a href="http://www.flickr.com/photos/dreadedhill/90102520/in/set-72057594053755347/">salt-saturated</a>
water is undrinkable. Yet the oasis awaits just around the bend of the
hill. Did they know how and where to look? Did travellers pass within a
couple miles, only to die in the wastes beyond?</p>
<p>Viewed through the plastic window of an airliner, this landscape is
distant and unremarkable. Viewed through the windows of an automobile,
the sights blurring by are dreary and repetitious. Viewed on foot,
standing still in the vast silence, the place weighs heavily on the
mind.</p>
Where the Sidewalk Ends2006-01-31T00:00:00Zhttps://bannister.us/weblog/2006/where-the-sidewalk-ends
<blockquote>
<p><a href="http://a-mother-from-gaza.blogspot.com/2006/01/where-sidewalk-ends.html">Raising Yousuf: a diary of a mother under occupation: Where the
Sidewalk
Ends</a>
Going to Erez always serves as a stark reminder of what Gaza has
become, because it is sometimes easy to forget when you are trapped
inside the snow globe that there is a glass dome surrounding you; it
starkly reminds of the limits and the absolute control I am subject
to; of the fact that I am a prisoner in my own land; that I am
deprived of that most basic of human rights: freedom.</p>
</blockquote>
<p>From the other side of the world, the mess in Israel is hard to really
understand. Clearly after so many years of killing, there are going to
be folks who are polarized and non-rational about their differences.
Clearly there are folks of power and wealth playing games in the hope of
gaining more wealth and power - games that get lots of ordinary folk
killed. What we hear in the news tends to be distorted by the game
players.</p>
<p>On the other hand, I firmly believe that ordinary decent folk on either
side of this mess could meet over coffee, chat about their children, and
generally just get along without trouble.</p>
<p>Laila's words offer a bit of insight, slightly polarized (easy to
understand why) but apparently candid and honest. Worth reading.</p>
User Interface Goals2006-01-31T00:00:00Zhttps://bannister.us/weblog/2006/user-interface-goals
<blockquote>
<p><a href="http://www.alistapart.com/articles/homepagegoals">A List Apart: Articles: Home Page
Goals</a>
Google can get away with a user-hostile front page because everybody
already knows how to use it. But that’s the exception to the rule.</p>
</blockquote>
<p>Was in agreement with the notions in the above referenced article up to
the quoted section. The perfect user interface is simple. When you want
to do something, the perfect user interface puts up a "doit" button that
will do exactly what you want.</p>
<p>Of course, since we have not quite yet figured out how to read the
user's mind, a perfect user interface is beyond our reach. So instead we
have to make our best guess as what the user may want to do next, and
structure our presentation so the most likely choices are most
prominent, and less likely choices may even be a couple hops away.</p>
<p>With Google most of the time visitors want to search. The Google
interface is pretty near optimal. The user interface says "Google",
offers a search box (first), and then smaller links to less likely
choices. Nothing more is needed, and anything more would be clutter
(distracting - not a good thing).</p>
<p>Some folks like clutter - don't know why, but they do - but it is not
good design.</p>
Bill Gates - Coke Commercial (Coca-Cola)2006-01-31T00:00:00Zhttps://bannister.us/weblog/2006/bill-gates-coke-commercial-coca-cola
<p>
<embed style="width:400px; height:326px;" id="VideoPlayback" align="middle" type="application/x-shockwave-flash" src="http://video.google.com/googleplayer.swf?videoUrl=http%3A%2F%2Fvp.video.google.com%2Fvideodownload%3Fversion%3D0%26secureurl%3DkwAAAKBVTDQdEkaAloZjKExXe_q5L93g87RDGbuOYkGgGFaZ7vIWR5b1_L-nry5Y453JI8xkfTsFrsECwIhnQiUuByAVEzJeMI9m9b-BSQB-ZpQCxouDMt5wEWN7tD1eeTo5YYv3TIRL8f0yoDnqpiSe2wdPXNCQguia3Fxb7qOzs2KFoIKqytwAwZR_QOtA8uh7ERw2il9hXL06VkpR0g0fQp0%26sigh%3DRS5pHAnsaRJxOGk4Cr6XxjTqsEk%26begin%3D0%26len%3D30066%26docid%3D2428643356101239067&thumbnailUrl=http%3A%2F%2Fvideo.google.com%2FThumbnailServer%3Fcontentid%3D9cd6767584ca77a9%26second%3D5%26itag%3Dw320%26urlcreated%3D1138706450%26sigh%3D4VrUWDYeE4adCtRcmb3Nc_pnyqo&playerId=2428643356101239067&playerMode=embedded" allowscriptaccess="sameDomain" quality="best" bgcolor="#ffffff" scale="noScale" wmode="window" salign="TL" />
</p><p><a href="http://video.google.com/videoplay?docid=2428643356101239067">Bill Gates - Coke Commercial (Coca-Cola) - Google
Video</a></p>
<p></p>
Would you buy this car?2006-01-29T00:00:00Zhttps://bannister.us/weblog/2006/philip-greenspuns-weblog
<blockquote>
<p><a href="http://blogs.law.harvard.edu/philg/2006/01/29#a12523">The decline of General Motors and Ford (maybe they should license
designs)</a>
What would you expect to happen in a society that pays financial
engineers 10-100X what it pays automotive engineers?</p>
</blockquote>
<blockquote>
<p>... is there anyone who ever rented a Pontiac Grand Am and walked away
saying "I need to buy me one of these"?</p>
</blockquote>
<p>Having rented a Pontiac Grand Am, my answer would be "no".</p>
Measure of a mindset and end-to-end checks2006-01-28T00:00:00Zhttps://bannister.us/weblog/2006/measure-of-a-mindset-and-end-to-end-checks
<blockquote>
<p><a href="http://blogs.msdn.com/david.wang/archive/2006/01/28/Does_Virtual_Server_support_multiple_Floppy_and_CDROM_drives.aspx">David Wang : Does Virtual Server support multiple Floppy and CDROM
drives?</a>
Actually, I do not see why you hope to be able to attach ISO via
INI/VMC files and see that as "not programming"... because modifying
INI/VMC files require "programming" to do the search/modification, no
matter the tool that you use. And between that choice and a
commandline tool that can use the Virtual Server Administration API to
manipulate VirtualMachine state, I see modification of INI/VMC file to
be a fragile, *nix "parse and pray" sort of approach. Sorry... but I
do not miss it one bit. ;-)</p>
</blockquote>
<p>The above in response to a query about configuring MS Virtual Server
"without programming" using INI files or the like. David is right about
the first point, but wrong about the second - for pretty much the same
reason. Also there is a minor epiphany waiting for him.</p>
<p>The starting point is one of Butler Lampson's observations I read from
the original publication of <a href="http://research.microsoft.com/~lampson/33-Hints/WebPage.html">Hints for Computer System
Design</a>
which can be paraphrased as:</p>
<blockquote>
<p>Only end-to-end checks matter - everything else is (or should be) an
optimization.</p>
<p></p>
</blockquote>
<p>The end-to-end check in this case is loading your virtual machine to see
if it really does what you want. If calling an API to modify the
configuration file catches some bogus changes - great, that might be an
optimization. In the end you still have to load the VM to see that it
does indeed do what you want. Editing a text configuration file - in the
end - is not a lot different.</p>
<p>As an amusing aside note that quite a lot of the Windows APIs are in the
same sense "call-and-pray". Quite a number of Windows APIs take a raft
of parameters, and you often cannot tell which combinations of options
are meaningful, which are buggy, and which do something quite different
from what you expect. So you code the call and test to see if it really
does what you expect from the documentation. When it doesn't you look
for examples of calling the API that are known to work.</p>
<p>Note a bit of symmetry?</p>
<p>In this particular case - in the end - you will want the configuration
in text. Maybe the application reads the text file directly, or maybe
you use a utility to dump/load the binary configuration data as text. In
either case you will in the end find the text form far more useful.
Maybe you offer an API to modify the configuration - I often do this in
addition to allowing direct editing of a text configuration file. One
epiphany comes when you realize that a text form of the data proves much
more useful than you might initially expect.</p>
<p>I have been down this path more than once - from "binary is fine", to
"we have one case for a text form", and finally to "oh! there are a
bunch of things easier with the text form...". When Lampson was
originally writing about end-to-end checks he was talking about
networks. In the end you realise the the same notion applies well to
software design.</p>
RFID tagged2006-01-28T00:00:00Zhttps://bannister.us/weblog/2006/df20060116jpg-jpeg-image-640x480-pixels
<p><img src="http://www.ibiblio.org/Dave/Dr-Fun/df200601/df20060116.jpg" alt="RFID" /></p>
We are not at war2006-01-27T00:00:00Zhttps://bannister.us/weblog/2006/we-are-not-at-war
<p>Let's put this threat in scope. The size of the "terrorist threat" is
about the size of a (well funded) gang - not the size of an army. A gang
of thugs can be a problem, but are not the same sort of problem as an
attacking army. Declaring war on terrorists is like a lion declaring war
on a rat. Yes, the rat has teeth and can bite. Certainly we don't like
to be bitten. But the rat cannot survive a direct confrontation. The rat
can only survive by eluding us.</p>
<p>Yes, we do need to deal with the rat. This is more like pest control
than war. We don't need to turn to secret laws and the wholesale spying
on citizens, just for pest control. That would be (and is) massive
overkill.</p>
<p>The solution is too large for the problem. The creepy part is if you
flip this around. Let's assume the solution is the right size, rather
it's aimed at a different problem. What "problem" is large enough to
need the "solution" we are being sold?</p>
<p>Now, I don't really believe the politicians are trying to build any sort
of authoritarian police state. I certainly don't believe in any sort of
vast, coordinated conspiracy. The creepy part is that we seem to be
headed that way anyhow.</p>
<p>How can we turn back?</p>
<blockquote>
<p><a href="http://news.yahoo.com/s/ap/20060123/ap_on_go_pr_wh/bush">Bush Says Surveillance Legal and Necessary - Yahoo!
News</a>
Speaking at Kansas State University, the president said the National
Security Agency's program to monitor phone calls and e-mails without a
warrant was legal under laws passed by Congress, upheld by the Supreme
Court and consistent with the actions of his predecessor. "Congress
gave me additional powers to use force, but it didn't prescribe the
tactics," Bush said.</p>
<p>The president dismissed accusations that the eavesdropping program is
illegal, saying that only calls initiated from overseas from suspected
al-Qaida affiliates to the United States are monitored.</p>
<p>"If I wanted to break the law," Bush asked rhetorically, "why was I
briefing Congress?"</p>
<p>Bush cited the law authorizing force after the Sept. 11 attacks as
justification for the program and said decisions by the Supreme Court
and the actions of his predecessors bolster the legal argument for his
acctions.</p>
<p>The president also called on Congress to renew all aspects of the
Patriot Act so that law enforcement will have the tools necessary to
fight terrorists.</p>
<p>"The Patriot Act ... may be set to expire, but the threats to the
United states are not about to expire," Bush said. He also said that
there have been no documented abuses under the Patriot Act and that
constant review of the program pays particular attention to civil
liberties.</p>
<p>Bush said the said that those people seeking to attack the United
States cannot be appeased and terrorists must be destroyed.</p>
<p>He said that the war on terror is an "ideological struggle" against an
enemy that has a "view of the world that is the exact opposite of our
view of the world."</p>
</blockquote>
Google "Ads" hit a home run?2006-01-27T00:00:00Zhttps://bannister.us/weblog/2006/google-ads-hit-a-home-run
<p>In GMail pulled up the message "[xmlc] XMLC 2.2.8 is out", and happened
to glance over at the ads placed by Google:</p>
<blockquote>
<p>Related Pages</p>
<p>Stylus Studio Queries XQuery Co-Inventor
PR.com (press release) - Jan 24, 2006
A One on One Interview with XQuery Guru and Co-inventor Jonathan ...</p>
<p>Jon Udell's Weblog
InfoWorld - Jan 23, 2006
After noodling some more on the question of tag-oriented query and
...</p>
<p>13.12.4 InputSource Objects
13.12.4 InputSource Objects
www.python.org
more related pages »
About these links</p>
</blockquote>
<p>I am not sure how this happened but the "ads" returned are all quite
interesting. The first two might be paid ads, but the third?</p>
<p>Personally I have found the in many cases the quality of Google Ads is
not very high. By quality I mean the ads presented are a bit too often
not interesting, or completely irrelevant. Because (subjectively) the
quality of the ads have slipped, I have tended to pay less attention.</p>
<p>Now this case might just be an accident, but if the Google folks started
slipping in a occasional non-paid but highly relevant item into the
"ads" presented - this could keep up the interest of end-user folk.</p>
<p>The algorithms for doing this would sure be interesting :).</p>
How to Keep the Carriers from Flushing the Net Down the Tubes2006-01-22T00:00:00Zhttps://bannister.us/weblog/2006/how-to-keep-the-carriers-from-flushing-the-net-down-the-tubes
<blockquote>
<p><a href="http://www.linuxjournal.com/article/8673">Saving the Net: How to Keep the Carriers from Flushing the Net Down
the Tubes | Linux Journal</a>
It's called creating scarcity and charging for it.</p>
</blockquote>
IIS Troubleshooting and VMware2006-01-19T00:00:00Zhttps://bannister.us/weblog/2006/iis-troubleshooting-and-vmware
<p>When you are having trouble getting IIS to do what you need, David Wang
offers some advice for <a href="http://blogs.msdn.com/david.wang/archive/2005/12/31/HOWTO_Basics_of_IIS6_Troubleshooting.aspx">IIS6
Troubleshooting</a>.
Unfortunately in one respect, David's advice is impractical. The
developer faced with an IIS problem in the first instance needs to try
and resolve the problem ASAP, and cannot count on outside help. This
leads to destroying the state the David (rightly) wants to preserve.</p>
<p>There is another excellent solution - use VMware. With VMware you can
snapshot the system state, or clone an entire new virtual machine.
Either operation takes seconds. When you have a problem using IIS, and
your test installation is running in a VMware virtual machine, you can
exactly preserve the state of the "machine" using a clone or a snapshot.
You can then figure out the problem on your own (as is usually
necessary), while preserving state others might need to look at later.</p>
Economics of MySpace2006-01-19T00:00:00Zhttps://bannister.us/weblog/2006/economics-of-myspace
<p>Let's just talk about "is" for a moment. We will get to "can" and
"should" later.</p>
<p>Teenagers are tremendously motivated by anything that might make them
more interesting to the opposite sex. It's pretty simple really. Nature
has turned on (big time!) their sex drive - the need to find a mate and
reproduce. This in a society where having children while in your teens
is greatly frowned upon. Restriction placed on a powerful urge creates
an enormous tension. Dealing with this tension can prove quite difficult
for teenagers and their parents.</p>
<p>Teenagers tend to think they are indestructable. Again, this seems to be
something in-built by Nature. Behaviors that adults generally would
refrain from, regularly kill teenagers. Naturally this is another source
of tension between teenagers and their parents (as parents do not want
to see their kids dead). To a teenager, if something bad has not
happened to him or his friends, then the possibility seems simply too
remote to think about.</p>
<p>Do parents sometimes over-react to risks to their children? Of course
they do! Parents are generally fond of their children, and are going to
be very uncomfortable with any significant risk. No parent wants to end
up with a dead child. Pretty much every parent knows of another parent
with a dead child, so it does not take much imagination on the parent's
part to see the same thing happening to them.</p>
<p>This leads us to MySpace. Back in July, <a href="http://news.bbc.co.uk/1/hi/business/4695495.stm">News Corp bought MySpace for
$580 million</a>. No
doubt they expect the then <a href="http://www.freewilliamsburg.com/archives/2005/07/myspace_bought.html">16 million monthly
users</a>
to grow (<a href="http://www.wired.com/wired/archive/13.11/myspace.html?pg=3&topic=myspace&topic_set=">roughly 22 million more
recently</a>).
Rupert Murdoch (the owner of News Corp) will make back his money by
selling advertising (MySpace <a href="http://www.wired.com/wired/archive/13.11/myspace.html">hosts 12 percent of all ads on the Web,
more than any other
site</a>), so
popularity of the site is the most important consideration.</p>
<p>Ignoring popularity for the moment, the MySpace site is nothing special.
If MySpace were a car, it would be a
<a href="http://www.google.com/search?hl=en&q=yugo&btnG=Google+Search">Yugo</a>.
The features offered by the site are nothing special. The reliability
and performance offered the site is relatively lousy. The underlying
implementation - PHP on IIS using MS SQL - is pretty naive. Popularity -
not technology or implementation - is the only thing special about the
MySpace website.</p>
<p>So what News Corp bought was popularity - so let's talk about why
MySpace is popular.</p>
<p>MySpace does not really restrict kids from using the service by age, or
make more than a token attempt to control what kids say. Make no
mistake, the popularity of MySpace began with and continues to be driven
by kids using the service. Because of the lack of restrictions, MySpace
became "cool" and popular with kids.</p>
<p>Teenagers by nature are unmindful of risk. On MySpace users can expose
themselves (in both a figurative and literal sense) far more than other
"social networking" sites. Talk to a teenager and they somehow expect
that what they post will only be viewed by their peers.</p>
<p>This naturally is a perfect setup for any sort of predator. You would
expect an uptick in crimes against minors. On the other hand, MySpace is
new enough that it will be quite a while before there are any sort of
specific statistics. Lacking specific numbers, let's put together an
estimate.</p>
<p>From documents published on the <a href="http://www.cybertipline.com/">CyberTipline
website</a> we can get a <a href="http://www.cybertipline.com/en_US/publications/NC62.pdf">variety of
statistics</a>,
including - of <a href="http://www.cybertipline.com/en_US/publications/NC62.pdf">a nationally representative sample of 1,501 youth ages
10 to 17 who use the Internet regularly ... one in seventeen was
threatened or
harassed</a>. Lets
assume that only a fraction of those incidents might rise to the level
of a crime, enabled by the previously unattainable information made
available on MySpace. One in 200 is less than a tenth the most
aggressive reported incidents. Let's use one in 200 as an upper bound,
and one in 2000 as a lower bound.</p>
<p>Out of the 22 million recent number of MySpace users, some are not
children, so rounding down we can very roughly estimate the incidents
that might rise to the level of a crime at about 10,000 to 100,000 per
year.</p>
<p>Want MySpace (and the inevitable imitators) to clean up their act? Pass
a cost back for each crime in terms of liability. Right now crimes
against minors cost MySpace nothing. Businesses respond to costs and
profits. If the incidents between a predator and a child cost MySpace an
average of $6,000 to $60,000, the entire net worth of MySpace would be
wiped out in a single year. You can bet that MySpace would care a
<strong>lot</strong> more about the safety of their users, if there was a cost
attached.</p>
<p>In fact the origins of MySpace are less than innocent. In the beginning,
while building up popularity, MySpace did not run ads. The hosting bills
for the site must have been considerable, certainly beyond what could be
supported by the nominal individual creator of MySpace.
<a href="http://www.intermix.com/">Someone</a> supplied a <strong>lot</strong> of
<a href="http://www.intermix.com/about_press_inthenews.cfm?id=722&startrow=1">money</a>
to get the site going - someone whose motivations were likely
<a href="http://www.applexnet.com/index.php?name=News&file=article&sid=1510">less</a>
than innocent. Did the original backers of MySpace choose to ignore
risks to children on the way to making a profit?</p>
Useless spying2006-01-17T00:00:00Zhttps://bannister.us/weblog/2006/useless-spying
<blockquote>
<p><a href="http://www.iht.com/articles/2006/01/17/news/spy.php?rss">U.S. spying program netted few - Americas - International Herald
Tribune</a>
"We'd chase a number, find it's a schoolteacher with no indication
they've ever been involved in international terrorism - case closed,"
said one former FBI official, who was aware of the program and the
data it generated for the bureau. "After you get a thousand numbers
and not one is turning up anything, you get some frustration."</p>
</blockquote>
Open Microsoft Formats?2006-01-16T00:00:00Zhttps://bannister.us/weblog/2006/open-microsoft-formats
<p>Yet another professional journalist who would make yet another
unremarkable guy with a weblog. In that role his mistakes would be not
especially bothersome. As a professional journalist, we tend to expect
something better than this.</p>
<blockquote>
<p><a href="http://www.eweek.com/article2/0,1895,1856854,00.asp">Massachusetts' Move to Open Format Is
Closed-Minded</a>
I am not sure what the real problem is with using Microsoft file
formats. No, they are not open, but they aren't completely closed,
either.</p>
</blockquote>
<p>Right - so it makes perfect sense to pull up an old document twently or
more years from now, and <strong>almost</strong> be able to read the document. Public
documents should be archived, and some will need to be readable many
years from now. An almost-kinda-sorta documented format may be readable
in the future, if we're lucky. That's not good enough.</p>
<p>As a software developer my guess is that on a pure technology basis,
trying to standardize on the Microsoft formats is probably a mistake.
Microsoft shipped the first version of Word on 1983. With each
successive revision the Microsoft folks have doubtless both added
features, and maintained compatibility with prior version. This has gone
on for over twenty years! By now both the document formats and the code
have likely accumulated a fair amount of cruft - leftover bits that have
to be there, but that are not well understood or that do not fit well
with the rest of the design. For the Microsoft folks to document all
this would be both difficult and a bit embarassing. Not really a good
basis for a standard.</p>
<p>At this point pretty much everyone should understand the upgrade-game
Microsoft plays with Office customers. Customers feel forced to upgrade
with each new version, on the chance that someone might send them a
document (from a newer version of Office) that they cannot read.
Customers are not upgrading to get new features, they are upgrading out
of fear. As long as Microsoft can tweak the default format regularly,
they can keep customers on the upgrade cycle.</p>
<p>The last time I was <strong>interested</strong> in a new version was Microsoft Word
95 - as this was the second 32-bit version of Word. Even the older
16-bit versions of Word were very capable programs, but had trouble with
large documents. The 32-bit version had fewer limits, and by the second
version they had shaken out most of the bugs from the transition to
32-bit. I have a personal copy of Office 95. Since then I have received
licensed current versions of Office through work, but have switched
entirely to OpenOffice for all my personal and kids' machines.
OpenOffice is more than good enough.</p>
<p>Looks like some folks who use Word more than I do presently have a
similar opinion:</p>
<blockquote>
<p><a href="http://www.faughnan.com/msword.html">Microsoft Word: Living with the
Beast</a>
I'm told by true experts that until Word 6/Word 95 it was actually
not a bad wordprocessor. It really went bad with Word 97 onwards. This
parallels my experience with the old Macintosh version of Word 4 and
5; they were quite useable.</p>
</blockquote>
Chills2006-01-14T00:00:00Zhttps://bannister.us/weblog/2006/chills
<blockquote>
<p><a href="http://countrydame.blogspot.com/2004/11/chills.html#comments">Lady of the house:
chills</a>
Those last few days plenty of temperature records have been broken in
Iceland, its been very cold for the time of year. Temperatures dropped
down to -30C at Lake Myvatn last night and here they have been at
around -15C for a few days. An aging electrical heating system can not
keep up with those kind of temperatures and I have started to think
that I will be in the need of surgery once it starts getting warmer
again, those jumpers will most likely have to be removed by
amputation.
Here are a few things worth having in mind for those who would like
to make their home a bit more cozy during a big freeze.</p>
</blockquote>
<p>Interesting perhaps more because I have only lived here is southern
California, and am thinking of leaving someday. Cold winter nights here
can get down near 40°F (not often) with days mostly in the 50's or 60's.
The above is rather different.</p>
Scarcity versus abundance of talent2006-01-12T00:00:00Zhttps://bannister.us/weblog/2006/scarcity-versus-abundance-of-talent
<p>When I first read this, I felt Diller's argument was wrong, but could
not put my finger on why.</p>
<blockquote>
<p><a href="http://weblog.infoworld.com/udell/2006/01/09.html#a1366">Jon Udell: Scarcity versus abundance of
talent</a>
Over the weekend I listened to the ITConversations podcast of Barry
Diller's appearance at Web 2.0. He's a thoughtful and articulate guy
and I recommend the entire interview, but here's the crucial quote
from the <a href="http://udell.infoworld.com:8003/?url=http://www.itconversations.com/audio/download/ITConversations-820.mp3&beg=12:50&end=13:57">soundbite I
bookmarked</a>:</p>
</blockquote>
<blockquote>
<p>There's not that much talent in the world, and talent almost always
outs. There's very few people, in very few closets, that are really
talented and can't find their way out. Somehow they get out.</p>
</blockquote>
<blockquote>
<p>... it wasn't until I heard Diller's remarkable statement that I
finally got to the crux of the issue. Is talent scarce or abundant? If
you believe that talent is scarce, as Diller does, then it's going to
have to be metered, and we're headed down the DRM path for sure. If
you believe that talent is relatively abundant, as Doc and I do, then
you imagine a very different future where technology favors use over
control.</p>
<p>The scarcity argument can't be dismissed out of hand. Maybe Diller's
right. But what if he's wrong? If the DRM train has already left the
station, we'll never do the experiment and we'll never know the
answer.</p>
</blockquote>
<p>What is wrong with Dillier's argument is his definition of talent. From
the world-view of an outfit looking to control, mass-market, and reap
huge profits - the sort of "talent" they are looking for probably is as
Diller describes.
<strong>When Diller says "really talented", he is referring to the size of
the market.</strong></p>
<p>My definition of "talent" as a consumer is quite different. When I go
looking for music to buy, I am looking for a "talent" whose work I like.
I don't care if their audience is ten other people, ten thousand or ten
million.
<strong>Customers evaluate "talent" by the whether the works produced appeal
to their individual taste. In the end, customers define the market.</strong></p>
<p>The trick is how to make the "long tail" work. This is a search
problem - how can the consumer find all those interesting "talents" that
have markets too small for Diller and friends?</p>
<p><a href="http://www.pandora.com/">Pandora</a> seems to have the best solution to
the hard part of the search problem - they do a very good job of finding
music similar to works I like. The use of a <a href="http://static.flickr.com/43/85692131_ede6b02b8e_o.jpg">postage-stamp sized Flash
applet</a> is a
pain. At this point I am so annoyed with the RIAA that I am very
unlikely to buy anything from an RIAA member - and it seems that
everything Pandora returns is from an RIAA member. Promising but - at
least for me - presently useless.</p>
<p><a href="http://www.magnatune.com/">Magnatune</a> is interesting for how they
package and deliver music. The problem with Magnatune is limited
selection - I've bought everything they offer that I like.</p>
Honey, I'm Home2006-01-12T00:00:00Zhttps://bannister.us/weblog/2006/honey-im-home
<p><object style="width:400px; height:326px;" id="VideoPlayback" align="middle" type="application/x-shockwave-flash" data="http://video.google.com/googleplayer.swf?videoUrl=http%3A%2F%2Fvp.video.google.com%2Fvideodownload%3Fversion%3D0%26secureurl%3DgQAAAItftD5fjs2DjtITIQ21p5iL4CHOIGljwcZvdbe_JueOfbou87afbQHbjVSccZBYVHtcdznAql_PxhYqpCaT0On2rGgDinr5XkXAfkDtEH5qGyt0J9ndKrtfvt6heik_iWkee5q0Ov_NORp-YS9v3YMkKINaDheRuePLS79qFNmr0JW8YvMryABAfGfOv_kbMA%26begin%3D0%26len%3D46520&thumbnailUrl=http%3A%2F%2Fvideo.google.com%2FThumbnailServer%3Fcontentid%3Db9953c717f89cb88%26second%3D5%26itag%3Dw320%26urlcreated%3D1137054167%26sigh%3DD03_Zqt18FtRzesOIW5UDihBza4&playerId=7995452351169893248&playerMode=embedded"><param name="allowScriptAccess" value="sameDomain" /><param name="movie" value="http://video.google.com/googleplayer.swf?videoUrl=http%3A%2F%2Fvp.video.google.com%2Fvideodownload%3Fversion%3D0%26secureurl%3DgQAAAItftD5fjs2DjtITIQ21p5iL4CHOIGljwcZvdbe_JueOfbou87afbQHbjVSccZBYVHtcdznAql_PxhYqpCaT0On2rGgDinr5XkXAfkDtEH5qGyt0J9ndKrtfvt6heik_iWkee5q0Ov_NORp-YS9v3YMkKINaDheRuePLS79qFNmr0JW8YvMryABAfGfOv_kbMA%26begin%3D0%26len%3D46520&thumbnailUrl=http%3A%2F%2Fvideo.google.com%2FThumbnailServer%3Fcontentid%3Db9953c717f89cb88%26second%3D5%26itag%3Dw320%26urlcreated%3D1137054167%26sigh%3DD03_Zqt18FtRzesOIW5UDihBza4&playerId=7995452351169893248&playerMode=embedded" /><param name="quality" value="best" /><param name="bgcolor" value="#ffffff" /><param name="scale" value="noScale" /><param name="wmode" value="window" /><param name="salign" value="TL" /></object>
<a href="http://video.google.com/videoplay?docid=7995452351169893248&q=thai">Honey, I'm Home - Google
Video</a></p>
How not to teach Calculus2006-01-11T00:00:00Zhttps://bannister.us/weblog/2006/how-not-to-teach-calculus
<p><object style="width:400px; height:326px;" id="VideoPlayback" align="middle" type="application/x-shockwave-flash" data="http://video.google.com/googleplayer.swf?videoUrl=http%3A%2F%2Fvp.video.google.com%2Fvideodownload%3Fversion%3D0%26secureurl%3DiwAAAFAJ_BuJSBDu4bQb-Ov_KYg6LlYWGeH_p9CIOWoNlFS1rrUrB9YDmAYWOLDTSertfCNaefOYSGPWU_aNiOAWlqnEfBma9LdSHnsTrKn_O5Vkp4HkHlSrnL_gjBJnV9xvHJSJ9TkMbh0j6wwlxc5E63OLSG71uLbL-07sFHVk01Q96_QZ2GITYRiQv3PWFOy-XQ%26begin%3D0%26len%3D124691&thumbnailUrl=http%3A%2F%2Fvideo.google.com%2FThumbnailServer%3Fcontentid%3Deea77eea6736c4bd%26second%3D5%26itag%3Dw320%26urlcreated%3D1137050014%26sigh%3DkCTokVxFwVXW6UfPqZWHEHgY5CI&playerId=7172438422483406719&playerMode=embedded"><param name="allowScriptAccess" value="sameDomain" /><param name="movie" value="http://video.google.com/googleplayer.swf?videoUrl=http%3A%2F%2Fvp.video.google.com%2Fvideodownload%3Fversion%3D0%26secureurl%3DiwAAAFAJ_BuJSBDu4bQb-Ov_KYg6LlYWGeH_p9CIOWoNlFS1rrUrB9YDmAYWOLDTSertfCNaefOYSGPWU_aNiOAWlqnEfBma9LdSHnsTrKn_O5Vkp4HkHlSrnL_gjBJnV9xvHJSJ9TkMbh0j6wwlxc5E63OLSG71uLbL-07sFHVk01Q96_QZ2GITYRiQv3PWFOy-XQ%26begin%3D0%26len%3D124691&thumbnailUrl=http%3A%2F%2Fvideo.google.com%2FThumbnailServer%3Fcontentid%3Deea77eea6736c4bd%26second%3D5%26itag%3Dw320%26urlcreated%3D1137050014%26sigh%3DkCTokVxFwVXW6UfPqZWHEHgY5CI&playerId=7172438422483406719&playerMode=embedded" /><param name="quality" value="best" /><param name="bgcolor" value="#ffffff" /><param name="scale" value="noScale" /><param name="wmode" value="window" /><param name="salign" value="TL" /></object>
<a href="http://video.google.com/videoplay?docid=7172438422483406719&q=calculus">How-to-Do Girls: Bikini Calculus - Constant Rule - Google
Video</a>
Guaranteed not to improve any guy’s knowledge of Math.</p>
Can women do every thing - Google Video2006-01-11T00:00:00Zhttps://bannister.us/weblog/2006/can-women-do-every-thing-google-video
<p><object style="width:400px; height:326px;" id="VideoPlayback" align="middle" type="application/x-shockwave-flash" data="http://video.google.com/googleplayer.swf?videoUrl=http%3A%2F%2Fvp.video.google.com%2Fvideodownload%3Fversion%3D0%26secureurl%3DigAAAKjzh5TmdsIH3FO5yAFO9Mu1-wTOOQppu0xEwQyf8jteDX9mzr2yQIH2PMP0J4djh897mGN7p52ECC7CWc5Xiu1wl6IPaEcocPN0sXrqnknUP-k4rFWXRulJKWRXH3IZxOgfGuqeZym2kHxGFd4hX0VchkGc2BkCFswAfb3cuFNBsNBQXlzcC0tlc76a0oZ96Q%26begin%3D0%26len%3D42800&thumbnailUrl=http%3A%2F%2Fvideo.google.com%2FThumbnailServer%3Fcontentid%3D40b4ece3cd38739c%26second%3D5%26itag%3Dw320%26urlcreated%3D1137049257%26sigh%3DiJ0c3MejMp1crlOjhg5PDePl-1A&playerId=5835125648649758133&playerMode=embedded"><param name="allowScriptAccess" value="sameDomain" /><param name="movie" value="http://video.google.com/googleplayer.swf?videoUrl=http%3A%2F%2Fvp.video.google.com%2Fvideodownload%3Fversion%3D0%26secureurl%3DigAAAKjzh5TmdsIH3FO5yAFO9Mu1-wTOOQppu0xEwQyf8jteDX9mzr2yQIH2PMP0J4djh897mGN7p52ECC7CWc5Xiu1wl6IPaEcocPN0sXrqnknUP-k4rFWXRulJKWRXH3IZxOgfGuqeZym2kHxGFd4hX0VchkGc2BkCFswAfb3cuFNBsNBQXlzcC0tlc76a0oZ96Q%26begin%3D0%26len%3D42800&thumbnailUrl=http%3A%2F%2Fvideo.google.com%2FThumbnailServer%3Fcontentid%3D40b4ece3cd38739c%26second%3D5%26itag%3Dw320%26urlcreated%3D1137049257%26sigh%3DiJ0c3MejMp1crlOjhg5PDePl-1A&playerId=5835125648649758133&playerMode=embedded" /><param name="quality" value="best" /><param name="bgcolor" value="#ffffff" /><param name="scale" value="noScale" /><param name="wmode" value="window" /><param name="salign" value="TL" /></object>
<a href="http://video.google.com/videoplay?docid=5835125648649758133">Can women do every thing - Google
Video</a></p>
airplane landing on the highway 405 - Google Video2006-01-11T00:00:00Zhttps://bannister.us/weblog/2006/airplane-landing-on-the-highway-405-google-video
<p><object style="width:400px; height:326px;" id="VideoPlayback" align="middle" type="application/x-shockwave-flash" data="http://video.google.com/googleplayer.swf?videoUrl=http%3A%2F%2Fvp.video.google.com%2Fvideodownload%3Fversion%3D0%26secureurl%3DewAAAIErYPtq04Qn8vwdjgunpSo3GjmzAfk3TKYfXVvsXfxs3AMf-Ih-L7Y4tcpx47H8IxfOtVVIbPyjCaurBhAEW2nCq5CgmDN-wd1Qt-LC4QB54tQfmmqZI5riis2QE2aye7L6gygK8joD3i4ByfH_xrOOk4BO5XrC-ySsK2punT3Y%26begin%3D0%26len%3D178699&thumbnailUrl=http%3A%2F%2Fvideo.google.com%2FThumbnailServer%3Fcontentid%3Df740505caac3f7d9%26second%3D5%26itag%3Dw320%26urlcreated%3D1137050266%26sigh%3D20FBUkQjVkctozDoXgB2APpetj4&playerId=-5507725333094203198&playerMode=embedded"><param name="allowScriptAccess" value="sameDomain" /><param name="movie" value="http://video.google.com/googleplayer.swf?videoUrl=http%3A%2F%2Fvp.video.google.com%2Fvideodownload%3Fversion%3D0%26secureurl%3DewAAAIErYPtq04Qn8vwdjgunpSo3GjmzAfk3TKYfXVvsXfxs3AMf-Ih-L7Y4tcpx47H8IxfOtVVIbPyjCaurBhAEW2nCq5CgmDN-wd1Qt-LC4QB54tQfmmqZI5riis2QE2aye7L6gygK8joD3i4ByfH_xrOOk4BO5XrC-ySsK2punT3Y%26begin%3D0%26len%3D178699&thumbnailUrl=http%3A%2F%2Fvideo.google.com%2FThumbnailServer%3Fcontentid%3Df740505caac3f7d9%26second%3D5%26itag%3Dw320%26urlcreated%3D1137050266%26sigh%3D20FBUkQjVkctozDoXgB2APpetj4&playerId=-5507725333094203198&playerMode=embedded" /><param name="quality" value="best" /><param name="bgcolor" value="#ffffff" /><param name="scale" value="noScale" /><param name="wmode" value="window" /><param name="salign" value="TL" /></object>
<a href="http://video.google.com/videoplay?docid=-5507725333094203198&q=405">Airplane landing on the highway 405 - Google
Video</a></p>
The risk of hosting with Microsoft or Yahoo2006-01-07T00:00:00Zhttps://bannister.us/weblog/2006/the-risk-of-hosting-with-microsoft-or-yahoo
<blockquote>
<p><a href="http://www.iht.com/articles/2006/01/06/technology/web.0107msft.php">Microsoft's shutdown of Chinese blog is condemned - Technology -
International Herald
Tribune</a>
Microsoft's decision to shut down the site of a well-known Chinese
blogger was the latest in a series of measures in which some of the
biggest technology companies have cooperated with Beijing to curb
dissent or free speech online.</p>
<p>Microsoft drew criticism last summer when it was discovered that its
blog tool in China was designed to filter words like ''democracy'' and
''human rights'' from blog titles. The company said this week that it
must ''comply with global and local laws.''</p>
</blockquote>
<blockquote>
<p>Another American online service operating in China, Yahoo, was widely
criticized in the autumn after it was revealed that the company had
provided Chinese authorities with information that led to the
imprisonment of a Chinese journalist who kept a personal e-mail
account with Yahoo. Yahoo also defended its action by saying it was
forced to comply with local law.</p>
</blockquote>
<p>Apparently hosting your weblog, website, or email with a service that
has a significant business presence in repressive countries is not a
good idea. I can understand Microsoft's and Yahoo's actions - as a
business they stand to lose much if they get in trouble with China's
government. As an individual, I can see there is a big risk in hosting
my website with a business whose interests might conflict.</p>
<p>Not long ago I was looking at Yahoo's much-improved offerings for web
hosting. Safe to say I have pretty much lost interest in the notion in
hosting with any big business that has other - potentially conflicting -
interests.</p>
Pile on the debt!2006-01-07T00:00:00Zhttps://bannister.us/weblog/2006/apparently-bush-thinks-we-need-a-bigger-deficit-2
<blockquote>
<p><a href="http://www.bloomberg.com/apps/news?pid=10000087&sid=aY7hwHCktxCY&refer=top_world_news">Bush Urges Congress to Extend Tax Cuts, Slow Spending
Growth</a>
President George W. Bush urged the U.S. Congress to slow the growth
of spending on entitlement programs and suggested that Democrats who
oppose extending tax cuts risk undermining the economy.</p>
</blockquote>
<p>When you first read the headline it almost sounds like Bush is trying to
be economically conservative. When you <strong>read</strong> the headline ... the
most ambitious goal Bush can think of is:</p>
<ul>
<li>not stopping the growth of the <strong>yearly</strong> budget deficit</li>
<li>not reducing the deficit</li>
<li>not a balanced budget</li>
<li>absolutely not a budget surplus!</li>
</ul>
<p>The most ambitious goal Bush can come up is to run a bigger deficit than
last year. Wow, I'm impressed.</p>
<p>In my book, economically conservative does <strong>not</strong> mean getting more and
more into debt every year. An economic conservative would look to:</p>
<ul>
<li>first - balance the budget</li>
<li>second - reduce spending to generate a surplus</li>
<li>third - pay off the debt</li>
<li>and last - cut taxes when we have little or no debt</li>
</ul>
<p>What words would you use to describe someone who ran up huge debts or
your credit cards, debts that you were obligated to pay off? Is
"conservative" one of those words?</p>
<p>I am an engineer and my father is an engineer. In the world of
engineering, a good "conservative" engineer strives to design things to
be a little more robust than absolutely necessary, and tries to control
costs (without compromising the design) as much as possible. In the
world of investing, a good "conservative" investor looks for good solid
investments with limited risk. When it comes to the natural beauties and
wonders of our world, a "conservationist" looks to preserve, protect and
enhance the world around us.</p>
<p>Keeping a "tax cut" as a priority when Congress in unable (or unwilling)
to control spending is <strong>not</strong> good conservative behavior. It would seem
more accurate to say that the President, Congress - and by extension the
Republican party - are dominated by
<a href="http://www.google.com/search?hl=en&lr=&c2coff=1&safe=off&oi=defmore&defl=en&q=define:grifter">grifters</a>.</p>
Remember Orwell's "1984"?2006-01-01T00:00:00Zhttps://bannister.us/weblog/2005/remember-orwells-1984
<blockquote>
<p><a href="http://news.yahoo.com/s/ap/20060102/ap_on_go_pr_wh/domestic_spying">Bush Calls Domestic Spy Program
'Limited'</a>
President Bush strongly defended his domestic spying program on
Sunday, calling it legal as well as vital to thwarting terrorist
attacks, and contended the leak making it public had caused "great
harm to the nation."</p>
<p>"This is a limited program designed to prevent attacks on the United
States of America and, I repeat, limited," Bush told reporters after
visiting wounded troops at Brooke Army Medical Center. "I think most
Americans understand the need to find out what the enemy's thinking."</p>
</blockquote>
<p>Looking within for "enemies" with no oversight?</p>
<blockquote>
<p>The New York Times reported last month that the National Security
Agency had been conducting warrantless surveillance since 2002. Bush
then acknowledged that he had authorized the NSA program and pointed
to informing congressional leaders and regular reviews by
administration officials as evidence of oversight for the program.</p>
</blockquote>
<blockquote>
<p>The Justice Department on Friday opened an investigation into the leak
that resulted in news stories about the secret order to eavesdrop on
Americans with suspected ties to terrorists.</p>
<p>"The fact that somebody leaked this program causes great harm to the
United States," Bush said before returning to Washington from a
holiday break at his Texas ranch. "There's an enemy out there."</p>
</blockquote>
<p>There are good reasons for laws that distinguish between looking "out
there" and looking within our own country.</p>
<blockquote>
<p>The president denied misleading the public during a 2004 appearance in
support of the Patriot Act when he said, "Any time you hear the United
States government talking about wiretap, a wiretap requires a court
order."</p>
<p>Asked about that Sunday, Bush said: "I was talking about roving wire
taps, I believe, involved in the Patriot Act. This is different from
the NSA program. The NSA program is a necessary program."</p>
</blockquote>
<p>Didn't they ream Clinton for mincing his words in a similar fashion?</p>
<blockquote>
<p>Sen. Arlen Specter (news, bio, voting record), the Pennsylvania
Republican who chairs the Judiciary Committee, has called for hearings
into the program. Sen. Mitch McConnell (news, bio, voting record),
R-Ky., said Sunday that he would prefer that any hearings be held by
the Intelligence Committee, which likely would be in secret.</p>
<p>"We're already talking about this entirely too much out in public as a
result of these leaks ... and it's endangering our efforts to make
Americans more secure," McConnell said.</p>
</blockquote>
<p>Maybe talking about problems like this in public is a good thing - less
chance to hide things that should not be hidden.</p>
<blockquote>
<p>Appearing with McConnell on "Fox News Sunday," Sen. Charles Schumer
(news, bio, voting record), D-N.Y., said the Justice Department
investigation should explore the motivation of the person who leaked
the information.</p>
<p>"Was this somebody who had an ill purpose, trying to hurt the United
States?" Schumer asked. "Or might it have been someone in the
department who felt that this was wrong, legally wrong, that the law
was being violated?"</p>
</blockquote>
<p>The motivation of the leaker is irrelevant. What Bush did was wrong - or
at least should be in this country.</p>
<p>The political turmoil that lead into World War II, the Communist
takeover in Russia, dictatorships that arose in Europe, and Orwell's
book "1984" - all made entire generations of Americans wary of any form
of authoritarion government. Apparently we have lost much of that
wariness.</p>
Non-working security tags2006-01-01T00:00:00Zhttps://bannister.us/weblog/2005/non-working-security-tags
<p>Bought three (rather pricey) shirts from a large retailer at the mall. A
few days later at home pulled one out of the bag - and found that the
anti-theft device was still attached. Checked the other shirts, and
found that only one had the security tag removed. So I walked out the
door with three items nominally worth $285 (purchased) - and the two
security tags did nothing.</p>
<p>Now I do not want to burn an hour driving back to the store, just to get
the tags removed. I have successfully bashed this sort of tag to bits
before - a bit of a pain - when the store clerk forgot to remove them.
Checked to see if anyone had a better approach, and only came up with -
<a href="http://www.boingboing.net/2004/08/23/lazyweb_request_remo.html">Removing anti-theft devices still attached to purchased
clothing</a>
and <a href="http://ask.metafilter.com/mefi/18730">Removing security tags</a> -
nothing fancier than pliers and bashing with a hammer.</p>
<p>Looking for more information, came across an outfit selling <a href="http://www.sensortags.com/shoplifting-deterrents/fake-security.htm">fake
security</a>.
The "fake" tags are much cheaper ($0.10 each) than the real tags. I
have walked out of the store before with items where the security tags
were still attached (when the clerk forgot to remove the device). Never
had any sort of alarm go off. Apparently the use of "fake" security tags
is pretty common.</p>
<p>The search turned up a fair number of court transcripts where the
presence of the security tags was used as evidence. My guess is that
fake tags are mostly just meant to identify shoplifted items when a
shoplifter is caught by store security.</p>
IIS6 troubleshooting advice2006-01-01T00:00:00Zhttps://bannister.us/weblog/2005/iis6-troubleshooting-advice
<p>Worth a mention....</p>
<p><a href="http://blogs.msdn.com/david.wang/comments/508151.aspx">David Wang : HOWTO: Basics of IIS6
Troubleshooting</a></p>
<p>If you are trying to solve an obscure misbehavior in IIS and (and IIS6
tends to be particularly obscure), one of the very best resources is
<a href="http://blogs.msdn.com/david.wang/default.aspx">David Wang's weblog</a>.
ISAPI filters and ISAPI extensions can be especially obscure to diagnose
when they misbehave.</p>
Dirty play - Massachusetts and Microsoft2006-01-01T00:00:00Zhttps://bannister.us/weblog/2005/dirty-play-massachusetts-and-microsoft
<blockquote>
<p><a href="http://www.betanews.com/article/Mass_Secretary_Attacks_Open_Doc_Plan/1130280805">Mass. Secretary Attacks Open Doc
Plan</a>
Massachusetts' plan to drop Microsoft Office in favor of open
standards formats has drawn criticism from the Commonwealth's
Secretary of State, who says he has "grave concerns" about switching
to OpenDocument. But politics could be playing a larger role in
Secretary William Galvin's opposition.</p>
</blockquote>
<p>Since there is no technical basis for the objections from the
Massachusetts Secretary of State, either this indicates a personal
political and economic basis - or ignorance.</p>
<blockquote>
<p>Still, Massachusetts CIO Quinn is confident the change is a step in
the right direction. "There is no evidence that migrating to office
applications that support OpenDocument Format will be any more costly
than upgrading current applications," the state's IT department said,
noting that any company is free to implement OpenDocument support -
including Microsoft.</p>
</blockquote>
<p>Quinn pretty much nails the issue.</p>
<p>Upgrading to a new version of Microsoft Office burns a <strong>lot</strong> of cash,
and will do so again when another new version comes out. You can pay for
a <strong>lot</strong> of conversion expenses - probably more than needed - out of
cash saved by opting out of MS Office upgrades. Conversion expenses are
one-time. Version upgrade expenses repeat.</p>
<p>Microsoft could likely turn out a load/save module for the ODF formats
inside of a month. On a technical level this is just not all that
difficult. Naturally they will continue to come up with semi-bogus
reasons this cannot be done - right up to the point where they have no
choice. Adopting ODF does <strong>not</strong> mean that Microsoft is in any way
excluded, and it is silly to suggest otherwise. Adopting ODF does level
the playing field - naturally <strong>not</strong> something Microsoft wants.</p>
<blockquote>
<p><a href="http://www.boston.com/news/local/massachusetts/articles/2005/12/10/review_backs_trips_by_technology_chief/">Review backs trips by technology chief - The Boston
Globe</a>
Quinn has been at the center of a controversial decision made by the
Romney administration to require that all documents produced by the
state's executive branch be stored in a new, universal computer format
called OpenDocument, which would work with many brands of software and
is less likely to become obsolete. The change, <strong>which would require
modifications to the software running on thousands of state
computers</strong>, is widely viewed as a challenge to Microsoft and its
Office software, which is used to generate documents on most
computers.</p>
</blockquote>
<p>Just to state the incredibly obvious - every time the State of
Massachusetts buys a new version of Microsoft Office, they modify
software on thousands of computers. Duh. Whether Massachusetts chooses
MS Office or OpenOffice - the number of computers effected is the same.</p>
<p>Note this is a professional "Journalist" turning out a
less-than-insightful bit of work. There are quite a few non-professional
<a href="https://bannister.us/weblog/2005/weblogs-and-journalism">journalists</a>
putting better work into weblogs.</p>
<blockquote>
<p><a href="http://www.eweek.com/article2/0,1895,1906407,00.asp">Microsoft Wins, Open Standards
Lose</a>
The Boston Globe decided to publish a Page 1 story about how Quinn
was being investigated, because of the Globe's own probes, for
unauthorized trips.</p>
<p>Several weeks later, the Globe reported, in the local pages, that
Quinn had not violated "conflict-of-interest standards or other rules
when he took 12 out-of-state trips to attend conferences."</p>
<p>Andrew Updegrove, a partner with Gesmer Updegrove LLP, a Boston law
firm, and the editor of ConsortiumInfo.org, wondered about the timing
of the Globe's reporting, which was "concurrent with moves by Senator
Pacheco and others in State Government to curtail Quinn's ability to
set rules for proper management of the [state's] IT needs."</p>
<p>Coincidence? Maybe.</p>
<p>The first time someone in authority in a state government decides to
support a format that Microsoft doesn't approve, he's suddenly hounded
not only within the government but in the press as well.</p>
<p>So, Quinn resigned.</p>
</blockquote>
<blockquote>
<p><a href="http://consortiuminfo.org/newsblog/blog.php?ID=1863">Consortiuminfo.org Standards
Blog</a>
... received the news from Eric Kriss, who as the then Massachusetts
Secretary of Administration and Finance was Quinn's boss during most
of the ODF evaluation process (the Secretary of A&F is now Thomas
Trimarco).</p>
<p>According to Kriss, who met with Quinn on December 21st, the personal
attacks, and especially the unfounded (and quickly disproven) charges
publicized by the Boston Globe, played a major part in reaching his
decision."</p>
</blockquote>
<p>So now both Quinn and his boss are gone. It will be interesting to see
who replaces them.</p>
<p>Did Microsoft fund this misbehavior? This smells bad.</p>
White House web bugs2005-12-31T00:00:00Zhttps://bannister.us/weblog/2005/white-house-web-bugs
<p><a href="http://news.yahoo.com/s/ap/20051231/ap_on_hi_te/white_house_bug">White House Says Web Site Counts
Visitors</a>
OK, this is just silly ... perhaps not-very-hard working
<a href="https://bannister.us/weblog/2005/weblogs-and-journalism">"Journalists"</a>
looking for low hanging fruit.</p>
<p>File this under "So What!". Perhaps the White House website counts
visitors. Perhaps the White House website tracks the interests of an
individual visitor. By itself this is harmless, and the last is
information the folks maintaining the website can use to be more
helpful. By itself this is simply not a problem.</p>
<p>Now if the website information was going into some universal
surveillance database - which may well be the case given recent
history - then that would be of concern. This sort of surveillance is
more effectively done by installing what amounts to <a href="http://www.epic.org/privacy/carnivore/foia_documents.html">digital taps in the
Internet</a>. In
comparison cookies and webbugs are pretty much both useless and
harmless.</p>
<p><a href="http://www.schneier.com/blog/archives/2005/09/nsa_watch.html">We</a>
<a href="http://www.schneier.com/blog/archives/2005/10/dmca_review.html">have</a>
<a href="http://www.schneier.com/blog/archives/2005/12/is_the_nsa_read.html">many</a>
<a href="http://www.schneier.com/blog/archives/2005/12/project_shamroc.html">far</a>
<a href="http://www.schneier.com/blog/archives/2005/12/idiotic_article.html">more</a>
<a href="http://www.schneier.com/blog/archives/2005/11/fraud_and_organ.html">serious</a>
<a href="http://www.schneier.com/blog/archives/2005/11/interdicting_te.html">problems</a>
<a href="http://www.schneier.com/blog/archives/2005/11/interdicting_te.html">to</a>
<a href="http://www.schneier.com/blog/archives/2005/11/giving_the_us_m.html">worry</a>
<a href="http://www.schneier.com/blog/archives/2005/10/cell_phone_surv.html">about</a>.</p>
<p><a href="http://www.theonion.com/content/files/images/Infographic-New-TSA-C.jpg"><img src="http://www.theonion.com/content/files/images/Infographic-New-TSA-C.article.jpg" alt="TSA" /></a>
from <a href="http://www.theonion.com/content/node/43716">The Onion</a></p>
Weblogs and Journalism2005-12-31T00:00:00Zhttps://bannister.us/weblog/2005/weblogs-and-journalism
<p><a href="http://ars.userfriendly.org/cartoons/?id=20051230"><img src="http://www.userfriendly.org/cartoons/archives/05dec/uf008670.gif" alt="yes" /></a>
from <a href="http://ars.userfriendly.org/cartoons/?id=20051230">UserFriendly</a></p>
<p>Yes, I do believe weblogs have forced those who practice "Journalism"
(the profession) to work a little harder, and to not be as sloppy as
often.</p>
<p>As an aside - the word "Journalism" is dervied from
<a href="http://www.google.com/search?hl=en&lr=&c2coff=1&safe=off&oi=defmore&defl=en&q=define:journal">journal</a>
for which one of the offered definitions is "a daily written record of
(usually personal) experiences and observations". Hmm - this sounds like
a weblog. So if a weblog is a form of journal, then presumably we can
say that those who keep
<a href="http://www.google.com/search?hl=en&lr=&c2coff=1&safe=off&oi=defmore&defl=en&q=define:weblog">weblogs</a>
are practicing
<a href="http://www.google.com/search?hl=en&lr=&c2coff=1&safe=off&oi=defmore&defl=en&q=define:journalism">journalism</a> -
by definition?</p>
<p>Of course in common usage "Journalism" (especially when capitallized) is
often used to describe the profession associated with newspapers,
magazines, and (sometimes) television.</p>
<p>So ... those who keep weblogs are "journalists", but not "Journalists"??
Is this something of a rather fine - or perhaps slight - distinction?
This change from centrallized to decentrallized mass communication (from
print to the Internet) is playing havoc with old definitions :).</p>
Royal good taste honors Apple designer2005-12-31T00:00:00Zhttps://bannister.us/weblog/2005/royal-good-taste-honors-apple-designer
<blockquote>
<p><a href="http://www.mercurynews.com/mld/mercurynews/business/13523188.htm">MercuryNews.com | 12/31/2005 | Royal honor shines on Apple
designer</a>
Jonathan Ive has been awarded the Commander of the Most Excellent
Order of the British Empire, or CBE, by Queen Elizabeth II who,
according to the British press, fancies a silver iPod mini.</p>
</blockquote>
<p>I think this shows incredible good taste on the part of the Queen. Who
knew? :)</p>
Lawyers, guns and money2005-12-31T00:00:00Zhttps://bannister.us/weblog/2005/lawyers-guns-and-money
<blockquote>
<p><a href="http://www.redherring.com/Article.aspx?a=15098&hed=Google+Sued+for+%245B#">Google Sued for $5B</a>
Rates Technology, a little-known patent-holding company with a
history of filing suits against large technology companies, said it
will seek $5 billion in damages from Google based on unpaid royalties
from a patent infringement lawsuit RTI filed against Google in New
York.</p>
</blockquote>
<p>Would it be more cost-effective to simply let contracts for "hits" on
the RTI principals? Improve the gene pool and make better use of
shareholder's money all in one stroke.</p>
<p>For the humor-impaired - 1) note the category, 2) get a clue.</p>
Keeping what little freedom we have left.2005-12-31T00:00:00Zhttps://bannister.us/weblog/2005/keeping-what-little-freedom-we-have-left
<blockquote>
<p><a href="http://www.schneier.com/blog/archives/2005/12/nsa_and_bushs_i.html">Schneier on Security: NSA and Bush's Illegal
Eavesdropping</a>
“Necessity is the plea for every infringement of human freedom. It is
the argument of tyrants; it is the creed of slaves.” -- William Pitt,
House of Commons, 11/18/1783</p>
</blockquote>
How To Make A RFID Blocking Wallet2005-12-31T00:00:00Zhttps://bannister.us/weblog/2005/how-to-make-a-rfid-blocking-wallet
<p><img src="http://www.rpi-polymath.com/ducttape/rfidwallet_small.gif" alt="wallet" />
<a href="http://www.rpi-polymath.com/ducttape/RFIDWallet.php">How To Make A RFID Blocking Wallet</a>
I wonder how long before this becomes a standard feature of wallets?
All the maker has to do is incorporate a layer of aluminum foil.</p>
<p><a href="http://www.ductskinvenice.com/pages/2/index.htm">100 % Duct Tape Wallets by DuckSkin
VENICE</a>
Pre-made wallets out of duct tape?!</p>
<p><a href="http://www.duct-tape.com/">Duct tape / Colored Duct Tape</a>
For those of you who are serious about their duct tape. I admit to
being tempted :).</p>
Cookies are not scary2005-12-31T00:00:00Zhttps://bannister.us/weblog/2005/cookies-are-not-scary
<blockquote>
<p><a href="http://blondesense.blogspot.com/2005/12/nsa-web-site-spies-on-you.html">NSA Web Site Spies On
You</a>
Since the NSA has been caught illegally spying on people recently. I
hardly believe that the cookies are inadvertant.</p>
</blockquote>
<p>This is so wrong on so many levels...</p>
<p>First, web browser cookies are not scary. In fact they are about as
scary as ... cookies (the kind you'd munch on). Cookies let a web site
remember a bit about you from the last visit. This is something like a
helpful shopkeeper who remembers you from the before, and does not waste
your time asking the same questions on every visit.</p>
<p>Years ago, when the software folks at Netscape came up with "cookies"
they were only trying to be helpful. They did make a mistake in that
they did not at the time consider the ways in which the information in
"cookies" could be misused. The problem was pretty simple - a bad site
could read <strong>all</strong> your cookies, not just the ones created by their
site. The fix was equally simple, and all current web browsers prevent
bad sites from stealing cookies.</p>
<p>There is still a way in which cookies can be abused. Advertising
outfits - the kind that put banner ads on lots of different pages - can
keep a history of all the sites you visit on which they have ads. Given
that advertising outfits tend to be a bit weak on ethics, this history
may be more information than you would like them to have. One common
(though not necessarily universal) feature of "spyware blockers" is the
ability to block the less ethical advertising outfits.</p>
Are men programmable?2005-12-31T00:00:00Zhttps://bannister.us/weblog/2005/are-men-programmable
<blockquote>
<p><a href="http://www.iht.com/articles/2005/12/29/business/surfer.php">Sexes gain equality on the
Web</a>
For men, it's just, 'Give me the facts,"' said Deborah Fallows, who
wrote the report based on six years of Pew surveys. "For women, it's
'Let's talk about this. Are you worried about this problem?' It's
keeping in touch and connecting with people in a richer way."</p>
</blockquote>
<p>Is this part of a pattern?</p>
<p>"You never listen to me!" - is a common complaint men hear from women.
Often the subject of the complaint is confused, as it seems he is doing
quite a lot of listening.</p>
<p>When out walking, I often see couples where the woman is talking - a
lot - and the man is listening (with expressions that range from patient
to slightly pained). It seems very much like the woman is attempting to
load a program into the subject, and the complaint comes when the man -
no matter how much listening he actually does - does not accept the
program.</p>
<p>Are men shaped by evolution to be programmable by women?</p>
jsp:plugin grief (cont'd)2005-12-27T00:00:00Zhttps://bannister.us/weblog/2005/jspplugin-grief-contd
<p>Updated the <a href="http://bannister.us/tests/applets/">applet tests</a> referred
to in the <a href="https://bannister.us/weblog/2005/jspplugin-grief">prior
post</a> both to
summarize the pass/fail result for each variety of applet invocation in
each IE/Firefox Java/no-java environment, and for each test to include
the applet exercising the Javascript-to-Java bridge.</p>
<p>Perhaps there are other incantations I could use for invoking an
applet - if so I would like to know. This was the best I could glean
from reading the documentation and dredging about on the web.</p>
<p>One observation I had missed that is apparent from the table - you
apparently cannot get Firefox to offer to install a specific older
version (1.4.2 in this case), as can be done with IE and the right
incantation.
Ouch.</p>
<p>I have no idea how this plays in Safari or Opera.</p>
<p>Apparently...
With IE we are better off using the OBJECT tag with a
<strong>classid="clsid:..."</strong> attribute.
With Firefox we are better off using either an APPLET tag, EMBED tag,
or an OBJECT tag with <strong>classid="java:..."</strong> attribute.</p>
Java Applets that "just work"2005-12-27T00:00:00Zhttps://bannister.us/weblog/2005/java-applets-that-just-work
<p>Summing up the results from <a href="https://bannister.us/weblog/2005/jspplugin-grief-contd">prior
post</a>,
getting Java Applets to "Just Work" in the browser boils down to a
"to-do" list on the part of multiple parties.</p>
<ol>
<li>
<p>Sun must offer a consistent API for downloading the appropriate JRE
for the user's machine. This API should look like...</p>
<p><strong>http://downloadserver.sun.com/downloads/jre</strong> to download the
latest JRE.
<strong>http://downloadserver.sun.com/downloads/jre?version=1.4</strong> to
download the latest 1.4 JRE.
<strong>http://downloadserver.sun.com/downloads/jre?version=1.4.2</strong> to
download the latest 1.4.2 JRE.
<strong>http://downloadserver.sun.com/downloads/jre?version=1.4.2_10</strong>
to download the latest 1.4.2_10 JRE.</p>
<p>Note that in each case the server can use browser detection to
supply the appropriate binary for the browser and operating system.</p>
<p>
Note also that the API **must never change** once offered. Also the
default installation should be as silent as possible.
</p></li>
<li>
<p>Firefox must provide a means to specify the minimum or exact Java
version required. Right now we will have a failure every time an
earlier Java version is installed on the user's machine than is
required by the applet. A better solution would be for Firefox to
look for a <strong>version=</strong> (or similar) attribute on APPLET, EMBED, and
OBJECT tags. If the installed Java version is earlier than
specified, then offer to install the appropriate Java version. The
default would be to download from the above Sun URL, and could be
overridden using a <strong>pluginurl=</strong> attribute (or similar). Note that
the interpretation of the <strong>version=</strong> attribute should follow a
similar scheme.</p>
<p><strong>version=' '</strong> or when unspecified accepts whatever Java version is
installed on the machine, or offers to download the latest JRE.
<strong>version='1.4'</strong> offers to download the latest 1.4 JRE if no or a
non-1.4 version is installed on the machine.
<strong>version='1.4+'</strong> offers to download the latest JRE if no or a
version earlier than 1.4 is installed on the machine.
<strong>version='1.4.2'</strong> offers to download the latest 1.4.2 JRE if no
or a non-1.4.2 version is installed on the machine.
<strong>version='1.4.2+'</strong> offers to download the latest JRE if no or a
version earlier than 1.4.2 is installed on the machine.
<strong>version='1.4.2_10'</strong> offers to download the latest 1.4.2_10 JRE
if no or a non-1.4.2_10 version is installed on the machine.
<strong>version='1.4.2_10+'</strong> offers to download the latest JRE if no or
a version earlier than 1.4.2_10 is installed on the machine.</p>
<p>Note the use of "+" to distinguish between the need for a specific
version, or for anything later than a specific version.</p>
<p>
A possible work-around is to load a shim applet compiled against
(say) Java 1.1, test the JRE version, then offer to install a later
JRE. I am not sure if this is even possible. Certainly this may
cause problems if in-page Javascript needs to communicate with the
applet.
</p></li>
<li>
<p>The JSP tag <strong>jsp:plugin</strong> should do browser detection (in the
default case). For IE (to avoid getting the Microsoft JVM) the
<strong>jsp:plugin</strong> tag should emit an OBJECT tag of the form:</p>
<p><object name="test_applet_object" classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" codebase="http://downloadserver.sun.com/downloads/jre?version=1.4.2" width="80%" height="200">
<param name="code" value="us.bannister.applets.TestApplet" />
<param name="archive" value="dist/applet-tests.jar" />
<param name="mayscript" />
<param name="foo" value="923-foo" />
<param name="bar" value="456-bar" />
</object></p>
<p>The above assumes the Sun folks implement the suggested API.
On all other platforms the <strong>jsp:plugin</strong> should emit an APPLET tag
of the form:</p>
<p><applet name="test_applet" code="https://bannister.us/weblog/2005/us.bannister.applets.TestApplet" width="80%" height="200" archive="https://bannister.us/weblog/2005/dist/applet-tests.jar" version="1.4.2_10" mayscript="">
<param name="foo" value="123-foo" />
<param name="bar" value="456-bar" />
</applet></p>
<p>
Note that the **version=** attribute is currently ignored.
</p></li>
</ol>
<p>For the moment, the best we can do for dynamically generated pages is
check the sort of browser, and for IE emit the OBJECT tag (as below),
and for everything else emit the APPLET tag (as below).</p>
<p><object name="test_applet_object" classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" codebase="http://java.sun.com/update/1.4.2/jinstall-1_4_2_10-windows-i586.cab#Version=1,4,2,10" width="80%" height="200">
<param name="code" value="us.bannister.applets.TestApplet" />
<param name="archive" value="dist/applet-tests.jar" />
<param name="mayscript" />
<param name="foo" value="923-foo" />
<param name="bar" value="456-bar" />
</object></p>
<p><applet name="test_applet" code="https://bannister.us/weblog/2005/us.bannister.applets.TestApplet" width="80%" height="200" archive="https://bannister.us/weblog/2005/dist/applet-tests.jar" version="1.4.2_10" mayscript="">
<param name="foo" value="123-foo" />
<param name="bar" value="456-bar" />
</applet></p>
<p>Yes, I know the HTML 4 standard deprecates the APPLET tag.
Pragmatically - this is irrelevant. Browsers for compatibility will have
to support the APPLET tag ... forever. Given the current (and future)
state of affairs, we would all be better off restoring the APPLET tag to
future HTML standards, with the addition above.</p>
<p>Yes, I know about the "trick" to wrap an EMBED inside an OBJECT that
gets us one incantation the works in static HTML for both IE or Firefox.
Given that EMBED is a Netscape-specific extension, there is no reason to
expect this to work in other browsers. There is an even hairier
incantation that uses in-page Javascript to conditionally emit either
OBJECT, EMBED, or APPLET tags. Good luck verifying that this works in
all environments. Better to use server-side dynamic HTML generation and
keep the emitted HTML as simple as possible. The above approach of
emitting an OBJECT tag for IE (to avoid the hoary Microsoft JVM), and an
APPLET everywhere else is both simpler, and arguably safer.</p>
<p>Now - if I had unlimited free time (as if) - the right thing to do would
be to ...</p>
<ul>
<li>Track down the folks at Sun responsible, and convince them to put up
a consistent plugin-download API (as above).</li>
<li>Work up and submit a patch to Mozilla/Firefox to implement the above
APPLET semantic to download the appropriate plugin.</li>
<li>Work up and submit a patch to JSP to get <strong>jsp:plugin</strong> to do the
right thing (as above).</li>
</ul>
<p>Right about now I can feel the appeal of accepting the Microsoft
monoculture :).</p>
jsp:plugin grief2005-12-26T00:00:00Zhttps://bannister.us/weblog/2005/jspplugin-grief
<p>My current work project - a web application - calls for use of a small
Java applet to present a critical and slightly tricky portion of the
user interface. The web application is aimed at replacing a Windows
desktop application (from a third party), and meant to provide a
<strong>better</strong> user interface than the desktop application it will replace.
For most of the application, it proved tedious but not difficult to
accomplish the same overall task using HTML pages (with extensive help
from CSS and Javascript) with an equivalent-or-better UI.</p>
<p>In the original Windows application there is one critical portion of the
UI that I always found rather clumsy and awkward to use. Years ago - as
time permitted and as a precondition to starting the project - I'd put
together a small prototype Java applet to present this one aspect and
test out my notions for a better presentation. I was satisfied with the
resulting UI gadget. Where the original application was obscure - with
the small Java applet this same facet of the user interface became
simple, intuitive, and more efficient to use.</p>
<p>Presenting the same user interface in HTML/CSS and (lots of) Javascript
is simply far too tricky to attempt in the first version of the
application. Someday I may take a crack at this, but not soon. It may
not even be possible.</p>
<p>Now - the support for Java applets in web browsers is somewhat
half-hearted. Web developers have largely moved away from use of Java
applets. Microsoft is - at best - a bit grumpy about supporting Java. So
I knew this part was a bit of a risk.</p>
<p>Years ago the Sun/Java folks did "The Right Thing" and came up with the
<a href="http://java.sun.com/products/plugin/index.jsp">Java Plugin</a>. With the
<a href="http://java.sun.com/j2se/1.4.2/docs/guide/plugin/developer_guide/using_tags.html">right
incantation</a>
in your HTML page you could insure the proper version of Java was
installed in the user's web browser. Since by now the Java Plugin has
been around for years - I pretty much assumed any of the kinks should
have been worked out long ago.</p>
<p>What's more there is even a <a href="http://java.sun.com/j2se/1.4.2/docs/guide/plugin/developer_guide/jsp.html">standard built-in JSP
tag</a>
to properly invoke the Java Plugin. Given the simple to use
<strong>jsp:plugin</strong> tag to generate the proper incantation - how could I go
wrong?</p>
<p><strong>... rather badly wrong, as it turns out ...</strong></p>
<p>The first sign of trouble came when the guy doing testing reported that
the applet did not run on machine that did not have a JRE already
installed. What's more it seemed that the Java Plugin was attempting to
download the <strong>wrong</strong> version of Java! Ouch. The original
<strong>jsp:plugin</strong> invocation follows - which works properly when the JRE is
already installed.</p>
<p><jsp:plugin
name = "TemplateEditorGadget"
type = "applet"
jreversion = "1.4"
code = "com.asg.reportweb.modeler.applets.swing.TemplateEditorGadget"
archive = "applets/TemplateEditorGadget.jar"
width = "100%"
height = "300"
>
<a href="jsp:params">jsp:params</a>
<jsp:param name="mayscript" value="Y" />
</jsp:params>
<a href="jsp:fallback">jsp:fallback</a>
</p><div class="notice">Java plugins not supported by your browser.</div>
</jsp:fallback>
</jsp:plugin><p></p>
<p>On checking the generated HTML, it appears that whomever wrote the
<strong>jsp:plugin</strong> code followed the Sun recommendation for use of the <a href="http://java.sun.com/j2se/1.4.2/docs/guide/plugin/developer_guide/using_tags.html#ie-nav">Java
Plug-in in IE and
Navigator</a>.
Now - if you've been playing attention - this part should strike you as
a little odd. Note that the JSP page is <strong>dynamically</strong> generating HTML,
and can detect the sort of web browser on the remote end of the
connection. There is seldom if ever a need to generate HTML for a web
browser other than the one receiving the page.</p>
<p>Along the way spotted a discouraging sign in the documented list of
<a href="http://java.sun.com/j2se/1.5.0/docs/guide/deployment/deployment-guide/autodl-files.html">Autodownload
Files</a>
offered by Sun. What you have here is effectively a (web) API that Sun
has not made an effort to keep consistent. Based on past changes, you
cannot predict the URLs valid for future JRE versions - not good!</p>
<p>Since the generated HTML from <strong>jsp:plugin</strong> was not producing the
desired effect, and what <strong>should</strong> work was less than entirely clear,
this seems like a good time to try out <a href="http://java.sun.com/j2se/1.5.0/docs/guide/plugin/developer_guide/html_converter_more.html">Sun's HTML
Converter</a>.
Cooked up a basic APPLET invocation and ran it through HTML Convertor -
which generated a result that didn't work for some reason. Severely
confused at this point, I put together a series of <a href="http://bannister.us/tests/applets/">test
cases</a> to empirically determine what
works and what does not.</p>
<p>Note that at this point it is a great advantage to have a machine with
<a href="http://www.vmware.com/products/ws/">VMware</a> installed. To test you need
a machine that does not have Java installed - and preferably has
<strong>never</strong> had Java installed. With VMware cloning a new VM takes
seconds, and gets you an absolutely clean copy of a reference
installation of whatever operating system version you want to test.</p>
<p>... still trying to sort this out ...</p>
As if this were ever true...2005-12-18T00:00:00Zhttps://bannister.us/weblog/2005/as-if-this-were-ever-true
<blockquote>
<p><a href="http://news.bbc.co.uk/1/hi/technology/4534712.stm">BBC NEWS | Technology | What is it with
Wikipedia?</a>
The days when everything you saw on a screen had been carefully
filtered, vetted, edited and checked are long gone.</p>
</blockquote>
<p>The mistake here is in assuming that this were <strong>ever</strong> true. Even the
Encyclopedia Britannica (arguably one of the very best sources) would -
when checked against other sources - have occasional weak areas and
omissions. Articles in the newspaper vary quite a lot in quality - only
rarely (<strong>very</strong> rarely) could a newspaper article be described as
"carefully filtered, vetted, edited and checked".</p>
<p>Once a Wikipedia article gets reviewed by a few knowledgable folks, we
are likely well above ordinary newspaper quality.</p>
<p>The question is not whether there will be weak articles (there always
are), or some degree of distortion (there always is). The question is
whether the combination of pooled knowledge and community review will
yield a higher average quality than other sources.</p>
<p>I find the recent flap (inaccurate Wikipedia entries mentioning
Siegenthaler) oddly thought provoking. Instead of correcting the
entries - which would have taken minutes - Siegenthaler's first reaction
was to try and contact some sort of external authority. Stop and think
about this a bit. Why the hesitation? Why not make an immediate
correction?</p>
<p>Do both Siegenthaler's actions and the assumption that old media is
somehow more accurate point toward a sort of blind deference to
authority - a deference that we would be better off without?</p>
The (nearly) perfect camera?2005-12-11T00:00:00Zhttps://bannister.us/weblog/2005/the-nearly-perfect-camera
<p>I'm back to using my old Canon S110 (2-megapixel) camera until my <a href="http://www.dpreview.com/reviews/sonydscp200/">Sony
DSC-P200/R</a> (7.2
megapixel) comes back from warranty service in Texas (hopefully without
the blob on the image).
<img src="http://www.dpreview.com/reviews/Sonydscp200/images/allroundview-001.jpg" alt="untitled" />The
Sony is in fact a very nice camera.</p>
<ul>
<li>Fast startup.</li>
<li>Compact and easy to carry (144g).</li>
<li>Very sharp pictures (sometimes).</li>
</ul>
<p>But it does have some failings in my usage - failings likely common to
all the current high-resolution point-and-shoot digital cameras.</p>
<ol>
<li>Still pictures are often blurry.</li>
<li>Twilight pictures are too dark and/or blurry.</li>
<li>Distant pictures (an aircraft flying by) show the subject too small.</li>
<li>Fast action pictures (a running deer, a flying hawk, a kid chasing a
soccer ball) seldom turn out.</li>
</ol>
<p>It seems that the slightest hand tremor is enough to blur the picture,
even in normal light. I can largely get around (1) by using the camera
in "burst" mode. The 1GB memory card essentially never fills up, and
throwing away 3-5 blurry pictures to get one good picture is tedious,
but not difficult. Both low-light (2) and "fast" pictures (4) require
better light-gathering by the camera - which translates to the need for
a bigger/wider lens. Distant subjects (3) require greater zoom (much
more than 3x) and high zoom values require either image stabilization or
very high light-gathering and very short exposures.</p>
<p>While image stabilization is less needed in bigger/heavier cameras, this
is the not the direction I would like to go. Someday the image sensors
<strong>may</strong> become more sensitive and lessen the need for a bigger lens. I
would guess this requires some big advances in the underlying
technology, and is probably 5-10 years out (at least).</p>
<p><img src="https://bannister.us/weblog/images/point-and-shoot.jpg" alt="point-and-shoot" /> My
requirements for the "perfect" camera are simple.</p>
<ul>
<li>Capture pictures at least as good as what my eye can see. Fair
warning - blue eyes and ancestors from northern Europe mean I can
"see" into twilight better than most.</li>
<li>The camera should be unobtrusive and require the least possible
amount of ceremony in use. Big/heavy cameras and extraneous controls
count against usability.</li>
</ul>
<p>Meeting those requirements is far from simple, and doubtless at present
requires compromises. The ultimate point-and-shoot camera would track
and capture whatever I was looking at. This is not likely to show up
anytime soon (though DARPA should have a similar project in the works
for battlefield use).</p>
<p>How close can we get? The photography sites have a lot of
<a href="http://www.dpreview.com/learn/?/Glossary/">data</a>, but how to answer my
pragmatic questions is not obvious. I have no idea what expectations are
reasonable.</p>
<ul>
<li>Can I capture a kid kicking a soccer ball? (Conditions: daylight -
full sunlight or overcast, auto-focus, zoomed or unzoomed).</li>
<li>Can I capture a bird or aircraft in flight? (Conditions: extreme
zoom, daylight, handheld).</li>
<li>Can a capture a deer under the trees at twilight? (Conditions: low
light, unzoomed or modest zoom, handheld).</li>
</ul>
<p>The <a href="http://www.dpreview.com/reviews/canoneos350d/">Canon Rebel</a> gets
<a href="http://www.eosrebels.com/">good reviews</a> and <a href="http://www.amazon.com/gp/earlyadopter/browse.html/ref=cm_ea_br_3c_pl/102-4290250-9281767?%5Fencoding=UTF8&filterID=2&categoryID=2">sells
well</a>.
Apparently the stock lens is not very good, and with a better lens (or
two) the 20D looks to be around $1100-2000. No doubt this takes <a href="http://www.flickr.com/photo_zoom.gne?id=32296282&context=set-1142602&size=l">great
pictures</a>,
but there is no chance lugging this camera around qualifies as
unobtrusive.</p>
<p>The <a href="http://www.dpreview.com/reviews/nikoncp8800/">Nikon Coolpix 8800</a>
looks interesting - 10x zoom with image stabilization, and a rather
large looking lens (good light capture?). The camera can only capture
limited length movie clips.</p>
<p>The size of the image sensor on the <a href="http://www.dpreview.com/reviews/sonydscr1/">Sony
DCS-R1</a> is interesting -
better fast/low-light performance? No ability to capture video clips,
and weighing 990g makes this is a klunky single-tasker.</p>
<p><img src="http://www.dpreview.com/reviews/CanonS2IS/images/allroundview-001.jpg" alt="untitled" />
The <a href="http://www.dpreview.com/reviews/sonydsch1/">Sony Cyber-shot DCS-H1</a>
and <a href="http://www.dpreview.com/reviews/canons2is/">Canon PowerShot S2 IS</a>
are interesting - 12x zoom with stabilization, moderate weight, and
modest ~$500 price - but only 5 megapixel - which at present is pretty
much the best you can do in this category. Between the Canon and the
Sony the features are about the same (with the Sony a shade weaker in
some areas I care about). Bought the Canon as I just had to return my
new Sony for warranty service (manufacturing fault), and my old Canon
still works perfectly.</p>
<p>Not the perfect camera - too bulky and a bit light on resolution - but
apparently about the best we can do at present for capturing more
distant objects.</p>
<p><strong>Update:</strong> the Sony came back from service about 10 days after I sent
it off, and seems to be OK.
<strong>Update(2):</strong> after a bit of use, I find that the smaller 1.8"screen
on the back of the Canon is <strong>much</strong> less pleasant to use than the
larger 2.5" screen on my Sony. The bigger screen gives you a <strong>much
better</strong> idea about how the picture is going to turn out.</p>
<div class="spacer">
</div>
Under construction2005-12-10T00:00:00Zhttps://bannister.us/weblog/2005/under-construction
<p><img src="http://static.flickr.com/30/65464089_d20334f82a.jpg" alt="untitled" />
<a href="http://www.flickr.com/photos/99593987@N00/65464089/">Best representation of a new-Chinese
city?</a></p>
<p>There are so many layers to the story told by this one picture. Other
pictures of Chinese cities I have seen are too myopic or too obvious in
presenting a single point of view. I don't believe the scope of this
picture was intentional of the part of the photographer (which may be
why this works so well for me).</p>
<p>The polluted skyline reminds me of the LA basin in the late 1960's/early
1970's. The distant army of cranes tells us the frenetic pace of growth.
The bridge is a grand entrance into the city. The two happy and hopeful
looking young people flank and turn toward the entrance. The pile of
rubble on which they stand represents a discarded past.</p>
<p>Be sure to look at the
<a href="http://static.flickr.com/30/65464089_d20334f82a_b.jpg">larger</a> version.</p>
SCO Raises New Funding2005-12-09T00:00:00Zhttps://bannister.us/weblog/2005/sco-raises-new-funding
<blockquote>
<p><a href="http://www.linuxpipeline.com/174910950?cid=rssfeed_pl_lxp">Linux Pipeline | SCO Raises New Funding -- And Experts Raise
Questions</a>
"The investment of $10 million in SCO is curious," said John
Ferrell, a practicing attorney and partner at Carr & Ferrell. "With
the trial in the IBM litigation not scheduled until June of 2007, it
is entirely possible that every cent of that investment could end up
being paid out in lawyers fees and expert opinions."</p>
<p>Ferrell added that the company's investors could have ulterior
motives. "If you were even the slightest bit cynical, you might
conclude that this investment in SCO is an attack on Linux and not a
bet on SCO's future business success," he stated.</p>
<p>"As to the identity of the investor, the SEC filings indicate that
this sale was made in accordance with an exemption to the normal
registration and disclosure rules," Ferrell continued. "Any short,
short list speculating possible investors, would naturally include
those OS companies that might find Linux a threat to their business."</p>
</blockquote>
<p>That short-short list would be Microsoft and, er, Microsoft. OK - so
$10M is nothing of moment to Microsoft, and I can see them slopping a
bit of money to SCO even on a very long shot.</p>
<p>Still the whole SCO soap opera is so very, very <strong>lame</strong>. You'd think
that by now BillG and friends would have stopped wasting brain-cycles on
the SCO turkey, and found a more constructive outlet for their energy.</p>
Watching the Highways2005-12-08T00:00:00Zhttps://bannister.us/weblog/2005/watching-the-highways
<p>Not to detract from <a href="http://www.schneier.com/blog/archives/2005/12/truckers_watchi.html">Schneier's
take</a>,
let us roughly guess the relative frequency of "terrorist" events
compared to ordinary everyday problems a motorist (including truckers)
might encounter.</p>
<p>Looking at the real-time traffic information posted by the web, my guess
would be there are more than 20 hazard events per day on the highways in
an area containing less than a tenth of the country's population.
Extrapolating that gets us a (very) rough estimate (rounded up) of about
100,000 hazard events per year for the entire country - just on the
highways. Given that the number of terrorist events per year is
something less than one, we are talking about a less than 1:100,000
chance of spotting a "terrorist" act compared to an ordinary hazard.</p>
<p>I do believe the <a href="http://www.highwaywatch.com/">Highway Watch</a> program
is generally an excellent idea. With less than 1:100,000 odds, seems
that specific training to spot "terrorists" is pretty much a waste of
time.</p>
What Old People Do For Fun...2005-12-07T00:00:00Zhttps://bannister.us/weblog/2005/what-old-people-do-for-fun
<p><object style="width:400px; height:326px;" id="VideoPlayback" align="middle" type="application/x-shockwave-flash" data="http://video.google.com/googleplayer.swf?videoUrl=http%3A%2F%2Fvp.video.google.com%2Fvideodownload%3Fversion%3D0%26secureurl%3DiwAAAFxSa5VpynCGKimZgSuRrRfwkeOyg6w5bizv52aqFbKa8zPCu0CojDtZfe1ed4qDEuuiWiC3BOq_23hplRl8M6uzbfhcy_w8YMaeHz9-TNY9ukvsZrfb9ZLzdogTrS5afIu8NJxctoSLIKAJ_erGpJSpnGaEHRhPFLKQzkot_zXrzZFoSQeHCskBJI3VSnNzzg%26begin%3D0%26len%3D40160&thumbnailUrl=http%3A%2F%2Fvideo.google.com%2FThumbnailServer%3Fcontentid%3Dab33f934219c3a9e%26second%3D5%26itag%3Dw320%26urlcreated%3D1137051589%26sigh%3DNbDuWW__lSWAaPcihJs6XmkyfnU&playerId=-8735889757702013026&playerMode=embedded"><param name="allowScriptAccess" value="sameDomain" /><param name="movie" value="http://video.google.com/googleplayer.swf?videoUrl=http%3A%2F%2Fvp.video.google.com%2Fvideodownload%3Fversion%3D0%26secureurl%3DiwAAAFxSa5VpynCGKimZgSuRrRfwkeOyg6w5bizv52aqFbKa8zPCu0CojDtZfe1ed4qDEuuiWiC3BOq_23hplRl8M6uzbfhcy_w8YMaeHz9-TNY9ukvsZrfb9ZLzdogTrS5afIu8NJxctoSLIKAJ_erGpJSpnGaEHRhPFLKQzkot_zXrzZFoSQeHCskBJI3VSnNzzg%26begin%3D0%26len%3D40160&thumbnailUrl=http%3A%2F%2Fvideo.google.com%2FThumbnailServer%3Fcontentid%3Dab33f934219c3a9e%26second%3D5%26itag%3Dw320%26urlcreated%3D1137051589%26sigh%3DNbDuWW__lSWAaPcihJs6XmkyfnU&playerId=-8735889757702013026&playerMode=embedded" /><param name="quality" value="best" /><param name="bgcolor" value="#ffffff" /><param name="scale" value="noScale" /><param name="wmode" value="window" /><param name="salign" value="TL" /></object>
<a href="http://video.google.com/videoplay?docid=-8735889757702013026">What Old People Do For Fun... - Google
Video</a></p>
Trance N Roll2005-12-07T00:00:00Zhttps://bannister.us/weblog/2005/trance-n-roll
<p><object style="width:400px; height:326px;" id="VideoPlayback" align="middle" type="application/x-shockwave-flash" data="http://video.google.com/googleplayer.swf?videoUrl=http%3A%2F%2Fvp.video.google.com%2Fvideodownload%3Fversion%3D0%26secureurl%3DgwAAAOWtIq5Rux8fT4udBdi6pBNZXfuVMz-y0hQOxb5W9OSe-_x3YvtijjizEz3SXNJRrCveFTRbJCfqAKZypOoHnOy4l08bKsZLCvLtHLbgbW-JfVVKIVMEcJyBGk8GNpa0_otHT0yQD_IH0Ld1FJ4CMeSB07mcXBG6S_SsIa4Cmk2KuWjQxV_bQgZOM9re7s8GOA%26begin%3D0%26len%3D244582&thumbnailUrl=http%3A%2F%2Fvideo.google.com%2FThumbnailServer%3Fcontentid%3D5097d740bb93401c%26second%3D5%26itag%3Dw320%26urlcreated%3D1137051761%26sigh%3DTKC-1rMqrpc7aFWomh2Fp-IMTrQ&playerId=-3284408115585006479&playerMode=embedded"><param name="allowScriptAccess" value="sameDomain" /><param name="movie" value="http://video.google.com/googleplayer.swf?videoUrl=http%3A%2F%2Fvp.video.google.com%2Fvideodownload%3Fversion%3D0%26secureurl%3DgwAAAOWtIq5Rux8fT4udBdi6pBNZXfuVMz-y0hQOxb5W9OSe-_x3YvtijjizEz3SXNJRrCveFTRbJCfqAKZypOoHnOy4l08bKsZLCvLtHLbgbW-JfVVKIVMEcJyBGk8GNpa0_otHT0yQD_IH0Ld1FJ4CMeSB07mcXBG6S_SsIa4Cmk2KuWjQxV_bQgZOM9re7s8GOA%26begin%3D0%26len%3D244582&thumbnailUrl=http%3A%2F%2Fvideo.google.com%2FThumbnailServer%3Fcontentid%3D5097d740bb93401c%26second%3D5%26itag%3Dw320%26urlcreated%3D1137051761%26sigh%3DTKC-1rMqrpc7aFWomh2Fp-IMTrQ&playerId=-3284408115585006479&playerMode=embedded" /><param name="quality" value="best" /><param name="bgcolor" value="#ffffff" /><param name="scale" value="noScale" /><param name="wmode" value="window" /><param name="salign" value="TL" /></object></p>
<p><a href="http://video.google.com/videoplay?docid=-3284408115585006479">Trance N Roll - Google
Video</a></p>
Supersonic flight2005-12-07T00:00:00Zhttps://bannister.us/weblog/2005/supersonic-flight
<p><img src="http://video.google.com/ThumbnailServer?contentid=37740c649f328711&second=5&itag=w160&urlcreated=1134023850&sigh=1_bgUsTrVF9vOlyezyqcfLjm72Y" alt="untitled" />
<a href="http://video.google.com/videoplay?docid=-936735685110358592&q=flight">Supersonic flight - Google
Video</a></p>
Snake-Oil Research2005-12-07T00:00:00Zhttps://bannister.us/weblog/2005/snake-oil-research
<p>Has research in computer science at Colleges and Universities become
less meaningful?</p>
<p>In <a href="http://www.schneier.com/blog/archives/2005/12/snakeoil_resear.html">Snake-Oil Research in
<em>Nature</em></a>
we have a case where Bruce Schneier (who knows something about
cryptography) finds a bit of research done in an academic setting that
is a little short on relevant expertise.</p>
<p>As an odd aside, note that a number of the articles referenced are in
journals that require subscription. Originally the notion was that
refereed journals were a concentrated resource. We expect both writers
and reviewers to possess an unusual level of expertise in the subject.
The resulting reviewed articles should capture the highest order of
thought on a presented material. Clearly that is not what we have here.</p>
<p>On reflection - in the past communication within the academic community
was generally stronger than communication outside. Researchers and
engineers working within companies were seldom encouraged and often
prohibited from sharing their results. This is all prior to the
widespread availability of the Internet to the general public.</p>
<p>Now the effort needed to share results is near zero. Communication
within the academic community is not significantly stronger than
outside. In fact, results "shared" within any ghetto that requires a
subscription are <strong>less available</strong> than material simply placed on the
web. It would seem we have an inversion.</p>
<p>Does this explain why the "distinguished speakers" I have heard at UCI
have been rather disappointing in the past several years (or perhaps
just bad timing on my part)?</p>
<p>What does this mean for the role of research in an academic setting?</p>
Security agency broke privacy laws2005-12-07T00:00:00Zhttps://bannister.us/weblog/2005/security-agency-broke-privacy-laws
<blockquote>
<p><a href="http://news.zdnet.com/2110-1009_22-5803433.html?tag=nl">GAO: Security agency broke privacy laws | Tech News on
ZDNet</a>
The Transportation Security Administration violated federal privacy
law by failing to report exactly how and why it has collected personal
data on nearly 250,000 airline passengers...</p>
</blockquote>
Secret ID Law2005-12-07T00:00:00Zhttps://bannister.us/weblog/2005/secret-id-law
<blockquote>
<p><a href="http://www.wired.com/news/politics/0,1283,69774,00.html">Wired News: Secret ID Law to Get
Hearing</a>
So far, <strong>the government has refused to show Gilmore the order</strong>
compelling airlines to ask for identification, saying that the rule is
"sensitive security information," a security designation that was
greatly expanded by Congress in 2002, allowing the Transportation
Security Administration wide latitude to withhold information from the
public.</p>
<p>Gilmore argues that secrecy and the power of the "sensitive security
information," or SSI, designation is to blame for the repeated privacy
scandals at the TSA.</p>
<p>"TSA and DHS in general have set themselves up to be insulated from
criticism, to have their inner workings be invisible, because they can
pull this magic SSI shield over anything they do," Gilmore said. "And
what you see are the natural consequences of that kind of secrecy,
which is that incompetence is never detected and corrected."</p>
</blockquote>
<p>Now I might believe there are <strong>rare</strong> cases where it might be important
to keep such "orders" secret ... maybe. Such cases should be quite rare,
and subject to some sort of outside review. On the other hand, secrecy
can be used to hide foolish and incompetitent actions - as a "security
blanket" for beaurucrats (this the need for external review). Government
beaurucrats using secrecy as a shield from criticism is not good for the
country.</p>
<p>Where is the review?</p>
<p>Secret laws are an <strong>enormous</strong> danger to a liberty in a free and open
society. Is this what we want as the "American Way"?</p>
Octopus Eats Shark2005-12-07T00:00:00Zhttps://bannister.us/weblog/2005/octopus-eats-shark
<p><img src="http://video.google.com/ThumbnailServer?contentid=4da8d12c577d3d28&second=5&itag=w160&urlcreated=1134012878&sigh=z-bPGnW1LNjx55UmDpKXKwPFrM0" alt="untitled" />
<a href="http://video.google.com/videoplay?docid=-7004909622962894202">Octopus Eats Shark - Google
Video</a></p>
DUI Stop2005-12-07T00:00:00Zhttps://bannister.us/weblog/2005/dui-stop-google-video
<p><object style="width:400px; height:326px;" id="VideoPlayback" align="middle" type="application/x-shockwave-flash" data="http://video.google.com/googleplayer.swf?videoUrl=http%3A%2F%2Fvp.video.google.com%2Fvideodownload%3Fversion%3D0%26secureurl%3DgQAAAIWbiOXeGO0FDgs-is0L0rHdXukJH4ou5nIQILEVyOeIwLfGd97HmF1I8KC3dSxNazQE-IBfio9LibIBsiKBILURNABdWRI0-iWissFPXwngyTkLMTQUjTVuXiMttjG_qjPX3kfgzHuXyaJio1dF3gYba6WXp60yC3_RSDxOn1hkv8KXIvnXvDpi4ldLWq5nvA%26begin%3D0%26len%3D114633&thumbnailUrl=http%3A%2F%2Fvideo.google.com%2FThumbnailServer%3Fcontentid%3D21e1da71fca970f5%26second%3D5%26itag%3Dw320%26urlcreated%3D1137053256%26sigh%3DXUUfvSraLkedIvvYyNJj2mERHvg&playerId=8770655215583494255&playerMode=embedded"><param name="allowScriptAccess" value="sameDomain" /><param name="movie" value="http://video.google.com/googleplayer.swf?videoUrl=http%3A%2F%2Fvp.video.google.com%2Fvideodownload%3Fversion%3D0%26secureurl%3DgQAAAIWbiOXeGO0FDgs-is0L0rHdXukJH4ou5nIQILEVyOeIwLfGd97HmF1I8KC3dSxNazQE-IBfio9LibIBsiKBILURNABdWRI0-iWissFPXwngyTkLMTQUjTVuXiMttjG_qjPX3kfgzHuXyaJio1dF3gYba6WXp60yC3_RSDxOn1hkv8KXIvnXvDpi4ldLWq5nvA%26begin%3D0%26len%3D114633&thumbnailUrl=http%3A%2F%2Fvideo.google.com%2FThumbnailServer%3Fcontentid%3D21e1da71fca970f5%26second%3D5%26itag%3Dw320%26urlcreated%3D1137053256%26sigh%3DXUUfvSraLkedIvvYyNJj2mERHvg&playerId=8770655215583494255&playerMode=embedded" /><param name="quality" value="best" /><param name="bgcolor" value="#ffffff" /><param name="scale" value="noScale" /><param name="wmode" value="window" /><param name="salign" value="TL" /></object>
<a href="http://video.google.com/videoplay?docid=8770655215583494255">DUI Stop - Google
Video</a></p>
Curry-N-Rice Girl2005-12-07T00:00:00Zhttps://bannister.us/weblog/2005/curry-n-rice-girl
<p><object style="width:400px; height:326px;" id="VideoPlayback" align="middle" type="application/x-shockwave-flash" data="http://video.google.com/googleplayer.swf?videoUrl=http%3A%2F%2Fvp.video.google.com%2Fvideodownload%3Fversion%3D0%26secureurl%3DhgAAAPhDo4e_RD-xbmV3LN57s_2W4Ufhq8lAZH8TmEPXVUbwGlxRQM3dTU_xFpt828uwBuRCwqNt__uVC4q2g84sBOqWRUFQn0YMf1wd5ATxxwx2IvXLqvhZOK3Ay9wl1O8BC6X0iJwuRSPq2VTkSB9Pyja8yxb1VspncLgCWWjnWpzL2kEVyZI9lRlRBAvI5o4RVA%26begin%3D0%26len%3D215666&thumbnailUrl=http%3A%2F%2Fvideo.google.com%2FThumbnailServer%3Fcontentid%3D10519c909b620e7b%26second%3D5%26itag%3Dw320%26urlcreated%3D1137051679%26sigh%3D-YBcwe4kymQCUTO_4qNtdMSNXIg&playerId=-4532245984549289375&playerMode=embedded"><param name="allowScriptAccess" value="sameDomain" /><param name="movie" value="http://video.google.com/googleplayer.swf?videoUrl=http%3A%2F%2Fvp.video.google.com%2Fvideodownload%3Fversion%3D0%26secureurl%3DhgAAAPhDo4e_RD-xbmV3LN57s_2W4Ufhq8lAZH8TmEPXVUbwGlxRQM3dTU_xFpt828uwBuRCwqNt__uVC4q2g84sBOqWRUFQn0YMf1wd5ATxxwx2IvXLqvhZOK3Ay9wl1O8BC6X0iJwuRSPq2VTkSB9Pyja8yxb1VspncLgCWWjnWpzL2kEVyZI9lRlRBAvI5o4RVA%26begin%3D0%26len%3D215666&thumbnailUrl=http%3A%2F%2Fvideo.google.com%2FThumbnailServer%3Fcontentid%3D10519c909b620e7b%26second%3D5%26itag%3Dw320%26urlcreated%3D1137051679%26sigh%3D-YBcwe4kymQCUTO_4qNtdMSNXIg&playerId=-4532245984549289375&playerMode=embedded" /><param name="quality" value="best" /><param name="bgcolor" value="#ffffff" /><param name="scale" value="noScale" /><param name="wmode" value="window" /><param name="salign" value="TL" /></object>
<a href="http://video.google.com/videoplay?docid=-4532245984549289375">Curry-N-Rice Girl - Google
Video</a></p>
Arab technology versus German engineering2005-12-07T00:00:00Zhttps://bannister.us/weblog/2005/arab-technology-versus-german-engineering
<p><object style="width:400px; height:326px;" id="VideoPlayback" align="middle" type="application/x-shockwave-flash" data="http://video.google.com/googleplayer.swf?videoUrl=http%3A%2F%2Fvp.video.google.com%2Fvideodownload%3Fversion%3D0%26secureurl%3DigAAAJp2EX3_PiBWypLRpL_g2CiPqTHRPfHGxtwijiKFBhqqUK_BZMgLY6_faLDXHJ9U95wcF2YS1mspwimh_cbRhYVXRxsqCiZ38DBwYi8LvIC2unPuGykJ1cdOcfUZ7HLyXVppiXvJLPaScNR7y5dJoJhJmfotdR5Ym8vOppwf2AZRMcTBz7iWn6sZ9uEBMPjdhQ%26begin%3D0%26len%3D21933&thumbnailUrl=http%3A%2F%2Fvideo.google.com%2FThumbnailServer%3Fcontentid%3D77fee3b77613c5db%26second%3D5%26itag%3Dw320%26urlcreated%3D1137052038%26sigh%3DbCfUPAdrVmWhwPFWBYoRrQw1S94&playerId=3374757378608744139&playerMode=embedded"><param name="allowScriptAccess" value="sameDomain" /><param name="movie" value="http://video.google.com/googleplayer.swf?videoUrl=http%3A%2F%2Fvp.video.google.com%2Fvideodownload%3Fversion%3D0%26secureurl%3DigAAAJp2EX3_PiBWypLRpL_g2CiPqTHRPfHGxtwijiKFBhqqUK_BZMgLY6_faLDXHJ9U95wcF2YS1mspwimh_cbRhYVXRxsqCiZ38DBwYi8LvIC2unPuGykJ1cdOcfUZ7HLyXVppiXvJLPaScNR7y5dJoJhJmfotdR5Ym8vOppwf2AZRMcTBz7iWn6sZ9uEBMPjdhQ%26begin%3D0%26len%3D21933&thumbnailUrl=http%3A%2F%2Fvideo.google.com%2FThumbnailServer%3Fcontentid%3D77fee3b77613c5db%26second%3D5%26itag%3Dw320%26urlcreated%3D1137052038%26sigh%3DbCfUPAdrVmWhwPFWBYoRrQw1S94&playerId=3374757378608744139&playerMode=embedded" /><param name="quality" value="best" /><param name="bgcolor" value="#ffffff" /><param name="scale" value="noScale" /><param name="wmode" value="window" /><param name="salign" value="TL" /></object>
<a href="http://video.google.com/videoplay?docid=3374757378608744139">German engineering-v-Arab technology - Google
Video</a></p>
Open source, and when not2005-12-06T00:00:00Zhttps://bannister.us/weblog/2005/ongoing-osi
<blockquote>
<p><a href="http://www.tbray.org/ongoing/When/200x/2005/11/25/OSI">ongoing ·
OSI</a>
In the future though, I think pretty well all software innovation
will be either open-source or inside a big server, because the
business model for shipping closed-source software as a product is
just too twisted and weird.</p>
</blockquote>
<p>In fact I disagree pretty much completely, as there is a third group in
a sort of mid-range that ends up closed source ... and I don't see
working any other way.</p>
<p>Open source projects only succeed if they can attract a sufficient
number of developers, and a sufficient amount of developer time.
Developer time can come from fragments of "free" time - when the choice
to participate comes from the individual developer. Developer time can
be full time - when the choice to participate come from the institution
for which the developer works. The effort level required of the project
determines the amount of development time necessary for the project to
be viable (i.e. OpenOffice requires far more dedicated developer time to
be viable than Perl).</p>
<p>The defining characteristic that makes open source projects more or less
viable is the ratio between the number of end users and the number of
developers. When the ratio is large then institutions (large and small)
are likely to find an interest in dedicating developer time to open
source work. The ratio can be small when end users are developers and
contributed of bits of free time are sufficient.</p>
<p>Open source projects fail when they cannot attract enough developer
time. There are <strong>lots</strong> of failed or marginal open source projects.</p>
<p>In the mid-range there are software products with relatively modest
numbers of users. Products that are successful in this range return
quite a lot of value to their customers. It is not at all clear to me
that products in this range could survive as open source.</p>
Candid Cactus2005-12-05T00:00:00Zhttps://bannister.us/weblog/2005/candid-cactus
<p><img src="http://static.flickr.com/33/59548048_85ab18c6f8.jpg" alt="Cactus" />
<a href="http://www.flickr.com/photos/dreadedhill/59548048/">Cactus</a></p>
<blockquote>
<p><a href="http://www.flickr.com/photos/basuel/">J.L.B.</a> says:
this is an excellent shot! they look like a group of people you've
caught off guard, which makes my next question (can you eat them?)
seem a bit odd.</p>
</blockquote>
<p>Interesting how she sees people in plants. I do worry a bit about the
comment...</p>
Tom Yum Kung - Where??2005-12-04T00:00:00Zhttps://bannister.us/weblog/2005/tom-yum-kung-where
<p><img src="http://static.flickr.com/35/68633010_a02df64e2f_m.jpg" alt="untitled" /></p>
<p><a href="http://www.flickr.com/photos/yoshiko314/68633010/">Yoshiko's photo</a>
looks delicious.
<a href="http://www.google.com/search?hl=en&q=tom+yum+kung&btnG=Google+Search">Recipes</a>
for <a href="http://bangkok.thailandtoday.com/food/032_0001_tomyumkung.html">Tom
Yum</a> -
shrimp, lemongrass, cilanto, ginger, chilis - sound yummy.</p>
<p>I am on a mission to find a good "Tom Yum" ... which turns out harder
than expected.</p>
<p>Tried two local Thai places, but ended up with something more like "Tom
Yuck". Both made their soup mainly from onion, tomato and generic
mushrooms (I kid you not), celery (at one), with lots of broth and some
shrimp. If there was any lime, ginger or lemongrass in the mix, I could
not taste it :(.</p>
<p>Might have to make this myself to get anything remotely as good as the
picture. Either that or find Yoshiko's friend in Japan...</p>
Two points worth repeating2005-12-03T00:00:00Zhttps://bannister.us/weblog/2005/two-points-worth-repeating
<blockquote>
<p><a href="http://blogs.sun.com/roller/page/jonathan?entry=free_like_a_puppy">Jonathan Schwartz's
Weblog</a>
... no Fortune 2000 customer on earth is going to run the heart of
their enterprise with products that don't have someone's home number
on the other end.
... no developer or developing nation, presented with an equivalent
or better free and open source product, is going to opt for a
proprietary alternative.</p>
<p>Those two points are the market's reality. And having reviewed them
today at length at a customer conference, with some of the largest
telecommunications customers on earth, I only heard the strongest
agreement. They all, after all, are prolific distributors of free
handsets.</p>
<p>Betting against FOSS is like betting against gravity. And free
software doesn't mean no revenue, it means no barriers to revenue.
Just ask your carrier.</p>
</blockquote>
Setting negative expectations2005-12-03T00:00:00Zhttps://bannister.us/weblog/2005/setting-negative-expectations
<p>Pulled a book I had bought quite a while ago (based on recommendations)
off the bookshelf and started reading. From the introduction:</p>
<blockquote>
<p><a href="http://www.amazon.com/gp/product/0789723107/ref=sib_rdr_dp/102-4290250-9281767?%5Fencoding=UTF8&me=ATVPDKIKX0DER&no=283155&st=books&n=283155">Amazon.com: Don't Make Me Think: A Common Sense Approach to Web
Usability:
Books</a>
Steve and I first worked together when I was a creative consultant to
@Home networks in 1997.</p>
</blockquote>
<p>Ack. I remember @Home's web applications - a real train-wreck - flashy,
klunky, and painful to use.</p>
<p>Having set my expectations for the material in the book to solidly
negative ... they won't be hard to exceed :). I think it's too late to
get my money back.</p>
HP system customers got the message2005-12-03T00:00:00Zhttps://bannister.us/weblog/2005/hp-system-customers-got-the-message
<blockquote>
<p><a href="http://blogs.sun.com/roller/page/jonathan?entry=free_like_a_puppy">Jonathan Schwartz's
Weblog</a>
Opening up Solaris and giving it away for free has led to the single
largest wave of adoption Solaris has ever seen - some 3.4 million
licenses since February this year (most on HP, curiously).</p>
</blockquote>
<p>Well, um, yes. Jonathan has in past posts very clearly pointed out how
the HP OS strategy - isn't. Looks like HP system customers got the
message loud and clear (possibly without help). Since Jonathan has a)
said Sun will help you, and b) laid out a plan that made sense, it looks
like customers owning HP hardware got the message ... big time!</p>
Schneier on Security - Airplane Security2005-12-01T00:00:00Zhttps://bannister.us/weblog/2005/schneier-on-security-airplane-security
<blockquote>
<p><a href="http://www.schneier.com/blog/archives/2005/12/airline_securit_4.html">Schneier on Security: Airplane
Security</a>
I know quite a lot about this. I was a member of the government's
Secure Flight Working Group on Privacy and Security. We looked at the
TSA's program for matching airplane passengers with the terrorist
watch list, and found a complete mess: poorly defined goals,
incoherent design criteria, no clear system architecture, inadequate
testing. (Our report was on the TSA website, but has recently been
removed -- "refreshed" is the word the organization used -- and
replaced with an "executive summary" (.doc) that contains none of the
report's findings. The TSA did retain two (.doc) rebuttals (.doc),
which read like products of the same outline and dismiss our findings
by saying that we didn't have access to the requisite information.)
Our conclusions match those in two (.pdf) reports (.pdf) by the
Government Accountability Office and one (.pdf) by the DHS inspector
general.</p>
<p>That's right; the TSA is disappearing our report.</p>
</blockquote>
Scary Cyclotron?2005-12-01T00:00:00Zhttps://bannister.us/weblog/2005/scary-cyclotron
<p>This item is so goofy, it is positively sublime.</p>
<blockquote>
<p><a href="http://www.wired.com/news/politics/0,1283,69726,00.html">Wired News: The Cyclotron Comes to the
'Hood</a>
Local lawmakers rushed to introduce emergency legislation banning the
use of cyclotrons in home businesses. State health officials took
similar steps, and have suspended Swank's permit to operate cyclotrons
on his property.
[...]
"We in Alaska embrace technology, and we love it -- but we would like
to see this in a hospital or industrial area, where it belongs,"
Tesche said. "We don't need cyclotrons operating out of back alleys,
or in someone's garage."</p>
<p>In a letter to the city assembly, the South Addition Community Council
compared potential damage from a cyclotron mishap to the Three Mile
Island nuclear reactor accident.</p>
<p>"Cyclotrons are not nuclear reactors," explains Roger Dixon of the
Fermi National Accelerator laboratory or Fermilab in Illinois, funded
by the U.S. Department of Energy. "Probably the worst thing that could
happen with small cyclotrons is that the operator might electrocute
themselves."</p>
</blockquote>
<p>On the scale of risk, I would put a small cyclotron at somewhat <strong>more
dangerous</strong> than a television, and <strong>less dangerous</strong> than a lawn mower.
I wonder if they are also out-lawing lawn mowers??</p>
<p>Guess in Alaska "embrace technology" means they are both clueless and
afraid of things they do not understand.</p>
Heidi and the Knife2005-11-29T00:00:00Zhttps://bannister.us/weblog/2005/heidi-and-the-knife
<p><a href="http://www.flickr.com/photos/machine/11269739/" title="photo sharing"><img src="http://static.flickr.com/8/11269739_2abf14e19d.jpg" alt="armed" /> One does NOT mess with Heidi. Trust me on this.</a></p>
Hands-Free Headset2005-11-29T00:00:00Zhttps://bannister.us/weblog/2005/hands-free-headset
<p><img src="http://www.monstercable.com/images_db/mobile/mobile_headset_glam_tn.jpg" alt="untitled" />
Worth noting - the above <a href="http://www.monstercable.com/mobile/mobile_productPage.asp?pin=1577">Monster Mobile: MobileTalk™ 100 Hands-Free
Headset</a>
is by far best headset I've used (so far). Target used to carry them.
Went back for a couple more after it became clear how well the headset
worked - and they were out of stock. Argh.
<a href="http://www.amazon.com/gp/product/B000092WY0/102-4290250-9281767">Amazon has
them!!</a>
... or they did - I ordered the last two they had in stock :).</p>
Sad Commentary - or call for action?2005-11-27T00:00:00Zhttps://bannister.us/weblog/2005/sad-commentary-or-call-for-action
<blockquote>
<p><a href="http://www.adambosworth.net/archives/000051.html">Adam Bosworth's Weblog: Sad
Commentary</a>
... I no longer vote Republican since the Republican Party has become
the creature of irrational know nothings who, if we had always
listened to their ilk, would have us all still living in caves without
fire.</p>
</blockquote>
<p>I would flip this around - perhaps this calls for <strong>greater
involvement</strong> in the Republican Party. Not blind following of the
current uninspiring leadership, but instead make an effort to <strong>change</strong>
the party.</p>
<p>The view outside the Republican Party is much as Adam describes. The
view <em>inside</em> the Republican Party is a little different. The party is
comprised of a large number of individual voices, and many of the voices
with which I find the most in common are within the Republican Party.</p>
<p>If we "leave" the Republican Party, where do we go? By in large I find
the Democrats even less inspiring. For better or worse you have to
participate in either the Republican or Democratic parties, as the
remaining splinters largely don't matter.</p>
<p>Admittedly I don't have a clue how to get started (in any way that will
make a difference). If we simply give up, we leave the party to the
current gang - and that is just <strong>not acceptable</strong>.</p>
European Terrorism Law and Music Downloaders2005-11-27T00:00:00Zhttps://bannister.us/weblog/2005/european-terrorism-law-and-music-downloaders
<blockquote>
<p><a href="http://www.schneier.com/blog/archives/2005/11/european_terror.html">Schneier on Security: European Terrorism Law and Music
Downloaders</a>
... demanding that the European parliament extends the scope of
proposed anti-terror laws to help them prosecute illegal downloaders.</p>
</blockquote>
<p>Music downloaders are not terrorists. This ties in so very well with the
previous post about "taking back" the Republican Party.</p>
Help?2005-11-23T00:00:00Zhttps://bannister.us/weblog/2005/help
<p><a href="http://www.flickr.com/photos/65853861@N00/27913281/" title="photo sharing"><img src="http://static.flickr.com/22/27913281_9ffc674bbb.jpg" alt="help" /></a></p>
Trying to open an airliner door in-flight2005-11-22T00:00:00Zhttps://bannister.us/weblog/2005/trying-to-open-an-airliner-door-in-flight
<blockquote>
<p><a href="http://www.theregister.co.uk/2005/11/22/letters_2211/">Plane door crisis | The
Register</a>
Even if the passenger's nicotine addiction were strong enough, the
door handle probably isn't.</p>
</blockquote>
Roomba (robot vacuum) died AGAIN2005-11-22T00:00:00Zhttps://bannister.us/weblog/2005/roomba-robot-vacuum-died-again-2
<p>Well, I guess that settles it - my <strong>third</strong> replacement Roomba just
died. We are headed into the Xmas shopping season, and unless the Roomba
got a redesign (apparently not) then I really <strong>cannot recommend the
Roomba product</strong>. I like what it does - when it works - but three dead
units in one year is not a good thing.</p>
<p>12/31/2004
: Bought a new Roomba <a href="https://bannister.us/weblog/2004/robot-vacuum">Robot
Vacuum</a>,
which shortly died (faulty charging circuit).</p>
<p>4/6/2005
: <a href="https://bannister.us/weblog/2005/roomba-robot-vacuum-died-again">Replacement Roomba
died</a>,
and a another replacement unit is promised by iRobot.</p>
<p>11/22/2005
: The third replacement Roomba finally crosses the line into useless.
The last couple months have been marginal as the battery life got
shorter and shorter. Today the brushes stopped spinning, and the
unit not longer does anything useful.</p>
What is this?2005-11-21T00:00:00Zhttps://bannister.us/weblog/2005/what-is-this
<p><a href="http://www.flickr.com/photos/dreadedhill/65584560/"><img src="http://static.flickr.com/31/65584560_6710269a23.jpg" alt="untitled" /></a>
<a href="http://maps.google.com/maps?q=33.422272,-124.963989&spn=3.936925,9.936035&t=k&hl=en">Location in Google
Maps</a></p>
Xen, Java and Web Hosting2005-11-20T00:00:00Zhttps://bannister.us/weblog/2005/xen-java-and-web-hosting
<p>This week my <a href="http://vervehosting.com/plans.html">current web hosting
service</a> sent me a notice that I was
approaching the storage limit on the account. At the time I setup the
account (a few years back), the $20/month plan offered a pretty good
deal. Since then other providors have come along with more generous
offerings, but since I wasn't running up against any limits, it was not
worth the hassle of making a change.</p>
<p>Now that I am running close to the account storage limit, it is time to
take another look. It took me a while to pick the first provider, and I
can see that the second time around is not going to be any easier. My
initial requirements as near as I can figure:</p>
<ul>
<li>Sufficient storage - say at least 2GB (to follow the
double-if-you-run-out rule).</li>
<li>Sufficient bandwidth - say at least 5GB/month. Usage hit a reported
peak of 2.47GB in August. Practically all of that is web-crawlers
and feed-readers (I cut the number of entries returned on the feed
from 100 to 40, and bandwidth usage seems to have dropped about in
half).</li>
<li>Similar cost of ~$20/month.</li>
</ul>
<p>The above is very easy to find. The second part is a little less
certain.</p>
<ul>
<li>Access to an IMAP mail server I can use for the @bannister.us
domain.</li>
<li>Providor-maintained spam-suppression filters/tools.</li>
<li>A generous storage limit on email (usually but not always the same
as the account overall limit).</li>
<li>Bonus points if offering
<a href="http://www.ietf.org/rfc/rfc3028.txt?number=3028">Sieve</a> mail filter
support.</li>
<li>Bonus points if offering <a href="http://acme.com/mail_filtering/">acme.com</a>
quality filtering :).</li>
</ul>
<p>While I would like to have access to a well-run mail server, installing
and maintaining my own mail server is a bit too much of a moving target.
I don't need <strong>another</strong> hobby! Admittedly with GMail offering generous
limits, and the ability to send and receive through GMail using another
address, I am not certain that this is needed anymore. Unfortunately
there is a lot of variation in how the providors offer an email service.
The first time around - setup a couple of accounts, and cancelled after
I had a good look at working with their email service. Most of my
current disk usage is for @bannister.us email (522.22 MB).</p>
<p>The above filters the list down somewhat. The next part was simply not
available (at modest cost) the first time around.</p>
<ul>
<li>Able to run server-side Java code.</li>
<li>Able to host CVS and/or Subversion servers.</li>
</ul>
<p>After considerable mucking about, I have come to the conclusion that I
really want to use Java and a full-performance Sun JVM on the server.</p>
<p>PHP - the most commonly available alternative - has a low threshold for
entry for new programmers, and the resulting works largely reflect this.
Lots of projects get started, generate early/flashy results, then bog
down. Look inside and you find the code is a mess. Pretty much what you
would expect from new, enthusiastic programmers with limited skills.
(Admittedly I wasn't impressed with the internals of the PHP interpreter
either). PHP is good for small/simple webapps, but beyond that is less
desirable (my opinion).</p>
<p>Java projects tend to have a different malady. The threshold for entry
with Java is a bit higher, and requires that you understand
abstractions. Perhaps not surprisingly, the quality of Java code tends
to be higher, with the common failing of <strong>too many</strong> abstractions.
Occam's Razor: <em>Do not multiply concepts beyond necessity</em> - could be
more often applied in the Java world (about which <a href="http://www.amazon.com/gp/product/0596006764/102-4290250-9281767">Bruce
Tate</a>
has written well).</p>
<p>Of course the usual notion applies - a good programmer can produce
well-written code in most languages, and a less-skilled programmer can
write poor code in <strong>any</strong> language.</p>
<p>Given the <a href="http://blogs.sun.com/roller/page/jag?entry=java_urban_performance_legends">claimed efficiency of the Sun
JVM</a>
I'd rather host any more dynamic language (Jython, Groovy, JRuby,
whatever) under the same throughly-optimized VM.</p>
<p>As an aside - I've long wondered if you could do efficient Java hosting
on Unix by pre-loading a single master JVM with a large number of
commonly-used Java classes, and calling <strong>fork()</strong> to clone an instance
to process subscriber code. Would shared virtual memory pages and
copy-on-write reduce the physical memory usage, and indirectly (through
improved caching) reduce CPU usage?</p>
<p>What has changed in the web-hosting world since I last looked is the use
of first <a href="http://user-mode-linux.sourceforge.net/">User Mode Linux</a> and
more recently
<a href="http://www.cl.cam.ac.uk/Research/SRG/netos/xen/performance.html">Xen</a>
to efficently subdivide a single physical machine into multiple isolated
virtual machines. Searching on "Xen", "Java" and "hosting" comes back
with <a href="https://bannister.us/weblog/2005/xen-java-and-web-hosting">quite a list</a>. Most seem(?) to expect me to install and
administer my own mail server - which I'd rather not. The per-account
memory limits are not especially generous - are they sufficient to run
Tomcat or Jetty well?</p>
<p>The <a href="http://www.mortbay.com/MB/log/gregw/?permalink=ScalingConnections.html">refactoring for efficient AJAX
support</a>
is especially interesting in <a href="http://jetty.mortbay.org/jetty6/index.html">Jetty
6</a>.</p>
<p>I can see this is going to take some work...</p>
<p><strong>Update 5/1/2006:</strong> Moved everything over to DreamHost a few months
back. No Java support, but the weblog (PHP) and email are running fine -
and I have more disk storage and bandwidth than likely I will ever need.</p>
What don't we have to buy?2005-11-19T00:00:00Zhttps://bannister.us/weblog/2005/what-dont-we-have-to-buy
<blockquote>
<p><a href="http://lily.typepad.com/eloc/2005/11/index.html#a0007476844">Efficient Law Office Consulting: November
2005</a>
Lawyers, it seems, aren't too happy -- as most folk aren't -- with
software that doesn't integrate with what they already have, and which
has to be upgraded before the office even understands how to use the
current version. Unfortunately for the Lawlady and others, that
situation is about to get worse. Software as a whole is going to
annual versions, and even worse -- for the consumer, while better for
the software manufacturer -- entertaining the subscription model.</p>
</blockquote>
<p>Replace Microsoft Office with OpenOffice and you can step off the
upgrade merry-go-round. Plus you get both standard OASIS office document
formats, and the ability to read and write MS Office documents. Not bad
for $free.</p>
<p>Microsoft was wanting the move MS Office customers to a subscription
model, but I think that notion is now pretty near dead.</p>
Leather Pants2005-11-19T00:00:00Zhttps://bannister.us/weblog/2005/leather-pants
<blockquote>
<p><a href="http://contact.ebay.com/ws/eBayISAPI.dll?ShowAllQuestions&requested=bsack&iid=8335653541&frm=284&redirect=0&ShowASQAlways=1&SSPageName=PageAskSellerQuestion_VI">Show All
Questions</a>
Q: Love the pants but . . . I wonder, how many thongs do you think
could be made from them?
A: For Americans? 15. French? 45.</p>
</blockquote>
Sun and ZFS2005-11-18T00:00:00Zhttps://bannister.us/weblog/2005/sun-and-zfs
<p>Very impressive - a <a href="http://blogs.sun.com/roller/page/elowe/20051116">filesystem that detects <strong>and corrects</strong> data
corruption and runs on ordinary
hardware</a>!
Add to the fact that - when used with OpenSolaris - the pricetag is
"free".</p>
<p>Hitting the meme of offering the best possible deal AND the best
possible technology to the customer (rather than trying to extract every
last dollar) is a good way of generating loyal customers. Customers who
will put you first in line when they need to do large scale deployments
(and want to buy support, hardware, etc.).</p>
Setting up Ubuntu, VMware and Windows2005-11-18T00:00:00Zhttps://bannister.us/weblog/2005/setting-up-ubuntu-vmware-and-windows
<p>Did something that - for a variety of reasons - I have wanted to do for
a long time.</p>
<p>Put together an AMD Athlon 64 3500 system with 4GB memory and 380GB
disk. Installed <a href="http://www.ubuntulinux.org/">Ubuntu</a> 5.10 and
<a href="https://bannister.us/weblog/2005/setting-up-ubuntu-vmware-and-windows">VMware</a> 5 (using <a href="https://wiki.ubuntu.com/VmWare">instructions from the Unbuntu
wiki</a>).</p>
<p>Wow. Setting up Ubuntu 5.10 is a <strong>lot</strong> easier than setting up Windows
(any version), and - so far at least - everything just works. I'd
expected some grief setting up printers. One printer (HP DeskJet 5550)
is shared off a Windows box. Another printer (HP Photosmart 8450) is
directly connected to the network. In both cases, bounced through a
couple of Printing dialogs, and both printers work(!).</p>
<p>Installed Windows 2000 and 2003 Server (I have an MSDN license) in
VMware virtual machines. Subjectively at least, it seemed that setup,
boot and shutdown are all <strong>faster</strong>. Might be the underlying Linux OS
and all that RAM acting as a cache and optimizing disk access. Add to
this VMware's ability to snapshot and clone VMs, and testing multiple OS
configurations becomes fast and slick.</p>
<p>This leads me to wonder if hosting multiple Windows VMs under Linux
might often yield better performance, as in typical use not all VMs are
going to be busy at the same time, and the large pool of physical RAM is
going act as a very large disk cache. Another topic...</p>
<p>This all went into an old PC Power and Cooling case (solid, well-built,
but nothing flashy). The original power supply was somewhat noisy (not
atypical, just louder than I'd like), so after a bit of research ordered
a <a href="http://www.seasonicusa.com/products.php?lineId=9">Seasonic S12</a> power
supply (<a href="http://www.pricegrabber.com/p__Victory_SEASONIC_S12_430W_POWER_SUPPLY,__9023002/skd=1/search=seasonic+s12">moderately
priced</a>,
quiet, efficient, good performance - see
<a href="http://www.silentpcreview.com/Sections+index-req-printpage-artid-226.html">review</a>)
and after installation, you can scarcely hear the machine running.</p>
<p>In fact I ordered *two* power supplies. Any noise from the new box is
drown out when the nearby Linux file server is running. Guess which box
is up next for rebuilding??</p>
<p>As an aside - I was somewhat surprised to see the BIOS report that the
Athlon 64 3500 is running at 34°C (94°F) with the stock AMD-supplied
fan/heatsink. To me the low power usage (and heat generation) suggests
that the Athlon 64's coming out of AMD are no longer on the bleeding
edge for chip fabrication. This has two implications. AMD can produce
the chips at low cost, and (very likely) there is an excellent chance
the chips will overclock very well (an adventure for another day).</p>
What is she thinking (or is she)?2005-11-14T00:00:00Zhttps://bannister.us/weblog/2005/what-is-she-thinking-or-is-she
<p>OK, I have to admit I don't quite "get" this picture.</p>
<p><a href="http://www.flickr.com/photos/94048268@N00/56356893/" title="photo sharing"><img src="http://static.flickr.com/24/56356893_36fe5b976a.jpg" alt="untitled" /></a></p>
<p>Yes, clearly this girl is advertising all her "assets", and hopes to use
sex to "buy" her place in the world. I get that part.
What I don't "get" is what sort of thought goes through her head, or if
she is from the same species.
Heh. Women's lib - bra burning - girl with no bra - ???</p>
No respect2005-11-14T00:00:00Zhttps://bannister.us/weblog/2005/no-respect
<p>A few years back a friend replaced his battered old Jeep with a shiny
new model. Almost immediately he noticed that on the road he got a lot
less respect. Folks were generally careful about getting too near to his
old disreputable-looking vehicle, but apparently felt no such qualms
about cutting off a shiny new Jeep.</p>
<p>As I have discovered, if you drive a minivan you get even less respect.
It took a few months (I don't do a lot of driving in traffic if I can
help it), but finally it sunk in. For some reason other drivers feel not
the slightest qualm at doing rude things (even somewhat dangerous)
around a minivan.</p>
<p>The road cretins (most often sporting a baseball cap and driving a small
pickup) are usually quite easy to predict. While I like to drive a bit
faster than most other folks, at the same time I prefer to keep a safe
distance between my car and the car ahead. This gap proves incredibly
alluring to road-cretins, who have no qualms about cutting in (often
without signalling) and slowing down - far too close for my comfort.</p>
<p>Once I figured out what was happening, I could change the game. While
the minivan is no road-rocket, with a 200hp engine it scats reasonably
well. When I could predict the next moves of an impatient/impolite
driver would include diving into the space in front of my car, the gap
would mysteriously dimish <em>just enough</em>, and then widen when other
traffic blocked access to that space.</p>
<p>I'm thinking of adding a flaming death's-head to the front, and an "I
brake for hallucinations" sticker to the rear. Just enough to penetrate
the mental haze of the less mentally active drivers, and make them think
twice (or even once) before doing something rude :).</p>
Winning Chip Battles?2005-11-12T00:00:00Zhttps://bannister.us/weblog/2005/winning-chip-battles
<blockquote>
<p><a href="http://blogs.sun.com/roller/page/jonathan?entry=a_five_year_lead">Recipe for Winning Chip Battles - Jonathan Schwartz's
Weblog</a>
But IBM's recent Power5 announcement was odd - in that what we were
expecting wasn't what IBM delivered.</p>
<p>Granted, I didn't get invited to IBM's P5 roll-out. I was expecting
yet another of IBM's periodic, methodical improvements. Something
similar to the 2002 upgrade from POWER4 to POWER4 - in which they
executed flawlessly to increase speed, lower cost and power
consumption. They did everything they could to make the chip work
better at less cost. And that's what initiated a very tough period for
Sun.</p>
<p>But the newly announced POWER5 seemed anti-climactic - no higher
frequencies. No improvements to memory. Not even a reduction in power
consumption (making the POWER name, with oil at $70/barrel,
particularly ironic). About the only tangible benefit listed for
POWER5 over POWER5 was a smaller die size - a manufacturing benefit
for IBM.</p>
<p>The new POWER5 is sitting today at the exact same performance point
that the old POWER5 reached over a year ago. IBM has stood still -
long enough to open a window of opportunity for Sun.</p>
<p>A few weeks before the P5 announcement, we announced our own upgrade
to our UltraSPARC IV processor. The new UltraSPARC IV is a completely
revised design, which boasts a doubling of performance, a smaller die
and lower power consumption. And unlike IBM, <strong><u>which is confining
P5 to a few of its low-end systems</u></strong>, we already have UltraSPARC
IV rolled out across our entire line of mid-range and high-end
servers.</p>
</blockquote>
<p>With everything else the same, a smaller die size should mean lower
cost. Lower cost is effective for mostly-single-threaded applications
(games machines and PCs) where power consumption is not critical. If new
chips can be dropped into the new XBox then this means greater profit
for IBM. If the new chips can be dropped into Apple PCs, this could mean
Apple can offer a lower price point (if Apple is still willing and
interested).</p>
<p>Checking the IBM site for news nets...</p>
<blockquote>
<p><a href="http://www-03.ibm.com/chips/news/2005/1025_xbox.html">IBM delivers Power-based chip for Microsoft Xbox 360 worldwide
launch</a>
"The chip was delivered to Microsoft in less than 24 months from
original contract signing in the fall of 2003 in time to meet
Microsoft's massive worldwide product launch for the 2005 holiday
season."</p>
</blockquote>
<p>So it sounds like IBM focused the majority of their engineering effort
on meeting the Microsoft contract.</p>
Military Silly String2005-11-12T00:00:00Zhttps://bannister.us/weblog/2005/military-silly-string
<blockquote>
<p><a href="http://www.cockeyed.com/citizen/silly/silly.html">The Military Applications of Silly
String</a>
I'm a former Marine I in Afghanistan. Silly string has served me well
in Combat especially in looking for I.A.Ds., simply put, booby traps.
When you spray the silly sting in dark areas, especially when you
doing house to house fighting. On many occasions the silly string has
saved me and my men's lives.
Now my little brother has taken up the fight in Iraq and where he is,
house to house fighting is intense. To get to the point I would like
to purchase a large amount of silly string to send to him to help with
the booby traps. Please send me some prices for a bulk order.</p>
</blockquote>
<blockquote>
<p>Yes, I myself use it too. When you spray the string it just spreads
everywhere and when it sets it lays right on the wire. Even in a dark
room the string stands out revealing the trip wire.</p>
</blockquote>
Jumping to conclusions2005-11-10T00:00:00Zhttps://bannister.us/weblog/2005/jumping-to-conclusions
<blockquote>
<p><a href="http://www.tbray.org/ongoing/When/200x/2005/11/08/US-Politics">ongoing · US Politics —
Creepy</a>
I read a lot of news, and it makes me wonder whether the faction
currently governing America is heavily populated with greedy vicious
lying thieving sanctimonious underhanded heartless venial creeps.</p>
</blockquote>
Is bandwidth still too costly?2005-11-10T00:00:00Zhttps://bannister.us/weblog/2005/is-bandwidth-still-too-costly
<p>Image captured from Yahoo News ... (which might go away someday)</p>
<p><img src="http://us.news3.yimg.com/us.i2.yimg.com/p/ap/20051109/capt.hk10411090601.hong_kong_record_flight_hk104.jpg?x=380&y=253&sig=aTPvj0VIhatfHY.2.Yto3Q--" alt="untitled" />
This is the "big" image from a <a href="http://news.yahoo.com/news?tmpl=story&cid=535&ncid=535&e=5&u=/ap/20051109/ap_on_re_as/hong_kong_record_flight">news
article</a>,
and really does not do justice to the subject.</p>
<p>Now I can understand the need to keep image sizes down, in the days when
bandwidth was expensive and most users were on dial-up modems. Is this
still an appropriate tradeoff? Bandwidth is cheaper and dial-up is a
much smaller portion of the user population. Isn't it time to upsize the
images offered?</p>
An interesting twist - Real Estate Auctions2005-11-08T00:00:00Zhttps://bannister.us/weblog/2005/an-interesting-twist-real-estate-auctions
<p>Near the end of today's election my neighbor from down the street -
Tony - stopped by to vote. Turns out he has found a new line of
business.
<a href="http://homes2auction.com/">Real Estate Auctions by Goodlife Financial
Management</a></p>
<p>To put this into context, realtors in the area want something like a
4-6% commission for selling your house. At $800K to $1.2M (prices I
have seen recently for local homes) - that is a lot of money. There is
some indication the local realtors are becoming more flexible on their
pricing (no surprise), but nothing concrete.</p>
<p>Apparently one of Tony's friends took a trip to New Zealand and saw that
homes there are typically sold at a sort of auction - different than
what is usually done here. Tony took the idea and reports that he is
getting more business than he can handle (though factor in the fact that
salesmen-types tend to exaggerate). In fact this sounds like a terrific
idea - at least for the local market.</p>
On torture Bush vows ... what?2005-11-07T00:00:00Zhttps://bannister.us/weblog/2005/on-torture-bush-vows-what
<blockquote>
<p><a href="http://www.alertnet.org/printable.htm?URL=/thenews/newsdesk/N07523099.htm">Reuters AlertNet - Bush vows "we do not torture" terror
suspects</a>
"We are finding terrorists and bringing them to justice," Bush said
at a joint news conference with Panamanian President Martin Torrijos.
"We are gathering information about where the terrorists might be
hiding. We are trying to disrupt their plots and plans. Anything we do
... to that end in this effort, any activity we conduct, is within the
law."</p>
</blockquote>
<p>For a moment I had a flicker of hope - then I realised the statement
could be almost true if looked from just the right angle. Carefully
re-define "we" to exclude anyone doing anything nasty, and carefully
re-define "torture" to exclude any nasty stuff they might be doing ...
and the statement from Bush is true (maybe - but not really). Didn't
Clinton get roasted for chosing his definitions in a similar fashion?</p>
<blockquote>
<p>Vice President Dick Cheney has been spearheading an effort on Capitol
Hill to have the CIA exempt from an amendment by Arizona Republican
Sen. John McCain that would ban torture and inhumane treatment of
prisoners.</p>
</blockquote>
<p>So ... we don't torture, but the CIA needs an exception so they can?
Ouch.</p>
<p>The headline from ABC News/Associated Press has a lot less punch, and
the heading puts a lot of big mild words before they get to "torture".
Wonder if there is a pattern here?</p>
<blockquote>
<p><a href="http://abcnews.go.com/Politics/print?id=1288500">ABC News: Bush Defends U.S. Interrogation
Policy</a>
President Bush Defends Administration's Policy on Detention of
Terrorism Suspects, Says 'We Do Not Torture'"</p>
<p></p>
</blockquote>
<p>And from elsewhere...</p>
<blockquote>
<p><a href="http://news.kypost.com/apps/pbcs.dll/article?AID=/20051104/NEWS02/511040358/1014&template=printpicart">The Cincinnati Post - Torture is a crime, not a
policy</a>
In its four-year war against terrorism, the United States has strayed
from the ideals that made us, as the late President Reagan used to
say, like a city shining on a hill.
It is time we get back to who we are as a people and we are not a
people who torture prisoners.</p>
<p></p>
</blockquote>
<p>Well said.</p>
Postel’s Law - liberal in what you accept, conservative in what you generate2005-11-05T00:00:00Zhttps://bannister.us/weblog/2005/postel-law-liberal-in-what-you-accept-conservative-in-what-you-generate
<blockquote>
<p><a href="http://en.wikipedia.org/wiki/Postel%27s_Law">Postel's Law</a> - from
<a href="http://www.ibiblio.org/pub/docs/rfc/rfc793.txt">RFC: 793 - TRANSMISSION CONTROL PROTOCOL</a></p>
<p><code>2.10. Robustness Principle TCP implementations will follow a general principle of robustness: be conservative in what you do, be liberal in what you accept from others.</code></p>
</blockquote>
<p>Long ago I had accepted and internalized this bit of sound general
advice as almost univerally applicable in software design - so long ago
in fact I had forgotten the source.</p>
<p>Admittedly I have not tried to puzzle out all the tumult around Atom and
the various RSS flavors. Seems to me if you generate feeds you want to
make sure whatever you generate is as clean as possible. On the other
hand if you want to consume the universe of feeds, you have to adapt to
all the flawed generators out there - and for aggregator sites and the
like there simply is no other choice. You might try to encourage the
flawed generators to clean up their acts, but adaptation is something
you cannot practically avoid.</p>
<p>For specific limited applications you <strong>can</strong> often afford to be picky
and require that all the feeds you consume be well-formed. General
purpose feed consumers do not have this luxury and <strong>must</strong> be "liberal
in what you accept". Adapting to flawed generators is a pain, but is
also something you cannot ignore. In the true spirit of the Internet, if
your application does an incomplete job then users will simply route
around you and use other applications that do a better job.</p>
<p>The above conclusion is pretty easy to come by - so why all the noise?</p>
<p>In trying to puzzle out <a href="http://www.intertwingly.net/blog/2005/11/05/Prisoners-Dilemma">an obscure
posting</a>
from Sam Ruby - just ran across a nearly two year old item from Mark
Pilgrim (who is doing <u>exactly</u> the right thing, BTW)</p>
<blockquote>
<p><a href="http://diveintomark.org/archives/2004/01/08/postels-law">There are no exceptions to Postel’s Law [dive into
mark]</a>
This last one is interesting, in that it tries to wish away Postel’s
Law (originally stated in RFC 793 as be conservative in what you do,
be liberal in what you accept from others). Various people have tried
to mandate this principle out of existence, some going so far as to
claim that Postel’s Law should not apply to XML, because (apparently)
the three letters X, M, and L are a magical combination that signal a
glorious revolution that somehow overturns the fundamental principles
of interoperability.</p>
<p>There are no exceptions to Postel’s Law. Anyone who tries to tell you
differently is probably a client-side developer who wants the entire
world to change so that their life might be 0.00001% easier. The world
doesn’t work that way.</p>
<p>I maintain a <a href="http://diveintomark.org/projects/feed_parser/">feed
parser</a>. Real people
rely on it. It is used in several end-user products, including
Chandler and Straw, and lots of other people use it in their own
homegrown aggregators. It is as liberal as possible because that is
what clients need to be. It handles the 7 different versions of RSS
seamlessly and equally. It handles Atom. It even goes so far as to try
to to abstract away the differences between RSS and Atom, duplicating
RSS elements into Atom fields and Atom elements into RSS fields, RSS
2.0 fields into RSS 1.0 fields, and so forth and so on. If all you
care about is title/link/description, you can get that from any feed,
even a souped-up Atom feed. If you want to use the more advanced
content model of Atom, you can do that too, even from the most minimal
RSS feed.</p>
<p>My feed parser resolves relative links. It maps non-standard elements
to standard ones. It parses 10 different types of dates and then
normalizes them in case somebody claims their latest entry was last
modified on June 31st. It handles many common cases of non-well-formed
XML, because many feeds contain XML well-formedness errors, even the
feeds of people who should really know better, and a feed parsing
library that can’t parse the feeds that exist in the real world is
simply a waste of everyone’s time. Don’t whine to me that parsing
feeds is hard. I know how hard it is.</p>
<p>I also help maintain a <a href="http://feedvalidator.org/">feed validator</a>,
and I strongly advocate its use among producers. It tickles me
whenever I go to a new site and see a valid RSS or valid Atom banner.
I have spent an ungodly amount of time making the validator as easy to
use as possible and also as strict as possible. It has almost 1000
test cases backing up its rules; 300 of those were added in the last
release alone. It checks for June 31st. I swear to God it does. One
day I was writing test cases and Sam was writing code to pass them,
and when he saw that test case fail he almost reached through his
cable modem and strangled me. He almost removed the test case out of
spite. He gave in and coded it anyway, and checked it in, and we
deployed, and three days later I got a bug report from someone who
couldn’t figure out why his feed wasn’t validating. And I couldn’t
figure it out either, until he mentioned that it only seemed to choke
on the date for one specific entry, and I looked at it one more time
and I swear to God it said 2003-06-31.</p>
<p>There are no exceptions to Postel’s Law.</p>
</blockquote>
<p>More recently from the <a href="http://blogs.msdn.com/rssteam/archive/2005/11/03/489065.aspx">Microsoft Team RSS Blog : Feeds and well-formed
XML</a> we
hear...</p>
<blockquote>
<p>... we’ve adopted the following overriding principle for IE 7 and RSS
platform in Windows Vista:
We will only support feeds that are well-formed XML.</p>
<p></p>
</blockquote>
<p>On reflection I suppose this is harmless. If you have an application
with a limited domain, you can use the Microsoft code with little grief.
If you need to support a larger domain then you either use <a href="http://diveintomark.org/projects/feed_parser/">a better
feed parser</a>, or you run
your feeds through an aggregator (presumably itself running a better
feed parser). This will encourage the folks generating new applications
to do a better job with what they generate.</p>
<p>At the very least the above reading snags links to a feed validator and
an excellent feed parser. Might have use for both in the coming months.</p>
<p>The feed parser is Python code - wonder if it will run in a JVM using
<a href="http://www.jython.org/">Jython</a>?</p>
Bathsheba Grossman - Design2005-11-05T00:00:00Zhttps://bannister.us/weblog/2005/bathsheba-grossman-design
<p><img src="http://www.bathsheba.com/math/120cell/120cell_5.jpg" alt="artifact" />
<a href="http://www.bathsheba.com/sculpt/process/">Bathsheba Grossman - Design</a></p>
<p>Getting closer to automated one-off on-demand manufacturing?</p>
ACT & Boston ODF Day2005-11-03T00:00:00Zhttps://bannister.us/weblog/2005/ongoing-boston-odf-day
<blockquote>
<p><a href="http://www.tbray.org/ongoing/When/200x/2005/10/28/Boston">ongoing · Boston ODF
Day</a>
... there is this guy in the room from ACT who was pushing back
pretty hard against the new Massachusetts policy. His arguments are
lifted pretty well word for word from the Microsoft talking points ...</p>
</blockquote>
<p><em>Another amusing bit:</em>
The guy from <a href="http://www.actonline.org/">ACT</a> claimed to be
representing lots of little guys -- but -- when it came to enumerating
the big vendors, his pattern of speech <em>changed</em>. The names of all the
big vendors just plain <strong>rolled off his tongue</strong> without the slightest
hesitation - as though oft-repeated and much-valued by the speaker.</p>
<p>One might guess that the big guys (i.e. Microsoft) were of particular
importance in the speaker's mind.</p>
Graphing the Deficit2005-11-03T00:00:00Zhttps://bannister.us/weblog/2005/graphing-the-deficit
<p><a href="http://www.flickr.com/photos/travischurch/55587191/">from Flickr</a>
<img src="http://static.flickr.com/27/55587191_2e8c27e63f.jpg" alt="untitled" /></p>
<p>Any questions?</p>
Sony - clueless about software?2005-11-02T00:00:00Zhttps://bannister.us/weblog/2005/sony-clueless-about-software
<blockquote>
<p><a href="http://www.sysinternals.com/blog/2005/10/sony-rootkits-and-digital-rights.html">Sony, Rootkits and Digital Rights Management Gone Too
Far</a>
At that point I knew conclusively that the rootkit and its associated
files were related to the First 4 Internet DRM software Sony ships on
its CDs. Not happy having underhanded and sloppily written software on
my system I looked for a way to uninstall it. However, I didn’t find
any reference to it in the Control Panel’s Add or Remove Programs
list, nor did I find any uninstall utility or directions on the CD or
on First 4 Internet’s site. I checked the EULA and saw no mention of
the fact that I was agreeing to have software put on my system that I
couldn't uninstall. Now I was mad.</p>
</blockquote>
<p>Dumb idea - Sony.</p>
Secret CIA jails2005-11-02T00:00:00Zhttps://bannister.us/weblog/2005/secret-cia-jails
<blockquote>
<p><a href="http://www.guardian.co.uk/print/0,3858,5324527-110878,00.html">Guardian | East Europe 'has secret CIA jails for
al-Qaida'</a>
The CIA has been interrogating al-Qaida prisoners at a Soviet era
compound in eastern Europe as part of a covert jail system set up
after the September 11 attacks, according to the Washington Post. The
secret facility is part of a network of "black sites" spanning eight
countries, the existence and locations of which are known only to a
handful of US officials and usually only the president and a few top
intelligence officers in the host countries.</p>
</blockquote>
<p>So ... our government has secret jails in other countries, and - as
<a href="https://bannister.us/weblog/2005/negotiating-for-torture">previously
noted</a>
is advocating torture.</p>
<p>On rare occasion it might make sense for a government to keep secrets
from it's citizens. Far more often this is simply a way to hide
reprehensible behavior. Care to venture a guess which this represents?</p>
Prejudice & spammers2005-11-01T00:00:00Zhttps://bannister.us/weblog/2005/prejudice-spammers
<p>As usual I was loading up tabs in Firefox with pages and was reading
through each in turn. Get enough queued up, and you tend to forget why
you loaded the page.</p>
<p>So when I got to <a href="http://ogun.stanford.edu/~kunle/">this guy's page</a>,
instead of thinking about CMT, my first thought was...
<img src="http://ogun.stanford.edu/~kunle/images/0105wsunf1.jpg" alt="Not a Nigerian
Spammer." />
... a Nigerian Spammer?</p>
<p>Oh well.</p>
Population of Europe2005-11-01T00:00:00Zhttps://bannister.us/weblog/2005/population-of-europe
<p>Simple what-if question:
What would be the population of Europe, without World War I or II?
A lot of young men were killed in each war, but relatively few women.
How does that effect population growth?</p>
California Spring2005-10-31T00:00:00Zhttps://bannister.us/weblog/2005/california-spring
<p>In the past couple weeks we got a fair dose of rain. Fall it may be by
the calendar. Spring in this portion of southern California is any time
it rains - which is generally around Spring or Fall, and occasionally in
the middle of Winter. Spring is defined by the simple brief presence of
water.</p>
<p><a href="http://www.flickr.com/photos/dreadedhill/57952742/" title="Photo Sharing"><img src="http://static.flickr.com/24/57952742_370326d29e.jpg" alt="DSC01321" />
Spring in
California</a></p>
Insurance, inefficient healthcare -- the Elephant in the closet2005-10-30T00:00:00Zhttps://bannister.us/weblog/2005/insurance-inefficient-healthcare-the-elephant-in-the-closet
<p>A recent piece in the <a href="http://www.chron.com/cs/CDA/ssistory.mpl/business/3424769">Houston
Chronicle</a>
and echoed in the <a href="http://blogs.chron.com/fulldisclosure/archives/2005/10/wal-mart_hiring.html">reporter's
weblog</a>
criticises Wal-Mart for trying to control their employee costs. Reading
the <a href="http://www.nytimes.com/packages/pdf/business/26walmart.pdf">internal Wal-Mart
communication</a>
gives a somewhat different message. I know it is fashionable to
criticise Wal-Mart just now, but this article (and many like it) miss
the real issue.</p>
<p>The real issue is the unchecked rising cost of health insurance.</p>
<p>Profit-making commercial entities (like Wal-Mart) are amoral entities -
not moral, not immoral - simply as they are organized to stay in
business and make a profit. The company that does the best job in this
game stays in business, and companies that do a lesser job - as with
many of Wal-Mart's competitors - lose business.</p>
<p>
Every company in the United States that offers health insurance to their
employees, is faced with a problem, and this chart from [Trends &
Indicators in the Changing Health Care
Marketplace](http://www.kff.org/insurance/7031/print-sec1.cfm) tells the
story.<object class="cpHideForMenus" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,23,0" height="355" width="100%"><param name="width" value="100%" /><param name="play" value="true" /><param name="scale" value="showall" /><param name="height" value="355" /><param name="loop" value="true" /><param name="quality" value="high" /><param name="src" value="http://www.kff.org/insurance/7031/upload/Exhibit-1-1-Chart.swf" /><param name="salign" value="l" /><param name="pluginspage" value="http://www.macromedia.com/go/getflashplayer" /><param name="menu" value="true" />
<embed class="cpHideForMenus" play="true" scale="showall" loop="true" quality="high" src="http://www.kff.org/insurance/7031/upload/Exhibit-1-1-Chart.swf" salign="l" pluginspage="http://www.macromedia.com/go/getflashplayer" menu="true" height="355" width="100%" />
</object>
We - collectively - have a problem. The cost of healthcare is
increasing at a completely unjustified rate. Over the past several
decades an ever-larger portion of our total income (as a nation) has
gone to healthcare.
</p><blockquote>
<p><a href="http://www.nchc.org/facts/cost.shtml">NCHC | Facts About Healthcare - Health Insurance
Cost</a>
Experts agree that our health care system is riddled with
inefficiencies, excessive administrative expenses, inflated prices,
poor management, inappropriate care, waste and fraud. These problems
significantly increase the cost of medical care and health insurance
for employers and workers.</p>
<p></p>
</blockquote>
<p>With better technology the quality of healthcare should have gone up,
and the cost should have gone down. Since that did not happen, something
is wrong.</p>
Watch out for potholes2005-10-25T00:00:00Zhttps://bannister.us/weblog/2005/watch-out-for-potholes
<p><img src="http://wiredblogs.tripod.com/gadgets/iswing.jpg" alt="untitled" />
<a href="http://wiredblogs.tripod.com/gadgets/index.blog?entry_id=1260405">from Gear
Factor</a></p>
<p>I'd want a rollcage for this gadget. One good pothole or bump at speed
and the wheel(s) end up slower, and you go face-down fast.</p>
<p>At least with the Segway you aren't trapped inside a structure.</p>
Schneier on Security - FBI Abuses of the USA Patriot Act2005-10-25T00:00:00Zhttps://bannister.us/weblog/2005/schneier-on-security-fbi-abuses-of-the-usa-patriot-act
<blockquote>
<p><a href="http://www.schneier.com/blog/archives/2005/10/fbi_abuses_of_t.html">Schneier on Security: FBI Abuses of the USA Patriot
Act</a>
This week marks the four-year anniversary of the enactment of the
Patriot Act. Does anyone feel safer because of it?</p>
</blockquote>
Negotiating for Torture2005-10-25T00:00:00Zhttps://bannister.us/weblog/2005/negotiating-for-torture
<blockquote>
<p><a href="http://news.yahoo.com/s/ap/20051025/ap_on_go_co/congress_detainees&printer=1">Negotiators on Torture Bill Feeling
Heat</a>
Congressional negotiators are feeling heat from the White House and
constituents as they consider whether to back a Senate-approved ban on
torturing detainees in U.S. custody or weaken it as the White House
prefers.</p>
<p>Led by Vice President Dick Cheney, the Bush administration is floating
a proposal that would allow the president to exempt covert agents
outside the Defense Department from the prohibition.</p>
<p>Meanwhile, some newspapers are calling for lawmakers to support Sen.
John McCain (news, bio, voting record)'s provision that would ban the
use of "cruel, inhuman or degrading treatment or punishment" against
anyone in U.S. government custody, regardless of where they are held.</p>
</blockquote>
<p>Lets flip this around.</p>
<p>Does anyone think it is OK for foreign agents to come into the United
States and torture an American citizen, merely if an agent <strong>thinks</strong>
that citizen <strong>might</strong> know something the agent considers important?</p>
<p>McCain is dead right, and the Administration is dead wrong.</p>
Apple faces lawsuit over iPod2005-10-24T00:00:00Zhttps://bannister.us/weblog/2005/apple-faces-lawsuit-over-ipod
<blockquote>
<p><a href="http://money.cnn.com/2005/10/24/technology/apple_nano.reut/">Apple faces lawsuit over iPod
defects</a>
The plaintiff named in the California lawsuit, Jason Tomczak, bought
a nano in September that he said quickly became so scratched he could
not view the screen. Apple replaced that device because of a battery
problem, but the complaint said the replacement nano also became so
scratched that Tomczak decided to return it.</p>
</blockquote>
<p>I don't get this - even if Apple (or a supplier) used a soft plastic for
the screen, how the heck could he get the device "so scratched he could
not view the screen" - in a single month?!? Absurd.</p>
<p>Given the overwhelming slice of the market claimed by the iPods, I have
to wonder if this "issue" could be either</p>
<ul>
<li>lawyers out to make a name for themselves</li>
<li>funded by an iPod competitor as a marketing tactic</li>
</ul>
<p>or both?</p>
Study Reveals Pittsburgh Unprepared For Full-Scale Zombie Attack2005-10-22T00:00:00Zhttps://bannister.us/weblog/2005/study-reveals-pittsburgh-unprepared-for-full-scale-zombie-attack
<blockquote>
<p><a href="http://www.theonion.com/content/node/41676/print/">Study Reveals Pittsburgh Unprepared For Full-Scale Zombie Attack |
The Onion - America's Finest News
Source</a>
ZPI researchers noted that tens of thousands of Pittsburgh citizens
live in close proximity to a cemetery. This fact, coupled with
abnormally high space-radiation levels in eastern Pennsylvania and
ongoing traffic issues in the East Hills and Larimer areas, led
Cornelius to declare the likelihood of a successful evacuation as
"slight to impossible."</p>
</blockquote>
Jini and XML2005-10-19T00:00:00Zhttps://bannister.us/weblog/2005/jini-and-xml
<p>Tim Bray is feeling a touch guilty...</p>
<blockquote>
<p><a href="http://www.tbray.org/ongoing/When/200x/2005/10/19/Waldo-on-IPC">ongoing · Bits on the
Wire?</a>
So I wrote a quick note to Jim along the lines of “Uh, what about
XML?”</p>
</blockquote>
<p>Months later(!) Jim Waldo responds with <a href="http://www.artima.com/weblogs/viewpost.jsp?thread=132646">"What is
XML?"</a> - in
effect elaborating on the question in interesting ways without
attempting an answer. Elaborating on the question is quite reasonable.
XML is simply data structures serialized into a common text format - but
different folks tend to attach different connotations to the use of XML.</p>
<p>Saw <a href="http://www.artima.com/weblogs/index.jsp?blogger=waldo">Jim Waldo</a>
when he gave a (quite interesting and entertaining) talk at the first
JavaOne conference in 1995 - I believe he was talking about Jini (or a
precursor?). Interesting stuff, but not relevant to anything I was doing
at the time, so I filed Jim away under "guys whose work is worth
checking on".</p>
<p>About a week ago I checked back, read up on Jini, and can see how using
Jini could introduce some powerful simplicity into complex distributed
applications. Might even be useful to apply to some of the larger
problems I can see working on over the next several years.</p>
<p>To my mind the use of Jini versus XML primarily comes down to a single
question - "Loosely coupled or tightly coupled?" - in the context of
distributed applications.</p>
<p>Within an organization you can reasonably deploy tightly coupled
applications. If you can reasonably expect a JVM on both ends of the
network connection, using Jini makes a lot of sense, as you could save
boatloads of development time, and some classes (no pun intended) of
problems simply go away.</p>
<p>Between organizations you want things to be more loosely coupled. The
notion of dynamically loading a Java class from another organization
into my JVM gives me hives. There might be cases where this makes sense,
but this would be more the exception than the rule. Pumping your
inter-application data through XML is likely going to require more
development and runtime work compared to Jini. The payback is better
isolation - essential when the level of trust is less, and when the
range of versions is greater.</p>
Speaking up2005-10-18T00:00:00Zhttps://bannister.us/weblog/2005/speaking-up
<blockquote>
<p><a href="http://www.adambosworth.net/archives/000047.html">Adam Bosworth's Weblog: Speaking
up</a>
I fear now for my children growing up into a world where the leaders
turn their backs on the spirit of reason and inquiry.
... akin to letting a child's tantrum dictate the judgement of an
adult.</p>
</blockquote>
<p>What he said. It should not need saying ... but it does.</p>
Valentina2005-10-18T00:00:00Zhttps://bannister.us/weblog/2005/flickr-photo-download-valentina-sm-2
<p><img src="http://static.flickr.com/25/53353557_6d291b26b8.jpg" alt="?" />
<a href="http://www.flickr.com/photos/protagonist/53353557/in/photostream">A bit of mystery.</a></p>
How Swing Components are displayed (Tell me it isn't so!)2005-10-17T00:00:00Zhttps://bannister.us/weblog/2005/how-swing-components-are-displayed-tell-me-it-isnt-so
<blockquote>
<p><a href="http://java.sun.com/docs/books/tutorial/uiswing/14painting/concepts.html">How Swing Components Are
Displayed</a>
When the GUI for SwingApplication is painted, here's what happens:</p>
<ol>
<li>The top-level container, JFrame, paints itself.</li>
<li>The content pane first paints its background, which is a solid
gray rectangle. It then tells the JPanel to paint itself. In most
look and feels, the JPanel is opaque by default and the content
pane's background rectangle doesn't actually appear in the
finished GUI, being completely obscured by the JPanel. Note: It's
important that the content pane be opaque. Otherwise, messy
repaints will result. We could invoke setOpaque(true) on the
JPanel and then make it the content pane. This would slightly
simplify the containment hierarchy and painting by removing an
unnecessary container.</li>
<li>In most look and feels, the JPanel is opaque and the first
painting it does fills its background. Next, it paints its border.
The border is an EmptyBorder, which has no effect except for
increasing the JPanel's size by reserving some space at the edge
of the panel. Finally, the panel asks its children to paint
themselves.</li>
<li>To paint itself, the JButton paints its background rectangle, if
necessary, then the text that the button contains, and then its
border. If the button has the keyboard focus, meaning that any
typing goes directly to the button for processing, the button does
some look-and-feel-specific painting to make clear that it has the
focus.</li>
<li>To paint itself, the JLabel paints its text.</li>
</ol>
<p>In this way, each component paints itself before any of the components
it contains. This ensures that the background of a JPanel, for
example, is visible only where it isn't covered by painting performed
by one of the components it contains.</p>
</blockquote>
<p>If this is really how Swing paints, they really do need double-buffered
graphics - to hide their sins.</p>
<p>The algorithm for efficient GUI paints is very simple, efficient ... and
this isn't it. Puzzled out this particular problem out in the early
1980's (prior to any version of Microsoft Windows) when writing a GUI
framework to run on PCs (i.e. the 5Mhz 8088 CPU).</p>
<p>First you set a clipping region, as often only a portion needs repaint.
Next you do a depth-first walk of the visual objects, first asking
front-most children to paint, then asking <u>only the exposed
fragments</u> of the parent to paint (i.e. only the portions not covered
by a child). Paint children before parents, and pass a clipping
rectangle (which could be used by the component to optimize the repaint
processing) for just the exposed area in need of update.</p>
<p>With the exception of painting characters over a background, you want to
paint a pixel exactly once. If the parent is painted before the child
and they have different colors you can get rather nasty flicker (aside
from the wasted processing time). You can hide the flicker by using
double-buffered graphics (and waste <strong>huge</strong> chunks of memory and
compute time).</p>
Passwords on the web as a security risk2005-10-16T00:00:00Zhttps://bannister.us/weblog/2005/passwords-on-the-web-as-a-security-risk
<p>A simple observation about another risk involving plaintext passwords
sent across the network...</p>
<p>This has nothing to do with whether the channel in encrypted (typically
HTTPS - HTTP over SSL). Rather this has to do with whether the remote
server is receiving plaintext passwords.</p>
<p>If you use applications on the web, there are likely several if not
dozens of sites on which you are required to enter both a username and
password. With so many different sites requiring passwords, you have a
couple of choices.</p>
<p>The easiest choice is to use the same username and password on as many
sites are possible. Using the same username and password everywhere is
easiest to remember, but likely will not work everywhere as different
sites have sometimes in different requirements (minimum and maximum
username and password lengths), and on more popular sites the username
you wish to use may already be in use. This is also the least secure as
once anyone gets ahold of your username/password they can use gain entry
to all the sites where you have used that combination. For sites where
someone gaining access to your account (online bulletin boards and the
like) is inconvienent but not harmful - a use of single common
username/password is only a modest risk.</p>
<p>Using a different username/password for login to every site is simply
impractical. With too many different logins to remember you will be
forced to record (on paper or elsewhere) all the different logins used.
If you ever lose than record - and it falls into the wrong hands - then
whoever obtains the record now has access to all your recorded accounts.</p>
<p>Another aspect to this problem is the information that can be collected
from subverted sites. With so many different web applications in use
managed by so many different people, there is a good chance one or more
are easily subverted. From a subverted site successful logins can be
monitored to obtain username/password logins valid for that site - but
the failed logins may be nearly as or more interesting. A failed login
may represent a case where the user entered a valid login <strong>for another
site</strong>! In fact if the attacker has enough control over the subverted
site, a good approach would be to occasionally reject a valid login, and
record the alternatives tried by the user. The valid login would tell
you the identity of the person trying to login, and the alternatives
tried by the user would tell you possible username/password combinations
to try at other sites where the person has accounts.</p>
<p>The solution to all this is easy to imagine, but more difficult to
implement. A user should only have to ever remember one password, and
the plaintext password should either <strong>never</strong> be sent across the
network, or only ever be sent to one trusted site.</p>
<p>The "one trusted site" approach is similar to Microsoft's Passport
service. Given Microsoft's history as a sometimes rapacious competitor,
folks were not universally willing to trust Microsoft, so Passport was
never widely adopted. Also a single "trusted site" for everyone to use
represents a single point of failure - always something to avoid in a
design. What this means in the case of a like Microsoft's Passport
service is that the service becomes a single point of attack, and if
<u>any</u> attack were successful the amount of information disclosed is
huge.</p>
<p>A better approach is to have multiple "trusted sites" run independently,
where you get to pick the one you trust. This is similar to the
<a href="http://www.projectliberty.org/">Liberty</a> proposal (and somewhat to
<a href="http://openid.net/">OpenID</a> - not exact equivalents, BTW).</p>
<p>Another alternative is to only ever enter one good password on your
local machine, and compute a one-way hash from the one master password
(which is not stored and never leaves your machine) to generate a unique
password for each individual site. One example of this approach is
<a href="http://passwordmaker.org/">PasswordMaker</a> (there are
<a href="https://addons.mozilla.org/extensions/showlist.php?application=firefox&category=Privacy%20and%20Security">others</a>).</p>
<p>The risk of manually entering passwords to so many sites deserves a bit
more emphasis.</p>
Maybe after all the good guys win?2005-10-16T00:00:00Zhttps://bannister.us/weblog/2005/maybe-after-all-the-good-guys-win
<blockquote>
<p><a href="http://takingalongview.blogspot.com/2005/10/brave-new-world.html">Taking a Long View: Brave New
World</a>
... about 20 years ago, when I started in this refugee business, most
of my clients were from southeast asia, central america, and eastern
europe. They were fleeing bestial despotisms and casual torture. It
had a deep impact on my mind, at the time, and I frequently despaired.</p>
<p>But now, well, we get no refugees from those places anymore. While not
perfect, all those countries are doing so much better.</p>
</blockquote>
Fading history2005-10-16T00:00:00Zhttps://bannister.us/weblog/2005/fading-history
<p><a href="http://www.flickr.com/photos/dreadedhill/53041839/" title="Photo Sharing"><img src="http://static.flickr.com/31/53041839_562b898e9c_b.jpg" alt="Airship
hangers" /></a></p>
<p>Old airship hangers at the former military base in Tustin - soon to be
destroyed by developers - as seen in the distance from the hills in the
Whiting Ranch Wilderness. Unusual lighting courtesy of a rare
thunderstorm cloud to the west.</p>
Guide to DRM in Online Music2005-10-16T00:00:00Zhttps://bannister.us/weblog/2005/eff-the-customer-is-always-wrong-a-users-guide-to-drm-in-online-music
<blockquote>
<p><a href="http://www.eff.org/IP/DRM/guide/">EFF: The Customer Is Always Wrong: A User's Guide to DRM in Online
Music</a>
... in this brave new world of "authorized music services,"
law-abiding music fans often get less for their money than they did in
the old world of CDs (or at least, the world before record companies
started crippling CDs with DRM, too). Unfortunately, in an effort to
attract customers, these music services try to obscure the
restrictions they impose on you with clever marketing.</p>
</blockquote>
Dramatic light2005-10-16T00:00:00Zhttps://bannister.us/weblog/2005/dramatic-light
<p><a href="http://www.flickr.com/photos/dreadedhill/53041869/" title="Photo Sharing"><img src="http://static.flickr.com/27/53041869_00b8b36554_b.jpg" alt="Dramatic
light" /></a></p>
<p>The photo does not do justice to what the eye could see.</p>
Icelandic horses2005-10-14T00:00:00Zhttps://bannister.us/weblog/2005/icelandic-horses
<p><img src="http://static.flickr.com/28/52090493_e7ca59684b.jpg" alt="untitled" />
<a href="http://www.flickr.com/photos/rebba/52090493/">Flickr page</a></p>
<p>For my daughter.</p>
Dog hair is killing my Roomba - again!2005-10-14T00:00:00Zhttps://bannister.us/weblog/2005/dog-hair-is-killing-my-roomba-again
<p>First bought my <a href="http://irobot.com/">Roomba Discovery</a> a week or so
after this last Xmas.</p>
<p>After a bit of use the first unit had problems charging. iRobot support
sent out a new charger, then a new battery, and finally replaced the
Roomba itself. The support folks were pleasant and efficient, though I'd
rather talk to them less often.</p>
<p>The replacement Roomba ran for a couple months, then got a little too
quiet - the brushes had stopped spinning, and the unit wasn't picking up
much. This time it took a bit longer to get a replacement Roomba.</p>
<p>The second replacement Roomba lasted longer, but has started making some
very odd noises.</p>
<p>I have a dog (medium-sized dog, medium length hair) who sheds, so the
Roomba gets run a few times every day, emptied once a day, and the
brushes cleaned at least once a week. As it turns out, this isn't
enough. A few weeks ago I noticed that the bearings seemed a little
stiff, so I took off the little yellow plastic bits with the brass
bearings - and found the space behind was completely jammed with pet
hair!</p>
<p>I've not tried to disassemble the Roomba itself, but I'm guessing hair
as worked it's way into other unsealed mechanisms, and is working
similar mischief - and is the cause of the odd noises.</p>
<p>Despite all the above misadventures, I do like the job the Roomba does.
If you don't have pets (with hair) then the Roomba might well be
reasonably reliable. While I think many aspects of the Roomba design are
quite clever, the Roomba badly needs a redesign so as not to be so
easily destroyed by simple pet hair.</p>
The Physics of Extra-Terrestrial Civilizations2005-10-12T00:00:00Zhttps://bannister.us/weblog/2005/the-physics-of-extra-terrestrial-civilizations
<p>A relatively straightforward speculative article.
<a href="http://www.mkaku.org/articles/physics_of_alien_civs.shtml">The Physics of Extra-Terrestrial
Civilizations</a></p>
<p>A couple of quibbles. When you read old speculative articles they often
seems a bit quaint, as the then-current latest technology is given more
emphasis than later seems warranted.</p>
<blockquote>
<p>Paul Davies speculates that a space-faring civilization could use
nanotechnology to build miniature probes to explore the galaxy,
perhaps no bigger than your palm. Davies says, “The tiny probes I'm
talking about will be so inconspicuous that it's no surprise that we
haven't come across one. It's not the sort of thing that you're going
to trip over in your back yard. So if that is the way technology
develops, namely, smaller, faster, cheaper and if other civilizations
have gone this route, then we could be surrounded by surveillance
devices.”</p>
</blockquote>
<p>Simply put - smaller things tend to be shorter lived. Patterns printed
on silicon smear over time (very quickly in the time frames of the
article), and cosmic rays zap through smashing very small things.
Assuming no radical changes in the physics of materials, to make a small
probe long-lived you would have to make the design either enormously
redundant, self-repairing, or self-reproducing.</p>
<blockquote>
<p>Furthermore, the development of biotechnology has opened entirely new
possibilities. These probes may act as life-forms, reproducing their
genetic information, mutating and evolving at each stage of
reproduction to enhance their capabilities, and may have artificial
intelligence to accelerate their search.</p>
</blockquote>
<p>This sounds a lot like biology - in fact I do not see a distinction -
this <u>is</u> biology. In <u>very</u> short time (in these time scales)
we will have complete mastery over the design and construction of new
carbon and DNA based living things. Since we are able to do this as a
"Type 0" civilization, surely the older civilizations will be at least
as capable.</p>
<p>Put differently - perhaps we are the probes, or the products of probes.
Of course, non-carbon based life forms may be far more suitable - though
we are not nearly far enough along to make that sort of judgement.</p>
<p>Then of course there is the question of why. Why would an advanced
civilization choose to expand? Is expansion a purpose in itself? Should
it be?</p>
<p>This leads us to the speculation that some advanced civilizations will
largely lose interest in expansion at some point. Since a nearby
expansion-oriented civilization could pose a threat, we have a basis for
conflict. Conflict on this scale could absorb a great deal of energy
that might otherwise go into expansion. Perhaps some civilizations
cannot coexist peacefully with others on any basis.</p>
<p>Von Neumann probes need to be smart and adaptable. Over the scale of
galaxy-wide space stretched over thousands or millions of years, the
chance of mutation has to be considered. Could these probes turn out to
be a threat to the civilization that originated them? Could one
civilization re-purpose the probes sent out by another? Could probes
prove a threat or provocative to other civilizations - even
accidentally?</p>
<p>This all starts to look something like an ecosystem. Some may choose to
remain hidden. Some may choose strong defenses. Some may choose flight.
Some may choose aggression.</p>
<p>Perhaps enlightened older civilizations will all learn to get along in
harmony - we all like this assumption, but it is an <u>assumption</u>.
Perhaps this is not always or often possible. We simply do not know and
have no basis to judge.</p>
<p>Perhaps sending out a massive wave of probes is not a good idea. If
probes are sent out, stealth is probably a good idea. If there are
probes here or nearby, we should not expect to find them easily.</p>
Suspicious behaviour on the tube2005-10-12T00:00:00Zhttps://bannister.us/weblog/2005/suspicious-behaviour-on-the-tube
<blockquote>
<p><a href="http://www.guardian.co.uk/attackonlondon/story/0,16132,1575532,00.html">Guardian Unlimited | Special reports | Suspicious behaviour on the
tube</a>
All men are suspect, but some men are more suspect than others (with
apologies to George Orwell).</p>
</blockquote>
Never ending Atom feeds2005-10-12T00:00:00Zhttps://bannister.us/weblog/2005/never-ending-atom-feeds
<blockquote>
<p><a href="http://www.livejournal.com/users/brad/2143713.html">brad's life - Never ending feed of Atom
feeds</a>
An increasing number of companies (large and small) are really
insistent that we ping them with all blog updates, for reasons I won't
rant about.</p>
<p>Just to prove a point, I flooded a couple of them and found that sure
enough, nobody can really keep up. It's even more annoying when they
don't even support persistent HTTP connections.</p>
<p>So --- I decided to turn things on their head and make them get data
from us. If they can't keep up, it's their loss.</p>
<p>Prototype: (not its final home)**
$ telnet danga.com 8081
GET /atom-stream.xml HTTP/1.0
**</p>
<p>And enjoy the never ending XML stream of Atom feeds, each containing
one entry. And if you get more than 256k behind (not including your
TCP window size), then we start dropping entries to you and you see:</p>
<p><code><sorrytooslow youMissed="23" /></code></p>
<p>I think soon we'll get TypePad and perhaps MovableType blogs all being
sent through this. The final home will probably be on a subdomain of
sixapart.com somewhere, including documentation better than this blog
entry.</p>
<p>And yes, I'm sure my Atom syntax is bogus or something. I spent a good
2 minutes on that part of it.</p>
</blockquote>
Laura's Box of Chocolates2005-10-12T00:00:00Zhttps://bannister.us/weblog/2005/lauras-box-of-chocolates
<blockquote>
<p><a href="http://blogs.sun.com/roller/page/laurar?entry=free_parking">Laura's Box of
Chocolates</a>
Since I left my slide rule at home, I ambled away, deciding the risk
was more bearable than the headache.</p>
</blockquote>
Is Microsoft becoming Burroughs?2005-10-12T00:00:00Zhttps://bannister.us/weblog/2005/is-microsoft-becoming-burroughs
<p>In the early 1980's I worked at
<a href="http://en.wikipedia.org/wiki/Burroughs">Burroughs</a>. At the time
Burroughs was the second largest computer company in the world (behind
only IBM in size) and growing strongly. I lucked into one of the most
interesting projects in the company - working on a programmer's
workbench for mainframe programming with the user interface to run on
desktop computers.</p>
<p>In the end the experience was more educational than productive. Despite
a wealth of bright people and interesting ideas, practically none of the
software projects made it out the door. Management was the problem.
Burroughs had in the 1960's and 1970's fielded some really innovative
hardware and software. The resulting success generated a wave of growth
that carried the company through to the early 1980's. Looking back I see
that the company's revenues started to drop a year or so after I'd left.</p>
<p>I have seen similar patterns in other companies with a history of strong
growth. Strong growth means a lot of new people in management, and you
tend to end up with a lot of not-very-good management. Lots of folks
interested in avoiding risks and looking good means the company ends up
not taking the risks needed to stay competitive.</p>
<p>Reading the Bill Gates book from several years back, I got the
impression he had both terrific work experience in building Microsoft,
and very shallow experience in not ever working for anything but his own
company. Is this mixture coming back to haunt Microsoft? Windows was
Microsoft's big (and well-earned) success. Office was a substantial and
credible add-on success. Since then the incremental add-ons are
successively less inspiring.</p>
<blockquote>
<p><a href="http://www.wired.com/news/business/0,1367,69161,00.html">Wired News: Growing Up: Microsoft Turns
30</a>
If successful, such changes could help alleviate complaints that
employee productivity is being slowed by management hoops that require
too many layers of approval.</p>
</blockquote>
<p>Can we take this to mean that Microsoft is suffering from the same sort
of success/growth/management problem?</p>
How to make your neighbor's Humvee look wimpy2005-10-12T00:00:00Zhttps://bannister.us/weblog/2005/how-to-make-your-neighbors-humvee-look-wimpy
<p><img src="http://www.forceprotection.net/images/random_top/top_img_hp2.jpg" alt="movable" /> <a href="http://www.forceprotection.net/">Force Protection, Inc. - advanced ballistic and mine protected vehicles</a></p>
Medieval Times2005-10-10T00:00:00Zhttps://bannister.us/weblog/2005/medieval-times
<p>Took my son Cedric and guests to the 6pm show on October 8th in Buena
Park - at his request - for his 13th birthday. (I now officially have
two teenagers.)</p>
<p>You can order your tickets online from <a href="http://www.medievaltimes.com/">their
website</a> (a nice touch). When ordering
they hit you up for an add-on "Royalty Package".</p>
<blockquote>
<p>The <strong>Royalty Package</strong> includes preferred seating, Knights cheering
banner, souvenir DVD, and a commemorative program, for each member of
the party! Only $10 additional per person.</p>
<p></p>
</blockquote>
<p>Ordered and paid extra for the "Royalty Package" - but did not receive
any of the extra items mentioned. As to the "preferred seating", we were
seated on the next-to-topmost row in a corner under a fluorescent
light - nothing special.</p>
<p>In the performance they announced birthdays and such. My son was not
mentioned and was somewhat dissappointed. Since I did not know they were
going to do anything of the sort, I'd not asked (and did not know who to
ask) for my son's birthday to be announced.</p>
<p>Before the show you could buy bits at the gift shop, and take pictures
of the back-sides of horses. The show was fine - fake combat, bits of
play-acting, and horses performing.</p>
<p>My son and his invited friends enjoyed the outing. Clearly I am a bit
less impressed, and feel a bit ripped off.</p>
<p>If you have any sort of allergies, load up on antihistimene for before,
during, and after the event. I normally have very little trouble with
allergies, but there is something about the air in the arena that will
completely wipe you out. (They do make an effort warn you about this
ahead of time at the site, and with signs at the event).</p>
Election day - replacing Chris Cox2005-10-02T00:00:00Zhttps://bannister.us/weblog/2005/getting-ready-for-election-day
<p>Checking out the supplies and paperwork (fun) before Tuesday's election.
Noticed the roster is a bit longer In fact there are 1885 voters
listed - almost twice
<a href="https://bannister.us/weblog/2004/puzzled">last</a>
<a href="https://bannister.us/weblog/2004/working-the-polls">year</a>.
They delivered 8 voting machines (versus 5 last year). I will have 3
other poll workers versus 4 workers last year. Admittedly, the last
election was pretty easy, but this year ... we will have to see.</p>
<p>Update: Election day was <u>very</u> quiet. Only 114 voters for the
entire day, so we had very little to do. Had a mild case of bronchitis,
so I wasn't feeling too well (especially at the end of day), but the
other three poll workers scarcely needed any of my help - a good thing
:). Did the polling place setup the day before and taking down the
machines the day after.</p>
<p>Almost seems like I should leave everything up, as the next election is
in one month.</p>
... all we need is music ...2005-09-30T00:00:00Zhttps://bannister.us/weblog/2005/all-we-need-is-music
<p><img src="http://static.flickr.com/31/47807949_f12e3efaa7.jpg" alt="sneaky" /> <a href="http://www.flickr.com/photos/rebba/47807949/">what you dont know can indeed hurt you</a></p>
Secure Flight News2005-09-26T00:00:00Zhttps://bannister.us/weblog/2005/schneier-on-security-secure-flight-news
<blockquote>
<p><a href="http://www.schneier.com/blog/archives/2005/09/secure_flight_n_1.html">Schneier on Security: Secure Flight
News</a>
Remember what the no-fly list is. It's a list of people who are so
dangerous that they can't be allowed to board an airplane under any
circumstances, yet so innocent that they can't be arrested -- even
under the provisions of the PATRIOT Act.</p>
</blockquote>
China Space Mission2005-09-26T00:00:00Zhttps://bannister.us/weblog/2005/china-space-mission
<blockquote>
<p><a href="http://www.washingtonpost.com/wp-dyn/content/article/2005/09/26/AR2005092600321.html">China Space Mission Said Planned for
Oct.</a>
The military-backed space program is a major prestige project for the
communist government. China has announced plans to land an unmanned
probe on the moon by 2010 as well as operate a space station.</p>
</blockquote>
<p>While I would like to believe China has nothing but peaceful intentions,
we should not forget that a rocket capable of putting a man into orbit
is also capable of delivering a large payload of nuclear weapons
anywhere on the planet.</p>
<blockquote>
<p><a href="http://www.freep.com/news/nw/china26e_20050926.htm">China to clamp down on Web sites' news
content</a>
Online dissidents who post items critical of the government, or those
expressing opinions in chat rooms, are regularly arrested and charged
under vaguely worded national security laws.</p>
</blockquote>
<p>China is still a centrally controlled repressive regime whose aims are
unclear. This fact combined with increasing economic and military power
is at least disquieting.</p>
Jetex - random memory2005-09-19T00:00:00Zhttps://bannister.us/weblog/2005/jetex-random-memory
<p>For no obvious reason an old memory - a vivid image and smell - came to
mind along with a name "Jetex".</p>
<p>As a kid I had acquired an interest in model airplanes from my father.</p>
<p>Now this wasn't a very fulfilling hobby in dense-suburban southern
California. Lack of nearby open fields meant that models that flew well
were generally lost, and most models died in unfortunate encounters with
hard surfaces (streets, houses, power poles). Lots of time spent in
fabrication, and not much time flying...</p>
<p><img src="http://jetex.org/cja/images/motors/poster/50B-full.gif" alt="untitled" /></p>
<p>One of my more successful models was a simple balsa glider powered by a
small <a href="http://jetex.org/">Jetex</a> rocket motor. I did manage to recover
the model and make an unusual number of flights (and a few repairs).
Eventually - as with all the other successful efforts - this model too
was lost when it flew off out of sight.</p>
Insecure voting2005-09-19T00:00:00Zhttps://bannister.us/weblog/2005/insecure-voting
<p>Assuming this story is true (and I suspect that it is) then we have
further proof that secrets of a commercial sort inside the voting
process is a bad idea.</p>
<p><a href="http://www.bradblog.com/archives/00001838.htm">A DIEBOLD INSIDER
SPEAKS!"</a></p>
<p>As part of the rituals when opening the polling place (as I will do
twice in the next two months), we show the empty ballot box and
(reported) voting machine totals to the first voter in the door. All the
poll workers are required to verify and witness any totals at the end of
the day. Before the use of voting machines I was sure that any ballots
cast at my voting place were safely delivered to the central collection
(though I have no means of knowing if the collected votes were counted
accurately).</p>
<p>With the use of voting machines, I have no way of knowing if the results
reported by the machine are accurate. In fact, I suspect the results
returned by the voting machines in the polling place are accurate. If
you are able it is likely far easier to subvert the vote-counting at the
central collection point.</p>
<p>While I do believe that voting machines are a good idea, I also believe
that the process used to collect and tabulate votes <strong>must</strong> be open.
That means the software and hardware designs used in any machines that
collect <strong>must</strong> be open to inspection. Anything else invites abuse.</p>
... but wait ...2005-09-19T00:00:00Zhttps://bannister.us/weblog/2005/but-wait
<p>Something amusing in the fact that I really believe <a href="http://blogs.sun.com/roller/page/jonathan?entry=what_a_proud_team_looks">Sun has a good
story</a>,
but that my luck <a href="https://bannister.us/weblog/2005/solaris-10-attempt">trying out new
work</a> from
Sun is <a href="http://www.netbeans.org/issues/show_bug.cgi?id=57661">less than
successful</a>.</p>
<p>Not meaningful really, but .... does it have to go wrong on the first
things I try??</p>
<p>BTW - I get quite a few hits (~20-100/month - and another in today's
log) from folks searching on <a href="http://www.google.com/search?hl=en&lr=&q=solaris+cannot+find+boot.bin">"solaris cannot find
boot.bin"</a>
or the like, so it's not just me. :)</p>
mouse test2005-09-12T00:00:00Zhttps://bannister.us/weblog/2005/mouse-test
<p>Been working on a web application that tries to present a relatively
rich user interface. As a target I am aiming at the current and near/mid
future population of browsers. That means IE 6 (and later),
Mozilla/Firefox, and trying to stick as much as possible with the W3C
standards (HTML 4.01, CSS 2, Javascript 1.5). This does <strong>not</strong> mean
Netscape 4.x support, and I am not testing with Opera or Safari.</p>
<p>So far I have covered some fairly exacting layouts, resizable dialogs
(with layout changes), Java/Javascript integration, tooltips, and other
interesting bits, all without explicit browser detection, using fairly
minimal, clean, largely standards-compliant code.</p>
<p>In the process of implementing drag and drop, I got hung up trying to
make some sort of coherent sense of mouse tracking. In fact I already
had code that worked (derived from various samples on the net), or at
least seemed to work, but ... I am not at all sure that this indeed
covers all cases.</p>
<p>Put up <a href="http://www.bannister.us/examples/mouse/track.html">an example
page</a> with mouse
tracking over a variety of positioned elements.</p>
<p>The core bit of code is pretty simple.</p>
<p>document.onmousemove = function(e) {
e = e || event
var o = e.srcElement || e.target
var x = e.clientX
var y = e.clientY
while (null != o.scrollTop) {
x += o.scrollLeft
y += o.scrollTop
o = o.parentNode
}
window.track.style.left = x + "px"
window.track.style.top = y + "px"
}</p>
<p>This code seems to work correctly with IE6 and Firefox. It would be nice
to know if this code works in Safari and Opera. It would be useful to
know if there are cases were this code does not work.</p>
Betty Boop in color2005-09-12T00:00:00Zhttps://bannister.us/weblog/2005/betty-boop-in-color-google-video
<p><a href="http://video.google.com/videopreviewbigall?q=&page=1&docid=-6235339630378464744&urlcreated=1126582592#"><img src="http://video.google.com/ThumbnailServer?contentid=d8e0b4ae979ebf01&second=120&itag=w320&urlcreated=1126582592&sigh=Fnrf9ULe2Nx_iVODShL1u0MvM78" alt="boop" /></a>
Found via Google Video.</p>
Inequality and Risk2005-09-07T00:00:00Zhttps://bannister.us/weblog/2005/inequality-and-risk
<p><a href="http://www.paulgraham.com/inequality.html">Inequality and Risk</a></p>
<p>Other spins ...</p>
<p>Instead of "confiscate", use "cost of doing business". Set the baseline
(minimum standards for available education, housing, health,
retirement), and tax only above the baseline. Taxes are (or should be)
simply a "fair share" of the costs of running the country, instead of a
seemingly arbitrary amount.</p>
<p>Better yet, make the tax rate float based on the expenditures of the
government. Bet that would knock down excess spending in a hurry - when
increased spending showed up in next year's tax bill. The decoupling
between tax rates and spending allows politicians to "pass the buck" to
later generations. Remove the decoupling, and you can bet politicians
are going to be very careful about spending (and annoying voters).</p>
<p>As to risk and reward, if you lessen the risk, you don't need as big a
reward, or as big a chance of success. When Bill Gates started Microsoft
he was running at zero risk. When Gates started Microsoft his biggest
worry was that he might have to borrow money from his father (who had
plenty). That's not much of a risk, and you have to count Microsoft as a
success story.</p>
Which "everybody"?2005-09-05T00:00:00Zhttps://bannister.us/weblog/2005/which-everybody
<p>On why the current Bush reversed his father's(!) decision and turned
wetlands over to developers - wetlands that could have reduced the
impact of a hurricane on New Orleans.</p>
<blockquote>
<p><a href="http://www.guardian.co.uk/katrina/story/0,16441,1561356,00.html#article_continue">Katrina comes home to
roost</a>
The chairman of the White House's council on environmental quality
dismissed the study as "highly questionable", and boasted: "Everybody
loves what we're doing."</p>
</blockquote>
<p>Welcome to <a href="https://bannister.us/weblog/2004/welcome-to-jim-taggarts-cocktail-party">Jim Taggart's cocktail
party</a>
in the White House.</p>
LRF replacements2005-09-04T00:00:00Zhttps://bannister.us/weblog/2005/lrf-replacements
<p>Today I found the you can use the glue from a small hot glue gun to make
<a href="http://en.wikipedia.org/wiki/Little_Rubber_Feet">LRF</a> replacements.</p>
<p>In fact I was trying to re-attach the two remaining LRF's (two are lost)
but they would not stick to the glue - when I realised the glue by
itself was a suitable replacement :).</p>
<p>On the other hand, if you are trying to justify the purchase of a new
notebook - as my sister has rationalized the purchase of a new car - you
can just ignore this little tip.</p>
Ancient browser2005-09-04T00:00:00Zhttps://bannister.us/weblog/2005/ancient-browser
<blockquote>
<p><a href="http://www.tbray.org/ongoing/When/200x/2005/09/04/Museum-Piece">Museum piece</a></p>
<p><img src="http://www.tbray.org/ongoing/When/200x/2005/09/04/-big/IMGP2620.jpg" alt="scary" />
Doubtless the terror of its ecosystem, in its day.</p>
</blockquote>
Turing test2005-09-03T00:00:00Zhttps://bannister.us/weblog/2005/turing-test
<p>Did she (or it) <a href="http://en.wikipedia.org/wiki/Turing_test">pass the
test</a>?</p>
<blockquote>
<p>pbannister (9/3/2005 9:24:14 PM): Hello ... do I know you?
lilyno501 (9/3/2005 9:24:35 PM): difinately
pbannister (9/3/2005 9:24:57 PM): lol - oh, ok
lilyno501 (9/3/2005 9:25:52 PM): so how are u doin today
lilyno501 (9/3/2005 9:25:58 PM): its bein a while
lilyno501 (9/3/2005 9:26:07 PM): since we chated ok
pbannister (9/3/2005 9:26:30 PM): Apparently. I am going fine. How
are you doing?
lilyno501 (9/3/2005 9:26:45 PM): im very well ty
lilyno501 (9/3/2005 9:26:58 PM): how was day today
pbannister (9/3/2005 9:28:10 PM): Busy - to a point - then took a nap
(was behind on sleep from completing a project).
lilyno501 (9/3/2005 9:28:31 PM): oh ok
lilyno501 (9/3/2005 9:28:35 PM): ths nice
pbannister (9/3/2005 9:28:52 PM): So where are you at?
lilyno501 (9/3/2005 9:29:25 PM): am from san jose
lilyno501 (9/3/2005 9:29:31 PM): what about u
pbannister (9/3/2005 9:30:13 PM): Oh, the information on my profile
is all accurate (last I looked). I live in southern California.
lilyno501 (9/3/2005 9:30:28 PM): cool
pbannister (9/3/2005 9:30:43 PM): Nice smell of sage blowing in the
window from the hills just now.
lilyno501 (9/3/2005 9:31:36 PM): where part in southern cali
pbannister (9/3/2005 9:31:54 PM): Foothill Ranch - south Orange
County.
lilyno501 (9/3/2005 9:32:06 PM): ok
lilyno501 (9/3/2005 9:32:18 PM): what ur name
pbannister (9/3/2005 9:32:49 PM): lol - I thought you said we chatted
before?
lilyno501 (9/3/2005 9:33:20 PM): of course we hav but i hav forgotten
ur name ok
lilyno501 (9/3/2005 9:33:40 PM): u knw its bein awhile since we dsid
cht
lilyno501 (9/3/2005 9:33:51 PM): so tell me
pbannister (9/3/2005 9:34:38 PM): My name is Preston. My personal
website is at http://bannister.us/
lilyno501 (9/3/2005 9:35:24 PM): cool nice name
pbannister (9/3/2005 9:36:01 PM): So why are you stalking random guys
on IM?
lilyno501 (9/3/2005 9:36:26 PM): am lilian by name
lilyno501 (9/3/2005 9:36:56 PM): urs?
pbannister (9/3/2005 9:37:25 PM): So what do you do for a living
Lillian?
lilyno501 (9/3/2005 9:38:44 PM): i deal with fibric
pbannister (9/3/2005 9:39:11 PM): How is the weather up there in San
Jose?
lilyno501 (9/3/2005 9:40:03 PM): not bad
lilyno501 (9/3/2005 9:40:12 PM): ur?
pbannister (9/3/2005 9:40:47 PM): You don't have a friend named
Eliza, do you?
lilyno501 (9/3/2005 9:41:18 PM): nope
lilyno501 (9/3/2005 9:41:23 PM): why
pbannister (9/3/2005 9:41:50 PM): Oh I dunno - something about the
style of conversation.
lilyno501 (9/3/2005 9:42:09 PM): oh really
pbannister (9/3/2005 9:42:23 PM): yep!
lilyno501 (9/3/2005 9:42:25 PM): well i don knw any tht bears tht
name ok
pbannister (9/3/2005 9:43:31 PM): Just what do you do with fabric?
lilyno501 (9/3/2005 9:44:22 PM): i import african textile
lilyno501 (9/3/2005 9:44:37 PM): and beside i travel alot
pbannister (9/3/2005 9:44:52 PM): Oh really? Sounds interesting. Do
you enjoy this?
lilyno501 (9/3/2005 9:45:17 PM): yes
lilyno501 (9/3/2005 9:45:32 PM): and u what do u do
pbannister (9/3/2005 9:46:27 PM): I write software, mainly. Where in
Africa do you end up?
lilyno501 (9/3/2005 9:47:04 PM): south africa
pbannister (9/3/2005 9:47:43 PM): Yikes. Had a friend get back from
there earlier this year.
lilyno501 (9/3/2005 9:48:02 PM): ok
pbannister (9/3/2005 9:48:27 PM): Apparently SA is a dangerous
place.
lilyno501 (9/3/2005 9:48:59 PM): not as u think
pbannister (9/3/2005 9:49:37 PM): Did you ride on any of the
mini-buses?
lilyno501 (9/3/2005 9:50:04 PM): what do u mean by that
pbannister (9/3/2005 9:51:18 PM): Some ex-pat SA folks were sending
around jokes about minibus drivers.
lilyno501 (9/3/2005 9:51:36 PM): ok
pbannister (9/3/2005 9:52:14 PM): My friend went to extract his
parents, who were getting quite old and infirm, and needed more family
support.
lilyno501 (9/3/2005 9:53:08 PM): ok
pbannister (9/3/2005 9:53:30 PM): So would you consider living
there?
lilyno501 (9/3/2005 9:54:10 PM): is too hot there
pbannister (9/3/2005 9:54:22 PM): Which part?
lilyno501 (9/3/2005 9:54:23 PM): here
lilyno501 (9/3/2005 9:54:36 PM): san jose
lilyno501 (9/3/2005 9:54:45 PM): u married
lilyno501 (9/3/2005 9:55:02 PM): what do u like for fun
pbannister (9/3/2005 9:55:20 PM): Nope - not any longer.
pbannister (9/3/2005 9:55:30 PM): Fun - what's that?
lilyno501 (9/3/2005 9:56:19 PM): what u do fun like
lilyno501 (9/3/2005 9:56:26 PM): swiming
lilyno501 (9/3/2005 9:56:30 PM): dancing
pbannister (9/3/2005 9:57:05 PM): Just curious - where did you grow
up?
lilyno501 (9/3/2005 9:58:18 PM): am mixed
pbannister (9/3/2005 9:58:47 PM): Mixed?
lilyno501 (9/3/2005 9:59:30 PM): yea
pbannister (9/3/2005 9:59:57 PM): Mixed in where you grew up, or
something else?
lilyno501 (9/3/2005 10:01:11 PM): my late father is from san jose
lilyno501 (9/3/2005 10:01:49 PM): and my mom from south africa
lilyno501 (9/3/2005 10:02:05 PM): are u ther
pbannister (9/3/2005 10:02:10 PM): Yep
lilyno501 (9/3/2005 10:03:03 PM): u stay alone
pbannister (9/3/2005 10:03:20 PM): There is quite a split. How did it
make a difference for you?
pbannister (9/3/2005 10:03:30 PM): Nope, I have kids.
lilyno501 (9/3/2005 10:03:58 PM): how many kids do u have
pbannister (9/3/2005 10:05:00 PM): three - two boys, one precocious
little girl.
lilyno501 (9/3/2005 10:05:17 PM): ok
lilyno501 (9/3/2005 10:05:35 PM): how old her they
pbannister (9/3/2005 10:06:13 PM): 16, 12, and 9 (at least this
month)
lilyno501 (9/3/2005 10:06:30 PM): ok
pbannister (9/3/2005 10:06:56 PM): How old are you? Any kids?
lilyno501 (9/3/2005 10:07:22 PM): 29
lilyno501 (9/3/2005 10:07:33 PM): i have no kid yet
lilyno501 (9/3/2005 10:07:45 PM): am still single
pbannister (9/3/2005 10:08:10 PM): You want to have kids?
lilyno501 (9/3/2005 10:08:31 PM): yes
lilyno501 (9/3/2005 10:08:44 PM): in will like to have kids
pbannister (9/3/2005 10:09:09 PM): Did you go to school in San Jose?
lilyno501 (9/3/2005 10:09:56 PM): no
pbannister (9/3/2005 10:10:36 PM): How did you get started in your
current line of work?
lilyno501 (9/3/2005 10:12:59 PM): i was in to textile before ok i
join the textile industries ok
lilyno501 (9/3/2005 10:13:38 PM): that the kind of business my mom
did
pbannister (9/3/2005 10:14:08 PM): Your mom was into imports from
SA?
pbannister (9/3/2005 10:14:51 PM): That must have been difficult at
times - was there not a restriction on imports for a time?
lilyno501 (9/3/2005 10:15:08 PM): i told u she from africa
pbannister (9/3/2005 10:16:01 PM): How is your mother doing?
lilyno501 (9/3/2005 10:16:14 PM): fine
pbannister (9/3/2005 10:17:02 PM): Is she still in the business?
lilyno501 (9/3/2005 10:17:28 PM): no
lilyno501 (9/3/2005 10:17:49 PM): she geting older now
pbannister (9/3/2005 10:18:11 PM): So you ended up taking over her
business?
lilyno501 (9/3/2005 10:18:55 PM): i inherited it from my mom
pbannister (9/3/2005 10:19:36 PM): Did she teach you the business, or
did you learn on your own?
lilyno501 (9/3/2005 10:20:26 PM): i learnt it from her
pbannister (9/3/2005 10:20:56 PM): Sounds nice. You travelled with
her before?
lilyno501 (9/3/2005 10:21:42 PM): yes
lilyno501 (9/3/2005 10:22:10 PM): mostly to asia
pbannister (9/3/2005 10:22:38 PM): Asia? Wait - I thought Africa was
the other direction
lilyno501 (9/3/2005 10:24:02 PM): mostly asia and africa
pbannister (9/3/2005 10:24:22 PM): What are your favorite places to
visit?
lilyno501 (9/3/2005 10:24:59 PM): africa
pbannister (9/3/2005 10:25:39 PM): SA or other places?
lilyno501 (9/3/2005 10:26:43 PM): oh ok
pbannister (9/3/2005 10:26:54 PM): ??
lilyno501 (9/3/2005 10:27:07 PM): i move down to other places
pbannister (9/3/2005 10:28:31 PM): Have you travelled around SA much,
or elsewhere in Africa?
lilyno501 (9/3/2005 10:29:48 PM): mostly in africa
pbannister (9/3/2005 10:29:51 PM): Have you ever failed a Turing
test?
lilyno501 (9/3/2005 10:30:12 PM): how do u mean
pbannister (9/3/2005 10:30:57 PM): So what exactly is it that you do
with fabrics and textiles?</p>
</blockquote>
<p>... no further response ...</p>
<p>Every more-complex question I posed got a least-complex response. I
cannot tell if the other end is a human or a warmed-over version of
<a href="http://en.wikipedia.org/wiki/Eliza">Eliza</a>. The poor spelling suggests
a human - but this could be easily simulated. Does this mean a program
passed the Turing test, or does it mean a human failed?</p>
Setting up a new/old car2005-09-03T00:00:00Zhttps://bannister.us/weblog/2005/setting-up-a-newold-car
<p>Bought a 1998 Dodge Grand Caravan LXi (leaving about $20K more in my
bank account over buying a new car). Having a mechanic you trust changes
the equation wonderfully. Took the newly acquired vehicle into his shop,
asked him to do whatever he thought it needed, and call me when done.
When done his bill was less than I'd expected.</p>
<p>The car came with a decent stereo - but no way to play MP3's (not so odd
for 1998). What I wanted to do was retain the original stereo's "head
unit", but somehow add the ability to play my entire MP3 collection
(12.6GB at present) - all of which is music I bought, BTW. This is too
much to fit even on a DVD, so some sort of hard disk based storage is
needed. Given that the existing stereo is capable of controlling an
external CD-changer, it seemed at least possible to find some sort of
lash-up for an external MP3 player.</p>
<p>Wanted to retain the manufacturer-installed unit as most (all?) of the
after-market units look really "cool", but have a lousy user interface.
When you are driving down a busy road at night, you want to keep your
eyes on the road. The manufacturer-installed unit is better designed in
this regard. Most adjustments can be performed by feel, without your
eyes leaving the road. After-market units are generally not as well
designed in this regard.</p>
<p>Turns out the solution that both makes sense and is most widely
supported is to buy an Apple iPod and an adapter kit to connect the iPod
to your existing car stereo.</p>
<p>Went to three different big local electronics retailers. This is where
things started to go wrong. Two of the local "experts" claimed what I
wanted was not possible. One said it was going to cost at least $500
<strong>in addition</strong> to the cost of buying an iPod, and would take an entire
day to install.</p>
<p>Went back home and started digging around the Internet looking for
better information. Eventually came across the excellent <a href="http://www.crutchfieldadvisor.com/learningcenter/car/ipod/shorttake_video_car.html?movie=ipod_car&format=mov">Crutchfield
site</a>.
Crutchfield got my business by offering more clear and useful
information than others I had visited.</p>
<p>Ordered an iPod from the Apple store, and the install kit from
Crutchfield. Will see if this all will actually work...</p>
Domino theory - Microsoft and standard document formats2005-09-03T00:00:00Zhttps://bannister.us/weblog/2005/domino-theory-microsoft-and-standard-document-formats
<p>This is all so painfully predictable...</p>
<p>The state's point of view is perfectly reasonable. Long-lived public
documents should not be in proprietary formats. There now exists a
functional, clearly defined standard for the most common office
documents. There is one excellent implementation
(OpenOffice/StarOffice). Pragmatically this is an excellent time for the
state to push for standard formats.</p>
<p>Microsoft's point of view - at least on the marketing/sales side - is
perfectly understandable. As long as customers feel locked in by
proprietary formats, Microsoft stands a better chance of maintaining
their dominance in the market.</p>
<blockquote>
<p><a href="http://informationweek.com/story/showArticle.jhtml?articleID=170700325">Microsoft Blasts Massachusetts' New XML Policy > September 2,
2005</a>
While any company can adopt the royalty free standard, Microsoft will
not support OpenDocument in its next version of Office 12 because it
is an inferior file format and is not compatible with older versions
of Office, one Microsoft executive said this week after the report was
released. Office 12 is due next year.</p>
<p>"No," said Alan Yates, general manager of Microsoft's Information
Worker Business Strategy, when asked by CRN about the potential for
Office to support OpenDocument. "The Office "12" formats pay special
attention to compatibility with older document versions, [and] other
formats do not concern themselves with this important issue," Yates
said.</p>
<p>Further, he added, "this proposal acknowledges that Open Document does
not address pictures, audio, video, charts, maps, voice,
voice-over-IP, and other kinds of data our customers are increasingly
putting in documents and archiving."</p>
</blockquote>
<p>If you look at things from <strong>just the right point of view</strong> the
statement from the Microsoft guy is (strictly speaking) correct. Looked
at on a practical basis, the statement is completely irrelevant. The
vast, overwhelming majority of office documents - probably well over
99% - are only very simply formatted, and the OASIS standard is more
than adequate. So on a pragmatic basis - moving to the standard format
will cause only minor and temporary discomfort for users.</p>
<p>In addition the amount of work needed by Microsoft to support reading
and writing of the standard formats is very small. There are <strong>no</strong>
significant technical obstacles. Once motivated, Microsoft could put out
an update with support for standard formats inside a month or two.</p>
<blockquote>
<p>If the state dropped Word and Excel, it would impact many VARs and
solutionproviders in the Bay state. "It's an interesting issue, and
we'd definitely have to add OpenDocument formatting to our regular
business processes," said Mike Healey, president of TENCorp, a VAR in
Needham, Mass. that does business with local governments and schools.
"We, like everyone else, just use Microsoft or PDF formatting. "</p>
</blockquote>
<p>This - of course - cuts to the heart of the matter. The dominos just
might start falling....</p>
Questions - Hurricane Katrina and New Orleans2005-08-31T00:00:00Zhttps://bannister.us/weblog/2005/questions-hurricane-katrina-and-new-orleans
<blockquote>
<p><a href="http://en.wikipedia.org/wiki/Effect_of_Hurricane_Katrina_on_New_Orleans">Effect of Hurricane Katrina on New
Orleans</a></p>
<p><img src="http://upload.wikimedia.org/wikipedia/en/8/8d/New_Orleans_Levee_System.gif" alt="untitled" /></p>
</blockquote>
<p>Much of New Orleans is below sea level. The Mississippi river is on one
side of the city, and Lake Pontchartrain on another - and both are
higher than sea level.</p>
<p>I don't get it. Why build any part of a city below the level of nearby
bodies of water? Apparently there is a shortage of higher ground? Is it
<strong>responsible</strong> for the local authorities to allow new construction?</p>
<p>Are they planning on re-building the flooded areas? Are we going to
spend federal money to do this?</p>
<p><strong>Why?</strong></p>
Semi-weekly hike2005-08-30T00:00:00Zhttps://bannister.us/weblog/2005/semi-weekly-hike
<p><a href="http://www.sueandpaul.com/gmapPedometer/?centerX=-117.6650333404541&centerY=33.68160393576117&zl=2&fl=h-e-s-235-1&polyline=ilqlEtmdmUmVm%5BkHgJ%7BRoBoGuL%7BEiKb@gBs%5DoNyHmEmAsGuAeEtAoCUmHjBgFjDaDhBNfC_Gi@iC%60BwBnAh@%5DnIsA%7CEGr@jBkAh@aGtEiC%3FnBxBGxBhDxNvEnEYZtAbBeAxHOuAkDtCQrHxBjFeAfMfMtCk@fIxFrNnFxSxGbDbDhDtL%5BxGyDtH%7DIhK%7DIfMuEdMsLxNgG%60C">Route of my local hike through Whiting Ranch (over Dreaded Hill) - a
bit over 5.5 miles,
apparently.</a></p>
<p>The trail zigs a bit more that the traced route, so the real mileage is
likely a shade higher. Have yet to find a biker with an odometer who has
been over the same route.</p>
Oops in Buffalo2005-08-30T00:00:00Zhttps://bannister.us/weblog/2005/oops-in-buffalo
<p>Apparently if you are school trying to make your way into the
<a href="http://www.top500.org/">Top500</a> you had better first check that you
have enough power (electricity) <a href="http://blogs.sun.com/roller/comments/marchamilton?anchor=buffalo_power">as Buffalo belatedly
discovered</a>.</p>
Mom's art2005-08-29T00:00:00Zhttps://bannister.us/weblog/2005/moms-art
<p><a href="http://www.flickr.com/photos/dreadedhill/38356163/" title="Photo Sharing"><img src="http://photos26.flickr.com/38356163_3d6458f583_t.jpg" alt="DSC00907" /></a><a href="http://www.flickr.com/photos/dreadedhill/38352311/" title="Photo Sharing"><img src="http://photos22.flickr.com/38352311_608ebd356e_t.jpg" alt="DSC00890" /></a><a href="http://www.flickr.com/photos/dreadedhill/38351824/" title="Photo Sharing"><img src="http://photos31.flickr.com/38351824_73cbd7856b_t.jpg" alt="DSC00889" /></a><a href="http://www.flickr.com/photos/dreadedhill/38351620/" title="Photo Sharing"><img src="http://photos25.flickr.com/38351620_1bfc94b6b3_t.jpg" alt="DSC00888" /></a><a href="http://www.flickr.com/photos/dreadedhill/38351397/" title="Photo Sharing"><img src="http://photos21.flickr.com/38351397_f5eb9e89f3_t.jpg" alt="DSC00887" /></a><a href="http://www.flickr.com/photos/dreadedhill/38342408/" title="Photo Sharing"><img src="http://photos29.flickr.com/38342408_515aa65454_t.jpg" alt="DSC00972" /></a>
<a href="http://www.flickr.com/photos/dreadedhill/tags/momspictures/">mom's
art</a></p>
Credit where due - to Microsoft2005-08-29T00:00:00Zhttps://bannister.us/weblog/2005/credit-where-due-to-microsoft
<p>This announcement is notable in that Microsoft's active contribution was
key to the arrests. This is a good thing. Doubtless (and predictably)
Microsoft will be criticised for taking so long to become proactive.
Delayed or not, this does not by any means take away from the
significance of this announcement. Microsoft has the resources, skill,
and interest in assuring the security of Windows products and protecting
Windows customers. This is the first public mention I have seen of
Microsoft playing a primary role in this sort of investigation.</p>
<blockquote>
<p><a href="http://www.nbr.co.nz/print/print.asp?id=12777&cid=3&cname=Technology">Zoteb worm writers
arrested</a>
Brad Smith, senior vice president and general counsel at Microsoft,
said the company’s ongoing partnerships with global law-enforcement
authorities help ensure that when malicious code such as Zotob and
Mytob is released, that information is shared rapidly to help law
enforcement identify and hold cybercriminals accountable for their
actions and help protect customers.</p>
<p>“We congratulate the Turkish and Moroccan authorities and the FBI for
finding and apprehending the alleged authors and distributors of the
Zotob and Mytob worms so quickly,” Mr Smith said.</p>
<p>“This arrest demonstrates the value of public-private collaboration —
the first-class investigative work by the authorities and
round-the-clock technical and investigative support provided by our
Internet Crime Investigations Team here at Microsoft. The results show
clearly that cybercriminals will be identified, apprehended and held
accountable for their actions.”</p>
<p>Microsoft’s Internet Crime Investigations Team supported the
investigation with law enforcement immediately following the release
of the two worms, the company said, by providing technical information
and analytical support to the FBI, which was then shared with Moroccan
and Turkish authorities.</p>
</blockquote>
<p>Credit is due to Microsoft for doing the right thing - and at least in
this case - doing it effectively. Hopefully this is the first of many
such announcements - one for every such threat launched against Windows.</p>
Apples2005-08-29T00:00:00Zhttps://bannister.us/weblog/2005/apples
<p><img src="http://photos21.flickr.com/32296281_f241cc41fe.jpg?v=0" alt="apples" /><img src="http://photos21.flickr.com/32452195_158788170a.jpg?v=0" alt="apples" />
<a href="http://www.flickr.com/photos/rebba/32452195/in/set-580093/">From virgin on Flickr</a></p>
Real and unreal threats2005-08-28T00:00:00Zhttps://bannister.us/weblog/2005/real-and-unreal-threats
<p>Via <a href="http://www.schneier.com/blog/archives/2005/08/peggy_noonan_an.html">Schneier on Security: Peggy Noonan and Movie-Plot Terrorist
Threats</a>.</p>
<blockquote>
<p><a href="http://www.opinionjournal.com/columnists/pnoonan/?id=110007154">Peggy Noonan - Think Dark - Don't close those military bases. We may
need them someday
soon.</a>
Among the things we may face over the next decade, as we all know, is
another terrorist attack on American soil. But let's imagine the next
one has many targets, is brilliantly planned and coordinated. Imagine
that there are already 100 serious terror cells in the U.S., two per
state. The members of each cell have been coming over, many but not
all crossing our borders, for five years. They're working jobs, living
lives, quietly planning.</p>
<p>Imagine they're planning that on the same day in the not-so-distant
future, they will set off nuclear suitcase bombs in six American
cities, including Washington, which will take the heaviest hit.
Hundreds of thousands may die; millions will be endangered. Lines will
go down, and to make it worse the terrorists will at the same time
execute the cyberattack of all cyberattacks, causing massive
communications failure and confusion. There will be no electricity;
switching and generating stations will also have been targeted. There
will be no word from Washington; the extent of the national damage
will be as unknown as the extent of local damage is clear. Daily
living will become very difficult, and for months--food shortages,
fuel shortages.</p>
</blockquote>
<p>In the incredibly elaborate scenario offered, I suspect our
much-maligned intelligence community would get clued in long before
anything so complicated could be realised.</p>
<p>The amount of damage <strong>on a national scale</strong> from such an attack would
be insignificant. Certainly six small nuclear devices would cause a lot
of local damage. This is a <strong>big</strong> country, and as a percentage the
portion of country's infrastructure damaged would probably be some
fraction of 1%. Doubtless as a country we would be pissed (and likely go
out and flatten another small country). Otherwise the vast majority of
the country would be materially uneffected, and would see little change
in day-to-day activity.</p>
<p>Along a similar line, we had a lesson a few years back when the
<a href="http://www.data.scec.org/chrono_index/northreq.html">Northridge
earthquake</a>
occurred within the greater Los Angeles area. For decades California was
dreading the "next big one", largely from memory of the <a href="http://quake.wr.usgs.gov/info/1906/">1906 earthquake
in San Francisco</a>. What should have
been obvious is that <em>earthquakes are local events</em>. A big earthquake
can pretty much wipe out a small city - and back in 1906 San Francisco
was much smaller. A big or moderate earthquake can do <a href="http://www.olympus.net/personal/gofamily/quake/2003quakes.html">a lot of
damage</a>
when structures fall down easily (not building with earthquakes in
mind). But when your city is spread out over a large area, and the
structures are built to withstand earthquakes, the amount of damage from
any one earthquake is limited.</p>
<blockquote>
<p>Let's make it worse. On top of all that, on the day of the suitcase
nukings, a half dozen designated cells will rise up and assassinate
national, state and local leaders. There will be chaos, disorder,
widespread want; law-enforcement personnel, or what remains of them,
will be overwhelmed and outmatched.</p>
<p>Impossibly grim? No, just grim. Novelistic? Sure. But if you'd been a
novelist on Sept. 10, 2001, and dreamed up a plot in which two huge
skyscrapers were leveled, the Pentagon was hit, and the wife of the
solicitor general of the United States was desperately phoning him
from a commercial jet that had been turned into a missile, you would
have been writing something wild and improbable that nonetheless
happened a day later.</p>
</blockquote>
<p>First, I think the airliner-as-bomb notion came up in one of our random
late-night discussions in college (about 1980), and I believe was not
original then. At the time I was surprised at the lack of imagination
shown by "terrorists". A half-dozen imaginative
physics/chemistry/engineering undergrads can come up with quite a few
workable ideas for causing mayhem in a single night.</p>
<p>When twenty years later some terrorists flew a couple airliners into a
couple skyscrapers, I found nothing "wild and improbable" about the
event (more like "so it finally happened"). Clearly "terrorists" had
become some combination of smarter, better organized, and/or better
funded - which is certainly something worth focus.</p>
<p>Second, if we lost a few or several dozen politicians ... the government
is not going to come crashing down. (Ignoring the obvious joke about
fewer lawyers and politicians).</p>
<p>There is one area of concern she did not mention. Having the majority of
the federal government is in a <strong>single city</strong> (Washington D.C.) made a
lot of sense back in the horse-and-buggy days. Since the advent of
nuclear weapons this represents a vulnerability. Since the widespread
availability of the Internet, this vulnerability is inexcusable. A
couple small nuclear devices could wipe out Congress, the President, and
the headquarters of a several federal agencies. A single large nuclear
device could obliterate the entire city. We should <strong>not</strong> locate more
than a small fraction of the government in any single city.</p>
<blockquote>
<p>And all this of course is just one scenario. The madman who runs North
Korea could launch a missile attack on the United States tomorrow,
etc. There are limitless possibilities for terrible trouble.</p>
</blockquote>
<p>( [sigh] ... I wonder if Peggy could even <em>find</em> North Korea on a map.
I'm guessing she hasn't a clue about the technologies involved ... )</p>
<p>The most likely result of North Korea launching an almost-untested
missile toward the United States would be a few scared fish lost
somewhere in the Pacific Ocean. It takes fancy technology and practice
to make ballistic missiles accurate at intercontinental distances. The
missile is more likely to hit somewhere in China than anywhere in the
US. If by incredible luck the missile made it to US soil, odds are it
would not land anywhere near large numbers of people. This is a very big
country with lots of empty space.</p>
<blockquote>
<p>So we are imagining America being forced to fight for its survival on
its streets. How does this get us to base closings? On the day the big
terrible thing happens there will of course be shock and chaos. People
will feel the need for protection--for the feeling of protection and
for the thing itself. They will want and need American troops nearby
and they will want and need American military bases up and operating
to help maintain some semblance of order. The very presence, the very
fact of these bases will help in the big recovery.</p>
<p>That's what all these bases are going to be needed for. To help us
survive a very bad time.</p>
</blockquote>
<p>Our military has proven superbe in facing an external enemy in an armed
conflict. This is a very different task than keeping civil order or
rebuilding an economy (assuming the imagined damage really was
significant). An organization excellent at one purpose may be nearly
ineffective for an entirely different purpose. There is no reason to
believe that more military bases would be helpful.</p>
<p>If you want to make a difference in some imaged future dark day -
decentralize! Large centralized cities and organizations as potential
targets give any enemy the greatest possible bang for the buck. Our most
effective and simplest defense is simple distance - a resource we have
in abundance. With efficient transport, communication, and the Internet,
distance no longer presents any difficulty for government of economic
organizations.</p>
Evangelical Scientists Refute Gravity With New 'Intelligent Falling' Theory2005-08-27T00:00:00Zhttps://bannister.us/weblog/2005/evangelical-scientists-refute-gravity-with-new-intelligent-falling-theory
<p><a href="http://www.theonion.com/news/index.php?issue=4133&n=2">Evangelical Scientists Refute Gravity With New 'Intelligent Falling'
Theory</a></p>
The Family Research Council wants to make porn harder to block2005-08-26T00:00:00Zhttps://bannister.us/weblog/2005/the-family-research-council-wants-to-make-porn-harder-to-block
<p>I am having a very hard time coming up the moderate language to describe
this topic...</p>
<p>There is a proposal to ICANN to create a .XXX TLD for the internet. The
.XXX domain seemed close to becoming a reality, when politics reared
it's ugly [brainless] head.</p>
<p>Let me make my point of view very clear. I have three kids - all with
computers. Right now blocking porn sites is essentially impossible. The
very first thing I will do if the .XXX domain becomes real is to
instruct my network router to block all .XXX sites. I do not expect this
will block everything - but I do expect that it will eventually help
quite a lot.</p>
<p>Now I hear that the Family Research Council wants to <a href="https://www.frc.org/get.cfm?i=AL05H04&v=PRINT">kill the .xxx
Domain</a>. The FRC issued a
press release back in June voicing their <a href="http://www.frc.org/get.cfm?i=PR05F01&v=PRINT">Opposition to '.xxx' Domain
Name</a> including a
statement from Patrick Trueman (FRC's senior legal counsel and former
chief of the U.S. Department of Justice's Child Exploitation and
Obscenity Section [and apparently a brain donor]).</p>
<blockquote>
<p>The new domain would do more harm than good. The '.com' domain has
been a cash cow for the porn industry and pornographers will not give
it up and remove themselves to the '.xxx' domain. Instead, they will
populate the '.xxx' domain and perhaps double the number of porn sites
available on the Web.</p>
<p>The '.xxx' domain also cloaks the porn industry with legitimacy. The
industry will have a place at the table in developing and maintaining
their new property.</p>
<p>Creating a virtual red light district may also discourage law
enforcement from bringing obscenity cases on the notion that the
problem is solved.</p>
</blockquote>
<p>[ ... what a pack of idiots ... ]</p>
<p>I am very disappointed to find the FRC making it <strong>harder</strong> to filter
out porn. That is the one and only result in opposing the .XXX domain.</p>
<p>Yes - adding the .XXX domain <strong>will</strong> increase the number of names used
by porn outfits on the internet, and Yes - the porn operations are
unlikely to give up their current .COM and other names. This part does
not matter, as changing the (huge) number of names will not make their
business any larger. Porn sites are already
<strong><a href="http://search.yahoo.com/search?p=hardcore+sex&prssweb=Search&ei=UTF-8&fr=FP-tab-web-t&fl=1&vl=lang_en&x=wrt&meta=vl%3Dlang_en">extremely</a>
<a href="http://www.google.com/search?hl=en&lr=&safe=off&c2coff=1&q=hardcore+sex&btnG=Search">easy</a></strong>
to
<a href="http://www.google.com/search?hl=en&lr=&safe=off&c2coff=1&q=hopefully+you+get+the+idea+by+now...&btnG=Search">find</a>,
so adding .XXX domains will make essentially no difference in that
respect. The number of porn businesses and the amount of money they
collect will change very little, if at all.</p>
<p>There are two factors in our favor. First, porn sites are interested in
folks with credit cards - not in kids who cannot pay. Second, porn sites
are a little bit worried about the law - just enough to <strong>move</strong> most of
their content to .XXX names. This means their .COM names would become a
front door, and once through the door you would get sent to their .XXX
site.</p>
<p>I care very little about porn sites with plain (or at least plainer)
front doors in the .COM domain - if I can block all the nasty stuff in
the .XXX domain.</p>
<p>... then there is the other aspect to this sideshow. The "Patrick
Trueman" whose name is publically associated with this misadventure is
in my considered opinion either:</p>
<ul>
<li><strong>a fool</strong> ... possibly intelligent but lacking the needed facts</li>
<li><strong>an idiot</strong> ... possibly well-informed but lacking the needed
intelligence</li>
<li><strong>immoral</strong> ... valuing publicity for personal gain above any harm
caused to millions of kids</li>
</ul>
<p>I just do not see any other logical possibility - aside from a
combination of all three traits. Wondering about the last reminded me
that the <a href="http://lcs.www.media.mit.edu/people/foner/Essays/Civil-Liberties/Project/green-card-lawyers.html">infamous "green card
lawyers"</a>
were one of the early milestones for moral decay on the internet (which
makes "immoral fool" my best guess).</p>
<p>The best approach for organizations like the FRC is to <strong>support</strong> the
creation of the .XXX domain. Once created the FRC and friends should do
everything possible to clean up the .COM neighborhood by using every
possible means to prosecute sites that displays objectionable material
on a .COM site. This combination has the best chance of yielding a big
result from a small effort.</p>
The Kutztown 132005-08-24T00:00:00Zhttps://bannister.us/weblog/2005/the-kutztown-13
<p><a href="http://www.schneier.com/blog/archives/2005/08/computer_crime.html">The Kutztown
13</a></p>
<p>So a bunch of high school kids were given "free" laptops by there
school. Predictably, (very predictably if you are familiar with high
school age kids) the kids used the computers for ways other than what
the school wanted. The kids are by no means innocent here, though their
actions have caused no harm.</p>
<p>How were the kids able to do this? At least in part because the school
<u>taped the administrative password to every machine</u> (yes, you read
that right). So - the school IT folks are <strong>GUILTY</strong> of massive
stupidity.</p>
<p>In truth a starting proposition in computer security is that for a
system to be secure, the hardware has to be secure (barring exotic
hardware). As soon as you hand a laptop to a bright kid, you have to
assume the machine can and will be compromised.</p>
<p>When inevitably the school finds that laptops are used for disallowed
purposes, the simplest solution would be to take back the laptops.
Instead the school warns the kids <em>repeatedly</em>, then <u>files felony
charges</u>! So - the school administration is <strong>GUILTY</strong> incompetence
and over-reaction.</p>
<p>This incident tells us nothing new about high school aged kids, but it
does tell us quite a lot about the hiring standards of the <a href="http://www.kasd.org/districtinfo/kasdPressrelease.htm">Kutztown
Area School
District</a>.</p>
<p>(Later...) On re-reading this entry, found I tend to mis-read the town
name as "Klutz-town". Heh.</p>
$$ Inertia in markets2005-08-21T00:00:00Zhttps://bannister.us/weblog/2005/inertia-in-markets
<p>One common element in the prior observations on <a href="https://bannister.us/weblog/2005/the-aol-of-broadband">The "AOL of
broadband"</a>
and <a href="https://bannister.us/weblog/2005/oasis-office-document-standards">OASIS Office Document
Standards</a>
is the surprising amount of
<a href="http://en.wikipedia.org/wiki/Inertia">inertia</a> (resistance to change)
displayed by the marketplace. The AOL subscriber base continued to grow
long after the service no longer made sense. Microsoft continues to
collect $billions$ in revenue when buying new copies of Microsoft
Office no longer really makes any sense.</p>
<p>The market did finally move away from AOL. We can presume the market
will eventually(!) figure out that new versions of MSWord are not worth
the price. The only guess is how long...</p>
<p>Heh - my guess - based on the assumption that Microsoft Office sales are
still increasing (true or not?): three more years for a MSOffice sales
to stall, five years for a significant drop, and ten years before sales
become nearly insignificant (assuming Microsoft does not change
pricing).</p>
The "AOL of broadband"2005-08-20T00:00:00Zhttps://bannister.us/weblog/2005/the-aol-of-broadband
<p>A bit of a flashback...</p>
<p>My first individual Internet access account was through CERF.net. Access
was through a 14.4 dial-up, and the monthly bills were not exactly
cheap. Later access became successively faster and cheaper through
kaiwan.com, speed.net, and PacBell. I got rid of dial-up in 1997 when
Cox (my local cable company) started offering internet access through
@Home.</p>
<p>The technical folks in @Home - at least those that made public
postings - seemed fairly sharp. Certainly the @Home service through Cox
worked well. Doubtless the Cox folks are due a fair measure of credit,
as @Home subscribers through other local cable companies had more
trouble with their service. Because the problem areas tended to be
local, it seemed that the @Home network itself was well-run.</p>
<p>The notion of a single common company (@Home) to run a shared network
backbone and infrastructure for multiple cable companies seemed to make
a lot of sense at a time when local cable companies had little or no
experience with the Internet or digital data networks.</p>
<p>Still - there were odd signs. In addition to the internet connection,
@Home also offered an odd client application - sort of a web portal
(poorly designed) running on client-side Java code. Why they did this is
still a mystery to me, though I suspect someone in management was using
AOL as a model. You could completely ignore the odd client and simply
use the Internet connection.</p>
<p>The basic point of the Internet was and is to allow anyone (with an
Internet connection) to get uniform access to anywhere on the Internet.
This means that there was no particular reason folks with @Home
connections would want to use the @Home portal. Why anyone thought there
was value in the @Home portal, I never did understand.</p>
<p>Apparently some of the folks directing strategy for @Home thought AOL
was somehow a model for their business. Using AOL as a model never did
make sense. AOL was originally successful in a time when connecting to
the AOL network and AOL-hosted content was worth more to ordinary folks
than access to the Internet. As the content on the Internet increased,
the notion of connecting to a proprietary (AOL) subnet and the relative
value of AOL-hosted content was going to decrease. Eventually it seemed
that outfits like AOL should become largely irrelevant.</p>
<p>At the least this is how I thought things would work out. On the other
hand, I wasn't making millions like the VC strategists or the guys
directing @Home - maybe they knew something I did not.</p>
<p>Then in 1999 came the merger of @Home with Excite. To me this seemed
like an electric utility merging with a company that made toasters. Sure
they both used electricity, but the business models are <em>very</em>
different. Apparently the VC's made out all right, but Excite cratered
and took @Home down with it.</p>
<p>Several months back I signed up (briefly) for AOL - mainly out of
curiousity as to why they survived. Heck, maybe there was some advantage
I just did not understand, so it had to be worth a look. After poking
around a bit I found nothing of compelling value on the AOL network, and
cancelled the account.</p>
<p>Now we see AOL
<a href="http://www.theregister.co.uk/2005/05/05/aol_q1_2005_earnings/print.html">losing</a>
<a href="http://www.watleyreview.com/2004/111604-3.html">subscribers</a> at a
<a href="http://www.forbes.com/2005/08/03/time-warner-aol-earnings-0803markets17_print.html">huge</a>
rate.</p>
<p>Wonder if the former @Home guys who thought AOL was a good model have
made the connection?? On the other hand...</p>
<blockquote>
<p><a href="http://contracts.corporate.findlaw.com/agreements/athome/jermoluk.emp.1996.07.19.html">Employment Agreement - At Home Corp. and Tom A.
Jermoluk</a>
...</p>
<ol>
<li>Base Compensation. Your base salary will be $500,000 per year.
...
(a) You will be granted the right to purchase one million five
hundred thousand (1,500,000) shares ... currently expected to be ten
cents ($.10) per share. You also will be granted the right to
purchase fifty thousand (50,000) shares ... at $10.00 per share ...
convertible into five hundred thousand (500,000) shares ... the
Restricted Stock and Series K Stock shall have an aggregate fair
market value of $10,000,000 ...</li>
</ol>
</blockquote>
<blockquote>
<p><a href="http://www.interesting-people.org/archives/interesting-people/200212/msg00036.html">Some execs scored big as company
valuesplunged</a>
"Thomas Jermoluk, former CEO of At Home, sold $50.3 million before
the cable broadband giant filed for bankruptcy. The company, known as
Excite@Home, once boasted a market value of $13 billion before
vaporizing following squabbles with its main shareholder and partner,
AT&T. Jermoluk is now a venture partner at Kleiner Perkins Caufield &
Byers."</p>
</blockquote>
<blockquote>
<p><a href="http://att.com.com/Was+ExciteHome+doomed+at+the+altar/2009-1033_3-272395.html">Was Excite@Home doomed at the
altar?</a>
"The deal proved a lucrative exit strategy for Excite investors who
were growing increasingly concerned about the company's prospects.
Generally, the goal of venture capital firms is to deliver a large
return to investors, either by selling stock after a company goes
public or by selling the entire company at a premium."</p>
</blockquote>
<p>Apparently it pays well to run a company into the ground.</p>
Follow that car! - new Microsoft Patent2005-08-19T00:00:00Zhttps://bannister.us/weblog/2005/follow-that-car-new-microsoft-patent
<blockquote>
<p><a href="http://appft1.uspto.gov/netacgi/nph-Parser?Sect1=PTO1&Sect2=HITOFF&d=PG01&p=1&u=%2Fnetahtml%2FPTO%2Fsrchnum.html&r=1&f=G&l=50&s1=%2220050171690%22.PGNR.&OS=DN/20050171690&RS=DN/20050171690">United States Patent Application:
0050171690</a>
"A concept for providing navigation information is described. The
concept includes a process for providing navigation information
including deriving a destination for a first vehicle and determining a
present location of the first vehicle. The process also includes
computing maneuvering information from the destination and present
location and adapting an image of a ghost vehicle in conformance with
the maneuvering information."</p>
</blockquote>
<p>Clever!</p>
<p>Navigation systems generally call for interpreting abstractions - maps,
written or spoken instructions - while driving. Adding to the driver's
mental workload is often not a good idea. Requiring the driver to take
their eyes off the road is not a good thing.</p>
<p>A heads-up display with an on-screen display with a virtual "guide" car
to follow means the driver's eyes stay on the road, and requires
near-zero interpretation. Hard to beat!</p>
<p>There is of course a minor catch. If the guidance system works <strong>most</strong>
of the time, when a small error sends the "guide" car through a tree,
the relaxed and trusting driver might follow...</p>
<p>Via <a href="http://www.transittrends.org/mvnforum/mvnforum/viewthread?thread=844">Microsoft files for Phantom Car
Patent</a></p>
Just a bit sideways...2005-08-19T00:00:00Zhttps://bannister.us/weblog/2005/385
<p><img src="http://www.liviodemarchi.com/images/preview31.jpg" alt="Commuting?" /></p>
<p><a href="http://www.transittrends.org/mvnforum/mvnforum/viewthread?thread=792">This guy has created a wooden
Ferrari.</a></p>
Missing the point - China and Climate Change2005-08-17T00:00:00Zhttps://bannister.us/weblog/2005/missing-the-point-china-and-climate-change
<p>Listened through the Open Source segment on <a href="http://www.radioopensource.org/china-and-climate-change/">China and Climate
Change</a>. Most
<a href="http://www.radioopensource.org/index.php">Open Source</a> programs are
pretty interesting. Wasn't too inspired by this segment, but only later
realised:</p>
<ul>
<li>Two rich American families are funding 12(?) representatives to live
in China and somehow "advise" the Chinese government. Sounds like a
good idea, until you think a bit about China - over a billion
people, and quite a few very smart and very well-educated. An added
12 Americans seems almost irrelevant.</li>
<li>The core problem is energy - first, last, and always. Most of our
energy (in China and elsewhere) comes from burning nonrenewable
resources. Aside from one clueless caller, no one really focused on
the main problem.</li>
<li>Somehow the <a href="http://en.wikipedia.org/wiki/Three_Gorges_Dam">Three Gorges
Dam</a> escaped mention.</li>
</ul>
<p>At 19.2 gigawatts the Three Gorges Dam could produce roughly 168 billion
kilowatt-hours per year, which works out to about 8% of China's current
<a href="http://www.cia.gov/cia/publications/factbook/geos/ch.html">annual electricity
production</a>.
This should be at least worth a mention.</p>
<p>China is the first large instance of a formerly "third-world" country
rising up the economic curve. The main problem is the use of fossil
fuels. The problem is common to every developed and developing country,
and is by no means unique to China.</p>
<p>Nuclear power is the biggest near-term feasible source of energy.
Nuclear power is or was politically unpopular. Poorly designed,
maintained, or operated power plants could be a risk. Nuclear waste
poorly disposed of could be a risk. Address the risks and nuclear power
is vastly better than burning fossil fuels.</p>
<p>Solar power is good for niche applications, and might be good for
knocking a couple percentage points off overall usage, but does not look
to do much more. Continuing research should payoff in more power from
solar - but this does not look to solve the main part of the problem.
Conversion efficiency is part of the problem. For more than incidental
use, storage is a big problem simply because our need for power is not
limited to the times when the sun is shining.</p>
<p>The research on thermonuclear power might someday yield a useful result.
Worth a side-bet but by no means a sure thing.</p>
<p>Solar power satellites are a sure long-term solution that seem to have
fallen out of mention. Outside the atmosphere sunshine is constant, much
brighter, and panels never need cleaning. Large structures can be built
in orbit that would be impractical on the surface of the Earth. This
<a href="http://www.google.com/search?hl=en&q=solar+power+satellites&btnG=Google+Search">notion</a>
is by no means new. Finding a solution with acceptable costs will take
an effort, but once found this is a essentially a <strong>permanent</strong> solution
to the energy problem.</p>
<p>Cleaning up power generated from burning fossil fuels is only a partial
and short-term solution. The problem is to find long-term sources of
energy viable for the future where the bulk of the world's growing
population climbs the economic scale. China is just the beginning.</p>
Slightly scary movie...2005-08-15T00:00:00Zhttps://bannister.us/weblog/2005/slightly-scary-movie
<p>Better not to click...
<a href="https://bannister.us/movies/bbaggins.mov">Baggins</a></p>
UK Border Security2005-08-14T00:00:00Zhttps://bannister.us/weblog/2005/schneier-on-security-uk-border-security
<blockquote>
<p><a href="http://www.schneier.com/blog/archives/2005/08/uk_border_secur.html">UK Border
Security</a>
A terror suspect appears to have fled the country by the simple
expedient of walking past an empty desk, and the Government's reaction
is not to put somebody at the desk, or to find out why, during one of
the biggest manhunts London has ever seen, it was empty in the first
place. No, the Government's reaction is to explain its abject failure
to play with the toys it's got by calling for bigger, more expensive
toys sooner.</p>
</blockquote>
Nigerian Net Grifters2005-08-14T00:00:00Zhttps://bannister.us/weblog/2005/nigerian-net-grifters
<blockquote>
<p><a href="http://www.wired.com/news/ebiz/0,1272,68459,00.html">Wired News: Nigerian Net Grifters Doing
Fine</a>
Nuhu Ribadu, head of the Economic and Financial Crimes Commission,
says cash and assets worth more than $700 million were recovered from
suspects between May 2003 and June 2004. More than 500 suspects have
been arrested, more than 100 cases are before the courts and 500
others are under investigation, he said.</p>
</blockquote>
<p>The "recovered" $700 million went where? Of course the money <strong>should</strong>
go back to the people from whom it was extracted. My guess is that the
money will largely stay in Nigeria (though I would be delighted to be
proven wrong).</p>
<p>Follow the money - if the money stays is Nigeria, what we have is a new
racket extorting money from grifters.</p>
Harm reduction and the "War on Drugs"2005-08-14T00:00:00Zhttps://bannister.us/weblog/2005/harm-reduction-and-the-war-on-drugs
<p><img src="http://www.tbray.org/ongoing/When/200x/2005/08/13/IMG_3826.png" alt="part of Hastings
Street" /></p>
<blockquote>
<p><a href="http://www.tbray.org/ongoing/When/200x/2005/08/13/Boring-Vancouver">Crane on
Hastings</a>
I took this weeks ago and liked the geometry, but the picture was
still a little on the boring side. So I abandoned photointegrity and
jammed the PhotoShop controls all the way over. Which, among other
things, covers up the <a href="http://www.tbray.org/ongoing/When/200x/2003/04/10/Downtown%20Eastside">collateral
damage</a>
from the War on Drugs.
Tall slender crane on Hastings Street, Vancouver</p>
<p>This part of Hastings Street is infested with junkies and other
walking wounded. A guy stopping in the middle of the street to take
pictures of cranes is hardly noticeable. I wrote <a href="http://www.tbray.org/ongoing/When/200x/2003/04/10/Downtown%20Eastside">an
essay</a>
about this place and the drugs and the consequences back in 2003, and
this picture reminded me of it, and I think it’s still material.</p>
</blockquote>
<blockquote>
<p><a href="http://www.tbray.org/ongoing/When/200x/2003/04/10/Downtown%20Eastside">On
Drugs</a>
<strong>Lesson: Drugs Differ</strong> We already treat different drugs
differently; alcohol is treated differently from tobacco is treated
differently from heroin. This makes all sorts of sense, except for
everything that's outside the law is put into one big basket, and
that's just silly.</p>
<p>My own personal opinions:</p>
<ul>
<li>As to uppers of all forms (coke/crack/meth, whatever), “speed
kills”, just like it did in the sixties. I've had a few druggie
friends, and the only ones who died or destroyed their lives on
illegal drugs were in this camp, and virtually everyone I've ever
known in this camp died or destroyed their life. The only sane
strategy is all-fronts attack.</li>
<li>Heroin is obviously insanely addictive, but unlike a lot of other
drugs, people don't get sick and die just from the heroin - it's
from the HIV on the needle, or the life of crime to stay high. A
lot of smart people seem to be saying that the sanest thing you
can do with junkies is keep them alive and relatively healthy, and
then over the years, quite a few of them eventually shake it. So
maybe there's something to be said for prescription and
supervised-injection in the European style.</li>
<li>As for cannabis, just give up. It's just not that damaging
(particularly with the modern varieties that reduce the quantity
of highly-carcinogenic smoke to nearly nothing), and the notion of
a “gateway drug” is just silly, and it's allowing a lot of very
evil people to get very rich.</li>
</ul>
<p>Legalize it, regulate it, collect the tax dollars, and free up the
cops to go after the real problem drugs (see above).</p>
</blockquote>
<blockquote>
<p><strong>Lesson: Listen to William Burroughs</strong>
<em>[snip]</em>
... I keep thinking about a lesson William Burroughs taught in Naked
Lunch, a revolting, depraved, nearly-impossible-to-read book that I
can't recommend but I'm glad I read.</p>
<p>Burroughs asks us to consider the narcotics supply chain: the farmer
sells to the aggregator, who sells to the importer, who sells to Mr.
Big, who sells to Mr. Medium, who sells to the street dealer, who
sells to the junkie. The cops have this idea that busting dealers is
good, and busting Mr. Medium is better, and busting Mr. Big is
terrific, and if we could go and redirect the farmers' energies that
would be ideal.</p>
<p>Burroughs points out that the truth is more or less exactly the
opposite: every piece of the chain - every piece of the chain - is
replaceable, and given the money to be made, will be replaced.</p>
<p>Except the junkie. Make the junkie go away and the money goes away and
the chain dries up. So, maybe the Vancouver cops are onto something;
let's just make it real hard to be a junkie and try to disrupt the
system from the bottom up.</p>
</blockquote>
<p>... which is not very different from <a href="https://bannister.us/weblog/2005/drug-warrant">what I said
before</a>. The
problem goes away if the end-consumer goes away.</p>
<p>Our current/unending "War on Drugs" is not turning up any clear
benefits. Clearly - thirty-odd years on - the current tactics are are
not winning this "war". When you aren't winning, after all this time -
it is time to try another approach.</p>
<p>First, we need to distinguish "hard" life-destroying drugs and "soft"
relatively harmless drugs. We've known for decades that marijuana is
about as harmful as tobacco and alcohol. (Frankly I wonder how money
went into political coffers from tobacco and alcohol businesses to keep
marijuana illegal). Take your pick of approaches - but whatever
restrictions you choose should be similar based on the actual effects
and side-effects.</p>
<p>The nonsense about marijuana as a "gateway" drug ... this is exactly as
true as tobacco and alcohol as "gateway" drugs. Stick your head into an
NA or AA meeting and you will find a pack of smokers. Clearly the folks
who have problems with addiction have problems with the whole suite -
and their starting point on the downward path was most likely tobacco
and alcohol.</p>
<p>To look at things from an entirely different perspective, look at things
like a parent who cares about their kids. Look at a group of kids and
figure that a large portion will try things we'd rather they didn't -
and more likely than not at least one of your kids is in this group. We
care a lot about the quality and safety of the things we consume.
Balance carefully the risks - is it better that "soft" drugs be illegal,
or better the substance our kids consume is as safe as possible? Take it
for granted that the folks making drugs illegally are not overly
concerned if a few of their customers <strong>die</strong>.</p>
<p>Kill the illegal distribution chain for "soft" drugs and you get safer
products, more taxes collected, lower prices ... and a likely lot less
crime.</p>
<p>The "War on Drugs" has gone on for a long time. For the average citizen
the "war" has proved expensive and is at best a stalemate. For the "Mr.
Big" in the illegal distribution chain the status-quo is very, very
profitable. I wonder how much money flows from "Mr. Big" into politics
with the aim to keep things as they are?</p>
Global Warming - for a Change2005-08-14T00:00:00Zhttps://bannister.us/weblog/2005/global-warming-for-a-change
<p>Listening to <a href="http://www.radioopensource.org/politics-of-climate-change/">Open Source - Politics of Climate
Change</a>, and
looking at some of the referenced material. The <strong>Open Source</strong> programs
are often quite interesting (whether you agree or not with the
opinions). I was a bit creeped out by the guys advocating more laws and
big government at the end of this program.</p>
<p>Found a reference to rising sea levels from melting ice:</p>
<blockquote>
<p><a href="http://incr.com/05investorsummit/pdf/INCR_jholdren_present_05summit.pdf">Climate-Change Risks &
Opportunities</a></p>
<ul>
<li>IPCC 2001 “central estimate” of ~0.5 meter further sea-level rise
by 2100 now looks like an underestimate…maybe a big underestimate.</li>
<li>All the ice on Greenland ~7 m increase in sea level; ice in WAIS
~5 m.</li>
<li>Rates at which this ice could become sea water are still highly
uncertain, but 12 m in 350-500 years is possible (~3 m per
century); some think even faster is possible (Hansen 2005).</li>
<li>East Antarctic Ice Sheet could add another 60 m, presumably only
over many centuries…but recent surprises indicate science
uncertain here.</li>
</ul>
</blockquote>
<p>OK, now I do in fact suspect that CO^2^ emissions from human activity
may indeed be the cause for the recent global rise in temperatures. I
believe we should aim to use a lot less of non-renewable resources
(which would include fossil fuels, midwestern topsoil, old growth
timber, and the like). I also believe it is a good long-term bet to
invest in and promote the development of solar, nuclear and other power
sources.</p>
<p>On the other hand, I find a lot of fuzzy thinking in publications like
the above referenced presentation.</p>
<p>First, the science basis for assigning global warming to increased CO^2^
emissions is a little uncertain. We should not assume that the Earth's
climate was always constant - or that the rate of change was always
constant. Climate change occurs over many tens of thousands of years. We
have really detailed information from just the past couple decades, and
fairly sketchy information for longer periods. Making projections from
that extremely short or thin basis is risky.</p>
<p>Before you can make any sort of projections, there are a lot of
questions that need asking. Did the Earth have warmer periods in the
past? Did the Earth have higher CO^2^ levels in the past? What change
was already occuring in the climate before human activity became
significant? Was the rate of change itself changing? What evidence do we
have about past changes?</p>
<p>Is warming a bad thing? I'm not convinced either way. Certainly warming
means <strong>change</strong>, and no doubt this will disrupt a lot of established
folks. On the other hand, sometimes change is a good thing. Why does it
seem that warming is <strong>assumed</strong> to be a bad thing?</p>
<p>Warmer temperatures should translate to a <strong>shift</strong> in climate - some
wet areas will become drier, some dry areas will become wet.
Crop-growing regions that become dry is a bad thing. Some currently dry
areas will become better for growing crops. If you drive around the
American West, or poke around the planet using Google Earth, you will
see huge, dry, largely unused tracts of land. As an American I would be
particularly interested in how much the <strong>total</strong> precipitation might
change <strong>for the entire country</strong>, and how the moisture would be
distributed. Is the change in distribution a net profit or a net loss?</p>
<p>As a guess, warmer temperatures should lead to more evaporation from the
oceans, which in turn should mean more fresh water from precipication on
the land. There are lots of folks who think we need more fresh water.
Will warming solve a looming problem?</p>
<p><a href="http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?cmd=Retrieve&db=PubMed&list_uids=12291371&dopt=Citation">Global water crisis: the major issue of the 21st century, a growing and
explosive
problem.</a>
<a href="http://www.imasar.com/elmosa/shortage.htm">Worldwide Water Shortage to
Worsen</a>
<a href="http://moneycentral.msn.com/content/P102152.asp">Invest in the coming global water
shortage</a>
<a href="http://www.cnie.org/pop/pai/water-14.html">Water-Scarce Countries</a>
<a href="http://ag.arizona.edu/AZWATER/awr/dec99/Feature2.htm">Global Water Shortage Looms In New
Century</a></p>
<p>So far as I can tell, no one is asking this sort of question.</p>
<p>Here in southern Orange County (California) - presuming the above
numbers for sea rise are somewhat accurate - warming means a lot of rich
folks might lose their house on the beach. My sympathy is limited -
especially since my house is at 800-odd feet elevation. Besides, this
sort of change will make a lot more folks interested in the
environment... :)</p>
<p>Then there are the odd conclusions.</p>
<blockquote>
<p><a href="http://incr.com/05investorsummit/pdf/INCR_jholdren_present_05summit.pdf">Climate-Change Risks &
Opportunities</a></p>
<ul>
<li>While there’s still no formal consensus, it’s increasingly clear
that the current level of anthropogenic interference is
dangerous.
Significant impacts in terms of floods, droughts, wildfires,
species, and melting ice are already evident at ~0.8°C above
pre-industrial T~avg~, and current GHG concentrations commit us to
~0.6°C more.</li>
<li>It is now all too plausible that…
<ul>
<li>ΔT~avg~ ~ 1.5°C will mean the end of coral reefs & polar
bears</li>
<li>ΔT~avg~ ~ 2°C will mean catastrophic melting of Greenland &
Antarctic ice, with commitment to multi-meter rises in sea
level</li>
<li>ΔT~avg~ ~ 2.5°C will sharply reduce crop yields worldwide</li>
</ul>
</li>
</ul>
</blockquote>
<p>Yes, some areas will become drier - and yield more wildfires, for a
time. On the other hand some areas will see more moisture and new
growth.</p>
<p>So ... a ~ 1.5°C rise will kill off all the coral reefs? Somehow it
seems likely the ecosystem of a coral reef can adapt to a small change
in temperature. Surely the change in temperature and sea level <strong>will</strong>
make changes in the ecosystem, but assuming no adaption seems
unreasonable.</p>
<p>It does seem likely that some existing farms will see reduced yields. It
also seems likely that some (large) new and existing farmed areas
limited by available water will become more productive. What I don't see
is mention of areas expected to become <strong>more</strong> productive. Without
attempting to measure the gains, we cannot reasonably say in balance
whether the change is a profit or loss to humankind.</p>
<p>OK - I will admit to one bit of amusement. Between rising temperatures
and sea level, Florida may largely disappear, and Texas become less
habitable. Given the location of the current President's political
base - I'm not feeling badly about this :).</p>
Fingerprinting Paper2005-08-14T00:00:00Zhttps://bannister.us/weblog/2005/fingerprinting-paper
<p>This is an amazingly good idea!</p>
<p><a href="http://www.schneier.com/blog/archives/2005/08/fingerprinting_2.html">Schneier on Security: Fingerprinting
Paper</a>
<a href="http://www.boston.com/news/science/articles/2005/08/01/the_fingerprint_of_paper?mode=PF">The fingerprint of
paper</a>
<a href="http://sciam.com/print_version.cfm?articleID=00049DB6-ED96-12E7-AD9683414B7F0000">Paper's Natural 'Fingerprint' Could Be Built-In Passport
Protection</a></p>
<p>Any piece of paper becomes a secure token. While - as with any problem
in security - you have to be careful about what you claim the token
"proves". Still the applications are pretty interesting.</p>
<p>You could have a warehouse full of unlabeled(!) boxes, with only
pre-printed guide marks to indicate where to scan.</p>
<p>You could issue temporary ID cards just by scanning a pre-printed bit of
paper - you do not have to print anything on the paper. In many ways
this is <strong>more</strong> secure, as if someone picks up a lost ID card, there is
no way to determine <strong>anything</strong> - company, user, privileges, or
expiration - without access to the (presumably secure) security
database. Manufacturing fake ID's becomes impossible.</p>
A four-star scapegoat?2005-08-14T00:00:00Zhttps://bannister.us/weblog/2005/arianna-huffington-at-rummys-bizarro-pentagon-torture-is-rewarded-while-sex-is-a-firing-offense-yahoo-news
<p>We have the lingering unresolved problem of some truly evil acts by a
small number of folks in the military. The low-level folks are getting
punished, but there is a curious lack of official interest in chasing
the chain of responsibility up the chain of command.</p>
<p>So what do we get instead?</p>
<blockquote>
<p><a href="http://www.washingtonpost.com/wp-dyn/content/article/2005/08/09/AR2005080900515_pf.html">4-Star General Relieved Of
Duty</a></p>
<p>"In a rare move, the Army relieved a four-star general of his command
amid allegations that he had an extramarital affair with a civilian,
Army officials said yesterday."</p>
<p>"A spokesman said Army officials could find no case of another
four-star general being relieved of duty in modern times."</p>
<p>"Having an extramarital affair can be deemed adultery and a violation
of the Uniform Code of Military Justice. But such cases rarely go to
court-martial and usually end in administrative punishment such as a
letter of reprimand, according to military lawyers. Relieving a
general of his command amid such allegations is extremely unusual,
especially given that he was about to retire."</p>
</blockquote>
<p><a href="http://www.huffingtonpost.com/theblog/archive/margaret-carlson/the-wrong-general_5595.html">The Wrong
General</a>
<a href="http://www.huffingtonpost.com/theblog/archive/stephen-elliott/sexual-politics-and-the-g_5593.html">Sexual Politics and the
General</a>
<a href="http://www.huffingtonpost.com/theblog/archive/lt-gen-claudia-kennedy/something-is-amiss_5555.html">Something is
Amiss</a></p>
<p>Sounds like a good definition of a
<a href="http://www.google.com/search?hl=en&lr=&c2coff=1&safe=off&oi=defmore&q=define:scapegoat">scapegoat</a>.</p>
Longhorn and RSS2005-08-09T00:00:00Zhttps://bannister.us/weblog/2005/longhorn-and-rss
<p>Microsoft is apparently going to incorporate some form of RSS support
into Longhorn. While this is generally a good idea, what I just don't
get is why folks are making a big fuss.</p>
<p><a href="http://blogs.msdn.com/ie/archive/2005/06/24/432390.aspx">Longhorn loves
RSS!</a>
<a href="http://www.microsoftmonitor.com/archives/008952.html">Microsoft’s RSS Platform: The
What</a>
<a href="http://www.microsoftmonitor.com/archives/008955.html">Microsoft’s RSS Platform: The
How</a>
<a href="http://www.microsoftmonitor.com/archives/008956.html">Microsoft’s RSS Platform: The
Why</a></p>
<p>Now this is not to undervalue the decision to use RSS by the developers
at Microsoft in any way - this was a very good and reasonable choice,
just not really a big deal outside niche tools tightly integrated to
specific versions of Windows.</p>
<p>First, RSS is just groking a bit a XML fetched (usually) via and HTTP
request. This is a code fragment or a library function at most, not an
operating system function.</p>
<p>As a client-side or server-side developer I cannot reasonably drop
support for pre-Longhorn versions of Windows, so any use of RSS will
have to be through portable libraries. Since portable libraries to
process RSS are neither difficult or rare, this is not a problem. The
fact that Longhorn incorporates RSS in some form is irrelevant. It would
have been nice of Microsoft offered their code as redistributable
libraries usable with any (recent) version of Windows, but it's really
not a big deal either way.</p>
<p>As a user any RSS support built into Windows or Internet Explorer (or
Mozilla for that matter) is largely irrelevant. I use RSS feeds (and
Atom perhaps) for monitoring weblogs and newsfeeds, and run all the
external feeds through an aggregator (Bloglines in my present case).
Aggregators are both more performant for the end user (feeds are queried
in background and ahead of time) and a more scalable solution for the
services (one fetch instead of hundreds or thousands).</p>
<p>RSS support in the browser is nice - but I'd rather run things through
an aggregator. Also since I use more than one machine, keeping the list
of subscribed RSS feeds in a web application is a big win over
replicating between desktops.</p>
<blockquote>
<p><a href="http://channel9.msdn.com/ShowPost.aspx?PostID=80533">From the channel9
video:</a>
"This is user data, sitting on the PC..."</p>
</blockquote>
<p>This is the key problem. This is user data <strong>that should be on a web
server</strong> much more often than on an individual PC. The ability to grok
<a href="http://www.ietf.org/rfc/rfc2445.txt">calendar files</a> is pretty neat,
but this could just as readily be web application - except for the
problem of getting data into and out of the Microsoft Exchange ghetto.
The examples shown are fine, but nothing that would not be better served
by a web application.</p>
Cisco Harasses Security Researcher2005-08-04T00:00:00Zhttps://bannister.us/weblog/2005/schneier-on-security-cisco-harasses-security-researcher
<p><a href="http://www.schneier.com/blog/archives/2005/07/cisco_harasses.html">Schneier on Security: Cisco Harasses Security
Researcher</a></p>
Automatic Surveillance Via Cell Phone2005-08-04T00:00:00Zhttps://bannister.us/weblog/2005/automatic-surveillance-via-cell-phone
<p><a href="http://www.schneier.com/blog/archives/2005/07/automatic_surve.html">Schneier on Security: Automatic Surveillance Via Cell
Phone</a></p>
fat CEO pay2005-08-03T00:00:00Zhttps://bannister.us/weblog/2005/you-deserve-a-refund-for-fat-ceo-pay-csmonitorcom
<p><a href="http://www.csmonitor.com/2005/0725/p17s01-cogn.htm">You deserve a refund for fat CEO pay |
csmonitor.com</a></p>
Kafka anti-bureaucracy website2005-08-03T00:00:00Zhttps://bannister.us/weblog/2005/usability-news-media-kafka-anti-bureaucracy-website-yields-streamline-government
<blockquote>
<p><a href="http://europa.eu.int/idabc/jsps/documents/dsp_showPrinterDocument.jsp?docID=1881%E2%89%B6=en">Kafka goes online to help Belgium reduce red
tape</a></p>
<p>The Belgian federal, regional, and community authorities have launched
on 10/12/2003 a joint initiative called 'Kafka' to fight red tape and
bureaucratic complexity across all levels of government. Until the end
of March 2004, citizens are encouraged to communicate their views on
complex forms, redundant processes and contradictory procedures
through a new website Kafka.be or through a toll free telephone
service.</p>
<p>The initiative, which aims at identifying problems and potential
solutions for simplifying public administration, is the result of a
joint effort by the federal government and the country's regional
authorities and communities. Citizens' comments will be stored in a
central database, then analysed and routed to the relevant
authorities. A final report will be published on Kafka.be after the
end of the consultation process.</p>
<p>This consultation exercise is consistent with the Belgian Government's
goal of modernising the country's public administration through ICT.
The strategic importance of this objective was reaffirmed in late
November 2003 in a white paper presented to the Council of Ministers
by the State Secretary for State Computerisation. The paper argues
that better exchange of information between administrations, together
with back-office and process re-engineering, are key for delivery of
successful e-government services.</p>
</blockquote>
<p><a href="http://www.kafka.be/">Kafka</a> -- Wish Google had a "Belgium to English"
translation :).</p>
Tacky namespace grab2005-08-03T00:00:00Zhttps://bannister.us/weblog/2005/tacky-namespace-grab
<p>This is bogus - <a href="http://www.bannister.name/">WWW.BANNISTER.NAME - Bannister Family - Bannister's
Homepage</a>.</p>
<p>So ... guess I wasn't keeping up with the new top-level domains for the
web. Saw a comment about registration for the new ".name" TLD. Checked
to see if anyone had grabbed "bannister.name" (and whom if taken).
Instead I find that some outfit has grabbed the name (and probably
thousands of others), only for the purpose of (hopefully) reselling the
name at a higher price.</p>
<p>Now in a free economy resellers are common. Most resellers add value in
one form or another - and as such can be justified as serving a purpose.</p>
<p>There is no added value here. Instead the outfits re-selling domain
names are something like ticket-scalpers. This smells bad.</p>
<p>I believe it would be better if domain names were only sold to folks who
would actually make some use (other than name-price-speculation).
Doubtless the registrars - outfits that make money off each
registration - would not be keen on this notion. Also, what sort of
scheme could you come up with that would be workable?</p>
<p>The simplest might be to limit the number of domains that could be
registered to any one individual. A limit of ten domains per individual
should be more (far more) than enough.</p>
<p>You could ban re-selling of names, but I do not know if this could be
checked or enforcable in any sort of practical sense.</p>
Hitting the High Notes2005-08-03T00:00:00Zhttps://bannister.us/weblog/2005/hitting-the-high-notes
<blockquote>
<p><a href="http://www.joelonsoftware.com/articles/HighNotes.html">Joel on Software - Hitting the High
Notes</a>
If you threw a bunch of extra programmers onto the Windows Media
Player team, would they ever hit that high note? Never in a thousand
years. Because the more people you added to that team, the more likely
they would be to have one real grump who thought it was unprofessional
and immature to write "Most things actually work" on your website.</p>
</blockquote>
<p>Why Microsoft does accomplish so little with so much?</p>
<p>The early MSDN CDs each came with little animated "Dr. GUI" cartoons.
Heck, that was the first thing I looked at after installing the new MSDN
CD. Of course there were some real grumps who wrote in complaining that
the cartoons were unprofessional and immature. After a few releases the
Dr. GUI cartoons disappeared.</p>
<p>Is it a coincidence that really interesting and inspiring bits of work
from Microsoft and the "Dr. GUI" cartoons disappeared around the same
time??</p>
Instant Outlining2005-08-03T00:00:00Zhttps://bannister.us/weblog/2005/geeksopmlorg-dave-luebbert-on-instant-outlining-and-microsoft
<p><a href="http://geeks.opml.org/stories/storyReader$90">Dave Luebbert on Instant Outlining and
Microsoft</a></p>
<p>If you're organized around email, usually the only folks who get to
listen are the folks who are direct reports. And those guys are always
too busy to pass much info down.</p>
Brooke Ramel2005-08-03T00:00:00Zhttps://bannister.us/weblog/2005/brooke-ramel
<p>Walked over the local food court for lunch a bit after noon on one day
last week. Weather was hot, humid and oppressive - the quote about "mad
dogs and Englishmen" came to mind (not that the dog minded the weather
in the least).</p>
<p>Entering the outdoor eating area, walked past a singer (between songs).
Listened while waiting for and eating my lunch. Did not expect much -
the occasional music sponsored by the food court ranges from mediocre to
moderately painful.</p>
<p>This time was a little different. The singer was <a href="http://brookeramel.com/">Brooke
Ramel</a> and the songs I heard were a number of
my favorites. The singer tended to use a high/forced/breathy/little-girl
sort of voice, which - at least in this place - sounded muddy,
indistinct and uninspiring. Maybe this was partly due to the outside
acoustics. Maybe this sort of singing sounds better indoors or in a
studio.</p>
<p><img src="http://brookeramel.com/images/brooke_new1.jpg" alt="Brooke" /></p>
<p>Between songs the singer's natural voice had more of a range and was
much more interesting. On a couple occasions the singer would slip out
of the high/false voice, and the lower tones would carry clearly and
reverberate very nicely in the open area. About this point I was feeling
rather frustrated, as it sounded as though her singing voice if she just
relaxed a bit might well be very good indeed (as in raising the hair on
the back of your neck good) - instead of the muddy mess I was hearing.</p>
<p>Will be really interested in <a href="http://brookeramel.com/calendar.htm">other
times</a> Brooke will appear.</p>
Un-spinning the question of "cover"2005-07-24T00:00:00Zhttps://bannister.us/weblog/2005/un-spinning-the-question-of-cover
<p>An opinion from a source we should respect.</p>
<p><a href="http://www.fas.org/irp/news/2005/07/intlet.pdf">intlet.pdf (application/pdf
Object)</a></p>
Roundabouts2005-07-24T00:00:00Zhttps://bannister.us/weblog/2005/roundabouts
<blockquote>
<p><a href="http://www.roundaboutsusa.com/">RoundaboutsUSA</a>
"RoundaboutsUSA can assist you with your roundabout project by:
conducting a feasibility study, CAD design, and peer review of current
designs. Contact Bill if you need assistance by email or at the phone
numbers listed below."</p>
</blockquote>
<p>The site referenced above presents some excellent and very sensible (and
common-sense) arguments for the use of roundabouts.</p>
<p>First - I will admit without hesitation that I <strong>like</strong> roundabouts.
Sitting stopped at the four-way-stop signed intersection is mind-numbing
(not to mention time and gas-wasting). How many times have you sat
waiting for the light to change - when there are no other cars moving,
or no other traffic at all?</p>
<p>There are two traffic circles (not roundabouts exactly if I understand
the distinction) somewhat local, one in the center of the city of
Orange, and another in Long Beach a major intersection with Pacific
Coast Highway. Apparently there are American communities (primarily in
Utah and Colorado) finding success with roundabouts. I encountered a
pair of small roundabouts just off the I-70 in St. George, Utah.</p>
<p>Wonder if I could push for the local
<a href="http://www.city-lakeforest.com/">city</a> to adopt roundabouts rather than
putting in more (and more!) traffic signals - especially on the major
streets?</p>
Model Quality Introductions2005-07-24T00:00:00Zhttps://bannister.us/weblog/2005/model-quality-introductions
<p>(<strong>Update</strong> - seems I may have
<a href="http://bannister.us/weblog/2010/stepped-on-someones-gravy-train/">stepped on someone's gravy train</a>.)</p>
<p>In Orange County, California there are two free widely distributed
monthly publications - <a href="http://www.ocweekly.com/">OC Weekly</a> and <a href="http://www.ocmetro.com/">OC
Metro</a>. Articles in OC Weekly tend to be
politically "liberal", and articles in OC Metro tend to be politically
"conservative". Read both and you might get some sort of "balance"...</p>
<p>Both publications are entirely supported by advertising, and - based on
the ads - it appears that selling sex keeps both publications in
business. In OC Weekly you get a lot of low-dollar sex ads - strip
clubs, escort services, and the like. In OC Metro you get a lot of
high-dollar sex ads - liposuction, cosmetic surgery, <a href="http://www.modelqualityintroductions.com/">Model Quality
Introductions</a>, and the like.</p>
<p>A quote from <a href="http://philip.greenspun.com/flying/plastic-airplanes">Philip
Greenspun</a> got me
thinking.</p>
<blockquote>
<p>... conventional (male) pilot wisdom ... "If it floats, flies, or
fucks... rent it"</p>
</blockquote>
<p>Does this imply that pilots tend to be more "liberal"? Seems unlikely
somehow as pilots tend to be more affluent. Do affluent "conservatives"
pick up OC Weekly when they want a rental? Certainly OC Metro does not
appear to carry sex-for-rent ads.</p>
<p>Maybe I was missing the very obvious, as <a href="http://www.modelqualityintroductions.com/works.cfm">Model Quality
Introductions</a> and
the like may well be just exactly that sort of service. On the surface
this looks like a dating service for rich guys to meet attractive
women - and perhaps for some guys that is exactly what the service
delivers. On the other hand, this would be a <strong>terrific</strong> cover for a
high-end sex-for-rent operation. Rich (or psuedo-rich?) guys pay the
service for "introductions". The service does not need to mention sex
(though they might). Some girls will offer sex for free (in hopes of
hooking a rich guy). Some girls may offer sex for gifts (or money). The
only question is if the service knows which girls offer sex - and
directs their clients accordingly.</p>
<p><img src="https://bannister.us/weblog/images/mqi/50_1.jpg" alt="model" /><img src="https://bannister.us/weblog/images/mqi/150_1.jpg" alt="model" /><img src="https://bannister.us/weblog/images/mqi/100_1.jpg" alt="model" /><img src="https://bannister.us/weblog/images/mqi/115_1.jpg" alt="model" /><img src="https://bannister.us/weblog/images/mqi/302_1.jpg" alt="model" /><img src="https://bannister.us/weblog/images/mqi/621_1.jpg" alt="model" /></p>
<p>Now in fact I have no idea if this service is anything other than what
they appear on the surface - though it would be interesting if we found
out (unlikely) that a portion of their clients are already married.
Somehow I doubt we will ever find out.</p>
<p>The local District Attorney apparently does favors for at least some
wealthy individuals in the county (and I am not sure about the local
Sheriff either). If some of the DA's friends are also clients of this
service - seems unlikely law enforcement would ever take a hard look.</p>
<p>Geez, this all sounds like some made-for-TV movie...</p>
<p><strong>Update:</strong> ... should have looked. Turns out
<a href="http://www.ocweekly.com/features/sex-issue/a-bunch-of-5s-looking-for-10s/16188/">OC Weekly did an article</a> -
it costs $25,000 to join (for men, free for women). Numbers are (by
report) about 100 men and 1000 women. Wonder if there is a site for
finding trophy wives as well somewhere ...
<a href="http://www.craigslist.com/pen/w4m/86887951.html">one ad on craigslist</a>
(not really the right place to advertise).</p>
Usefulness of Terrorist Watch Lists2005-07-16T00:00:00Zhttps://bannister.us/weblog/2005/usefulness-of-terrorist-watch-lists
<p>Just another reminder - much of what we are sold as needed for
"security" is not worth the money - or the intrusion.</p>
<p><a href="http://www.schneier.com/blog/archives/2005/07/london_bombing.html">Schneier on Security: London Bombing and the Usefulness of Terrorist
Watch
Lists</a></p>
Santa Claus, Arizona2005-07-14T00:00:00Zhttps://bannister.us/weblog/2005/santa-claus-arizona
<p>More whimsy...</p>
<p>Passing an endless chain of food franchises on the road between
California and Colorado, I remembered Heinlein mentioned a place to eat
that sounded wonderful. Just ran across the story <em>Cliff and the
Calories</em> (1950) in the Heinlein collection <a href="http://www.amazon.com/exec/obidos/tg/detail/-/0743499158/102-4290250-9281767">Expanded
Universe</a>.
The story is fiction but the place described - <a href="http://en.wikipedia.org/wiki/Santa_Claus%2C_Arizona">Santa Claus,
Arizona</a> was real.
Makes me wish I had a time machine.</p>
<p><img src="https://bannister.us/weblog/images/christmas-tree-inn.jpg" alt="inside" /><img src="https://bannister.us/weblog/images/santa-claus-arizona-postcard.jpg" alt="old
postcard" /></p>
<p>Finding the location on a map took some hunting. Google Maps had
nothing. Finally in deep among the Google search results was a link to a
Microsoft TerraServer page.</p>
<p>The <a href="http://maps.google.com/maps?ll=35.335636,-114.215755&spn=0.070450,0.107142&t=k&hl=en">best satellite image from Google
Maps</a>
is not nearly as good as the <a href="http://www.terraserver-usa.net/image.aspx?T=1&S=10&Z=11&X=3765&Y=19569&W=2">image from Microsoft
Teraserver</a>.
TerraServer also has Google beat in the link to <a href="http://www.terraserver-usa.net/image.aspx?T=2&S=11&Z=11&X=1882&Y=9784&W=2">Topo
Maps</a>
shows the location in old maps, as apparently newer maps remove the
name.</p>
<p>Wonder what is left? Worth a drive??</p>
Mail Filtering2005-07-13T00:00:00Zhttps://bannister.us/weblog/2005/mail-filtering
<p>A good tutorial on <a href="http://acme.com/mail_filtering/">Mail Filtering</a>
from Jef Poskanzer.</p>
<p>Now - how can I find a web hosting/email providor that supports IMAP and
email filtering as throughly done as Jef describes?</p>
The New Public Relations2005-07-12T00:00:00Zhttps://bannister.us/weblog/2005/the-new-public-relations
<blockquote>
<p><a href="http://www.intertwingly.net/blog/2005/07/12/The-New-Public-Relations">Sam Ruby: The New Public
Relations</a>
<a href="http://www.tbray.org/ongoing/When/200x/2005/07/11/New-Public-Relations">Tim
Bray</a>:
The new PR pipeline is a lot shorter, simpler, and wider:</p>
<ol>
<li>Senior management works out a company’s goals and messages.</li>
<li>Management works hard to make sure that the employees understand
them.</li>
<li>The people who are really doing the work tell the story to the
world, directly.</li>
</ol>
<p>I have one problem with this. To figure out what it is, note the use
of the word “works” in the first two bullets. Now apply the third
bullet.</p>
</blockquote>
<p>Different sorts of work, Sam - and you run the risk of sounding cynical
:). Yes, sometimes management is operating in a clue-free zone, and
doubtless both Sam and Tim have been around long enough to have worked
in that sort of situation at least once.</p>
<p>On the other hand, take the case where senior management does have
definite goals. Sometimes - maybe even somewhat often - the folks at the
bottom "really doing the work" know that parts of those goals do not
make sense. What needs to happen is that information needs to flow
<strong>up</strong> from the folks with the greater specific knowledge to the folks
trying to work out the meaningful overall goals. Odds are there are or
should be folks in the middle who can digest and combine the information
flowing up.</p>
<p>Put differently, if the message from the top does not make sense, then
the folks at the bottom need to work on pushing information up the
chain. Oddly enough I have a specific (constructive) example, but since
my present employer has no policy with regards to weblogs, I will not
write about it...</p>
<p>Sometimes the flow of information up the chain does not work. If the
company approves of employee's writing about company issues, then
employee weblogs become a fallback or failsafe. If there is a problem
that just isn't making up the management chain (say a PHB in the middle
somewhere), then airing issues in weblogs gives upper management a
chance at a reality check.</p>
<p>I do think that Tim's model makes sense.</p>
Slow radio?2005-07-10T00:00:00Zhttps://bannister.us/weblog/2005/slow-radio
<blockquote>
<p><strong>Over and out</strong>
"Marconi's first transmission is still out there, about 10% of the
way to the closest visible star. Granted it is pretty attenuated by
now>"
*Bob Lucky, technology consultant, formerly of Bell Labs and
Telcordia</p>
<ul>
<li><em><a href="http://www.edn.com/">EDN: Voice of the Electronics Engineer</a> - May
12, 2005 - page 17</em></li>
</ul>
</blockquote>
<p>Somebody goofed.</p>
<p>Radio signals travel at the speed of light. Astronomers use the
"light-year" - the distance light will travel in one year - as a measure
of distance. <a href="http://en.wikipedia.org/wiki/Guglielmo_Marconi">Marconi</a>
made the first radio transmission across the Atlantic on December 12,
1901. So Marconi's first transmission would have covered a bit over 103
light-years by this time.</p>
<p>From the <a href="http://en.wikipedia.org/wiki/List_of_nearest_stars">list of nearest
stars</a> we can see
that the nearest visible star is about 4.36 light-years distant. You
might note that 103 light-years is a lot more than 10% of the way to the
nearest star :).</p>
<p>I do not know how many stars are within 103 light-years. Given the the
list of 44 stars within 14.3 light-years we could (very roughly)
estimate 16,400 stars within 103 light-years. So rather that 10% of the
way to the first, instead Marconi's first transmission has already
<em>passed</em> something like 16,000 stars.</p>
Satellite images and security2005-07-10T00:00:00Zhttps://bannister.us/weblog/2005/satellite-iamges-and-security
<p><a href="http://ars.userfriendly.org/cartoons/?id=20050710&mode=classic"><img src="http://www.userfriendly.org/cartoons/archives/05jul/uf008130.gif" alt="secure" /></a></p>
<p>Note that Google Maps shows the <a href="http://maps.google.com/maps?q=1600+Pennsylvania+Ave+NW,+Washington,+DC+20500%E2%89%AA=38.895711,-77.037055&spn=0.009092,0.013393&t=k&hl=en">view of the White House</a>
with the roof of the White House and two flanking buildings are blanked
out. Similarly the view of
<a href="http://maps.google.com/maps?q=100+Constitution+Ave+NE,+Washington,+DC+20002%E2%89%AA=38.889649,-77.009043&spn=0.008806,0.013393&t=k&hl=en">Congress</a>
and nearby buildings is also obscured.</p>
<p>The cartoon is a joke, but the silliness as a security measure is real.
Doubtless this notion looked good in a memo, but makes no sense in the
real world. Pretending we're the "bad guys", let's hit this point by
point.</p>
<ul>
<li>By blanking out the roofs of some buildings but not others, you have
told us where to look for interesting stuff.</li>
<li>We could arrange a flight over the Washington area on a (rare) clear
day and take pictures (there are restrictions, so this may be
difficult). There are other possibilities.</li>
<li>We might be able to obtain satellite photos from non-US sources.</li>
<li>We might not even care. Anywhere near enough in the city with a
small nuke or other sort of dirty bomb, is good enough.</li>
</ul>
<p>Now let's pretend we are the "good guys".</p>
<ul>
<li>First - the best security measure might be to <strong>not</strong> obscure any
defensive equipment located rooftops. Seeing what's up there might
discourage the "bad guys", such that they don't even make an
attempt. An attack once attempted always has some chance of success,
and almost certainly will cause some collateral damage.</li>
<li>Second - if we really want to obscure whatever equipment is up
there, all we have to do is camouflage the important bits, and put
up a few fake bits. Even with high resolution images the "bad guys"
would be unable to discern anything useful.</li>
</ul>
<p>Between the two, there is no added security in obscuring satellite
images.</p>
<p>At the top of my list while still playing the "good guys" is concern
that so much of the government is located within the radius of
destruction of a single small nuclear bomb. My first priority would be
to get as much as possible of the government distributed <strong>away</strong> from
one single location. Why is this single overwhelmingly obvious concern
ignored?</p>
Rove under suspicion2005-07-10T00:00:00Zhttps://bannister.us/weblog/2005/plame-fireworks-rove-under-suspicion-and-why-is-judith-miller-really-going-to-jail-needlenose
<blockquote>
<p><a href="http://parkdep.blogspot.com/2003_10_12_parkdep_archive.html#106611382245391555">the Parks
Department</a>
Wednesday, Jul. 16, 2003 Has the Bush Administration declared war on
a former ambassador who conducted a fact-finding mission to probe
possible Iraqi interest in African uranium? Former Ambassador Joseph
C. Wilson raised the Administration's ire with an op-ed piece in The
New York Times on July 6 charging that the Administration had
"twisted" intelligence to "exaggerate" the Iraqi threat. Since then
Administration officials have taken public and private whacks at
Wilson, charging that his 2002 report, made at the behest of U.S.
intelligence, was faulty and that his mission was a scheme cooked up
by mid-level operatives. Some government officials, noting that
Wilson's wife, Valerie Plame, is a CIA official who monitors the
proliferation of weapons of mass destruction, intimate that she was
involved in his being dispatched Niger to investigate reports that
Saddam Hussein's government had sought to purchase large quantities of
uranium ore, sometimes referred to as yellow cake, for the purposes of
building nuclear devices.</p>
</blockquote>
<blockquote>
<p><a href="http://www.huffingtonpost.com/theblog/archive/lawrence-odonnell/its-rove_3556.html">The Huffington Post | The
Blog</a>
... Time magazine's emails will reveal that Karl Rove was Matt
Cooper's source.</p>
</blockquote>
<blockquote>
<p>Is this a dream that could come true?</p>
<p><a href="http://www.needlenose.com/node/view/1592"><img src="http://www.needlenose.com/i/swopa/RoveMarch.jpg" alt="untitled" /></a></p>
</blockquote>
Iraq as flypaper2005-07-10T00:00:00Zhttps://bannister.us/weblog/2005/iraq-as-flypaper
<blockquote>
<p><a href="http://www.huffingtonpost.com/arianna-huffington/london-bushs-flypape_b_3815.html">Arianna
Huffington</a>
So let me get this straight: we invaded them to liberate them... and
to use them as bait to attract terrorists who we could fight on the
streets of Baghdad rather than the streets of London and New York?</p>
</blockquote>
3D star maps2005-07-10T00:00:00Zhttps://bannister.us/weblog/2005/3d-star-maps-by-stellarium
<blockquote>
<p><a href="http://www.stellarium.com/index.html">3D star maps by Stellarium</a>
It began in 1975 as an effort to create a three dimensional map of
our sun and its nearest neighbors in space. Not just beads on
strings - something that really looked like stars. There was no
thought of a business. It was an amateur project in the very best
sense of the word: For love of the subject.</p>
<p>After three years and many false starts a small prototype was
completed and taken to a local planetarium for evaluation. Would they
accept a large map, say six feet in diameter, as a gift if we could
successfully build one? We just wanted to see one that big.</p>
<p>Construction began. A completely unanticipated phenomena gradually
became evident. The growing model was not only intellectually
interesting it was becoming truly wondrous. A view of the heavens
previously inaccessible to the human senses gradually appeared. The
new display completely surpassed all expectations. Mark Peterson, then
Director of Denver’s Gates Planetarium stated it in a word:
“Captivating.” This first large, prototypical Stellarium went on
public display in 1979. It remained in public service for twenty
years.</p>
<p>An eight foot diameter map was built in Rohnert Park, California, in
1983. We just wanted to see one. Again the unexpected occured. It was
much more impressive than the six foot map. The new giant map received
rave reviews. We started Stellarium.</p>
</blockquote>
<p>I can see a visit to the <a href="http://www.sbnature.org/">Santa Barbara Museum of Natural
History</a> in the near future.</p>
Reminder2005-07-07T00:00:00Zhttps://bannister.us/weblog/2005/reminder
<p><a href="http://www.flickr.com/photos/dreadedhill/23717944/" title="Photo Sharing"><img src="http://photos18.flickr.com/23717944_e6a5c70b8e_b.jpg" alt="Sombrero
Galaxy" /></a></p>
<p>With the focus on the ordinary day-to-day, too easy to forget that our
speck of dust floats amid wonders.</p>
A step in the right direction2005-07-04T00:00:00Zhttps://bannister.us/weblog/2005/a-step-in-the-right-direction
<blockquote>
<p><a href="http://www.andwest.com/blojsom/blog/tatle/agenda/2005/06/27/Norwegian_Minister_Proprietary_Standards_No_Longer_Acceptable_in_Communication_with_Government.html">Tatle</a>
"Proprietary formats will no longer be acceptable in communication
between citizens and government."</p>
</blockquote>
<p>One can hope that other government organizations will follow suit.</p>
Attempted identity theft?2005-06-28T00:00:00Zhttps://bannister.us/weblog/2005/attempted-identity-theft
<p>Today I got a call from Equifax. For some unspecified (?) reason they
were suspicious of the fact that someone had ordered my credit report on
March 22. Since I did not recall ordering a credit report, she offered
to put an "alert" on my "file" with all three (?) credit reporting
agencies.</p>
<p>A few weeks back I did get a letter dated March 28 from
<a href="https://www.truecredit.com/">TrueCredit</a>. "Thank you for choosing
TrueCredit!" This was odd as I did not remember making such a choice.
Tried logging in to their site, but stopped when they asked for
information I did not want to provide.</p>
<p>Up to this point there was some small chance I had indeed ordered a
credit report, and had simply forgotten.</p>
<p>Called TrueCredit. Found that someone ordered my credit report using the
credit card of someone in Brentwood, Missouri. Since I do not know
anyone in Brentwood, Missouri (let alone anyone who would need my credit
report), it is clear this is part of something dubious. Also heard from
TrueCredit that whomever did <strong>not</strong> actually succeed in gaining access
to my credit report.</p>
<p>Hopefully that is the end of the story...</p>
<p><strong>Update July 10:</strong> Received a free copy of my credit report from
Equifax. Checked and found nothing seriously wrong. They do have my
ex-wife's <em>new</em> address listed as one of my <em>old</em> addresses ... odd but
not serious.</p>
Overheated Honda2005-06-26T00:00:00Zhttps://bannister.us/weblog/2005/overheated-honda
<p><a href="http://www.flickr.com/photos/dreadedhill/21572477/" title="Photo Sharing"><img src="http://photos16.flickr.com/21572477_4fd2913d9d.jpg" alt="Downhill" /></a></p>
<p>This is the road that did in my Honda. You cannot tell from the picture
but this road is steep. Coming up the road required driving in first
gear, which after a mile or so proved too much, and my car overheated.
Guess long periods of heavy throttle in first gear is just more than my
car (and probably most cars) can handle.</p>
<p>Never saw my car overheat before. In fact before this drive I was not
sure the temperature gauge worked, as no matter how I drove the
indicator was always a third of the way from cold to hot. Now I know
that the gauge works, as on this road the temperature rose all the way
to the top. My memories of the Detroit cars my dad drove in the 60's and
70's always have the temperature gauge moving around a lot. Guess newer
cars are more closely regulated.</p>
<p>After sitting a while to let the engine cool, turned around and headed
downhill. Once back on the main road and able to get the speed up over
20mph the engine cooled to the normal temperature very quickly.</p>
<p>Was a bit alarmed for a time. Had not seen any cars for rather a while,
so if my car quit I had a long walk back to Silverton.</p>
Apple going to Intel - yet another speculation2005-06-26T00:00:00Zhttps://bannister.us/weblog/2005/apple-going-to-intel-yet-another-speculation
<p>Musing on the Apple-to-Intel transition, there are a couple points that
come to mind.</p>
<ul>
<li>Jobs and company recognized the need for a bet-the-company
transition if Apple's desktop and laptop computers are to remain
relevant. Better to make the bet now rather than wait through a long
painful decline.</li>
<li>Apple is using the announced transition to Intel to give IBM a
chance to get their act together. If it is possible for IBM to
deliver competitive hardware at competitive prices to meet Apple's
needs, then the Apple folks could simply decide to de-emphasize or
punt on the transition to Intel. This is a win for Apple, IBM, and
customers - if IBM is capable. If IBM cannot deliver then the
transition goes ahead.</li>
<li>Perhaps Apple as a manufacturer of computers can no longer be kept
relevant. The alternative is for Apple to become a software company.
If Apple software runs on Intel computers then existing PC
manufacturers can be used to make hardware for Apple.</li>
</ul>
<p>The last item occurred to me since the
<a href="https://bannister.us/weblog/2005/apple-going-to-intel-a-telling-question">earlier</a>
post - and seems to complete the equation. If the most likely outcome is
that Apple will essentially become a software company, then it makes
some sense to pre-announce the transition to Intel, and kill the sales
of the IBM PowerPC based computers.</p>
<p>Yet another speculation :).</p>
unique humor2005-06-25T00:00:00Zhttps://bannister.us/weblog/2005/unique-humor
<p><a href="http://cgi.ebay.com/ws/eBayISAPI.dll?ViewItem&item=7163650842">Own your very own 128-bit Uniqueidentifier
(GUID)</a></p>
<p>Probably only funny to a specific, er, unique group of people :).</p>
The Downing Street Memos2005-06-25T00:00:00Zhttps://bannister.us/weblog/2005/the-downing-street-memos-the-text
<p><a href="http://www.downingstreetmemo.com/memo.html">The Downing Street Memos :: The
text</a>
<a href="http://en.wikipedia.org/wiki/Downing_Street_memo">Downing Street memo - Wikipedia, the free
encyclopedia</a></p>
<p>Not that this really changes anything.</p>
Splendid isolation2005-06-25T00:00:00Zhttps://bannister.us/weblog/2005/splendid-isolation
<p><a href="http://www.flickr.com/photos/dreadedhill/20624843/" title="Photo Sharing"><img src="http://photos16.flickr.com/20624843_ef6fba9f3c.jpg" alt="DSC00583" /></a></p>
<p>These are very nicely-built houses, but note the blank "face" presented
to the street. Windows few, small and always shuttered. Neighbors can go
months or years without interacting.</p>
<p>When streets are our public spaces, and our houses face the public space
with closed garage doors, it is easy to stay isolated.</p>
<p>How to do better?</p>
A different sense of distance2005-06-25T00:00:00Zhttps://bannister.us/weblog/2005/a-different-sense-of-distance
<p><a href="http://www.flickr.com/photos/dreadedhill/21568516/" title="Photo Sharing"><img src="http://photos17.flickr.com/21568516_e645cac244_b.jpg" alt="Utah" /></a></p>
<p>When you can spend nearly all day with the cruise control engaged, you
get a different sense of distance. Much nicer than driving around
California.</p>
Wonderful twisty scenic roads2005-06-22T00:00:00Zhttps://bannister.us/weblog/2005/wonderful-twisty-scenic-roads
<p>Took part of a day off from helping my dad unpack to go for a drive.
Headed south toward
<a href="http://maps.google.com/maps?q=Ouray,+CO&spn=0.154324,0.225563&t=k&hl=en">Ouray</a>.
When you reach Ouray you are fairly well up into the mountains, and the
scenery is getting rather nice. From Ouray heading south the "Million
Dollar Highway" climbs into and over the mountains.</p>
<p>This road calls for close attention from the driver. On one side is the
mountain, and on the other side is ... nothing. I love this road! It
climbs, curves and swoops wonderfully as it makes it way through the
mountains. This is not a road for driving fast.</p>
<p><a href="http://www.flickr.com/photos/dreadedhill/20625547/"><img src="http://photos17.flickr.com/20625547_2092f25bd5.jpg" alt="untitled" /></a></p>
<p>Best to pay attention to the signs with recommended speeds. Pretty sure
I'd not want to take this road at night, or when there might be ice on
the road. On a warm spring or summer day, this is a very nice drive
indeed.</p>
<p>At the same time the scenery is really worth a look around. Problem is
that when driving, you cannot more than glance at scenery during those
brief moments when the road does not demand your full attention. Lots of
internal dialogue along the lines of "Oh - look at that! - CAN'T
LOOK!!". Fortunately there are many places to stop, where you can climb
around and take pictures.</p>
<p><a href="http://www.flickr.com/photos/dreadedhill/20626622/"><img src="http://photos17.flickr.com/20626622_4ad84f65b1.jpg" alt="untitled" /></a><a href="http://www.flickr.com/photos/dreadedhill/20626385/"><img src="http://photos16.flickr.com/20626385_9029cb9138.jpg" alt="untitled" /></a></p>
<p>Felt a bit of sympathy for an older couple in a white pickup from
Lousiana. The driver was clearly uncomfortable with twisty road and
shear dropoffs. Followed them for a bit. The driver showed a clear
preference for the center of the road (closer to the mountainside), and
speeds below 25mph. Hung back enough so that I hoped the driver would
not feel pressured to drive outside their comfort zone, but after a bit
he pulled over and waited for me to pass.</p>
<p>Still have a lot of photos to sort through and
<a href="http://www.flickr.com/photos/dreadedhill/">upload</a>.</p>
Every once and a while...2005-06-22T00:00:00Zhttps://bannister.us/weblog/2005/every-once-and-a-while
<p>... things do not seem to happen just by chance.</p>
<p>Drove to Colorado on Saturday. Picked a random CD, and listened to Elvis
Costello for the first few hours.</p>
<p>Drove back from Colorado Tuesday. Picked a random CD at a rest stop in
Utah, and listened to New Order for the last few hours.</p>
<p>Fired up Winamp today, and the Elvis Costello was the first randomly
selected track. Hit "skip". The second track was New Order. Hit "play"
and Winamp started randomly skipping through tracks, as the network
drive containing the tracks was not connected. Hit "stop", connected the
network drive, and hit "play". The track "Wonderful" from Everclear
started playing - which is my middle son's favorite.</p>
<p>Huh?</p>
Threads and Whimsy2005-06-20T00:00:00Zhttps://bannister.us/weblog/2005/threads-and-whimsy
<p>Making coffee this morning in my Dad's new house in Colorado. Helping
him to get settled - stacks of full boxes turned into stacks of empty
boxes. The "someday" boxes sorted and put out of sight. The boxes with
his office papers (cannot do these for him) are spread out in his office
for easy access, and somewhat out of sight from the main room (looks
organized anyway). The kitchen - well, that is for the later half of the
day.</p>
<p>I like to make my coffee strong. First thing my dad does is add water.
My uncle liked strong coffee - made coffee for him only once (he
approved). He brought a lot of joy into my life as a child. Wish I could
have paid him back somewhat as an adult.</p>
<p>My grandmother was also an enormous joy when I was a child. She became
estranged from my mother and uncle in her last several years, and
through occasional phone calls and letters I became her only family
contact. One day she called confused and upset though I could not tell
why. Talked to her for a while until she calmed down and sounded better.
As best we can figure, she died later that same day - alone. Wish I
could have done more for her.</p>
<p>Waited until I was 30 before my first child. Seemed to make sense to
wait until I could buy a house before having children, and southern
California is expensive. In retrospect I think that was a mistake. My
oldest never really knew my grandmother or uncle, and my little brother
is a fading memory. My youngest will have few and faint memories of my
mother. There is something to be said for overlap between generations.</p>
<p>Whimsy.</p>
Raise the bridge or lower the river?2005-06-20T00:00:00Zhttps://bannister.us/weblog/2005/raise-the-bridge-or-lower-the-river
<p>Philip asks if <a href="http://blogs.law.harvard.edu/philg/2005/06/18#a8829">Low tuition encourages career
slackers?</a> I think
there are a couple of relevant factors you have to consider before you
could make this connection. The first is the student's family
background. The students from wealthier families probably tend to be
more focused on an educational path that will make similar sorts of
money. The second is the admissions requirements for the school. Schools
that are more difficult to get into are more likely to end up with more
focused students.</p>
<p>The cost of tuition in itself is essentially irrelevant to the
students - one way or another it is not "their" money being spent, so
the effect on motivation is probably minor.</p>
<p>I saw this correlation at the California schools. The University of
California accepted only students in the top 4%. The California State
colleges accepted a much larger number (33%?), and the Community
Colleges would accept pretty much anyone who could show up. At the time
the cost to attend a UC school was pretty much nominal. I knew folks at
all three schools in the same area (Orange County) and it was very clear
that the number of "slackers" was greater for the schools with easier
admission requirements.</p>
<p>There is another thread worth picking up here. Through a series of
mostly Republican governors and largely Democratic assemblies the cost
to attend the UC schools has risen rather a lot. I think this is not a
good thing. Motivated students come from all sorts of family-income
groups. If there is any value to the country in training students to the
level of their ability, excluding students on their families ability to
afford tuition is a mistake.</p>
<p>On a similar note - last week I caught a fragment of a program on TV
about the declining populations in "first world" countries (exclusive of
immigration). Some countries are encouraging their citizens to have more
children. What I did not hear mentioned was the most obvious factor -
raising children is costly, and most couples find it too difficult to
raise more than one or two children. If you want couples to have more
children, it must become easier to afford.</p>
<p>Free universities are one way to help. Free childcare - or (likely
better) a cost of living that allows one parent to stay home, is another
way to help. Southern California is especially bad in this regard. The
cost to buy a house in a safe neighborhood for your children is simply
beyond the reach of most young couples. The cost of buying a house
requires both husband and wife to work, which means the additional cost
of childcare. Faced with childcare expenses when the children are young,
and the possible college expenses when the children are older, most
parents simply feel unable to afford more than one or two children.</p>
<p>If you truly believe that families and education are important, then you
need to recognize <strong>and adjust</strong> the costs involved.</p>
<p>Put differently - if you can't raise the bridge, lower the river. If the
cost of raising children well is too much, then you lower those costs.
Tax families on their "excess" income <strong>after</strong> the costs of housing,
childcare, college and retirement are fully accounted. Cut taxes to
families and (when necessary) subsidize the costs associated with
raising children in high-cost areas. If the country is required to
subsidize costs (housing, childcare, etc.), then you pass those costs
along to the cause. If businesses locate too far from safe, affordable
housing then you tax those businesses in direct proportion to the costs
incurred by the country. Once added to the cost of doing business,
businesses will be naturally motivated to locate closer to areas
suitable for families.</p>
<p>This would likely accelerate the decline of many inner-city areas.
Whether this is a bad thing is a different question.</p>
Mythical Engineer Shortage2005-06-17T00:00:00Zhttps://bannister.us/weblog/2005/mythical-engineer-shortage
<blockquote>
<p><a href="http://news.yahoo.com/s/ucru/20050615/cm_ucru/werelookingforafewboringdorks&printer=1">WE'RE LOOKING FOR A FEW BORING
DORKS</a>
Since then I've heard from my former engineering school classmates.
None were close to starving, but even those who went on to obtain
masters degrees and doctorates were laid off when government contracts
expired and projects were canceled. My brilliant ex-girlfriend, pushed
out the door when her fraction of a fraction of a fraction of a
percent error caused an expensive defense satellite to reenter the
atmosphere and burn up, had trouble finding work elsewhere. Employment
security was haphazard across the spectrum but engineers were
especially prone to bouncing from job to job separated by scary income
gaps.</p>
</blockquote>
<p>The author of the above article is not far wide of the mark. Engineering
is not an especially valued profession in the US, despite statements
from colleges and large-scale employers. Just look at the pay and
employment numbers. What large employers are looking for is more
<strong>cheap</strong> engineers.</p>
Web-based command-line interpreter2005-06-15T00:00:00Zhttps://bannister.us/weblog/2005/web-based-command-line-interpreter
<p>Undoubtedly a cool example...
<a href="http://a-i-studio.com/cmd/">WebCmd: web-based command-line interpreter
(shell)</a>
What I cannot decide is if this is only a gimmick, or the start of
something big. I suspect it is the latter.</p>
<p>So ... if you have a web-based command-line interpreter over HTTPS, do
we still need SSH? Sure, if you want to run 'vi' ... but ... could a
mutant 'vi' use a web browser as a screen? Certainly you could launch a
browser-based editor (either an editable textarea for small bits, or
perhaps a Java applet for larger?).</p>
<p>Microsoft's <a href="http://msdn.microsoft.com/theshow/episode.aspx?xml=theshow/en/Episode043/manifest.xml">new MSH
shell</a>
(or
<a href="http://weblogs.asp.net/jnadal/archive/2003/10/29/34413.aspx">'Monad'</a> -
which may not see release any time soon) is a pretty interesting piece
of work, because it changes the nature of the data flowing through the
pipe between commands. What MSH does not change is the display surface.
The WebCmd example has the web browser as a display surface. Browsers
inherently understand HTML and XML. If <strong>both</strong> the pipe between
commands and the display (web browser) understand richly structured data
... interesting stuff.</p>
Apple going to Intel - a telling question2005-06-15T00:00:00Zhttps://bannister.us/weblog/2005/apple-going-to-intel-a-telling-question
<blockquote>
<p><a href="http://www.pbs.org/cringely/pulpit/pulpit20050609.html">PBS | I, Cringely . June 9, 2005 - Going for
Broke</a>
Question 4: Why announce this chip swap a year before it will even
begin for customers?</p>
<p>This is the biggest question of all, suggesting Steve Jobs has
completely forgotten about Adam Osborne. For those who don't remember
him, Osborne was the charismatic founder of Osborne Computer, makers
of the world's first luggable computer, the Osborne 1. The company
failed in spectacular fashion when Adam pre-announced his next model,
the Osborne Executive, several months before it would actually ship.
People who would have bought Osborne 1s decided to wait for the
Executive, which cost only $200 more and was twice the computer.
Osborne sales crashed and the company folded. So why would Steve
Jobs -- who knew Adam Osborne and even shared a hot tub with him
(Steve's longtime girlfriend back in the day worked as an engineer for
Osborne) -- pre-announce this chip change that undercuts not only his
present product line but most of the machines he'll be introducing in
the next 12 to 18 months?</p>
<p>Is the guy really going to stand up at some future MacWorld and tout a
new Mac as being the world's most advanced obsolete computer?</p>
<p>This announcement has to cost Apple billions in lost sales as
customers inevitably decide to wait for Intel boxes.</p>
</blockquote>
Another beautiful thing2005-06-15T00:00:00Zhttps://bannister.us/weblog/2005/another-beautiful-thing
<p>An airplane meant for a single purpose.</p>
<p><img src="https://bannister.us/weblog/images/A-10-990104akhog.jpg" alt="airplane" /></p>
<p>Once you have air superiority then you need an effective way to attack
ground targets. Missiles are expensive. Fighters are only lightly
armored, vulnerable to ground fire and very expensive to replace. Also
to hit ground targets accurately you need an airplane that is not moving
too fast, and to take out armored targets (like tanks) you need a big
gun.</p>
<p><img src="https://bannister.us/weblog/images/A-10-003.jpg" alt="airplane" /></p>
<p>The outfit below clearly takes pride in their equipment.</p>
<p><img src="https://bannister.us/weblog/images/A-10-MVC-006F.JPG" alt="airplane" /></p>
<p>The emblem on the front of the gun says "Peace through superior
firepower".</p>
<p><em>Note: Original sites are gone for the above images.</em></p>
Memorial bench2005-06-10T00:00:00Zhttps://bannister.us/weblog/2005/memorial-bench
<p><a href="http://www.flickr.com/photos/dreadedhill/18141759/" title="photo sharing"><img src="http://photos12.flickr.com/18141759_6763ae569e_m.jpg" alt="untitled" /></a></p>
<p>On January 8, 2004 a cyclist who lived in Foothill Ranch was killed by a
mountain lion while riding through the Whiting Ranch wilderness area.
This bench was put up afterwards as a memorial. The houses in the near
distance are in Foothill Ranch.</p>
Bogus filtering2005-06-10T00:00:00Zhttps://bannister.us/weblog/2005/bogus-filtering
<p>Ran across this missive today -- <a href="http://www.internetisshit.org/print.html">The internet is
shit</a>. I have noticed this
bogus meme going around lately. The assumption is that other sources of
information outside the Internet are somehow in some sense generally
better.</p>
<p>Silly nonsense!</p>
<p>By the age of ten I had read through all the science books in the
children's section of the library, and got an exception so I could start
checking out books from the adult section. Science was my main interest,
but I spent a lot of time wandering through the stacks and pulling out
interesting-looking books. Read a lot of books as a kid and found that
not every book in the library was by any means golden. Or to use the
above writer's term - most books are full of shit.</p>
<p>As a kid I had a job delivering newspapers. For a few years I read every
day's paper from cover to cover. By the end it was clear that
practically all the information was not of the best quality, and much
was entirely bogus. Careful research was (and is) practically
non-existant. You could say newspapers were almost entirely full of
shit.</p>
<p>Looking at encyclopedias I found that the articles in the Encyclopedia
Britannica were almost always excellent. The articles in the lesser
encyclopedias ranged from good through shallow, to downright bogus. So
you could say that most encyclopedias are full of shit.</p>
<p>At this level of generalization you could claim pretty much everything
is just chock full of shit ... which is not a very useful or profitable
approach.</p>
<p>In truth you always need a filter, and you always need to refine and
rely on your own judgement. Some books, some encyclopedias, some sites
on the Internet, and even some newspapers (sometimes) are good sources
of information. You have to know how to look for and recognize the good
sources of information. This is no more or less true of the Internet
than any of the older sources.</p>
Semi-secrets and the White House?2005-06-09T00:00:00Zhttps://bannister.us/weblog/2005/semi-secrets-and-the-white-house
<p>Why is so much of the White House site hidden from search engines??</p>
<p><a href="http://www.whitehouse.gov/robots.txt">http://www.whitehouse.gov/robots.txt</a></p>
<p>This just strikes me as rather odd. The purpose of <strong>robots.txt</strong> is to
exclude your site from indexing by search engines. This is useful if
parts of your site contain data not of general interest. That there are
entries in <strong>robots.txt</strong> is perfectly normal -- but 2200 lines?!?</p>
Excluding a robot2005-06-09T00:00:00Zhttps://bannister.us/weblog/2005/excluding-a-robot
<p>Today I found a new set of entries in the "recent visitors" log for my
site from the <a href="http://www.turnitin.com/">turnitin.com</a> crawler.</p>
<p>Today I added the first entry to the
<a href="http://bannister.us/robots.txt">robots.txt</a> file for my site.</p>
<p>The internet is all about sharing. I am happy to pay for the for
bandwidth used by this site. My expectation is that I will get something
back in return from other folks who share, and so I will gladly
contribute to the common pool of shared material.</p>
<p>The folks at Turnitin are offering a for-pay service. The Turnitin folks
are not sharing. They want to profit from folks that share, but offer
nothing in return. Simply put, I do not feel like supporting a
for-profit service when their business model is based on leaching off my
bandwidth.</p>
<p>This choice is entirely up to your individual sense of ethics. I have
made my choice, and from now on I will be checking the nature of the
organization that crawl my site.</p>
Board chow2005-06-08T00:00:00Zhttps://bannister.us/weblog/2005/04-04-01gif-gif-image-450x615-pixels
<p><img src="http://www.inktank.com/images/AT/cartoons/04-04-01.gif" alt="board chow" /></p>
IBM really blew it with the PowerPC2005-06-07T00:00:00Zhttps://bannister.us/weblog/2005/ibm-really-blew-it-with-the-powerpc
<p>Losing Apple as a customer has got to count as one of the bigger
blunders in IBM's history.</p>
<p><a href="http://www.apple.com/pr/library/2005/jun/06intel.html">Apple to Use Intel Microprocessors Beginning in
2006</a></p>
<p>My guess is that this marks the start of a slow and painful end to the
PowerPC architecture. Rather a shame. Looks like it is going to be x86,
and pretty much everything else is fading out. Yes, I know that IBM
gained a huge design win in Microsoft's next X-Box. By itself and in the
long term, this does not count for anything. Microsoft can just as
easily switch away from PowerPC is their next iteration. Giving up on
the desktop market seems to have marked the beginning of the fade-out
for the other diminished processor lines.</p>
<p>One notion that might have more legs is a Sun/Apple alliance. Not sure
how the current Sun CPUs compare to the current generation Intel chips.
Realistically if the individual CPU cores are roughly equivalent to
1-2Ghz x86 CPUs - that should be more than good enough for the majority
of desktops. If Sparc multi-core CPUs can be fabricated with similar or
better net throughput, power consumption, and cost as equivalent x86
offerings, then they could prove competitive.</p>
Simple cooking2005-06-04T00:00:00Zhttps://bannister.us/weblog/2005/simple-cooking
<p><a href="http://www.flickr.com/photos/dreadedhill/sets/415933/">Simple
cooking</a> - a
cooking story told in pictures.</p>
<p>I keep things simple, do not use recipes, and like to cook ahead for
multiple meals.</p>
fishing2005-06-04T00:00:00Zhttps://bannister.us/weblog/2005/fishing
<p>From 1967(?) - first time fishing, and the only time I caught anything.
We had fried catfish later, which tasted wonderful.</p>
<p><a href="http://www.flickr.com/photos/dreadedhill/17460404/" title="photo sharing"><img src="http://photos9.flickr.com/17460404_59262a08d1_m.jpg" alt="fishing" /></a></p>
family-flying2005-06-04T00:00:00Zhttps://bannister.us/weblog/2005/family-flying
<p>Family vacation from 1968(?).</p>
<p><a href="http://www.flickr.com/photos/dreadedhill/17460408/" title="photo sharing"><img src="http://photos9.flickr.com/17460408_7d470e0355_m.jpg" alt="flying" /></a></p>
Dog Days Criterium2005-06-04T00:00:00Zhttps://bannister.us/weblog/2005/dog-days-1
<p>In the late-1970's the Beverly Hills Savings and Loan sponsored the
annual "Dog Days Criterium" (a non-USCF amateur race). Held on a Sunday
in the Irvine Industrial area (near Jeffery and Walnut?).</p>
<p><a href="http://www.flickr.com/photos/dreadedhill/17460431/" title="photo sharing"><img src="http://photos13.flickr.com/17460431_aa076291d6_m.jpg" alt="results" /></a><a href="http://www.flickr.com/photos/dreadedhill/17460553/" title="photo sharing"><img src="http://photos12.flickr.com/17460553_b458ee060e_m.jpg" alt="untitled" /></a><a href="http://www.flickr.com/photos/dreadedhill/17460586/" title="photo sharing"><img src="http://photos14.flickr.com/17460586_de0b4b0328_m.jpg" alt="untitled" /></a></p>
<p>We won! Orange County Wheelmen (bike club) - left to right in last
picture - ??, Terry Vincent, Allan?, Me, ??, ??, and C.J. Shank in
bottom center (the club president).</p>
Motor trends?2005-06-02T00:00:00Zhttps://bannister.us/weblog/2005/motor-trends
<p>There seems to be a marked change occuring in the population of cars I
see in taking my kids to the local elementary school. Last year may well
have marked the peak of the SUV-craze. Today there seemed to be
noticably fewer mega-vehicles in the drop-off line than you would have
seen last year.</p>
<p>This is a rather particular sample. The sample consists of families with
children of elementary school age (roughly 5-12 years old) . As the kids
grow the older families drop out of the sample, and younger families
come in. The neighborhood is roughly upper-middle class (though there
are some apartments in the area). There are a number of factors that
might skew the sample.</p>
<p>House prices have more than tripled in the 11 years since moving here.
Couple this with low interest rates - doubtless some of the new vehicles
are accounted for by refinance and taking some of the increased value
out of the house. In the late-1990's a good chunk of the new vehicles
were from folks whose stocks were doing well. As older folks moved out,
the newer folks moving in generally needed higher incomes to afford the
increased home finance cost and taxes.</p>
<p>There may be a secondary effect from rising house prices. There are some
substantial blocks of apartments in the area. Early in the history of
the school I remember hearing from the principal that relatively few
children were from the apartments. Perhaps as house prices have become
less affordable we have have more families with children in apartments?</p>
<p>The half-Hummers (H2's) seem to have disappeared. The "lifted" trucks
seem the more numerous of the remaining SUVs - perhaps this represents
the folks who are slower fad-wise? The SUVs were always a bit silly on a
practical level, and - spotless and unscratched - were clearly used as
ego-enhanced minivans. The number of new minivans might represent
younger families, older families replacing SUVs, or both.</p>
<p>Oh well - an amusing speculation :).</p>
Mission creep2005-06-01T00:00:00Zhttps://bannister.us/weblog/2005/mission-creep
<p>Is this mission creep, or on a mission for creeps?</p>
<p><a href="http://www.schneier.com/blog/archives/2005/06/dhs_enforces_co_1.html">Schneier on Security: DHS Enforces
Copyright</a></p>
<p>You might hope that the "Department of Homeland Security" would spend
it's time on things actually affecting our security.</p>
Random photo story2005-05-30T00:00:00Zhttps://bannister.us/weblog/2005/random-photo-story
<p>A story told in pictures...</p>
<p><a href="http://www.flickr.com/photos/travischurch/3027906/"><img src="http://photos1.flickr.com/3027906_5cbde25afd_s.jpg" alt="untitled" /></a>
<a href="http://www.flickr.com/photos/travischurch/1830995/"><img src="http://photos2.flickr.com/1830995_e3b91fc460_s.jpg" alt="untitled" /></a>
<a href="http://www.flickr.com/photos/21683372@N00/10313494/"><img src="http://photos6.flickr.com/10313494_3225621872_s.jpg" alt="untitled" /></a>
<a href="http://www.flickr.com/photos/newcastle_medics/12886981/"><img src="http://photos10.flickr.com/12886981_c79970fa87_s.jpg" alt="untitled" /></a>
<a href="http://www.flickr.com/photos/pyrateice/8071548/"><img src="http://photos5.flickr.com/8071548_519d36d839_s.jpg" alt="untitled" /></a>
<a href="http://www.flickr.com/photos/rettie/13006949/"><img src="http://photos11.flickr.com/13006949_7a30495e55_s.jpg" alt="untitled" /></a>
<a href="http://www.flickr.com/photos/vorjales/13461561/"><img src="http://photos9.flickr.com/13461561_80be18e7d9_s.jpg" alt="untitled" /></a>
<a href="http://www.flickr.com/photos/criminalintent/13884731/"><img src="http://photos12.flickr.com/13884731_6529c63d60_s.jpg" alt="untitled" /></a>
<a href="http://www.flickr.com/photos/notcatherinezeta/12813262/"><img src="http://photos11.flickr.com/12813262_933e24185a_s.jpg" alt="untitled" /></a>
<a href="http://www.flickr.com/photos/amyanddebs/12887370/"><img src="http://photos10.flickr.com/12887370_d1ef251237_s.jpg" alt="untitled" /></a>
<a href="http://www.flickr.com/photos/dan_and_claire_nelson/12960929/"><img src="http://photos11.flickr.com/12960929_fd5ca5d6b8_s.jpg" alt="untitled" /></a>
<a href="http://www.flickr.com/photos/55812825@N00/12826457/"><img src="http://photos11.flickr.com/12826457_91a72b7928_s.jpg" alt="untitled" /></a>
<a href="http://www.flickr.com/photos/tmix/10157601/"><img src="http://photos6.flickr.com/10157601_d1cca86310_s.jpg" alt="untitled" /></a></p>
<p>The above pictures are saved as my <a href="http://www.flickr.com/photos/dreadedhill/favorites/">"favorites" on
Flickr</a>, are all
taken by others, and each struck me in more than one way. Looking at the
set, I realized - at least to my mind - they told a story of sorts.
Probably all too personal - would someone else see the same story?</p>
HitchhikersGUI2005-05-28T00:00:00Zhttps://bannister.us/weblog/2005/hitchhikersgui
<p><a href="http://www.flickr.com/photos/betsythedevine/16115269/" title="photo sharing"><img src="http://photos9.flickr.com/16115269_8f34b6572a_m.jpg" alt="hitchhikersgui" /></a></p>
<p>Amusing if you write software, perhaps (from <a href="http://betsydevine.weblogger.com/2005/05/27#a2322">from h2g2</a>).</p>
OASIS Office Document Standards2005-05-27T00:00:00Zhttps://bannister.us/weblog/2005/oasis-office-document-standards
<p><a href="http://www.oasis-open.org/news/oasis_news_05_23_05.php">OASIS - News -
05-23-2005</a></p>
<p>This is big news - there is now a well-designed standardized format for
office documents. This is good news for business, as this means
documents created today will be readable forever.</p>
<p>In 2004 Microsoft took in <a href="http://www.microsoft.com/msft/ar04/nonflash/10k_fr_da.html">$10.8
billion</a> in
from "Information Worker" products, of which Office was probably the
largest part. Doubtless they will clear another $10 billion or so this
year just on inertia (that is one big pile of inertia!).</p>
<p>The standardized document formats mean businesses can drop out of the
Microsoft upgrade cycle. Frankly the improvements in Office in the past
decade have been relatively minor, and certainly not worth the upgrade
costs. What drives businesses to upgrade to new versions is the simple
fear that someone might send them a document from a newer version of
Office, which they will be unable to read.</p>
<p>The availability of OpenOffice (packaged as StarOffice gets you support
from Sun) means that you no longer need to buy Microsoft Office in the
first place.</p>
<p>Give the business world a few (or several) years for this to sink in,
and you create a 10 billion dollar hole in Microsoft's revenue. While
the reason to buy MS Office has gone away, the stunning thought in all
this is that Microsoft is going to collect <strong>tens of billions of
dollars</strong> of revenue, just from business inertia!</p>
Astronic Super Hero!2005-05-27T00:00:00Zhttps://bannister.us/weblog/2005/astronic-super-hero
<p><a href="http://www.flickr.com/photos/dreadedhill/15725616/" title="photo sharing"><img src="http://photos12.flickr.com/15725616_72a8f91702_m.jpg" alt="heroes" /></a></p>
The Astronic Express2005-05-24T00:00:00Zhttps://bannister.us/weblog/2005/the-astronic-express
<p><a data-flickr-embed="true" href="https://www.flickr.com/photos/dreadedhill/15398402/in/photolist-d3qvA9-byGRG4-b1pFDn-aGqrXR-aGqrxF-arBok5-ae39iN-9XvWmz-9XvWCZ-9Lq2un-9Lq2Gn-CBBY7-9NcQq-9Ncyq-9Ncq7-9NcVQ-9NcGy-9nLaF-2oAFj-2mVpG" title="The Astronic Express"><img src="https://c3.staticflickr.com/1/14/15398402_f4a1a1e36c_z.jpg" width="640" height="480" alt="The Astronic Express" /></a><script async="" src="https://embedr.flickr.com/assets/client-code.js" charset="utf-8"></script></p>
<p>Very regular folk.</p>
Intelligent Design2005-05-24T00:00:00Zhttps://bannister.us/weblog/2005/intelligent-design
<p>Life on Earth was created by Space Aliens!! Proved by advocacy groups
with funding from rich religious zealots!</p>
<p>Heh. If the so-called <a href="http://www.intelligentdesignnetwork.org/">Intelligent
Design</a> folks are not just
selling a slightly warmed-over version of creationism, then what is the
alternative?</p>
<p>Actually I would entertain the notion that visitors from elsewhere might
well have interfered in the evolution of life on Earth. Perhaps (very!)
ancient visitors seeded the very first life on this planet. Certainly
this seems within the realm of possibility, though I would guess rather
unlikely. The possibility is interesting, but lacking any compelling
evidence, would have to file this away with all the other
interesting-but-unlikely theories.</p>
<p>Back in college I watched a group of students from the Astronomy class
(the one for non-science majors) struggle with the concepts of scale and
planetary movement. What I realised is that there is a substantial chunk
of the human population that simply cannot absorb the concept of scale.
For some the scale of time counting in billions of years is simply
inconceivable. Without at least some grasp of scale (billions of years
with a planet-sized workshop) evolution must seem a miracle rather than
an incredibily slow process.</p>
<p>The response to someone promoting the "intelligent design" notion as not
just religion in disguise has to be:</p>
<p><strong>"So you think life was created by Space Aliens??"</strong></p>
On adults and responsibility2005-05-22T00:00:00Zhttps://bannister.us/weblog/2005/on-adults-and-responsibility
<blockquote>
<p><a href="http://www.techknowtimes.com/?p=18">TechKnow Times » Why mandatory E-911 for VoIP is a very bad
thing</a>
But hey, this is America, we don’t expect people to take personal
responsibility for anything.</p>
</blockquote>
<p>One thread in the cloth of which our civilization is built - or in this
case a thread that should be re-thought.</p>
<p>Should not a "responsible citizen" be, well, <strong>responsible</strong>? This meme
bears repeating. Should adults be expected to be responsible for their
own choices?</p>
<p>Let us re-visit some assumptions...</p>
<p><strong>Speed Limits</strong></p>
<p>Why do we have speed limits? To protect the driver? Should that not be
up to the driver? To protect others? In crowded areas this makes sense.
By the same notion in remote or less-travelled areas the need for speed
limits is less or none.</p>
<p>If you hop onto the local freeway what portion of cars are at or under
the speed limit? Around here that would be few or none. What purpose
does a law serve that practically everyone breaks?</p>
<p>Signs with recommended speeds are always a good idea, if the speed
recommended is based on the actual road. When you are driving across the
country and the sign indicates a recommended speed of 35 miles/hour for
an upcoming curve, any good driver is going to take notice. For the
driver that does not take notice, if they only harm themselves, why
should we have laws to prevent this?</p>
<p>What brings this to mind is a mildly diverting local road through a
small canyon. This road regularly claims the lives of drivers (mostly
teenagers) that choose to drive too fast through the canyon. Either for
this reason, or because this once-remote canyon is turning into
high-priced suburbia, the speed limit on the road has been lowered to
35mph. This limit is ridiculously low, (you can hold 55mph through
almost the entire road without difficulty) so of course now practically
every driver on this road is in violation of the law. At the same time
young (mostly) drivers still drive well in excess of both the posted
limit and safe speeds.</p>
<p>This is silly. The lower limit accomplishes nothing, aside from create a
revenue-generating opportunity for the local police.</p>
<p>Without speed limits what do you do if someone drives without regard to
risk to others? You do the same as now. An officer can give you a ticket
if in their judgement you were driving recklessly. Posted speed limits
are a bit silly in the opposite sense, as there are times (in rainy or
foggy conditions) when even the posted limits are <strong>too fast</strong> for
safety.</p>
<p>You should drive at a speed you consider safe. Signs should help you
make this judgement. Officers can cite you if <em>in their judgement</em> you
were driving at an unsafe speed for the current conditions.</p>
<p>If someone gets killed driving too fast - <strong>Think of this as evolution
in action.</strong></p>
<p><strong>Wilderness</strong></p>
<p>The local wilderness area has a sign detailing a list of harm that might
come to you in the park, and disclaimers. They also close the park after
the rains. At first I thought this was to protect the trails, but later
realized that single strong rainfall does far more damage than an entire
year of hikers and bikers. The county has a $500 fine for entering a
closed park. The rationale is that people might hurt themselves on the
muddy trails, and sue the county.</p>
<p>This too is silly. Adults should be responsible for their own
behavior -- and their own mistakes.</p>
<p><strong>Responsible is the definition of Adult</strong></p>
<p>I believe that we should encourage and rely on adults taking full
responsibility for their decisions.</p>
Java Harmony2005-05-18T00:00:00Zhttps://bannister.us/weblog/2005/java-harmony
<p>Somehow we need to get Jonathon to talk to
<a href="http://www.devx.com/Java/Article/28125/1954?pf=true">James</a> about
syndication.</p>
<p>First, well-run open source projects never allow "random" people commit
access. Commits generally get some level of review from trusted
committers. Do you really think that all the people outside Sun who
might be interested in contributing are not as smart as the folks at
Sun?</p>
<p>Second, your "enterprise" customers want a version of Java backed by
Sun. This is perfectly reasonable. I see no reason why the "Sun Java"
distribution cannot be built off a common open source base, then tested
and certified by Sun. Jonathan has a pretty good article on what he
calls "syndication".</p>
<p>We have a problem. Programming on the non-Microsoft systems needs to get
above the C/C++ level. Java would be an excellent candidate, but ... it
is not happening. Instead we have folks using Mono. If I were Bill Gates
(and friends), I would love Mono. Today I get more applications written
that could run on .NET (and fewer in Java), and tomorrow I can pull out
the rug and forbid running on anything other than Windows. This is a
sweet deal - for Microsoft.</p>
<p>The benchmark is to get the full JRE and/or JDK installed on every major
Linux distribution. Java should be ubiquitous.</p>
Caseless critic2005-05-18T00:00:00Zhttps://bannister.us/weblog/2005/caseless-critic
<p>The New Yorker has a <a href="http://www.newyorker.com/printables/critics/050523crci_cinema">fairly vacuous piece by a
"critic"</a>
trashing the current Star Wars movie.</p>
<p>Now for context - I view the opinions of "critics" with a huge amount of
skepticism after recently going to see two different movies ("Sideways"
and "Adaptation") about which the critics positively raved - both of
which were without doubt the <strong>worst</strong> movies I have ever seen. In both
cases I walked into an otherwise empty theatre, and in both cases walked
out halfway though - something I had never done before - leaving a
completely empty theatre.</p>
<p>There is no doubt that "Star Wars" is space opera - vividly imagined,
very well executed - but not meant to be mistaken for a philosophical
piece. Taken as such, the "Star Wars" series is an outstanding work.</p>
<p>One notion the critic has trouble with is a relatively sanitary future,
and a lack of obession with bodily functions. There are many possible
alternate futures. Science fiction at it's best imagines something
<em>different</em> and paints the differences as vividly as possible. In a
future with a long history of pervasive automation and mixture of alien
species, it should not be hard to imagine public and private spaces
well-cleansed. It also makes sense that sex and other bodily functions
are by convention segregated from public view (and largely irrelevant to
the story).</p>
<p>While the critic's article contains a great number of words, I find very
little imagination. Rather it seems the critic has some fixed internal
standard of how the world and it's stories should work. Science
fiction - at it's best - is about breaking those boundaries and
imagining fundamentally <em>different</em> futures.</p>
<p>For all the colorful phrases, I find this critic's collection of words
remarkably shallow.</p>
Death of a Muslim Woman2005-05-15T00:00:00Zhttps://bannister.us/weblog/2005/death-of-a-muslim-woman
<p>A footnote on cultural assimilation, or the lack thereof.</p>
<p><a href="http://service.spiegel.de/cache/international/0,1518,druck-344374,00.html">The Death of a Muslim Woman: "The Whore Lived Like a
German"</a></p>
<p>Simply put - immigration should also mean the assimilation of values.
When you leave one country to live in another, there must be some
reason. If the you move to another country to gain a better life, the
assumption must be that you will largely absorb the values and practices
of your new country.</p>
<p>Civilization is not buildings or structures. Civilization is not laws
written in books, or words printed on paper. Civilization is a set of
ideas, beliefs, and practices - and as such only exists in the minds of
the people.</p>
<p>If one place in the world makes a better place to live, then immigants
must be expected to absorb the ideas and practices (perhaps not all, but
a significant part) of that better place. To preserve the "civilization"
of that place, there is no other choice.</p>
Dubious Sushi2005-05-14T00:00:00Zhttps://bannister.us/weblog/2005/dubious-sushi
<p><a href="http://www.flickr.com/photos/dreadedhill/13248368/" title="photo sharing"><img src="http://photos10.flickr.com/13248368_bf57ce692e.jpg" alt="Choices?" /></a></p>
Web versus desktop - a personal example2005-05-13T00:00:00Zhttps://bannister.us/weblog/2005/web-versus-desktop-a-personal-example
<p>My dad has sold his house in California and is preparing to move out to
Colorado. Since he will be losing his current ISP, as preparation I
wanted to switch his email from @adelphia.net to something more
portable. So I setup both @gmail.com and @bannister.us email accounts,
and configured his machines to fetch and send email from anywhere -
specifically - via POP access to the @gmail.com account, and IMAP access
to the @bannister.us account. On the sending side I configured SMTP for
both @gmail.com and @bannister.us servers.</p>
<p>This all took a chunk of time to setup and test on both laptop and
desktop, but once done email sent or received could be seen on either
machine.</p>
<p>BTW - I setup both simply to give him a chance to decide later - moving
offers too many decisions as it is :).</p>
<p>The next day he called me up to say he could not send email. The SMTP
server at bannister.us was rejecting attempts to send email, saying that
Spamcop had the laptop's IP address on a blacklist. After a bit of
digging I found that the machine's current IP address had been used to
send spam around midnight on the previous day. Now I was reasonably sure
the spam did not come from my dad's machine, as I had scanned the
machine prior (it was clean aside from one minor bit of spyware), and
was using the machine at the time.</p>
<p>We switched the default SMTP server to gmail.com (preconfigured), and he
was again able to send email.</p>
<p>As it turns out, his laptop uses Verizon Wireless for it's Internet
connection. Naturally Verizon uses DHCP. I expect that when he switched
on his machine in the morning, the DHCP lease had expired, and he ended
up with the spamming machine's IP from the night before.</p>
<p>My dad's comment was had he wished he understood more about how all this
worked. The remarkable aspect of this is that my dad qualifies as a
hard-core techie - if you have owned more than one modem or cellphone,
there is a good chance the chips inside have a bit of his work. His
domain is in hardware, not software.</p>
<p>You can draw a number of conclusions from the above - one being that
Verizon should probably modify their DHCP lease policies slightly. What
I get from this is another example of why web applications (in this case
email) <strong>should</strong> win out over desktop applications. It took a chunk of
time to get two machines setup properly (easy for me to do - but still a
chunk of time). There is really no good reason to ask my dad to spend
time understanding the POP/SMTP/IMAP workings. When it broke, the
resolution and understanding the cause took another chunk of time.</p>
<p>Put differently - would you rather ask my dad to read up on the guts of
email, or would you rather see new cellphones come out a bit faster?</p>
<p>Web applications win...</p>
What every dog needs2005-05-11T00:00:00Zhttps://bannister.us/weblog/2005/what-every-dog-needs
<p><a href="http://www.flickr.com/photos/dreadedhill/13508915/"><img src="http://photos10.flickr.com/13508915_09531da321_m.jpg" alt="dog" /></a></p>
Mobile Web Design2005-05-11T00:00:00Zhttps://bannister.us/weblog/2005/usability-in-the-news-mobile-web-initiative
<p>From <a href="http://www.usernomics.com/news/2005/05/mobile-web-initiative.html">Usability In The News: Mobile Web
Initiative</a>
<img src="http://usernomics.com/images/pocketpc.jpg" alt="(picture of cluttered
screen)" /></p>
<p>Just to point out the blazingly obvious - this screenshot is an example
of awful design all around.</p>
<p>Because the screen is very small, only a tiny awkward piece of the web
page is visible. The fault is in the web page design and not allowing
for efficient display on (very!) small screens.</p>
<p>Worse, the container (web browser) gobbles up much (most?) of the space
that might be used for content with decorative borders and widgets. The
content matters - especially on small screens - not the coolness of the
decorations.</p>
Oops2005-05-10T00:00:00Zhttps://bannister.us/weblog/2005/oops
<p><a href="http://www.flickr.com/photos/noqontrol/13274585/" title="photo sharing"><img src="http://photos10.flickr.com/13274585_8540281eab_m.jpg" alt="oops" /></a></p>
Layers2005-05-10T00:00:00Zhttps://bannister.us/weblog/2005/layers
<p><a href="http://www.flickr.com/photos/rettie/13006949/" title="photo sharing"><img src="http://photos11.flickr.com/13006949_7a30495e55_m.jpg" alt="untitled" /></a></p>
Flickr2005-05-10T00:00:00Zhttps://bannister.us/weblog/2005/flickr
<p>Settled on using <a href="http://flickr.com/">Flickr</a> to keep the bulk of <a href="http://www.flickr.com/photos/dreadedhill/">my
online photos</a>, as you can
likely tell from the prior posts :).</p>
HitMaps2005-05-07T00:00:00Zhttps://bannister.us/weblog/2005/hitmaps
<p>More eye-candy - <a href="http://kmi.open.ac.uk/projects/hitmaps/">HitMaps</a>.</p>
Google Web Accelerator considered useful2005-05-07T00:00:00Zhttps://bannister.us/weblog/2005/google-web-accelerator-considered-useful
<p>So the new <a href="http://webaccelerator.google.com/">Google Web Accelerator</a>
is <a href="http://radar.oreilly.com/archives/2005/05/google_web_acce_1.html">O'Reilly Radar >causing grief for some web
applications</a>
when GET is used for destructive operations. Given that common advice is
to not perform operations of this sort on a GET ... wait, should I feel
badly about this??</p>
<p>On the other hand, maybe this is really a good thing :).</p>
An unfortunate graphic2005-05-07T00:00:00Zhttps://bannister.us/weblog/2005/an-unfortunate-graphic
<p>When checking flight information, came across this graphic.
<img src="https://bannister.us/weblog/images/about-us-airways.gif" alt="US Airways Airbus" /></p>
<p>This bears a resemblence to a airline crash test.
<img src="https://bannister.us/weblog/images/airline-crash-test.jpg" alt="Airline crash
test" /></p>
<p>Note to designers - always depict airliners elevated above any sort of
horizontal graphic.</p>
zarathustra2005-05-01T00:00:00Zhttps://bannister.us/weblog/2005/zarathustra
<blockquote>
<p><a href="http://www.zoroaster.net/indexe.htm">zarathustra</a>
Zarathustra never imagined praising a God who is a bribe taker. The
one, who is bribed by worship and then he rewards his worshiper with a
part of paradise. The Almighty God is not a dealer, he is neither a
buyer nor a seller, and does not need also to be flattered by his
creatures.</p>
</blockquote>
<p>Worth reflection - what does it mean (if anything) when a civilization's
main deity accepts bribes?</p>
<blockquote>
<p>“Iranians do not use harsh words and to them lying is considered the
worst sin. Next to lying is borrowing money. Because, when a person is
debtor, sometimes he is compelled to tell lie.”</p>
</blockquote>
<p>Not a bad notion.</p>
<blockquote>
<p><strong>Why Zarathustra’s Philosophy was gradually Forgotten?</strong></p>
<p>The answer to this question is quite clear. Zarathustra was against
bartering for gaining power through the name of God. He was also
against the inhumane sacrificing of animals, which was a lucrative
source of income for religious leaders. Moreover, since Zarathustra’s
philosophy frequently indicates that three principles of good
reflection, good words, and good deed; lead to human exaltation,
therefore, there remains no need for religious leaders to assume the
role of mediating between God and people like other religions.</p>
</blockquote>
<p>In other words, this particular religion made a poor
<a href="http://en.wikipedia.org/wiki/Franchising">franchise</a>.</p>
Old India2005-05-01T00:00:00Zhttps://bannister.us/weblog/2005/old-india
<blockquote>
<p><a href="http://www.gutenberg.org/etext/103">Around the World in 80 Days by Jules
Verne</a>
Everybody knows that the great reversed triangle of land, with its
base in the north and its apex in the south, which is called India,
embraces fourteen hundred thousand square miles, upon which is spread
unequally a population of one hundred and eighty millions of souls.</p>
</blockquote>
First impressions2005-05-01T00:00:00Zhttps://bannister.us/weblog/2005/first-impressions
<p>Reading about "thin slicing" in <a href="http://www.amazon.com/exec/obidos/tg/detail/-/0316172324/qid=1115015047/sr=8-1/ref=pd_csp_1/102-2511829-7224922?v=glance&s=books&n=507846">Blink : The Power of Thinking Without
Thinking</a>
reminds me of the only direct encounters I have had with political
figures.</p>
<p>First there is <a href="http://www.toddspitzer.org/about.htm">Todd Spitzer</a> who
came to speak locally on a couple of occasions. I found his manner very
matter-of-fact and his answers to questions very sensible. Some of his
answers - while offered in the most constructive manner possible - were
clearly not what the audience wanted. No pandering to our local audience
at least. My impression formed from watching Todd was that here was
someone who seemed both thoughtful and trustworthy. Admittedly a tenuous
observation based on a purely subjective impression, but one I have
since had no reason to change.</p>
<p><a href="http://www.toddspitzer.org/about.htm">Todd Spitzer</a> ended up on the
Orange County Board of Supervisors, and in that post he caused endless
trouble by speaking out quite clearly whenever the county government was
about to do something dumb or dubious (which was rather often). The fact
that he survived politically was - frankly - a bit of a surprise.</p>
<p>Later he was elected to the California State Assembly and became
Assemblyman Todd Spitzer. Unfortunately his present political territory
does not include my community - by some clear intent I do not
understand.</p>
<p>Ran into Spitzer at the Orange County Airport a couple weeks back while
waiting in line for the security check. He said something about things
"going in cycles" in response to my stating I missed seeing him in the
local papers. Not sure what that meant...</p>
<p>At around the same time two candidates for county sheriff also came
around and spoke locally.</p>
<p>One was a police chief in Santa Ana, who while not at all slick in his
presentation seemed at least to be sincere and to possess and ability to
solve problems. While not overly impressed, I did suspect he might be
sincere and trustworthy.</p>
<p>The second was <a href="http://www.ocsd.org/SitePages/Titles/TitleBiography.asp">Michael S.
Carona</a> who was
later elected and is currently the Orange County Sheriff. While I could
not say exactly why, for some reason after hearing him speak, I just did
not trust the man. Maybe he was just a little too slick. Maybe it was
because he was a little too well funded.</p>
<p>Since then there have been <a href="http://twistedbadge.com/theoc_10.htm">no
shortage</a> of
<a href="http://www.latimes.com/news/local/la-me-carona19apr19,1,2646741.story?coll=la-headlines-california&ctrack=1&cset=true">dubious</a>
<a href="http://www.ocweekly.com/ink/05/32/news-moxley.php">stories</a> involving
the Sheriff and the then-new <a href="http://www.oc.ca.gov/da/index.htm">County District
Attorney</a> (who has a rather
remarkable and dismaying history). While I might be fairly certain the
County DA is a dubious character, about the County Sheriff the story
does not seem nearly as clear. Still, I have not lost that first direct
impression - I simply do not trust the man to any great extent.</p>
<p><strong>Update 10/30/2007:</strong> Seems my mistrust of Carona was
<a href="http://news.google.com/nwshp?tab=wn&ncl=1122885946&hl=en&topic=h">well-founded</a>.</p>
Computer Chaos2005-04-28T00:00:00Zhttps://bannister.us/weblog/2005/flickr20photo20download3a20computer20chaos
<p>What happens when a new flat panel arrives and a (not-so) old computer
dies in the middle of a project.
<img src="http://photos8.flickr.com/11439635_af179a221f.jpg" alt="Computer Chaos" />
Before this I had two computers on a KVM switch sharing a single
monitor and keyboard, with all the wires tucked away, and (relatively)
neatly routed. When the nice/new Dell 24" flat panel arrived -- my main
Windows 2000 work box died. Not a big surprise, as the box has had
occasional problems for months -- so I knew this was coming. So the
prior test/Linux box is - at least for the moment - a Windows 2003
Server box, and my old Windows box is about to become spare parts.</p>
<p>Guess this is my excuse for starting to replace existing computers with
smaller/quieter models. Ordered a Shuttle XPC box and 3Ghz Sempron. Need
to pick out another video card able to drive both 1920x1200 and
1600x1200 screens. The remaining bits can come from the old Windows box.</p>
<p>After all the boxes are setup again, can figure out how to get
everything neatly routed -- but at least for now, this is ordered
chaos....</p>
The Prince2005-04-24T00:00:00Zhttps://bannister.us/weblog/2005/amazoncom-books-the-prince
<blockquote>
<p><a href="http://www.amazon.com/exec/obidos/tg/detail/-/0553212788/qid=1114315659/sr=1-1/ref=sr_1_1/103-9694390-2277452?v=glance&s=books">Niccolo Machiavelli, "The
Prince"</a>
The rulers of republics or kingdoms must therefore seek to preserve
the principles of their religion. Having done this, they will find it
an easy matter to keep the state devout, obedient, and united. They
should seek to favor and strengthen every circumstance that tends to
enhance religion, even if they themselves judge it to be false. The
wiser they are about natural reality, the more they should do this.</p>
</blockquote>
<p>A pretty remarkable statement from a guy living 500-odd years ago in
Italy.</p>
real or not?2005-04-23T00:00:00Zhttps://bannister.us/weblog/2005/real-or-not
<p>Bought some shirts off eBay in my <a href="http://cgi.ebay.com/ws/eBayISAPI.dll?ViewItem&item=8301280474">brand and
style</a>
(though unfortunately not my favorite color - red being a bit hard to
come by). The prices on eBay are radically lower than prices from the
store - even when on sale. This naturally leads to the question - are
these the real thing or imitations?</p>
<p>Now, I am no expert on cloth or the manufacture of clothing, but it
seems as though two of the four shirts "feel" different. The general cut
and fit seems about the same, but the cloth feels somehow softer. Is
this just normal variation in the manufacturers output, or is the
different feel due to different manufacture? Do not know how I could
distinguish, and on a practical level what I got is probably "good
enough".</p>
<p>Of course this leads into a related question. How much does clothing
really cost? Surely not everyone can afford American prices ($60 list!)
for a shirt. Are the prices offered elsewhere in the world lower? If so
then either they must make a lesser product for other markets, or the
cost of manufacture must be <strong>much</strong> lower for all markets. Surely
twisted, woven, cut and sewn plant fiber can be produced inexpensively?</p>
Google Doom2005-04-21T00:00:00Zhttps://bannister.us/weblog/2005/google-doom
<p>When is the last time you saw a really interesting new desktop
application?</p>
<p>In the Windows application space, things have pretty much settled down
to more of the same. Office applications - word processing and
spreadsheets - have changed very little in the past decade. General use
of email and web browsers were new for a while - rather a while ago.
Even games have settled into genres with only incremental improvements
in new releases.</p>
<p>Meanwhile Google and others are proving just how much you can do with a
web application. The really interesting new applications seem to all be
web applications.</p>
<p>The old "office" applications do not have any compelling web equivalents
as yet, but on the other hand - why should they? Pretty much everyone
already has a "Writer" and "Calc" program already. Why offer what folks
already have (or can get free with OpenOffice)?</p>
<p>About the only thing that keeps my kids computers on Windows is games,
and outside office applications, games are about the only area that have
not seen a full-on web-based application.</p>
<p>The original version of "Doom" came out about twelve years ago, was
pretty compelling, and pretty much defined the genre of the first-person
shooter. (The original version of Doom was also distributed <em>on floppy
disk</em>). With the general availability of high speed Internet
connections, I wonder if we are rolling up on the time when full-on
games are distributed without ever getting packaged on CD or DVD. Since
Google has been rolling out so many interesting web applications - are
we due for <strong>Google Doom</strong>? :)</p>
<p>On somewhat the same note, while I know we are not there yet, for some
reason this quote sounded a bit old-fashioned.</p>
<blockquote>
<p><a href="http://searchenterpriselinux.techtarget.com/originalContent/0,289142,sid39_gci1080813,00.html">Experts: Linux desktop growth steady and
unstoppable</a>
I hope that some day we'll make it so that you can just drop a
Windows CD into a Linux system drive and expect it to just work, but
Wine still has a ways to go before that's going to be possible.</p>
</blockquote>
<p>Are we rolling up on the time when you can drop a Windows CD into a
Linux system - and not find anything you want to run?</p>
Healthcare losses2005-04-19T00:00:00Zhttps://bannister.us/weblog/2005/healthcare-losses
<blockquote>
<p><a href="http://www.guardian.co.uk/usa/story/0,12271,1463922,00.html">Guardian Unlimited | Special reports | GM plunges into $1bn
quarterly
loss</a>
GM needed to "accelerate" efforts "on the challenging US healthcare
situation". The cost of health provision is rattling corporate
America, particularly GM with its huge number of current and former
employees.</p>
</blockquote>
<p>Simple fact - the cost of healthcare in the US is increasing faster than
the rate of inflation, and has for the last few decades (at least). This
makes no sense. Improving technology should be reducing the cost of
healthcare.</p>
<p>The problem is not in controlling existing costs. The problem is profit.
The problem is not investing in better technology to reduce costs.</p>
<p>All that money buys a lot of political favors, so you can expect the
dirty side of this equation to stall change as long as possible.</p>
<p>What does it take to raise awareness to the point of pushing for real
change?</p>
Tough Sell2005-04-18T00:00:00Zhttps://bannister.us/weblog/2005/tough-sell
<blockquote>
<p><a href="http://story.news.yahoo.com/news?tmpl=story&cid=1803&e=8&u=/washpost/a61356_2005apr17">Bush Social Security Plan Proves Tough Sell Among Working
Poor</a>
In a society of specialization, people would rather trust their
investment and savings decisions to perceived experts, just as they
trust their car repairs to mechanics and their legal problems to
lawyers.</p>
<p>"People are wary about taking control of their Social Security, just
as I'm wary of fixing my own car"</p>
</blockquote>
Auburn Hills, Michigan2005-04-18T00:00:00Zhttps://bannister.us/weblog/2005/google-maps-opdyke-roadauburn-hills-mi
<p>Was staying north of Detroit for a few days last week. The "free"
Internet access in the hotel (Courtyard by Marriott: Auburn Hills)
worked - sometimes, or just enough to drive me slightly nuts.</p>
<p>On the other hand, I can recommend the
<a href="http://maps.google.com/maps?q=big+buck+-+Opdyke+Road,Auburn+Hills,+MI%E2%89%AA=42.658099,-83.237615&spn=0.009753,0.014098&t=k&hl=en">Big Buck</a>
brewery for decent food and beer (if you can get past the name and
dead-animal-parts decor). An amusing side note - the receipt includes a
phrase in German. Might have something to do with the
<a href="http://maps.google.com/maps?q=DaimlerChrysler+Corporation,1000+Chrysler+Drive,+Auburn+Hills,+MI%E2%89%AA=42.654537,-83.230695&spn=0.009753,0.014098&t=k&hl=en">nearby Daimler-Chrysler operation</a>,
and visiting German engineers?</p>
CDDL - Sun's license for Solaris2005-04-16T00:00:00Zhttps://bannister.us/weblog/2005/cddl-suns-license-for-solaris
<p>Just to point out the obvious - despite the
<a href="http://blogs.sun.com/roller/page/webmink/20050415#failed_as_in_succeeded_wildly">micro-storm</a> -
maybe the folks talking are the one's with a point to prove.</p>
<p>Sun's CDDL looks reasonable at the least for their purpose, and I have
an appalling lack of interest in "discussing" the license.</p>
Take this airplane - please2005-04-10T00:00:00Zhttps://bannister.us/weblog/2005/google-maps-cr-4225atlanta-tx-75551
<p>My dad has a bit of a problem. He is getting ready to sell his house in
California, retire, and move out to Colorado (where he bought a house a
few years ago). The problem is that is the remains of an old Stinson
Voyager are sitting in the backyard, and we are having trouble getting
ahold of the nominal owner. My father bought the remains a few decades
back with the intent of restoring the airplane to flying condition, but
instead spent the time working on missile guidance computers, modem and
cell phone chips (and the like). A few years ago he sold the parts to a
guy in Texas, who has not as yet(!) come around to pick up what he
bought.</p>
<p>What do you do when a guy buys something from you, but never comes
around to pick up what he bought?? An airframe and wings is not
something you can drop in a box and hand to UPS (at least not for any
sane amount of money). What will we do if moving day comes around and
the airframe is still there?</p>
<p>Now transporting an airframe from southern California to northeast Texas
is not an especially easy proposition, so you have to cut the guy a
little slack. But after four years it is not unreasonable to get a bit
impatient :).</p>
<p>Add to this the fact the new owner seems to have disappeared. Used to be
I would see him on AIM (AOL Instant Messenger) pretty much all the time
(as "choctawcwr"), have not seen him at all recently, and he does not
respond to email. We are getting a bit concerned.</p>
<p>Turns out he has been just active enough that using just his AOL email
address we can find his general
<a href="http://maps.google.com/maps?q=cr-4225,Atlanta,+TX+75551&ll=33.053314,-94.164012&spn=0.026184,0.044058&hl=en">location</a>,
(on an obscure road that only <a href="http://mappoint.msn.com/(u4zq4tz3rg1riqagulsolkek)/map.aspx?C=33.03729%2c-94.16539&L=USA&A=12&PN=1775719436&S=800%2c740&P=%7C33.03729,-94.16539%7C1%7CCR-4225%2c+Atlanta%2c%0aTX+75551%7CL1%7C&TI=CR-4225%2c+Atlanta%2c+TX+75551">MSN Maps</a>
could find), and a phone number.</p>
<p>What the airplane should look like:
<a href="http://www.acf.clara.net/scale/scale-pics-2/high-wing/stinson-voyager/stinson-voyager.html"><img src="https://bannister.us/weblog/images/st-6.jpg" alt="old picture of Stinson Voyager" /></a></p>
Popular images - why?2005-04-10T00:00:00Zhttps://bannister.us/weblog/2005/280
<p>For the past several days I have been getting dozens of hits on the weblog from two particular searchs on Google Images, most for a
<a href="http://images.google.com/imgres?imgurl=http://www.cherryflava.com/photos/uncategorized/shark01.jpg&imgrefurl=http://bannister.us/weblog/%3Fcat%3D7&h=388&w=600&sz=177&tbnid=DxiPQBTJD9YJ:&tbnh=86&tbnw=133&prev=/images%3Fq%3Dshark%2Bpictures%26hl%3Den%26lr%3D&oi=imagesr&start=3">dolphin pretending to be a shark</a>
(from this
<a href="https://bannister.us/weblog/2004/yikes">original post</a>), and another for a
<a href="https://bannister.us/weblog/2004/indeed">fashionable bit of history</a>. Why so many people coming from the <strong>same</strong> two searches all of a sudden??</p>
<p>Add to this the fact that Google Image search is returning the wrong
view of the weblog so visitors are not getting the proper post...</p>
Ubuntu - seems to be it2005-04-09T00:00:00Zhttps://bannister.us/weblog/2005/ubuntu-seems-to-be-it
<p>Given I only have limited amounts of "free" time, there are a number of
things I expect to work out of the box with a Linux distribution.</p>
<ul>
<li>Network support (vanilla DHCP in my case).</li>
<li>Video support (recent but not bleeding edge - ATI Radeon 9200,
1600x1200x32 screen).</li>
<li>Multiple disk support (partitions on more than one disk with a
single mount point).</li>
</ul>
<p>In the past I have done by-hand build and configure to get the proper
network and video drivers - but would rather not now.</p>
<p>Tried out Debian 3.0r4, Fedora 3.90 (Fedora 4 test1), Gentoo 2005.0,
Mandrake 10.1, Solaris 10, Knoppix 3.7, SUSE 9.2, Fedora 3, and <a href="http://www.ubuntulinux.org/">Ubuntu
5.04</a>. Of the whole set, I could not get
Solaris to install, Debian and Gentoo came up without X, and with the
exception of Fedora and Ubuntu the others came up short in network,
video, or multidisk support. Nothing that could not be worked around
likely - with enough work (well, Solaris probably needs different
hardware...).</p>
<p>Fedora works and is somewhat familiar. The menu organisation is somewhat
improved (in Gnome?). Ubuntu works so well at first at first I thought
perhaps this was a warmed-over Fedora distribution - but Ubuntu is based
on Debian! Interesting!</p>
<p>Ubuntu seems very well put together, and I have had an inclination to
play with Debian for various reasons, so this looks like the right
choice - at least so far.</p>
Roomba (robot vacuum) died again2005-04-06T00:00:00Zhttps://bannister.us/weblog/2005/roomba-robot-vacuum-died-again
<p>After perhaps a month with the replacement Roomba, I noticed an odd
screeching noise, no dog hair in the vacuum's bin, and increasingly
hairy carpets - despite regular runs with the robot. Not good - looks
like the brushes stopped turning.</p>
<p>Called <a href="http://www.irobot.com/support/">iRobot Customer Support</a> and got
connected immediately (a surprise). This time they want me to ship back
my failed unit before they send a replacement (not unreasonable if a bit
of a drag).</p>
<p>Funny thing is the carass of the first failed Roomba is still here. Bet
I could take both apart and put together a working unit - but that would
no doubt void the warrantee, so I am not going to try.</p>
<p>This thing <strong>is</strong> useful - when it works.</p>
Playing with Linux/Solaris again2005-04-06T00:00:00Zhttps://bannister.us/weblog/2005/playing-with-linuxsolaris-again
<p>The blank <a href="http://www.amazon.com/exec/obidos/search-handle-url/index%3Dblended%26field-keywords%3DTaiyo%252520Yuden%252520DVD%26store-name%3Dall-product-search/103-1345191-9928610">Taiyo Yuden
DVDs</a>
arrived.</p>
<p>Burnt Fedora core 4 test1, Solaris 10, and SUSE 9.2 DVDs - also with no
errors reported by the Nero verify pass.</p>
<p>Booted the Fedora DVD successfully on the test box (already an
improvement). Ran <strong>linux mediacheck</strong> which claimed there were errors
on the DVD (though the scan seemed to run in less time). Did a basic
install of Fedora 3.90 (as the DVD is labelled) without trouble. So does
this mean the Nero verify scan is defective, the Fedora <strong>mediacheck</strong>
is defective, is there some issue with the (older) DVD reader in the
test box, or did the install simply not use any files with errors?</p>
<p>After the previous
<a href="https://bannister.us/weblog/2005/solaris-10-attempt">attempt</a>
at installing Solaris 10, it seemed that the problem might well be due
to attempting to burn the installation to a poor-quality DVD. With
better quality DVDs, the installation does indeed get further...</p>
<p>Bus Error - core dumped
Solaris installation program exited.</p>
<p>Not an encouraging sign.</p>
<p>Installed SUSE 9.2 DVD. I rather like the SUSE installation program. For
some reason SUSE could not configure to use my network, though it
appears to recognize the SIS900 network hardware (common stuff). There
was one read error reported installing a package. After completing the
install and rebooting, could not start X. I have gone through the
process of manually configuring X on more than one occasion in the past.
It was a pain, and long enough ago that I do not remember the details.
Since at least Fedora can configure X with practically no help, there
just is no motivation to troubleshoot X on another distribution.</p>
<p>Pulling down Mandrake 10.1, Knoppix 3.7, and Gentoo 2005.0 for a try.
Barring better results, looks like the new box is going to get Fedora.</p>
<p>There is some chance the above errors are with the (somewhat older) DVD
reader on the test box. Have a new DVD writer on order. Will install on
the test box and re-test when it arrives.</p>
Use the web (Microsoft Windows Media)2005-04-05T00:00:00Zhttps://bannister.us/weblog/2005/use-the-web-microsoft-windows-media
<p>Downloaded an AVI file (off a Sun site in Germany), attempted to play in
Microsoft Windows Media Player, and got at error that linked to the
following web page.</p>
<blockquote>
<p><a href="http://www.microsoft.com/windows/windowsmedia/player/webhelp/default.aspx?prd=Windows&spb=MediaPlayer&pver=9.0.0.3250&os=WinNT&over=5.0.2195&olcid=0x409&clcid=0x409&id=C00D11CD">Microsoft Windows Media - Web
Help</a>
You've encountered error message C00D11CD while using Windows Media
Player...</p>
</blockquote>
<p>Now it has been a fair time since the first release of Media Player, and
I am certain users have seen this error many times. I am also certain
that the application has more specific and meaningful information than
"error message C00D11CD". This is the perfect use for a web application.
Even if the codec (or whatever) required by the data file did not exist
at the time the desktop application was built, the web application can
be continuously updated. The end result delivered to the end user would
be specific instructions rather than meaningless error codes. Better yet
the desktop application could offer to download the needed bits.</p>
<p>The end result to the end user should be software that "just works".
Hexidecimal error codes are not a valid substitute.</p>
Enticing EULA2005-04-05T00:00:00Zhttps://bannister.us/weblog/2005/uf007802gif-gif-image-720x274-pixels
<p><a href="http://ars.userfriendly.org/cartoons/?id=20050404"><img src="http://www.userfriendly.org/cartoons/archives/05apr/uf007802.gif" alt="one" /></a></p>
<p><a href="http://ars.userfriendly.org/cartoons/?id=20050404"><img src="http://www.userfriendly.org/cartoons/archives/05apr/uf007804.gif" alt="two" /></a></p>
<p><a href="http://ars.userfriendly.org/cartoons/?id=20050405"><img src="http://www.userfriendly.org/cartoons/archives/05apr/uf007805.gif" alt="trice" /></a></p>
Toyota sludge2005-04-05T00:00:00Zhttps://bannister.us/weblog/2005/toyota-sludge
<p>Visiting the Parts department at the local Toyota dealer made me wary of
the brand many years ago. The Parts departments at the local Honda
dealers I had cause to visit were always well-run and some of the folks
were exceptionally helpful. By comparison going to the dealer to get
parts for my ex-wife's Toyota was positively nasty.</p>
<p>Last time I visited PhilipG's page on the <a href="http://philip.greenspun.com/materialism/cars/sienna">Toyota
Sienna</a>, he was
very positive on the brand and his (then-new) car. Seems his experience
since then is less pleasant, and from the comments he has a lot of
unhappy company.</p>
<p>So perhaps a good litmus test is to try out the dealer's Parts
department before buying a car?</p>
No software patents means no software patents2005-04-05T00:00:00Zhttps://bannister.us/weblog/2005/no-software-patents-means-no-software-patents
<blockquote>
<p><a href="http://blogs.sun.com/roller/page/jonathan/20050404#inevitability">Jonathan Schwartz's
Weblog</a>
I can assure you they are both suspicious of richly valued companies,
with enormous patent portfolios and legal teams, evangelizing the
benefits of the GPL and the elimination of software patents. They're
beginning to see it as a means of forcing them to disgorge their
intellectual property, and convey it to those same richly valued
companies. Free software they understand: they also understand
exploitation.</p>
</blockquote>
Knocking on the door?2005-04-03T00:00:00Zhttps://bannister.us/weblog/2005/knocking-on-the-door
<p>Since posting about the last exercise installing
<a href="https://bannister.us/weblog/2005/debian-install-sorta">Debian</a>,
<a href="https://bannister.us/weblog/2005/solaris-10-attempt">Solaris</a>,
and <a href="https://bannister.us/weblog/2005/fedora-core">Fedora</a>
there are more of the following sort of log entries from the gateway.</p>
<p>Apr/03/2005 02:20:02
TearDrop Attack Detect src:81.48.242.227:6881 dst:68.5.71.42:62353 Packet Dropped
Apr/03/2005 01:56:42
Ping of Death Detect src:81.48.242.227:6881 dst:68.5.71.42:61919 Packet Dropped
Apr/03/2005 01:36:10
Ping of Death Detect src:81.48.242.227:6881 dst:68.5.71.42:61623 Packet Dropped
Apr/03/2005 01:36:08
Ping of Death Detect src:81.48.242.227:6881 dst:68.5.71.42:61607 Packet Dropped
Apr/03/2005 01:13:10
Ping of Death Detect src:81.48.242.227:6881 dst:68.5.71.42:61378 Packet Dropped
Apr/03/2005 01:13:09
Ping of Death Detect src:81.48.242.227:6881 dst:68.5.71.42:61368 Packet Dropped
Apr/03/2005 00:27:18
TearDrop Attack Detect src:81.48.242.227:6881 dst:68.5.71.42:60737 Packet Dropped
Apr/03/2005 00:05:36
Ping of Death Detect src:81.48.242.227:6881 dst:68.5.71.42:60516 Packet Dropped
Apr/02/2005 23:43:43
Ping of Death Detect src:81.48.242.227:6881 dst:68.5.71.42:60185 Packet Dropped
Apr/02/2005 23:23:11
TearDrop Attack Detect src:81.48.242.227:6881 dst:68.5.71.42:63994 Packet Dropped
Apr/02/2005 23:23:07
Ping of Death Detect src:81.48.242.227:6881 dst:68.5.71.42:63946 Packet Dropped
Apr/02/2005 23:02:03
Ping of Death Detect src:81.48.242.227:6881 dst:68.5.71.42:63594 Packet Dropped
Apr/02/2005 23:01:37
Ping of Death Detect src:81.48.242.227:6881 dst:68.5.71.42:63583 Packet Dropped
Apr/02/2005 23:01:35
Ping of Death Detect src:81.48.242.227:6881 dst:68.5.71.42:63568 Packet Dropped
Apr/02/2005 21:56:04
Ping of Death Detect src:81.48.242.227:6881 dst:68.5.71.42:61114 Packet Dropped
Apr/02/2005 21:56:03
Ping of Death Detect src:81.48.242.227:6881 dst:68.5.71.42:61107 Packet Dropped
Apr/02/2005 21:56:02
Ping of Death Detect src:81.48.242.227:6881 dst:68.5.71.42:61096 Packet Dropped
Apr/02/2005 21:19:31
TearDrop Attack Detect src:81.48.242.227:6881 dst:68.5.71.42:60422 Packet Dropped
Apr/02/2005 21:19:05
Ping of Death Detect src:81.48.242.227:6881 dst:68.5.71.42:60419 Packet Dropped
Apr/02/2005 19:39:18
TearDrop Attack Detect src:81.48.242.227:6881 dst:68.5.71.42:61471 Packet Dropped
Apr/02/2005 19:17:35
Ping of Death Detect src:81.48.242.227:6881 dst:68.5.71.42:61236 Packet Dropped
Apr/02/2005 18:34:05
Ping of Death Detect src:81.48.242.227:6881 dst:68.5.71.42:63802 Packet Dropped
Apr/02/2005 18:34:04
Ping of Death Detect src:81.48.242.227:6881 dst:68.5.71.42:63795 Packet Dropped
Apr/02/2005 17:50:14
TearDrop Attack Detect src:81.48.242.227:6881 dst:68.5.71.42:63090 Packet Dropped
Apr/02/2005 17:50:10
Ping of Death Detect src:81.48.242.227:6881 dst:68.5.71.42:63052 Packet Dropped
Apr/02/2005 17:28:58
TearDrop Attack Detect src:81.48.242.227:6881 dst:68.5.71.42:62613 Packet Dropped
Apr/02/2005 00:26:52
Ping of Death Detect src:81.227.8.77:33012 dst:68.5.71.42:6881 Packet Dropped
Mar/31/2005 21:14:11
Ping of Death Detect src:61.115.153.119:33464 dst:68.5.71.42:6881 Packet Dropped
Mar/31/2005 20:52:27
Ping of Death Detect src:61.115.153.119:32912 dst:68.5.71.42:6881 Packet Dropped
Mar/31/2005 20:18:19
Ping of Death Detect src:61.115.153.119:32905 dst:68.5.71.42:6881 Packet Dropped
Mar/31/2005 20:13:37
Ping of Death Detect src:61.115.153.119:33236 dst:68.5.71.42:6881 Packet Dropped
Mar/31/2005 17:07:34
Ping of Death Detect src:81.227.8.77:49248 dst:68.5.71.42:61041 Packet Dropped
Mar/31/2005 17:07:07
Ping of Death Detect src:81.227.8.77:49248 dst:68.5.71.42:61032 Packet Dropped
Mar/31/2005 15:35:08
TearDrop Attack Detect src:81.227.8.77:49248 dst:68.5.71.42:63171 Packet Dropped
Mar/31/2005 15:21:58
Ping of Death Detect src:81.227.8.77:49248 dst:68.5.71.42:62954 Packet Dropped
Mar/31/2005 15:07:51
Ping of Death Detect src:81.227.8.77:49248 dst:68.5.71.42:62677 Packet Dropped
Mar/31/2005 15:07:48
Ping of Death Detect src:81.227.8.77:49248 dst:68.5.71.42:62645 Packet Dropped
Mar/31/2005 14:53:44
TearDrop Attack Detect src:81.227.8.77:49248 dst:68.5.71.42:62394 Packet Dropped
Mar/31/2005 14:53:40
Ping of Death Detect src:81.227.8.77:49248 dst:68.5.71.42:62358 Packet Dropped
Mar/31/2005 14:33:05
TearDrop Attack Detect src:81.227.8.77:49248 dst:68.5.71.42:62034 Packet Dropped
Mar/31/2005 14:33:05
Ping of Death Detect src:81.227.8.77:49248 dst:68.5.71.42:62032 Packet Dropped
Mar/31/2005 13:25:08
Ping of Death Detect src:81.227.8.77:33270 dst:68.5.71.42:6881 Packet Dropped
Mar/31/2005 11:17:21
Ping of Death Detect src:61.115.153.119:1113 dst:68.5.71.42:60964 Packet Dropped
Mar/31/2005 10:34:16
Ping of Death Detect src:61.115.153.119:1113 dst:68.5.71.42:62999 Packet Dropped
Mar/31/2005 10:34:16
Ping of Death Detect src:61.115.153.119:1113 dst:68.5.71.42:62988 Packet Dropped
Mar/31/2005 10:18:28
Ping of Death Detect src:61.115.153.119:33694 dst:68.5.71.42:6881 Packet Dropped
Mar/31/2005 10:14:36
Ping of Death Detect src:81.227.8.77:33487 dst:68.5.71.42:6881 Packet Dropped
Mar/31/2005 09:01:40
Ping of Death Detect src:61.115.153.119:33323 dst:68.5.71.42:6881 Packet Dropped
Mar/31/2005 08:31:24
Ping of Death Detect src:61.115.153.119:33753 dst:68.5.71.42:6881 Packet Dropped
Mar/31/2005 06:36:32
Ping of Death Detect src:81.53.12.242:6881 dst:68.5.71.42:60112 Packet Dropped
Mar/31/2005 06:36:31
Ping of Death Detect src:81.53.12.242:6881 dst:68.5.71.42:60102 Packet Dropped
Mar/31/2005 06:36:31
Ping of Death Detect src:81.53.12.242:6881 dst:68.5.71.42:60100 Packet Dropped
Mar/31/2005 06:04:12
Ping of Death Detect src:61.115.153.119:33248 dst:68.5.71.42:6881 Packet Dropped
Mar/31/2005 04:51:19
Ping of Death Detect src:81.53.12.242:6881 dst:68.5.71.42:62244 Packet Dropped
Mar/31/2005 04:32:57
TearDrop Attack Detect src:81.53.12.242:6881 dst:68.5.71.42:61980 Packet Dropped
Mar/31/2005 04:32:30
Ping of Death Detect src:81.53.12.242:6881 dst:68.5.71.42:61966 Packet Dropped
Mar/31/2005 04:31:11
Ping of Death Detect src:61.115.153.119:33239 dst:68.5.71.42:6881 Packet Dropped
Mar/31/2005 04:09:51
Ping of Death Detect src:61.115.153.119:33570 dst:68.5.71.42:6881 Packet Dropped
Mar/31/2005 03:51:54
Ping of Death Detect src:81.53.12.242:6881 dst:68.5.71.42:61154 Packet Dropped
Mar/31/2005 03:51:53
TearDrop Attack Detect src:81.53.12.242:6881 dst:68.5.71.42:61139 Packet Dropped
Mar/31/2005 03:10:47
TearDrop Attack Detect src:81.53.12.242:6881 dst:68.5.71.42:60288 Packet Dropped
Mar/31/2005 03:10:41
Ping of Death Detect src:81.53.12.242:6881 dst:68.5.71.42:60229 Packet Dropped
Mar/31/2005 03:02:00
Ping of Death Detect src:61.115.153.119:33021 dst:68.5.71.42:6881 Packet Dropped
Mar/31/2005 02:51:51
Ping of Death Detect src:81.53.12.242:6881 dst:68.5.71.42:64024 Packet Dropped
Mar/31/2005 02:51:50
TearDrop Attack Detect src:81.53.12.242:6881 dst:68.5.71.42:64011 Packet Dropped
Mar/31/2005 02:34:30
TearDrop Attack Detect src:81.53.12.242:6881 dst:68.5.71.42:63597 Packet Dropped
Mar/31/2005 02:16:15
Ping of Death Detect src:81.53.12.242:6881 dst:68.5.71.42:63147 Packet Dropped
Mar/31/2005 02:16:15
Ping of Death Detect src:81.53.12.242:6881 dst:68.5.71.42:63146 Packet Dropped
Mar/31/2005 01:56:53
Ping of Death Detect src:81.53.12.242:6881 dst:68.5.71.42:62792 Packet Dropped
Mar/31/2005 01:39:09
Ping of Death Detect src:81.53.12.242:6881 dst:68.5.71.42:62386 Packet Dropped</p>
<p>Might just be coincidence, but given the timing I suspect there is some
relationship. Could be due to the fact I downloaded the installations
(with the exception of Solaris) via bittorrent, and have the bittorrent
client (Azureus) running to share back what I pulled down. Could be due
to at least one wannabe cracker looking for search keywords (perhaps).</p>
<p>[ Naturally this is not the entire log. Used a simple AWK script to
filter out other entries that might yield internal information. I am a
bit of a security freak. ]</p>
Google Search - movie showtimes2005-04-03T00:00:00Zhttps://bannister.us/weblog/2005/google-search-movie-showtimes
<p>The good folks at Google slipped another new feature in without my
noticing. I am accustomed to using Yahoo to get local movie showtimes.
Remembering the number of clever features the Google folks have slipped
in lately, tried searching on "movie showtimes". Got a match set back,
and almost missed the first entry was asking for a zip code (for some
reason I skipped over this section the first time, believing it was an
advertisement).</p>
<p>Entered the zipcode, and got back a useful list of local <a href="http://www.google.com/search?q=movie%3A+movie+showtimes&sc=1&near=92610&rl=1">movie
showtimes</a>.</p>
<p>I wonder if the Google folks might be better off highlighting/formatting
these inline special features a little differently. This isn't the first
time I have scanned a match set without noticing one of these
enhancements.</p>
Design mistakes2005-04-03T00:00:00Zhttps://bannister.us/weblog/2005/design-mistakes
<p>From <a href="http://www.webpagesthatsuck.com/biggest-web-design-mistakes-in-2004.html">The biggest web design mistakes in
2004</a>
(via <a href="http://www.usernomics.com/news/2005/04/biggest-web-design-mistakes-in-2004.html">Usability In The
News</a>),
some of my favorites.</p>
<p>3. Mystical belief in the power of Web Standards, Usability, and
tableless CSS.
9. Forgetting the purpose of text.</p>
<p>As a perfect example of #9 we have <a href="http://driven-technologies.com/">Driven
Technologies</a>. Note the front page
composed entirely of graphics. The lack of text makes the site
meaningless to search engines. If you heard the company name and <a href="http://www.google.com/search?q=%22driven+technologies%22&btnG=Search&hl=en&lr=&c2coff=1">did a
search</a>
you would <strong>not</strong> find the company. When <a href="http://www.google.com/search?as_q=#=10&hl=en&c2coff=1&btnG=Google+Search&as_epq=&as_oq=&as_eq=&lr=&as_ft=i&as_filetype=&as_qdr=all&as_occt=any&as_dt=i&as_sitesearch=driven-technologies.com&safe=images">Google is asked specifically
about the
domain</a>
nothing comes back. The lack of text means that despite having a
website, the company is practically invisible on the web.</p>
<p>Of course this mistake should be counted against whomever put together
the website, not the company itself.</p>
<p><strong>April 8 update:</strong> the above site-specific Google query originally
returned just a single empty result. Now there are six entries of which
only two have
<a href="http://66.102.7.104/search?q=cache:UgslAnJmkiYJ:driven-technologies.com/pg_excit.html++site:driven-technologies.com&hl=en&lr=&strip=1">associated</a>
<a href="http://66.102.7.104/search?q=cache:F4LiW56-5zAJ:driven-technologies.com/pg_cont.html++site:driven-technologies.com&hl=en&lr=&strip=1">text</a>,
and all of which were crawled by Google on April 5 between 00:00 and
03:00 (two days after the original posting). Since Google crawls this
weblog every day, it is at least possible that the mention in the weblog
prompted Google to crawl the site more throughly.</p>
<p>There is something amusing about the fact that a mention as a bad
example enhanced their visibility with Google :).</p>
What happened to Yahoo!?2005-04-01T00:00:00Zhttps://bannister.us/weblog/2005/what-happened-to-yahoo
<p>What happened to Yahoo? They started out with all these interesting
features ... then apparently bogged down.</p>
<p><a href="http://mail.yahoo.com/">Yahoo Mail</a> is probably the bright spot in all
this. After a couple years buried in spam and unusable, the filters in
Yahoo Mail seem to be finally reducing the incoming spam down to a
tolerable level. The challenge from Google's GMail prompted Yahoo to
raise the mailbox limits.</p>
<p><a href="http://photos.yahoo.com/">Yahoo Photos</a> represents another fast start
that went no where.</p>
<p><a href="http://mail.yahoo.com/">Yahoo Mail</a>, <a href="http://calendar.yahoo.com/">Yahoo
Calendar</a> and <a href="http://messenger.yahoo.com/">Yahoo
Messenger</a> together have a large possible
impact - as yet unrealized. If Mail could capture any sort of
meeting/event messages (including those sent from Microsoft Exchange),
the events could be funnelled into Calendar. An always-running Messenger
can present events ... but the interface between the two is clunky and
has been stuck in that state for a few years (the Calendar web pages
displayed within Messenger are not designed to fit in a small view).</p>
<p>Since Yahoo seems to be suffering from a lack of progress and
imagination, perhaps they could open up and allow web services access to
Mail and Calendar, and plugins to Messenger?</p>
<p>I could hope :).</p>
No strings attached2005-04-01T00:00:00Zhttps://bannister.us/weblog/2005/no-strings-attached
<p>Another curious, deep link between the past and present. Wonderful
stuff...
<a href="http://www.englishcut.com/archives/000055.html">english cut: bespoke savile row tailors: no strings
attached</a></p>
Dubious DVDs2005-04-01T00:00:00Zhttps://bannister.us/weblog/2005/dubious-dvds
<p>After a tedious bit of experimentation (burning at different speeds,
stopping other activity on the box, and burning on a different box), I
seem to have discovered what
<a href="http://www.videohelp.com/dvdmedia.php?selectmedia=1129&searchdvdplayer=2664">others</a>
already know. Using blank DVDs labeled "DVD-R 4x UI-Tran" that have on
the disk the manufacturer ID "ONIDTECH" -- <strong>all</strong> the burned DVDs have
errors. Did not know the quality of blank DVDs varied so much.</p>
<p>After wasting more hours than I care to admit, ordered
<a href="http://www.amazon.com/exec/obidos/tg/detail/-/B00081USSA/ref=pd_luc_mri/103-1345191-9928610?v=glance&s=electronics&me=A12M0K37EZSWC5&st=*">Taiyo Yuden DVD-R Media</a>
off Amazon. Apparently Taiyo Yuden is known for the best possible
quality.</p>
<p>So the failed Solaris and Fedora installs may simply be due to bad DVDs.</p>
Drug WarRant2005-04-01T00:00:00Zhttps://bannister.us/weblog/2005/drug-warrant
<p><a href="http://blogs.salon.com/0002762/">Drug WarRant</a> ... what he said.</p>
<p>For reference - drug use messed up a good chunk of my younger brother's
life, so I am anything but an advocate for drug use. At the same time, I
do not think the current/unending/futile "War on Drugs" makes sense as
pursued over the past few decades. The problem is with consumption not
production. Political cowardice is one explanation for the course
pursued.</p>
Fedora core2005-03-31T00:00:00Zhttps://bannister.us/weblog/2005/fedora-core
<p>Downloaded and burned installation DVDs for Fedora core 3 (heidelberg)
and Fedora core 4 test1. The Fedora core 3 installation started, then
started getting disk read errors. The Fedora core 4 installation offered
to scan the DVD for errors, and promptly complained about errors on the
disk.</p>
<p>Could be the DVD reader in this box is a little old, and perhaps is the
source of the Fedora and Solaris installation DVD errors. Either that or
my DVD writer is writing bad DVDs...</p>
Usability references2005-03-30T00:00:00Zhttps://bannister.us/weblog/2005/usability-references
<p>Found a couple of interesting weblogs from the log of visitors to this
weblog (pardon the recursion).</p>
<p><a href="http://www.webword.com/">WebWord Usability Weblog :: Usability and Human Factors for the
Internet</a>
<a href="http://www.usernomics.com/news/user-interface-design-news.html">Usability In The
News</a></p>
<p>Nice effect here - checking the "latest visitors" to your weblog acts
like a sort of very-selective search engine :).</p>
Solaris 10 attempt2005-03-30T00:00:00Zhttps://bannister.us/weblog/2005/solaris-10-attempt
<p>Perhaps influenced by
<a href="http://blogs.sun.com/roller/page/jonathan">Jonathan</a>, downloaded and
burned a Solaris 10 x86 installation DVD. Hit reboot (what should have
marked the end of the just-prior Debian installation) and got...</p>
<blockquote>
<p>Cannot find boot.bin</p>
<p></p>
</blockquote>
<p>Not an encouraging start...</p>
<p>This box has fairly recent/generic hardware -- ECS K7S5A Pro
motherboard, 2.4Ghz Athlon, 1GB RAM, 200GB in 2 disks, an DVD-reader
(primary) and a CD-writer (secondary) -- nothing exotic. The box has
played host to Redhat, Gentoo, Fedora, and Debian installations without
trouble.</p>
<p>Seems <a href="http://supportforum.sun.com/sunos/index.php?SQ=393b5c36cfcccc1890634e87c778c80c&t=search&srch=boot.bin+x86&field=all&forum_limiter=&search_logic=AND&sort_order=DESC&btn_submit=Search">this
symptom</a>
is not unknown, but not really explained. Popped the DVD into another
machine and found two instances of "boot.bin", so I'm thinking the
problem is not with the disk.</p>
<p>Oh well - guess I will not be playing with Solaris any time soon.</p>
Debian install - sort'a2005-03-30T00:00:00Zhttps://bannister.us/weblog/2005/debian-install-sorta
<p>Installed <a href="http://www.debian.org/">Debian</a> 3.0r4 on a spare machine,
mostly out of curiousity. There are a enough folks fond of Debian
thought it might be worth another try.</p>
<p>First, I made a horrible mistake. Downloaded, burned and installed from
9 ISO images (7 installation, 2 updates). Trying to be a good
bandwidth-citizen by downloading via bittorrent, and leaving the client
up long enough to contribute back as much as I had pulled down. After
burning the CDs it (belatedly) occurred to me that with 9 CDs I might be
in for a lot of disk swapping. Turns out, that is exactly what happened.</p>
<p>To be fair, I do believe the Debian installer is much improved over the
last version I tried. Still - getting two disks partitioned and
formatted as ext3 took an awful lot of trial and error. In addition for
some reason the video driver used during the installation painted
characters on the screen about as fast as a 9600 baud terminal.</p>
<p>The installation (or perhaps more accurately the packages in the
installation) ask a lot of questions at random times during the
installation.</p>
<p>Ideally you would like to answer an initial set of questions up front,
then go do something else while all the download/unpack/whatever batch
operations run. At the end you could do configuration on all the newly
installed software. This is not what you get with Debian. Add random
install-stopping questions to a lot of CD-swapping and the whole
procedure was rather tedious.</p>
<p>In the end Debian booted to a character-mode 80x25 login (giant letters
on a 21" panel) -- and at this point I had lost interest.</p>
Military visitors2005-03-27T00:00:00Zhttps://bannister.us/weblog/2005/military-visitors
<p>Seems that some of the visitors to <a href="https://bannister.us/weblog/2005/female-gis-flash-breasts-thong-in-mud-wrestling-contests">this
entry</a>
are coming from military sites, from
<a href="http://www.google.com/search?q=Female+GIs+Flash+Breasts&btnG=Search&hl=en&lr=">obvious</a>
<a href="http://www.google.de/search?hl=de&q=photo+of+mudwrestling%2C+Iraq&meta=">search</a>
queries. Good to know I am contributing to military, er, readiness :).</p>
<p>Too bad I don't have any pictures, for which I suspect they are
hoping...</p>
Butterflies2005-03-27T00:00:00Zhttps://bannister.us/weblog/2005/butterflies
<p>Guess it must be spring...</p>
<p>Went to the ACP Swap Meet this morning for no obvious reason. Looks like
this institution is pretty much on it's last legs. The number of vendors
is perhaps a third or less from the peak, and the number of customers
probably even less. No real surprise, as the prices at the swap are no
longer dramatically better than elsewhere. Shopping over the Internet
has much to do with this. Bought a SD Memory card (512MB for $40) to
replace the lost card for my son's digital camera.</p>
<p>Went north to bother my dad, and check out the changes to his house. He
is preparing - in increments - to sell. The back patio cover and shed
are gone - both of which I helped my dad build when I was a teenager in
high school, and were rather deteriorated. Oddly enough without the two
structures, somehow the backyard appears smaller. My parents bought this
house when I was 5 years old.</p>
<p>Took the long way home - east through Santa Ana Canyon, south on the 15
to Temecula. Ate lunch at "Farmer Boy's" (a decent hamburger joint),
then wound west on Ortega Highway (#74).</p>
<p>Somewhere in there we started to see increasing numbers of butterflies -
after some had unfortunate encounters with the windshield. By the time
we reached RSM (Rancho Santa Margarita) the numbers were remarkable -
not so dense to appear as a swarm, but when driving I would say we
passed close to one or more butterflies every 10 yards, for perhaps the
last 10-15 miles home. Looking out the window at home I see one to
several fly by every few seconds - with all heading generally northwest.
I am sure this indicates something :).</p>
The past is rolling up behind us.2005-03-26T00:00:00Zhttps://bannister.us/weblog/2005/the-past-is-rolling-up-behind-us
<p>Another sign of things passing.... <a href="http://www.voanews.com/english/2005-03-26-voa27.cfm">Monaco Prince Rainier's Health
Deteriorating</a></p>
<p>Watched <a href="http://www.amazon.com/exec/obidos/tg/detail/-/B00005JJX8/qid=1111874822/sr=1-10/ref=sr_1_10/103-1345191-9928610?v=glance&s=dvd">To Catch a
Thief</a>
on DVD a few nights ago - one of my favorite old movies. The beautiful
young woman in the film, shortly after became the bride of Prince
Rainier. She died a few years back.</p>
<p>Aside from the cars passing on the road, I wonder if you visited the
Villa in the movie - if very much has changed.</p>
Pac-man nightmare2005-03-26T00:00:00Zhttps://bannister.us/weblog/2005/pac-man-nightmare
<p><a href="http://ars.userfriendly.org/cartoons/?id=20050326"><img src="http://www.userfriendly.org/cartoons/archives/05mar/uf007756.gif" alt="Bill's
nightmare" /></a></p>
Norman Borlaug - Forgotten Benefactor of Humanity -- Center for Global Food Issues2005-03-26T00:00:00Zhttps://bannister.us/weblog/2005/norman-borlaug-forgotten-benefactor-of-humanity-center-for-global-food-issues
<blockquote>
<p><a href="http://www.highyieldconservation.org/articles/forgotten_benefactor.html">Norman Borlaug: Forgotten Benefactor of Humanity -- Center for Global
Food
Issues</a>
... the green parties of Europe have been frightened by the sudden
wave of migrants entering their traditionally low-immigration nations,
and now think that improving conditions in Africa isn't such a bad
idea after all.</p>
</blockquote>
No small fonts, please2005-03-26T00:00:00Zhttps://bannister.us/weblog/2005/no-small-fonts-please
<p>A few years back I needed new glasses (due to wear and tear) and went to
get my eyes checked. The end result was no change to the prescription,
but went away with words from the examiner "your eyes should get worse
from here on out". Apparently the human eye gets less flexible with age
and past the age of 45 most folks have increasing trouble focusing on
close-up objects.</p>
<p>Unfortunately the guy was right. I have noticed a marked change in
exactly that ability to focus on small/near objects. What this means is
that cell phones with tiny displays, and web sites with sub-sized fonts
are - almost literally - a pain to use.</p>
<p>Went searching for web pages on user interface standards, and came up
with the pages using undersized fonts. A sampling...
<a href="http://www.upassoc.org/conferences_and_events/upa_conference/2003/adv_prog_curricula.htm">UPA Conf 2003 -
Curricula</a>
<a href="http://www.sims.berkeley.edu/~awilhelm/coursework.html">Anita Wilhelm - User Interface Designer -
Portfolio</a></p>
<p>Since the lesson about websites and not using small fonts is relatively
old, this is something you might reasonably expect folks professing
expertise not to get wrong. Guess the lesson here is that when getting
ideas from a "user interface" designer, do not assume that all their
ideas are good.</p>
Designing a better cell phone user interface2005-03-26T00:00:00Zhttps://bannister.us/weblog/2005/designing-a-better-cell-phone-user-interface
<p>Given that the cell phones on the market seem to be so often badly
designed - at least in terms of usability - it seems that the industry
could use some sort of design reference. Cell phones have been on the
mass-market for rather a while. Surely by now someone would have taken a
stab at writing up some sort of guidelines, or offered some sort of
reference design?</p>
<p>Went searching and - oddly enough - did not come up with much.</p>
<p><a href="http://www.tiresias.org/guidelines/mobile.htm">Tiresias - Guidelines (Mobile
Phones)</a>
<a href="http://developers.sun.com/techtopics/mobility/midp/articles/ui/">MIDP GUI Programming: Programming the Phone
Interface</a>
<a href="http://trace.wisc.edu/docs/phones/">Trace and phones</a>
<a href="http://trace.wisc.edu/docs/phones/tcrd1/summary/index.htm">Excerpt from "Everyone
Interfaces"</a>
<a href="http://trace.wisc.edu/docs/phones/tcrd1/tcrd1.htm">Trace Center Cell Phone Reference Design
1</a></p>
<p>Seems that most of the guidelines are focused on folks with
disabilities. To be brutally honest, free-market companies care very
little about the disabled as they represent only a very small portion of
the market. On the other hand, there does not seem to be focus on
usability for mainstream consumers. Maybe I did not look in the right
places. On the other hand, since the end result - the devices on the
market - is so poor, we have to assume that effectively no one else is
able to find relevant information.</p>
<p>From personal experience I can take a rough first cut at guidelines:</p>
<ul>
<li>Screens
<ul>
<li>Screen contrast - for color screens use <a href="http://www.snook.ca/technical/colour_contrast/colour.html">Colour Contrast
Check</a>
and the referenced material as a starting point.</li>
<li>Screen contrast - for monochrome screens beware lack of contrast
in mid-level light conditions. I find the screen on my Kyocera
6035 easy to read on full sunlight and full dark (with
backlight), but relatively hard to read in a room with open
windows and daylight outside.</li>
<li>Screen element sizing - for fonts you should be looking at the
same guidelines as computer screens. Anything below 12pt at
72dpi should be considered dubious.</li>
<li>On screen elements - where possible you want to use a few common
well-recognized icons for common features (battery-full,
signal-strength-bars, mail-envelope, ring-speaker). New
unrecognizable icons should be considered dubious. The end-test
is to ask users what icons mean. If they do not know (and many
do not), consider that a problem in your design.</li>
<li>Screen size - consider that you want to present the full phone
number (or at least last seven digits) in an upsized/bold font
across the width of the display. By my measure this suggests a
minimum display width of somewhere around 30-40mm.</li>
</ul>
</li>
<li>Keyboards
<ul>
<li>Button sizing - you want the size of a key to be about the size
of the fingertip pressing the button. Wet your finger, press it
against a surface and measure the resulting impression. I get
about 10mm tall and 12mm wide. If you only want to market to
children or small women, you can use smaller buttons. Note that
for the usual three-across keypad this suggests about 36mm
minimum width.</li>
<li>Button placement - the user should be able to identify and press
a unique button by both look and feel. Trying out the phones
offered in the Verison store recently, I found myself checking
the screen to verify the button pressed (a lot). If you watch
other folks using their cell phones, you will see a lot of
double-checking the screen to verify the key pressed.</li>
</ul>
</li>
</ul>
<p>I am sure with thought, working examples (and counter-examples),
additional guidelines would be easy to come by. Note that the minimum
usable widths given above for the screen and keypad both work out to
about the same (a big hint perhaps?).</p>
<p>Consumer Reports sent out another survery lately, asking which areas we
thought they should focus their efforts. Of the choices they offered,
none really struck me as especially suitable for Consumer Reports, as
while I did not doubt their intentions, I did doubt their ability to
make a difference (some issues are just too big).</p>
<p>On the other hand, focusing on cell phones and good user interface
design might be just exactly the right-sized problem for these folks to
tackle. Guidance in choosing easy-to-use cell phones will surely help
out a lot of consumers, and the number of consumers involved is enough
to make manufacturers pay attention. I can hope :).</p>
Upcoming.com2005-03-25T00:00:00Zhttps://bannister.us/weblog/2005/upcomingcom
<p>Another site I had not previously heard of.</p>
<p><a href="http://weblog.infoworld.com/udell/2005/03/21.html#a1198">Jon Udell: Upcoming events in Keene,
NH</a></p>
<p>The failure of upcoming is two-fold. First, they have (practically) no
content. Second, they cannot succeed as an independent site.</p>
<p>Remember why email originally took off (LONG ago) on Unix, and took much
longer on other platforms? The reason was very simple. Even if you had
<strong>never</strong> used email before, if anyone sent you email you would see a
"You have mail" message the next time you logged in. Every Unix user had
an email inbox (in the standard setup) so the step from not using to
using email was very small.</p>
<p>In the early 1980's I was trying trying to convince Burroughs folks of
the value of email. Burroughs did have an in-house email application
(AMS?). You had to run the email application to check your email, and
the application was slow to startup and painful to use. Since in the
beginning no one was using the email application, there was really no
point in firing up the application every day -- just to find there was
nothing there. A classic chicken and egg sort of problem. I argued that
there had to be an inexpensive and automatic check for email
<u>every</u> time you logged in, and for <u>every</u> user. I failed to
convince anyone as no one had (at that time) made enough use of email to
see the value.</p>
<p>Ironically, at Burroughs we spent a deal of time trying to communicate.
Phone tag, written memos, hunting through offices - all were popular
pass-times of necessity.</p>
<p>Upcoming.com has the same problem. No point checking the site if there
is no content. The RSS feed solves the problem of how to check without
making a visit to their site, however they still need content and some
sort of automatic hook. Very few are going to monitor an RSS feed from a
site that has no content.</p>
<p>Jon is right - they <strong>badly</strong> need an API to add and read events from
<a href="http://upcoming.com/">Upcoming</a>.</p>
<p>Given an API and a means of tagging events, any organization could find
<a href="http://upcoming.com/">Upcoming</a> a useful place to record and
(eventually) advertise their events. Without an API and with only manual
entry ... well, the current level of participation is elegant proof.</p>
The dirty little secret of MySpace2005-03-25T00:00:00Zhttps://bannister.us/weblog/2005/the-dirty-little-secret-of-myspace
<blockquote>
<p><a href="http://www.wired.com/news/business/0,1367,66915-2,00.html?tw=wn_story_page_next1">Wired News: Are Socialites Still
Networking?</a>
Chris DeWolfe, chief executive of the competing site MySpace, claims
that when one looks at the number of unique users, his company is
getting 8 times the volume of Friendster. The site, which allows
people as young as 16 to sign up, takes what DeWolfe calls a portal
strategy, combining social networking with blogs, games and music.
MySpace launched a year and a half ago.</p>
<p>"We don't believe social networking is the end-all, be-all," said
DeWolfe.</p>
<p>MySpace users tend to be on the younger side, typically between the
ages of 16 and 32. The company has used its youthful user base as a
selling point for advertisers, who are its main source of revenue.</p>
</blockquote>
<p>The dirty little secret of MySpace - and a key part of their success -
is the fact that a large chunk of their users are <strong>under 16</strong>. Kids of
this age have no problem entering a bigger number in the "age" field on
signup.</p>
<p>Either that or there are a lot more 30 and 40 year-olds attending
intermediate and high school than I would have thought :).</p>
Full moon out tonight2005-03-25T00:00:00Zhttps://bannister.us/weblog/2005/full-moon-out-tonight
<p>Drove home in no hurry from dinner in Orange, zig-zagging through
surface streets. Saw typical semi-older/mixed southern California
suburbia in Santa Ana / Orange / Tustin. Travelled what used to be the
north edge of Irvine on Irvine road. A rather large stretch of open
space is gone, swallowed by development. Used to rather like the mix of
open space and suburbs in Irvine. Tonight it felt like I was driving
somewhere in the suburban sea between Westminister and Huntington
Beach - adjusted for construction 30-40 years later. Nice enough I
suppose, but intensely boring.</p>
<p>Beautiful full moon out tonight, and no where in the endless suburban
sea where the moon could be really seen.</p>
In Iraq2005-03-25T00:00:00Zhttps://bannister.us/weblog/2005/clintons-military-in-iraq
<blockquote>
<p><a href="http://billmon.org/archives/001772.html">Wolfowitz - The Nice Guy</a>
Clinton's military did pretty well in Iraq, huh?</p>
</blockquote>
<blockquote>
<p><a href="http://www.msnbc.msn.com/id/6802629/site/newsweek/">The Salvador
Option</a>
The Pentagon may put Special-Forces-led assassination or kidnapping
teams in Iraq</p>
</blockquote>
<p>From the <a href="http://billmon.org/archives/001645.html">Whiskey Bar</a>, and
randomly:</p>
<blockquote>
<p><a href="http://www.canismajor.com/dog/rabies.html">Dog Owner's Guide:
Rabies</a>
Recent outbreaks of rabies in Texas and Florida point to the need for
prevention. This is one disease we can and must control.</p>
</blockquote>
<blockquote>
<p><a href="http://www.boston.com/news/globe/editorial_opinion/oped/articles/2005/03/17/wheres_the_outrage_on_torture/">Where's the outrage on
torture?</a>
"The latest Pentagon report on the abuse of captives, delivered to
Congress last week by Vice Admiral Albert Church III, doesn't point a
finger of blame at Miller or any other high-ranking official. It
concludes that while detainees in Iraq, Guantanamo, and elsewhere were
brutalized by military or CIA interrogators, there was no formal
policy authorizing such abuse. (On occasion it was even condemned --
in December 2002, for example, some Navy officials denounced the
Guantanamo techniques as ''unlawful and unworthy of the military
services.")</p>
<p>But surely, Church was asked at a congressional hearing, someone
should be held accountable for the scores of abuses that even the
government admits to? ''Not in my charter," the admiral replied."</p>
</blockquote>
AOL at 14.4Kb2005-03-25T00:00:00Zhttps://bannister.us/weblog/2005/aol-at-144kb
<p>Received the new/old Kyocera 6035 pda/phone and activated with Verizon
easily (just a non-cell phone call), and played with it a bit over the
past week. Good and bad points to this phone.</p>
<ul>
<li>This fat/wide phone fits in a shirt pocket, but takes up a lot of
room.</li>
<li>The little stick used to make selections on the small screen is a
little imprecise (read: lots of mistakes and retries).</li>
<li>The black-on-gray screen is pretty hard to read in anything less
than full sunlight. If dark enough the backlight is passable.</li>
<li>Rogue doesn't work properly :)</li>
<li>Did (eventually) get the built-in modem to work, which is kind'a
cool.</li>
</ul>
<p>Installed AOL on my laptop, partly to test the modem function of the
cell phone, and partly out of curiousity. I had an AOL account I used
occasionally (it was useful at odd times for a reason I cannot recall)
up until about 10 years ago.</p>
<p>Funny thing is - AOL is <strong>painfully</strong> slow over a cell phone (nominal)
14.4Kb modem! Maybe I had just forgotten how slow dialup connections
really are...</p>
New/old cell phone2005-03-21T00:00:00Zhttps://bannister.us/weblog/2005/newold-cell-phone
<p>Lost my cell phone on a change between airliners in the Houston airport.
Was not much upset by this loss as I was not especially fond of the
phone (an Audiovox CDM-8900). Since this provides an excuse for buying a
replacement, the loss was not all bad :).</p>
<p>My two year Verizon agreement runs out in January of next year, so
switching providers at this point would be expensive. At the same time,
if I buy an expensive Verizon-only phone now, then the investment would
be wasted if I switch providers later.</p>
<p>My last phone I bought based on reading a description on the web. When I
actually got the phone, I found that that the built-in camera was
marginal, and the user interface rather horrid. In retrospect buying
without playing with the phone first was a mistake. Rather than repeat a
past mistake I went into the local Verizon store to try out the various
models.</p>
<p>Turned out -- I did not like <strong>any</strong> of the models offered by Verizon!
Cheap plastic cases, too small screens and keyboards, and stiff pricing
for few interesting features -- not what I wanted at all.</p>
<p>At this point Verizon was very near to losing me as a customer,
locked-in service or not.</p>
<p>Aside from the stiff prices for replacement phones, my dad had just gone
through a series of problems with his Verizon service. First his old
cell phone starting dying (not the company's fault). He bought a
replacement from Verizon (and knowing my dad - probably went for one of
the fancier models). After a bit we figured out his new phone had a
tendency to drop connections on it's own, and eventually he got a
replacement. At about the same time he figured out that the Verizon
service near his home had a different problem (connection noise only
apparent when in the area, not elsewhere). He wasted a lot of his time
trying to communicate this to some rather dense Verizon support folks.</p>
<p>This all took a rather large notch out of my regard for Verizon. Has to
be somewhat uncomfortable for my dad as well, since he encouraged me to
switch <em>to</em> Verizon. (The fact that my Sprint service became unusable at
both home and work was also a factor).</p>
<p>After poking around a bit on web, I find that it is (apparently)
possible to buy cell phones on the open market to use with Verizon and
most any service. The cell phones you buy from the phone company are
"locked" and only work with the company's service. The cell phones you
buy on the open market are "unlocked" and can work with any service -
provided the phone supports the frequencies and encoding methods (CDMA,
GSM, etc.) required by the service.</p>
<p>Not exactly news this, but something I did not know. Oddly enough the
phone companies do not exactly go to lengths to point this out
(surprise). They would prefer you buy only "locked" phones, which makes
switching to another service expensive.</p>
<p>In fact the only reason I figured this all out was a small mention on
the Verizon support site of the need to call to make sure your phone was
compatible with Verizon. If I bought my phone from Verizon, why would it
not be compatible?? The only logical possibility was that you could buy
cell phones from elsewhere that were not specific to Verizon ... so I
started digging.</p>
<p>My "wish list" for a fancy cell phone would include support for
Bluetooth and Java, a decent built-in camera (>2Mpixel), no Microsoft
software (too unreliable), some means of backing up the numbers in the
phone, solid construction, and a user interface that does not suck
(especially for picture send/upload). Seems this pretty much rules out
Verizon phones.</p>
<p>Turns out there are older models of combo phone/PDAs to be had on eBay
for very little money. Now I have never been especially attracted to the
notion of a PDA - seems too much like a little sub-adequate computer to
me. With all the buzz about PDAs, had some desire to play with one a
bit - but not enough of a desire to pay the premium prices.</p>
<p>Settled on the <a href="http://www.kyocera-wireless.com/qcp-6035-smartphone/">Kyocera
QCP-6035</a> which
has decent battery life and generally got good reviews. Originally
listing at $600, you can now buy them <a href="http://www.tigerdirect.com/applications/SearchTools/item-details.asp?Sku=L420-1052">from
TigerDirect</a>
for $40 (my total was $58 with 2nd day shipping). At the worst I get a
fat cell phone for a lot less money than even Verizon's basic models. At
best I get:</p>
<ul>
<li>The ability to backup/copy phone numbers between my phone and
computer (the #1 annoyance when getting a new phone).</li>
<li>A phone that can act as a modem (useful when travelling, perhaps).</li>
<li>A PDA to play with, and the ability to write/upload Palm
applications (the built-in software in cell phones tends to suck).</li>
</ul>
<p>At worst I've burnt $60 on a toy :).</p>
Free SSL certificates to open-source projects2005-03-20T00:00:00Zhttps://bannister.us/weblog/2005/hot-points-a-blog-by-go-daddy-founder-and-president-bob-parsons
<p>Not only does Bob Parsons produce a <a href="http://bobparsons.com/index.php?/archives/27-Was-the-Banned-Go-Daddy-Super-Bowl-ad-indecent.html">wonderful politically incorrect
commercial</a>,
his company <a href="http://www.bobparsons.com/FreeAntiSpywareGoDaddyProvidesFreeSSLCertsToOpenSourceProjectst.html">Go Daddy offers free SSL certificates to open source
projects</a>.</p>
<p>Have to give this guy some credit for character :).</p>
A good use for the <blink> tag2005-03-20T00:00:00Zhttps://bannister.us/weblog/2005/a-good-use-for-the-tag
<p>Was looking at another one of the <a href="http://www.jvm.de/www/index_flash_de.php">overdone/cool (or is that "kewl"?)
sites</a> based on Flash. The
visuals are pretty neat. The fonts are too small (and fixed in size).
For all the special effects, I am not sure what exactly they are trying
to communicate (aside from generally: "We're cool - send us money"). Or
to quote my dad - who was once a teenager in the midwest with an
interest in cars:</p>
<blockquote>
<p>If it doesn't go, chrome it!</p>
</blockquote>
<p>Lots of chrome - not sure if it goes...</p>
<p>Out of the entire site, there is one aspect that illustrates a good use
for the <blink> tag. When loading a new visual element, a placeholder
was shown for the duration of the load.</p>
<blockquote>
<p><strong>Loading <blink style="color: #f66">></blink></strong></p>
</blockquote>
<p>Surely we could accomplish the same effect <a href="http://www.siteexperts.com/tips/html/ts12/page1.asp">using Javascript and a
timeout</a>, an
animated GIF, or a Java applet(!). In this one case, the <blink> tag
is an elegant solution :).</p>
<p>Perhaps we might find a similar legitimate use for the <marquee> tag?
Had some entertaining examples that worked in Internet Explorer.
Apparently Firefox ignores(??) the <strong>display: inline</strong> and <strong>width:
2em</strong> styles with the <marquee> tag, so the examples did not work as
well.</p>
<p>Update: Noticed that at least in the current version of Firefox,
blinking elements (ALL blinking elements) eventually stop working. Is
this a bug or a feature?? :)</p>
The assumption behind mail-in rebates2005-03-18T00:00:00Zhttps://bannister.us/weblog/2005/the-assumption-behind-mail-in-rebates
<p>The assumption behind mail-in rebates is that most folks attracted to
the with-rebate price will not actually bother going through all the
hassle of collecting a mail-in rebate.</p>
<p>Staples with their "easy-rebates" breaks this model. With "easy-rebates"
the hassle the customer has to go through to collect a rebate is almost
entirely eliminated.</p>
<p>Earlier I had speculated that once manufacturers caught on, the number
of rebates you could collect through the Staples program might drop.
Guess what......</p>
<p><a href="http://www.staples.com/Catalog/Browse/SKU.asp?BCFlag=False&PageType=1&SKU=504516">Staples | SKU Level Online Catalog
Page</a>
<a href="http://shopping.ocregister.com/RopAds.aspx?adv=179018&ad=1561129">Orange County Register - Daily
Ads</a></p>
<p>Oddly enough, the number of rebates that are available through the
Staples program seem to have dimished somewhat.</p>
<p>Anyone surprised???</p>
Time to leave?2005-03-13T00:00:00Zhttps://bannister.us/weblog/2005/time-to-leave
<p>My parents moved to southern California in the early 1960's as a part of
the aerospace boom. At the time most of our neighbors were from ...
everywhere. Up until recently very few Californians were actually <em>from</em>
California. In a sense we lived on an edge. Orange County was outside of
Los Angeles, our neighborhood was surrounded by orange groves, and it
was a bit of a drive to the nearest store. By the 1970's the orange
groves were mostly gone, replaced by a sea of suburbia.</p>
<p>I understand there are many places in the world where folks generally
are born, grow up, and die in pretty much the same place. What does it
say about the character of a population when most are adventurous enough
to move from elsewhere?</p>
<p>Later I went to college in the south part of the county - then still
largely rural. When I bought this house further south, the road out was
through dark, undeveloped land, and the hills behind were largely empty
(much of which is dedicated "wilderness"). Seems as though I was trying
to stay on the "edge" in some sense.</p>
<p>Stayed put for more than ten years as my kids have grown, and in the
time between the "rural" has all but vanished. The once dark and lonely
canyons just the other side of the hills are turning into an always-lit
drive past very expensive homes. The sea of suburbia is very much all
around.</p>
<p>Yuck.</p>
Self-Checkout Technology2005-03-13T00:00:00Zhttps://bannister.us/weblog/2005/self-checkout-technology
<p>A classic study-case in user interface design awaits you at you local
Wal-Mart (or any other place that offers self-checkout).</p>
<p><a href="http://www.eweek.com/category2/0,1738,1632951,00.asp">eWEEK.com's Special Report on Self-Checkout
Technology</a>
<a href="http://www.icsc.org/srch/sct/current/sct9911/21a.html">Self-scanning tests at Wal-Mart, supermarkets register
approval</a>
<a href="http://pfft.net/stories/20040311230234.html">PFFT: Stuff your Self
Checkout</a>
<a href="http://www.complaints.com/directory/2004/january/22/11.htm">Wal-Mart, Albuquerque, NM - self checkout fast lane stressful and not
consumer
friendly</a></p>
<p>Personally I like the self-checkout (when it is open) as it saves time
and I get out the door faster. On the other hand software and user
interface is a good part of my life's work, so I can figure out how the
designer meant for things to work. Regular folks tend to be more easily
mystified.</p>
<p>Tonight was a classic example. A mother was at the self-checkout with
her two young daughters. The older daughter was handing items to her
mother to scan, and was clearly less intimidated by anything with a
screen. The mother would scan the item, place it in the bag, and the
younger daughter would take the bags and place them in the cart.</p>
<p>All perfectly reasonable.</p>
<p>But when a bag was removed the screen would present a complaint. Now
though I knew why the complaint appeared (the software was counting on
the ever-increasing weight of the bag to monitor the checkout process),
even I found the message presented somewhat obscure. The mother was
plainly puzzled by the opaque message. The older daughter had learned
that when computers present obscure messages, the best response is to
punch buttons until the message goes away.</p>
<p>In the end the daughter's stategy worked. At points the software threw
up full-screen messages with the demand that we should all wait for a
clerk to appear. The nearby clerks did not seem in any way interested.
The older daughter knew better and simply kept punching buttons, the
mother kept scanning items, and the younger daughter kept loading bags
into the cart.</p>
<p>Now I have no idea if the final total was accurate, but in the end they
paid and left. An older male standing behind me was plainly trying to
make sense of all that was going on, and was just as plainly puzzled. He
turned to his daughter (or grand-daughter?) and muttered something about
"labor-saving" devices and Wal-Mart saving the price of a clerk.</p>
<p>From the above we can see pretty clearly why ActiveX controls were an
enormous security problem in Internet Explorer :).</p>
Cramped airline seating2005-03-13T00:00:00Zhttps://bannister.us/weblog/2005/cramped-airline-seating
<p>Several years back, I flew a number of coast-to-coast flights on
American Airlines. The trips were in fact rather pleasant. I could doze
off comfortably and arrive feeling relaxed and refreshed.</p>
<p>The more recent flights have been rather unpleasant. Probably for
reasons of economy, some(?) airlines have resorted to seats that are
simply too narrow. Maybe it is just me, but I do not enjoy spending
hours in a small space unable to avoid rubbing up against total
strangers. At the end of the flights I feel tired and cramped, and
really look forward to <strong>not</strong> flying again.</p>
<p>Short of getting the company to spring for first-class tickets
(unlikely), is there some way of determining beforehand whether an
airline is cramming people in too little space?</p>
<p>The recent flights were on Delta, Continental, and Northwest Airlines.
The last couple of flights were with Northwest and Continental on
<a href="http://www.seatguru.com/airlines/Northwest_Airlines/Northwest_Airlines_Airbus_A320.php">Airbus
A320</a>
and <a href="http://www.boeing.com/commercial/737family/pf/pf_cross_section.html">Boeing
737</a>
with six-across seating. In two out of three segments I was stuck in a
center seat with seats on both sides occupied. Clearly (for me at least)
the 17 inch seat widths offered are too narrow.</p>
<p>Unfortunately I do not remember the airplanes used on the prior American
Airlines flights, or if perhaps I lucked out and the adjacent seat was
empty.</p>
<p>At this point I intend to avoid flying if at all possible.</p>
Medical students and residents2005-03-12T00:00:00Zhttps://bannister.us/weblog/2005/medical-students-and-residents
<blockquote>
<p><a href="http://www.janegalt.net/blog/archives/005202.html#43917">Asymmetrical Information: More on medical
residents</a>
... residents driving home from work were being pulled over by the
police for driving poorly. The cops found, that despite not being
intoxicated, the exhausted residents could barely drive. Some later
research stated that a relatively small amount of sleep-deprivation
was equivalent to an illegal blood-alcohol level ...</p>
</blockquote>
<p>UCI (University of California, Irvine) at the time I was in school there
was known for relatively high acceptance rates of graduates into medical
school. There were a <strong>lot</strong> of pre-med students.</p>
<p>The defining characteristic of pre-med students was an overriding
interest in maintaining a high GPA. If you could be assured of a high
grade from intense study and rote-learning, the class tended to attract
pre-med students. Outside the mass-required classes I saw very few
pre-med students, as the Physics classes were too hard, and the other
interesting classes were too risky. The few pre-med students that
strayed into Physics dropped out very quickly.</p>
<p>Selecting for high GPA is simply a means of limiting the supply of new
doctors, and has very little to do selecting for intelligence.</p>
Displaced Californian2005-03-09T00:00:00Zhttps://bannister.us/weblog/2005/displaced-californian
<p>Near Detroit, Michigan for a few days. High here was 25° (Fahrenheit)
today. On the way to the hotel there was fluffy frozen water falling out
of the sky (pretty cool -- well, cold). At home I run the heater a few
times every winter, and generally keep windows open pretty much all the
time. This is a little different. Though it was colder than what I am
used to, never did bother unpacking the jacket.</p>
<p>Have not flown any since before 9/11, so naturally I was slightly
curious to see first-hand the new security measures. Was slightly
disappointed there wasn't another "Preston Bannister" on any of their
secret lists -- passed through security without any special notice.
Guess there are not a lot of terrorists with names similar to mine.</p>
<p>Last time I was in Detroit was twenty-odd years ago, on a visit to the
(then) Burroughs World Headquarters. (Our project got tangled in company
politics -- and we lost). I suspect we were closer to downtown on that
trip. What got my attention were the many once-nice brick houses in what
looked to once have been nice neighborhoods, and were then absolutely
neglected and decayed. It was as though everyone who cared - the kinds
of folks that keep up their house and their yard - had moved away. I do
not know anything about the history of the neighborhoods in Detroit, and
wonder just how this came to pass.</p>
Carly's Way2005-03-05T00:00:00Zhttps://bannister.us/weblog/2005/carlys-way
<p>An engineer's perspective on HP and Carly.</p>
<p><a href="http://www.technologyreview.com/articles/05/03/wo/wo_delio030405.asp?p=0">Carly's
Way</a></p>
<p>About the only thing I can add to this is my complete lack of surprise.
This same meme is often repeated at tech companies. Something in the
process by which company leaders is chosen can be deadly to high
technology companies. The concerns of the moment somehow outweigh the
longer term needs, and the company ends up without a future. Sad to see
this happen to HP (and by acquisition Compaq and DEC).</p>
<p>Apple survived just such an experience. Remember Amelio? You can add the
other companies for which he was chosen as leader to this list.
Doubtless there are other "leaders" who could count as walking poison
pills.</p>
<p>The question is whether the HP board can recover from the mistake.</p>
Subscription growth in techblogs?2005-03-02T00:00:00Zhttps://bannister.us/weblog/2005/subscription-growth-in-techblogs
<p>Jon Udell took a look at the <a href="http://weblog.infoworld.com/udell/2005/03/02.html#a1188">subscription growth in
techblogs</a> and
sees a generally decelerating growth curve.</p>
<p>In fact these numbers are rather hard to interpret. What Jon was looking
at is the number of subscribers recorded in <strong>bloglines.com</strong> (an RSS
feed aggregator). What Jon is wondering about is the number of actual
<strong>readers</strong>, which is not the same.</p>
<p>I have been trying to puzzle out the other side of the question. How
many people actually read my weblog?</p>
<p>Looking at the server logs I see crawlers from search engines. Some
readers come in from a query to a search engine, and are easy to spot.
Some of the search engines can present cached results from the last
crawl, and I have no way of telling how many readers are looking just at
the cached results.</p>
<p>Looking at the server log I can see aggregators (like bloglines) and
desktop readers sucking on the RSS feed. I am not familiar with all the
products, but it sure looks like there is more than one aggregator, for
which I have no notion of the number of actual readers.</p>
<p>Could it be that the decelerating growth curve Jon sees in his bloglines
sample says more about bloglines than weblog readers? With the
increasing competition from desktop readers and other aggregators,
perhaps what we are seeing is in fact the deceleration in <strong>bloglines</strong>
growth?</p>
<p>I suppose you could get part of the answer by charting the number of RSS
requests from readers used by individuals. Perhaps more new readers are
not using aggregators? A bit tricky(!!) to figure out the number of
readers from the number of requests, as different folks/products may use
different polling intervals.</p>
<p>Also did the recent appearance of Yahoo (and others) support for reading
RSS feeds correspond to the drop off in bloglines growth? The timing
seems to be about right.</p>
<p>Not that I want to make a career out of this, but it would be
interesting to have more accurate numbers.</p>
Wikipedia database download2005-03-01T00:00:00Zhttps://bannister.us/weblog/2005/wikipedia-database-download
<blockquote>
<p><a href="http://download.wikimedia.org/">Wikipedia database download</a>
Raw database dumps</p>
<p>Last dump made: 2005-02-09 (21 days ago)
Total size 12720MB (564MB for just current revisions)</p>
</blockquote>
<p>Contributed Wikipedia content including old revisions - heavily
compressed with bzip2 - is headed towards 13GB. Wonder how much that
would be without the old revisions.</p>
<p>How long before the Wikipedia content exceeds in bulk the content of a
mainstream encyclopedia?</p>
<p>The Britannica Ultimate Reference Suite 2005 apparently fits on a single
DVD (but is this the entire print encyclopedia?).</p>
<blockquote>
<p><a href="http://store.britannica.com/jump.jsp?itemID=615&itemType=PRODUCT&path=1%2C2%2C4%2C14%2C114&KickerID=23&KICKER">The Britannica
Store</a>
# 100,288 articles/54,592,999 words</p>
<p>* 73,570 - From Encyclopædia Britannica
* 15,716 - From Britannica Student Encyclopedia
* 1,851 - From Britannica Elementary Encyclopedia
* 61 Britannica Classics
* 9,090 from the Britannica Book of the Year (1993-2003)</p>
<p># 15,160 Photos and illustrations
# 2,514 Maps
# 510 Videos
# 136 Sound clips</p>
</blockquote>
Website redesign at Staples.com2005-02-26T00:00:00Zhttps://bannister.us/weblog/2005/website-redesign-at-staplescom
<p>The Staples folks just launched their redesigned website.</p>
<p>Previously I had been mildly impressed by the folks working on their
website and web applications. We are not talking about
revolutionary/whizbang/insanely anything, rather just a cleanly put
together site where things just worked very well. The quality of the
site implementation was simply first-rate.</p>
<p>A few days back they sent out an email pre-announcement of the new site
redesign. This is a mistake. You want to send out an announcement
<strong>when</strong> (not before) the new whatever is live. Great, I read the
message, you got my interest, and ... it is not there yet. The power of
the web is in immediate and direct connections. Pre-announcements are
pretty much a waste of everyone's time.</p>
<p>Took a look at their <a href="http://www.staples.com/webapp/wcs/stores/servlet/home?ts=1109430138185&storeId=10001&langId=-1&catalogId=10052">new site
design</a>
today and ... ouch. In short: drop-down menus, too small fonts, and an
ugly fixed width layout. I wonder if they lost their old designer.</p>
<p><a href="http://www.staples.com/webapp/wcs/stores/servlet/home?ts=1109430138185&storeId=10001&langId=-1&catalogId=10052">Staples.com®. that was
easy™.</a></p>
<p>First, it seems the site now sports fly-over, drop-down menus. Argh. I
know there are a lot of designers who think drop-down menus are cool (or
"kewl"). I suppose this makes web pages look more like a "real" (i.e.
Windows) application. This is a huge mistake. Likely the younger folks
in their design group have grown up with Windows applications and
somehow see drop-down menus as natural or maybe even essential to a
"real" application.</p>
<p>Drop-down/pop-up menus did indeed once make a lot of sense as a design
element.</p>
<p>Back in the early 1980's when the <a href="http://www.myoldcomputers.com/museum/comp/mac128.htm">Apple
Macintosh</a> and
Windows were born, we had much smaller displays, less storage, and
slower CPUs. The first versions of Windows ran on a CGA display at
320x200(!), and the Mac had a 512x342 pixel black and white screen.
Small memory and disk meant the applications were small, and had a
limited number of functions. Small screens meant you needed to present
the application's functions without taking up too much space. Hence
"folding" the menus into drop-downs made a lot of sense. The designer
could enumerate all the application's (few) functions in the menus. The
user could pretty much figure out what the application could do just by
looking at all the menus. (Of course the typical "user" then was a lot
less mainstream).</p>
<p>For applications crammed into small screens and small storage, drop-down
menus were an elegant solution. That was a long time ago. There is no
need for this sort of folding or cramming in a web application. None.</p>
<p>Oh nevermind. The are smart people who have already written at length on
this subject. No sense in repeating.</p>
Things You Love In Your House2005-02-25T00:00:00Zhttps://bannister.us/weblog/2005/things-you-love-in-your-house
<p>Prompted by <a href="http://halleyscomment.blogspot.com/2005/02/things-you-love-in-your-house.html">Halley's Comment: Things You Love In Your
House</a></p>
<p>Interesting question, to which my answers are not so much about
individual things. I like the house generally - open layout, lots of
windows, quiet neighborhood. I like the fact I have been able to work
from home much of the past several years. There is still a lot that
needs doing ... an after-effect of a long marriage that went badly and
ended in divorce. Got rid of almost all the dreck collected by my
ex-wife. I get a sense of satisfaction from replacing stuff (as needed)
with well-thought choices (better-built, better-working -- not flashy or
trashy). After the longest time I think I have settled on a "palette"
and am slowly finding bits that match my taste.</p>
<p>Looking around I see lots of things yet to do, but the sense of moving
steadily forward is gratifying.</p>
It's alive!2005-02-24T00:00:00Zhttps://bannister.us/weblog/2005/its-alive
<p>After the
<a href="http://bannister.us/weblog/2005/irobot-still-dead/">last episode</a>,
the iRobot folks sent out an entirely new Roomba unit. That did the trick.
The problem was not with the charger or the battery.</p>
<p>Now I have rather a lot of spare parts ... an extra charger and battery,
the carcass of the dead Roomba (minus the wire grill sent back as
proof). Add to this the two battery-powered "virtual wall" gadgets, and
wall-mounting bracket -- for all of which it turned out I have no need.</p>
<p>Assuming the lifetime for this unit is a bit longer, I will not be
needing replacement parts for quite a while.</p>
<p>I am tempted to take apart the dead unit to see what the inside bits
involved in charging look like.</p>
How much Secrecy do we want to allow the Government?2005-02-24T00:00:00Zhttps://bannister.us/weblog/2005/how-much-secrecy-do-we-want-to-allow-the-government
<blockquote>
<p><a href="http://www.fas.org/sgp/news/secrecy/2005/02/022205.html#1">Secrecy News
02/22/05</a>
<strong>VANISHING INFORMATION RESOURCES</strong></p>
<p>With almost every passing day, public access to yet another government
information resource is extinguished. Like an exotic species or a
nearly forgotten language that suddenly becomes extinct, its
disappearance excites little attention or protest. But the cumulative
effect of many such losses is bound to be significant.</p>
<p>The latest official resource to vanish from the public domain is the
U.S. Air Force "orbital element" database. These orbital elements,
which characterize the orbits of satellites in Earth orbit, have been
freely available to the public through NASA for nearly twenty years.
Now they won't be.</p>
</blockquote>
CENSUS OF THE REPUBLICAN PARTY2005-02-24T00:00:00Zhttps://bannister.us/weblog/2005/census-of-the-republican-party
<p>Received in the mail.</p>
<blockquote>
<p>REPUBLICAN NATIONAL COMMITTEE</p>
<hr />
<p>Ken Mehlman
RNC Chairman</p>
<p></p>
Senator Bill Prist
Majority Leader
<p>Congressman Dennis Hastert
Speaker</p>
<p>Congressman Tom Delay
Majority Leader</p>
<p>Dear Fellow Republican,</p>
<p>You are among a select group of Republicans who have been chosen to
take part in the official <strong>CENSUS OF THE REPUBLICAN PARTY</strong>.</p>
</blockquote>
<p>Just for the record, this was addressed to me. I am not now and have
never been a registered member of any political party.</p>
<blockquote>
<p>Enclosed is your new <strong>GOP CENSUS DOCUMENT</strong> which was assigned and
prepared especially for you as a representative of all Republicans
living in your voting district.</p>
<p>Registration #: 6819-2286
Voting District Code: IDO3-13</p>
<p>Your answers will be used to develop a BLUEPRINT for the Republican
Party for the next 10 years.</p>
<p>The 2000, 2002 and 2004 elections have all showed how <u>critical</u>
it is that we <u>identify and contact EVERY SINGLE POTENTIAL
Republican voter in America to get them involved</u>.</p>
<p>Because it is cost prohibitive for the Republican Party to print and
mail an official <strong>REPUBLICAN PARTY CENSUS</strong> to each and every one of
the 55,000,000 Republicans nationwide . . .</p>
<p>. . . your answers will represent the views and opinions of all
Republican voters living in your voting district.</p>
<p>So even if you are undecided about some questions, please complete
your new <strong>GOP CENSUS DOCUMENT</strong> and return it to me in the next 7
days to ensure we get ample and accurate results.</p>
<p>Should we continue developing a missile defense system that would
protect our nation against nuclear missiles?</p>
</blockquote>
<p>At this point I am starting to feel a bit dizzy. The statement
<strong>assumes</strong> the "missile defense system" will in fact protect anything.
All the evidence so far is to the contrary. I am in fact in favor of
developing a <strong>working</strong> missile defense -- but that is not what we have
at present.</p>
<blockquote>
<p>Should the inheritance or "death" tax be permanently repealed? And do
you support President Bush's pro-growth policies to create more jobs
and improve the economy?</p>
</blockquote>
<p>Since my family is not rich enough such that I or my children might
benefit from repealing the inheritance tax, and since this would seem to
mean passing more of the tax load to my children -- um, no I do not see
value in a permanent repeal.</p>
<p>Also while I am all in favor of "pro-growth policies" that "create more
jobs and improve the economy", nothing really comes to mind about the
current administration to which I would apply those words.</p>
<blockquote>
<p>Should we allow religious and charitable groups to do more in reducing
poverty so that those in need get the direct help necessary to get
back on track? Or should the government be able to continue
discriminating against faith-based organizations?</p>
</blockquote>
<p>Hmm, "discriminating" sounds bad, but what exactly are they trying to
sell?</p>
<blockquote>
<p>Do you favor balancing the federal budget by cutting wasteful
government spending?</p>
</blockquote>
<p>Of course I "favor balancing the federal budget" and favor "cutting
wasteful government spending"!! Last I checked the current
Administration and Congress took us from a surplus to a record deficit.
Seems they are more the problem than the solution.</p>
<blockquote>
<p>Do you support the law, passed by the Republican Congress and signed
by President Bush, that bans partial-birth abortion?</p>
<p>Make no mistake - without your answers to the <strong>REPUBLICAN PARTY
CENSUS DOCUMENT</strong> questions. . .</p>
<p>. . . our leadership will not know how you and other Republicans at
the grassroots level of our Party feel about the critical issues
facing our nation.</p>
<p>The Republican National Committee will be unable to develop a
<strong>BLUEPRINT</strong> that will truly energize and unify our Party.</p>
<p>Without your answers, the RNC cannot fully create a campaign plan to
organize and mobilize Republicans at the grassroots level of our
Party. Most importantly, without your answers we will be unable to
help President Bush win passage of his reform agenda in Congress.</p>
<p><u>Remember. the RNC is the only Republican Committee responsible for
both the campaign strategy to maintain and expand our majorities in
the House and Senate during the 2006 mid-term elections and for
helping enact the President's agenda</u>.</p>
<p>Our margins are razor-thin. Liberal Democrats in the U.S. Senate can
still kill almost any legislation that President Bush proposes and
they can stop his appointment of judicial nominees. <u>So real reform
depends on maintaining and extending our Republican majorities in the
House and the Senate. not iust now. but over the next 10 years</u>.</p>
<p><strong>And that starts with including Republicans like you in formulating
our BLUEPRINT, then identifying, educating and turning-out Republicans
on Election Day</strong>.</p>
<p>The last three national elections have been extremely close. In 2002,
we came within a few thousand votes of losing the House and Senate to
the Democrats and liberal special interests.</p>
<p>And I don't need to tell you how critical the get-out-the-vote effort
was to our Party in 2004, when President George W. Bush won
re-election by just 3%.</p>
<p>New Hampshire was decided by just 9,171 votes; Wisconsin by 11,813
votes and Pennsylvania by 128,869 votes out of 5,676,212 votes cast in
the keystone state. In fact, if 60,000 votes had gone the other way in
Ohio in 2004 . . . John Kerry would be President today.</p>
<p>That's why your <strong>REPUBLICAN PARTY CENSUS DOCUMENT</strong> is so important.</p>
<p>It all comes down to old-fashioned methods of grassroots contact -
phone calls, door-to-door canvassing, postcards and letters to likely
Republicans.</p>
<p>Believe me, the Democrat Party is angry. The radical liberals are once
again screaming that Republicans stole the election. And if you look
at the facts, the Democrats set voter turnout records and fundraising
records in 2004 as well.</p>
<p>There is no question, the Democrats will be back with a vengeance. And
historically the party in the White House loses seats in Congress in
the off year. So you can bet the Democrats will be rejuvenating their
deflated base for 2006 and for the 2008 presidential campaign.</p>
<p>And liberal special interest groups like People for the American Way,
the Trial Lawyers and MoveOn.org, emboldened by their influence in
2004, are already filling their campaign coffers for 2006.
<u>Republican candidates at all levels will need the RNC's help</u>.</p>
<p>So please don't delay in completing your official <strong>REPUBLICAN PARTY
CENSUS</strong>.</p>
<p>Based on your response, the RNC plans to print and mail a <strong>REPUBLICAN
PARTY CENSUS</strong> to 5.5 million Republicans so that we can get a
statistically reliable sampling of our Party.</p>
<p>But at a cost of $.40 each, our <strong>CENSUS OF THE REPUBLICAN PARTY</strong>
will cost the RNC over $2.2 million.</p>
<p>So along with your completed <strong>GOP CENSUS DOCUMENT</strong>, won't you also
enclose a contribution of $500, $250, $100, $50 or even $25 to
the Republican National Committee?</p>
<p>Your gift of $500 will allow another 1,250 Republicans to take part
in this offical census. And $250 will help us reach 625 of our fellow
party activists.</p>
<p><u>But more importantly. your contribution of any size will help the
RNC unify our Party in advance of the 2006 and 2008 elections</u>!</p>
<p>2004 was a watershed year. But it was only one year.</p>
<p>Republicans will lead the nation based on an agenda that represents
your views. But we can only accomplish this goal if we maintain our
Republican majorities in the U.S. House and Senate and provide strong
support for President Bush's agenda.</p>
<p><u>And with majorities in both the House and Senate and President Bush
in the White House. we've qot more at stake than ever</u>.</p>
<p>Liberal special interests and some unions will continue to hire
hundreds of "professional activists" and put them in place in targeted
congressional districts around the country. Working together with the
radical environmentalists and ultra liberal groups, these organizers
will set their sights on taking back Congress next year.</p>
<p><u>To counter these efforts, the Regublican National Committee has
already started workinq on our campaign Dlans to grotect our
majorities in both the U.S. House and Senate</u>.</p>
<p>We're targeting key precincts where we must rebuild our party and get
each and every Republican to the polls.</p>
<p>This is why your <strong>GOP CENSUS</strong> is so important. We know the best way
to energize Republicans is to have a strong agenda that reflects their
concerns. And to do that, we need your help.</p>
<p>Won't you please:</p>
<ol>
<li>Complete your specially registered <strong>REPUBLICAN PARTY CENSUS</strong> and
return it to me today?</li>
<li>Enclose your most generous gift of $500, $250, $100, $50 or
even $25 to help the RNC mail an official <strong>REPUBLICAN PARTY
CENSUS</strong> to 5.5 million Republicans throughout the country?</li>
</ol>
<p>Remember, your new <strong>GOP CENSUS</strong> is among the very first to be
mailed. President Bush is counting on all of us.</p>
<p>Sincerely,
Ken Mehlman
Chairman</p>
</blockquote>
<p>If you have managed to get this far, brace yourself, the census proper
follows. No point in taking apart the doublespeak that follows -- either
you see it, or you do not.</p>
<blockquote>
<p><strong>CENSUS DOCUMENT QUESTIONAIRE</strong></p>
<p><strong>DOMESTIC AND INTERNATIONAL SECURITY</strong></p>
<ol>
<li>Do you support President Bush's initiatives to promote the safety
and security of all Americans?</li>
<li>Do you support the use of air strikes against any country that
offers safe harbor or aid to individuals or organizations
committed to further attacks on America?</li>
<li>Do you continue to support increasing the amount of security at
airports, train stations and all government buildings including
monuments and museums?</li>
</ol>
<p><strong>ECONOMIC ISSUES</strong></p>
<ol>
<li>Should the Inheritance or "Death Tax" be permanently repealed?</li>
<li>Do you support President Bush's pro-growth policies to create more
jobs and improve the economy?</li>
<li>Do you think Congress should focus on cutting the federal budget
deficit by reducing wasteful government spending?</li>
</ol>
<p><strong>EDUCATION ISSUES</strong></p>
<ol>
<li>Do you support President Bush's plan to make our schools more
accountable to parents and to restore local control of education?</li>
<li>Should students, teachers, principals and administrators be held
to higher standards?</li>
<li>Do you agree that teaching our children to read and increasing
literacy rates should be a national priority?</li>
</ol>
<p><strong>SOCIAL ISSUES</strong></p>
<ol>
<li>Do you support President Bush's initiative to allow private
religious and charitable groups to do more to help those in need?</li>
<li>Do you support the law, passed by the Republican Congress and
signed by President Bush, that bans partial-birth abortions?</li>
<li>Do you support the President's efforts to save Social Security for
future generations?</li>
<li>Do you think Congress should pass legislation on the Federal
Marriage Amendment?</li>
</ol>
<p><strong>DEFENSE ISSUES</strong></p>
<ol>
<li>Do you think U.S. troops should have to serve under United
Nations' commanders?</li>
<li>Do you agree that our top military priority should be fighting
terrorists?</li>
<li>Should the U.S. continue work on building a defense shield against
nuclear missile attack?</li>
</ol>
<p><strong>REPUBLICAN PARTY</strong></p>
<ol>
<li>Do you support the election of Republican candidates across the
country and rebuilding our majorities over the next ten years?</li>
<li>a. Did you vote in the year 2000?
b. Did you vote in the year 2002?
c. Did you vote in the year 2004?</li>
<li>Will you join the Republican National Committee by making a
contribution today?</li>
</ol>
</blockquote>
<p>The odd thing is -- before receiving this, er, <em>creative</em> document I was
indeed considering joining. There are some interesting voices within the
Republican party. There are a couple of local representatives (including
one I have met) of whom I have a positive impression. (There are also
some about whom I feel rather differently).</p>
<p>There is so much "spin" in this document I felt queasy after reading the
first few "census" questions. To be fair, I would not be surprised to
find the "Democrat" party might well send out missives of similar
nature.</p>
<p>No, I cannot send money in response to a document that assumes I am dull
and gullible....</p>
Relative Review2005-02-24T00:00:00Zhttps://bannister.us/weblog/2005/cannot-think-of-anything-to-add-to-this-one
<blockquote>
<p><a href="http://www.andrewsullivan.com/index.php?dish_inc=archives/2005_02_20_dish_archive.html#110927750438526777">www.AndrewSullivan.com - Daily
Dish</a>
If Al Gore, say, had, turned a surplus into years of mounting debt,
if he'd added a huge new federal entitlement to Medicare, if he'd
over-ridden the rights of states to set their own laws with regard,
say, to education, if he'd put tariffs on steel, if he'd increased
government spending faster than anyone since LBJ, if he'd said that
government's job was to heal hurt wherever it exists, if he'd ramped
up agricultural subsidies, poured money into the Labour and Education
Departments, thrown public dollars at corporate America, spent gobs of
money on helping individuals in bad marriages, used the Constitution
as an instrument of social policy, given government the right to
detain people without trial and subject them to torture, and on and
on, I don't think National Review would have been content merely to
nitpick. Do you? I think they would have mounted a ferocious attempt
to remove the guy from office. The duplicitous, budget-busting
Medicare entitlement alone should have caused an insurrection. It
didn't. I think that tells you a lot about where some conservative
thinkers are really coming from.</p>
</blockquote>
Smiling and blinking2005-02-19T00:00:00Zhttps://bannister.us/weblog/2005/smiling-and-blinking
<p>This item gives me the creeps...</p>
<blockquote>
<p><a href="http://wireservice.wired.com/wired/story.asp?section=Breaking&storyId=993154&tw=wn_wire_story">Wired
News</a>
Egyptian doctors said they removed a second head from a 10-month-old
girl [...] the second twin had developed no body. The head that was
removed from Manar had been capable of smiling and blinking but not
independent life, doctors said.</p>
</blockquote>
<p>Wonder how the "right-to-life" zealots feel about this one.</p>
ajax - a new approach to web applications2005-02-19T00:00:00Zhttps://bannister.us/weblog/2005/ajax-a-new-approach-to-web-applications
<p>Interesting point:</p>
<blockquote>
<p><a href="http://www.adaptivepath.com/publications/essays/archives/000385.php">a new approach to web
applications</a>
If anything about current interaction design can be called
“glamorous,” it’s creating Web applications. After all, when was the
last time you heard someone rave about the interaction design of a
product that wasn’t on the Web? (Okay, besides the iPod.) All the
cool, innovative new projects are online.</p>
</blockquote>
<p>Writing web applications is something of a pain. You can crank out a
good-looking desktop application using Visual Basic in little time
(though good design is often lacking, as the stock/easy UI elements tend
to force a lack of imagination). It is much harder to crank out a
relatively "rich" web application.</p>
<p>My history with GUIs goes back to the early 1980's, when on one project
I got to play with (very!) early versions of Microsoft Windows. Windows
was not far enough along, so I ended up writing a GUI framework. Windows
only really became useful in the early 1990's.</p>
<p>As an aside -- it took near ten years from the start to the point
Windows became a success. Ten years is a <strong>very</strong> long time for a small
software company (as Microsoft was at the time) to stick to a difficult
software development project. There were a number of other companies
that tried, failed, and gave up in this same period of time. Putting
aside Microsoft's other misdeeds for a moment, you have to give a lot of
credit to Bill Gates for taking a huge risk and succeeding where others
failed.</p>
<p>Through the early 1990's Microsoft made a series of substantial and
worthwhile improvements to Windows. Perusing though every new MSDN CDROM
release was worthwhile and at times even inspiring (I still have the P1,
P2 and P3 CDs). Somewhere in the mid-1990's (about the time they lost
the Dr. GUI cartoons) I started to find new MSDN releases a lot less
interesting. Microsoft was trying to sell developers on a series of new
techno-schemes which I just didn't quite find compelling (most of which
have since been deprecated or disappeared).</p>
<p>While developing web applications is, er, less than inspiring -- Jesse's
point is well-taken. The <strong>interesting</strong> new applications are web-based
applications.</p>
<p>I am still searching for that sweet spot that lets me crank out
well-constructed web applications at a good clip. I adopted
<a href="http://jakarta.apache.org/tapestry/">Tapestry</a> for my current project,
and have come to regret that decision -- not because Tapestry is a poor
piece of work (much of the Tapestry framework is well thought-out), but
rather because it comes so very close to what I think is needed, yet
completely misses the mark. (Need to clarify my thoughts and write this
up at some point).</p>
How to shoot yourself in the foot2005-02-18T00:00:00Zhttps://bannister.us/weblog/2005/how-to-shoot-yourself-in-the-foot
<p>There are folks who recommend the use of XHTML over HTML, in the
interest of promoting web standards. While this idea has some merit, I
have chosen to use HTML 4.01 (strict) as the basis for my work for the
simple reason that IE6 does not actually know anything about XHTML. IE6
will be with us for many years, and the degree to which IE6 "supports"
XHTML is more-or-less accidental.</p>
<p>It just occurred to me that - to an extent - promoting the use of XHTML
<strong>now</strong> may actually be harmful!</p>
<p>Let us say that Microsoft re-starts IE development, and decides to
support XHTML. They face an immediate problem. There are an unknown
number of web applications of in the field that have adapted to the
partial XHTML support in IE6. If the Microsoft IE team implements exact
standard XHTML support, they run the risk of breaking existing
applications! This is not a good thing, so they may (reasonably) choose
<strong>NOT</strong> to change the existing IE behavior for pages that declare XHTML
1.0 or 1.1 as their DOCTYPE.</p>
<p>The only way that Microsoft can fold XHTML support into IE without the
risk of harming their customers, is by keying their
exact-standards-compliance to a <strong>later</strong> version of XHTML. Anyone up
for XHTML 1.2? (But not too soon, or we run the risk of "spoiling" that
revision as well).</p>
<p>So the folks evangelizing the use of XHTML now have put Microsoft in a
position where they cannot implement exact XHTML compliance without the
risk of harming customers.</p>
<p>Ouch :).</p>
Travel to Cuba by US Citizens2005-02-17T00:00:00Zhttps://bannister.us/weblog/2005/travel-to-cuba-by-us-citizens
<p>In some sense Cuba is a time-capsule. As long as Castro is in charge
Cuba will not change (much). After Castro dies, likely Cuba will change
quite a lot.</p>
<p>It would be interesting to see Cuba before Castro dies. It would be
interesting to see one of the last "Communist" countries, quite close to
the United States, and apparently a nice place to visit.</p>
<p>As an American citizen, apparently this is not possible, or at least not
"allowed" -- unless you are a government official, working actor, or
sports player. (A funny grouping - all "frivolous" occupations?)</p>
<p>Somehow I doubt that Americans visiting Cuba are terribly important.
Scratch that - we know from the old Soviets that it was visits to and
from the "West" that made clear how poorly their system was performing.
The foundation for the revolution-from-within that ended the Soviet
empire owed much to these visits. Americans visiting Cuba can only
emphasize the differences, and more than likely build a similar
foundation.</p>
<blockquote>
<p><a href="http://www.ibike.org/cuba/ofac/cuba-travelto.htm">Travel to Cuba by US
Citizens</a>
At the end of 2003, OFAC had just 4 full-time employees dedicated to
investigating Ousama Bin Ladin's and Sadam Hussien's wealth, while
nearly two dozen were working on the terrorism of Cuban embargo
violation.</p>
</blockquote>
<p>Sounds like money and politics again -- servicing the whims of
Cuban-American voters is more important that addressing real threats.</p>
Navigating among Elephants2005-02-17T00:00:00Zhttps://bannister.us/weblog/2005/navigating-among-elephants
<p>Both boys had a "late start" day at school today, so we took the extra
time to go out and eat breakfast together. Headed over to my daughter's
school after dropping off both boys. Coming up the hill there was a line
of about twenty SUVs (mostly) and Minivans (few) waiting to make a left
turn. Not a single smaller vehicle in the whole bunch.</p>
<p>Left them waiting in line, and came at the school from the other side of
the hill.</p>
<p>Picked up my daughter after school, and had to work my way through
another lumbering herd on the way out. For a moment it felt as though
we'd wandered into a field of elephants.</p>
<p>Wonder how long it will take for this fad to fade. The late 1960's
/early 1970's saw a similar fad with over-sized vehicles -- only it was
"campers" and "RV's" instead of SUV's. Back in the 1970's I remember
rows of campers and RV's in the parking lot of the Anaheim Rockwell
(Autonetics) plant. Pretty silly to commute to work in such an
over-sized vehicle. Somewhere around the late-1970's the RV owners
discovered that driving small cars was a lot more fun, and less costly.</p>
A thing of beauty2005-02-17T00:00:00Zhttps://bannister.us/weblog/2005/a-thing-of-beauty
<p>To my eye the things I find beautiful are bound up with purpose and
execution. The C-130 cargo plane is one example. The original design was
made before I was born, yet descendants of the design are still in
service. This all makes perfect sense. Propellers are more efficient
than jets, and turbines are more reliable than internal combustion
engines. Given a decent wing and a clean enclosure for cargo (the
fuselage) -- there just is not a lot of room for improvement, so the
design is still in service.</p>
<p><img src="https://bannister.us/weblog/images/C-130-J-2.jpg" alt="C-130J" /></p>
<p>An elegant and fitting solution to a particular class of problem.</p>
<p>Beautiful.</p>
Is Ada one of the "Technology Losers"?2005-02-16T00:00:00Zhttps://bannister.us/weblog/2005/is-ada-one-of-the-technology-losers
<p>An old posting by Tim Bray lists the Ada programming language as one of
the <a href="http://www.tbray.org/ongoing/When/200x/2004/01/04/TPSM-Losers">"Technology
Losers"</a>.
I suspect this is somewhere between not really accurate, and entirely
wrong.</p>
<p>One of the main aims of DARPA in promoting the development of Ada was to
give developers a single programming language usable on any DOD project.
Before this if you were a programmer on a defense project, your choices
were often limited and bizarre. For the hardware in question there was
usually an assembler, there <em>might</em> be a FORTRAN compiler, there <em>might</em>
be a Jovial compiler, or there <em>might</em> be a compiler for some other
<strong>odd</strong> language you have never used before. The quality of the compiler
implementations varied by a lot. The limitations of the compilers varied
by a lot. Getting updates to the compiler might be difficult or
impossible.</p>
<p>For a programmer working on defense projects, the tools landscape was a
real mess. Re-using software between projects was somewhere between
difficult and impossible. The DOD was looking to solve this problem.</p>
<p>An aside -- Back in college our project group got tasked with
summarising reviews of proposals for Ada Programming Environments.
Pretty interesting stuff -- first we read the proposal (somewhat cutting
edge for the time), then we read the submitted reviews (also interesting
for the viewpoints).</p>
<p>Another aside -- The proposal from Texas Instruments mentioned the use
of a recursive-descent parser for Ada. One of the reviewers claimed this
to be impossible. We were amused as at that time we were using a
recursive-descent parser for Ada, hammered together by one of the group
members over a (very long!) weekend.</p>
<p>A few years back I was talking to an old college roommate who has spent
his career working on software for defense projects. His observation was
that when starting a new project, you could not be sure exactly what
sort of compilers might be available, but you <strong>could</strong> count on Ada as
one of the choices.</p>
<p>This is an <strong>immense</strong> improvement over the past. Ada is a pretty decent
programming language -- especially compared to the common alternatives
on defense projects. Programmers do not have to learn a new language.
You may be able to re-use software from previous projects. You are
likely to be able to obtain and use better tools (and re-use tools you
have used before).</p>
<p>Calling Ada a "Technology Loser" misses the fact that <strong>for the original
purpose</strong>, Ada is a huge success.</p>
Halley's Comment2005-02-16T00:00:00Zhttps://bannister.us/weblog/2005/halleys-comment
<p>Yes, well ok - so I'm late to the party. To quote my daughter -
"what-<em>ever</em>!!"</p>
<p><a href="http://halleyscomment.blogspot.com/2003/01/alpha-male-links-lessons-1-through-18.html">Halley's Comment: Alpha Male Links -- Lessons 1 through 18</a></p>
<p>On the other hand, I'm no "Alpha Male" and will never be, so the whole
thing is rather annoying. Her "voice" is interesting though. Only #9
sounds bogus - as though written in an entirely different voice.</p>
<p>Geez - this girl posts a <strong>lot</strong> ... !</p>
Groupware?2005-02-16T00:00:00Zhttps://bannister.us/weblog/2005/groupware
<p>Saw the announcement for
<a href="http://www.hula-project.org/index.php/Hula_Server">Hula</a> -- apparently
Novell is open-sourcing their email+whatever
<a href="http://www.nat.org/2005/february/#15-February-2005">NetMail</a> software.
Guess I'm interested because of the calendar piece, in some combination
with email, but less than compelled. There are so <strong>many</strong> uninspiring
calendar applications. Will have to take a look at Hula later to see if
they have done better. If done well this could be interesting.</p>
<p>For a colorful but worthwhile assessment read <a href="http://www.livejournal.com/users/jwz/444651.html">Jamie Zawinski's take on
Hula</a>.</p>
<p>We should not forget
<a href="http://www.osafoundation.org/Chandler_Compelling_Vision.htm">Chandler</a>
which is still floating out there in chunky-vaporware-land. Could end up
interesting.</p>
<p>Tim Bray touches on <a href="http://www.tbray.org/ongoing/When/200x/2005/02/16/Groupware">Sun's use of
groupware</a>
(or what amounts to something of the sort). A few year's back I set up
an internal wiki for my work-group, and used and recommended IM as a
supplement ... guess we're not too far behind. On the other hand
<em>[snipped comments only relevant within the company]</em> there are bits
that could be better.</p>
Strong Typing vs. Strong Testing2005-02-15T00:00:00Zhttps://bannister.us/weblog/2005/strong-typing-vs-strong-testing
<p>A few months back I saw (via the web - do not remember where) Bruce
Eckel speaking to a group. In the middle of the talk he posed a question
(paraphrased below).</p>
<blockquote>
<p>Do we need strong typing if we have unit tests?</p>
</blockquote>
<p>The question gave me pause as clearly he had a point ... but something
did not sit right.</p>
<p>More recently Bruce explores this same subject under <a href="http://mindview.net/WebLog/log-0025">Strong Typing vs.
Strong Testing</a>.</p>
<p>In the time between it became plain to me why this notion gave me pause.
There is a hidden assumption. To <strong>substitute</strong> testing for typing <strong>you
must believe your tests are perfect</strong>.</p>
<p>Personally, I am a bit of a skeptic. I will guarantee you that neither
the code I write, nor my tests are perfect. I suspect the same tolds
true for pretty much everyone else. When your tests are perfect, Bruce
is right -- you have no need for strong typing. But what happens when
your code encounters a situation you did not anticipate, and that your
tests do not cover?</p>
<p>As an aside, I should mention that strong typing generally allows the
compiler to emit more efficient code. A good part of the time, this is
not important. There are still times when efficiency matters.</p>
<p>A couple years back an intern asked me to review some of his code. I
stopped writing when my comments got to be longer than his original
code. What I realised is that over the years I have collected a rather
large number of practices, all aimed at reducing the occurance of errors
in my code. Many of the individual practices may only make a small
percentage difference is the error rate, but add together a few dozen of
these small items and you get a large whack taken out of the error rate.</p>
<p>Strong typing is one of those practices. Strong typing can help cut back
our error rate when our code wanders off into waters uncharted by unit
tests.</p>
<p>Not that I want to be using strong typing <strong>all</strong> the time! I have been
a strong believer in "dynamic" languages since using Lisp in college
(where I first ran into Bruce - we were both taking physics and computer
science courses at about the same time). What I would like is to be able
to <strong>choose</strong> the level of "strictness" on a case by case basis.</p>
<p>There <strong>is</strong> a group of developers who can get away with using just
dynamic languages and unit testing. This is the group that essentially
has one application, and direct access to the machine(s) on which the
application is deployed. Web applications like those hosted by Yahoo and
Google fall into this group. With only one deployment environment, unit
tests have a better chance at complete coverage. With direct access to
the machine(s) on which the application is deployed, any problems can be
fixed immediately, and the period of time any bug is seen in the field
can be very limited.</p>
<p>Guys who write books about software kind'a belong in this group too :).</p>
<p>I do not have this luxury. My applications get mainly deployed within
company intranets. I do not have direct access to most customer systems.
Practically every customer system is different -- operating system
versions, patches applied, hardware, disk layout, virus scanners,
firewalls, security configuration, and other applications running on the
same machine -- there is a <strong>lot</strong> of variation. Guaranteed when a new
version of the software goes out, we will find <strong>some</strong> combination that
causes a problem, that we did not anticipate, and for which we did not
test.</p>
<p>Add to this the fact that determining the source of the error may be
difficult, as these are production customer systems to which we do not
have direct access. What this often means is more time needed to detect
the error, more time needed to diagnose the error, and (much!) more time
needed to get the error corrected on all the customer systems.</p>
<p>In this scenario our unit tests have failed, and my only hope to stay
out of trouble is all the <strong>other</strong> tricks I have learned over the
years - all the other practices that cut down the error rate. In this
environment I want to do everything I can up-front to minimize the
chance of error.</p>
<p>Bruce has a point - unit tests count for a lot, and sometimes may be
enough by themselves.</p>
<p>Sometimes is not always, and strong typing still has a place in our bag
of tricks.</p>
Missile Defense System Fails Another Test2005-02-15T00:00:00Zhttps://bannister.us/weblog/2005/missile-defense-system-fails-another-test
<p>Sublime. Ludicrous. Insane.</p>
<p>In the <a href="http://news.yahoo.com/news?tmpl=story&cid=542&u=/ap/20050215/ap_on_go_ca_st_pe/missile_defense&printer=1">most recent
test</a>
of the "Missile Defense" system, the interceptor missile failed to make
it out of the silo.</p>
<p>Even in the easiest most watered-down tests, this fine example has a
hard time getting near the target ... and the Bush administration is
pushing deployment.</p>
<p>Do I really have to say anything
<a href="https://bannister.us/weblog/2004/welcome-to-jim-taggarts-cocktail-party">more</a>?</p>
Bandwidth2005-02-15T00:00:00Zhttps://bannister.us/weblog/2005/bandwidth
<p>Used to feel a bit silly when I checked statistics on my website and
found I was using far less than 1% of my paid-for bandwidth. All of a
sudden the numbers are a lot bigger. A few more months along this trend,
and I might have to change my hosting service ... (not an exciting
prospect).</p>
<p><img src="https://bannister.us/weblog/images/usage.gif" alt="Bandwidth usage for bannster.us" /></p>
English Cut2005-02-14T00:00:00Zhttps://bannister.us/weblog/2005/english-cut
<p>Just what I was looking for and didn't know it (via
<a href="http://www.caterina.net/archive/000752.html">Caterina</a>).</p>
<p><a href="http://www.englishcut.com/">English Cut the website of thomas mahon, bespoke savile row tailor, london.</a></p>
<p>Oddly enough I would like to own a really well-made suit. Odd because I
almost never really have any call to wear a suit. (The suits in my
closet were worn sometime in the prior century). Odd because much of the
year it is simply too warm to wear a suit in southern California (unless
you spend all your time indoors). Odd also as I really have no idea what
makes up a well-made suit.</p>
<p>Weblogs are a wonderful thing :). Apparently <a href="http://www.gapingvoid.com/Moveable_Type/archives/001397.html">the
effect</a> on
the business is substantial.</p>
<p>With Tom's help I have a chance to understand what makes up a well-made
suit. Cool. Unfortunately flying to England to get a suit made is a
little impractical, as is the cost of the product (at least for my
purpose).</p>
<p>Oh well...</p>
Banned Super Bowl ad2005-02-14T00:00:00Zhttps://bannister.us/weblog/2005/banned-super-bowl-ad
<p>This lightened my day considerably :).</p>
<p><a href="http://bobparsons.com/index.php?/archives/27-Was-the-Banned-Go-Daddy-Super-Bowl-ad-indecent.html">Was the banned Go Daddy Super Bowl ad
indecent?</a></p>
<p>The commercial is great. The GoDaddy folks chose to poke fun at the NFL
and all the silly controversy for the supposed "wardrobe malfunction".
Given the amount of sex and violence on TV, and the ritualized violence
inherent in a football game -- the whole issue is <strong>way</strong> past absurd.</p>
<p>As to whether the ad was demeaning to women -- this was a football game,
right? I presume they had cheerleaders? So this is different how??</p>
<p>Didn't watch the Super Bowl. I have a complete lack of interest in any
professional sport.</p>
<p>Last time I watched a football game was when I was in high school. I was
trying to watch with my father (one of those father/son things). The
score was tied on the last down of the last quarter of the game. The
team with the ball was a couple yards from a touchdown. At the point of
maximum drama -- realised I was bored, had no interest in the game, and
have never watched professional sports since.</p>
<p>Might have been worth catching the commercial -- though the original
(unapproved) version is better :).</p>
Global warming and herd behavior2005-02-12T00:00:00Zhttps://bannister.us/weblog/2005/global-warming-and-herd-behavior
<p>It seems to me that we skipped a step.</p>
<p>On the topic of "global warming" I somehow missed the transition from
speculations based on a limited set of observations, to apparent
iron-clad certainty about cause and effect.</p>
<p>We humans have only made direct, accurate measurements of world-wide
temperates and CO2 levels for a <strong>very</strong> short period of time. A single
century is just a fleeting moment when talking about long-term
planet-wide climate changes, and our direct measurements cover less than
a century. We really need a much <strong>much</strong> longer record to go from
interesting (short-term) observations to any sort of long-term
conclusion.</p>
<p>We seem to see rising levels of CO2 in the atmosphere. We also know that
humans as a group are burning a lot of fossil fuels, and thinning out a
lot of the land-based greenery. We (reasonably) suspect the two are
linked.</p>
<p>Interesting stuff -- but not conclusive.</p>
<p>To guess at temperature and CO2 levels over a longer term, we have to
resort to indirect means. Indirect measurements come from gas bubbles in
rocks and ice, tree rings, and other observations from which we draw
inferences. Pretty interesting stuff, but we should be wary of the
derived data. Chemical reactions involving carbon and oxygen are common,
and the time scale over which we want to infer measurements is very
long. It would be very easy for some secondary unaccounted-for reaction
to radically distort our indirect measurements.</p>
<p>Also we have to account for all those pesky planet-wide secondary
processes. To pick a couple examples:
<a href="http://www.wired.com/news/technology/0,1282,66571,00.html">Pollution May Feed
Plankton</a>
<a href="http://www.wired.com/news/technology/0,1282,64236,00.html">Oceans Absorbed Missing
CO2</a></p>
<p>We know there are natural processes that put CO2 in the air. We know
that there are natural processes that remove CO2 from the air. What we
do not know and should not assume is that natural processes keep CO2 at
the same level at all times. What we do not know is the effect of
man-made sources dumping CO2 into the air -- will this increase CO2
levels, or will natural processes absorb the excess?</p>
<p>Remember we are talking about planet-wide changes where a century is
just a flicker of time.</p>
<p>Changes in planet-wide temperature levels are also just as tricky to
interpret. We know the planet-wide climate has changed quite a lot in
the past. We have some evidence the climate may be going through a
long-term change at present (though over the lifetime of the planet
likely the climate is <strong>always</strong> going through some sort of change).
What we do not know is if any present climate change was in any way
effected by recent human activity.</p>
<p>We suspect that additional CO2 in the atmosphere acts like a "green
house" and may trap heat that would otherwise escape. What is not clear
is how this effects the long term. If more CO2 in the atmosphere means
more captured heat, then we might expect more water in the air
(evaporated from the oceans that cover most of the planet). More water
in the air means more clouds. Clouds reflect the sun's heat, so
temperatures would likely drop. Right - so will additional CO2 in the
air make things on the ground warmer or colder?</p>
<p>Taken together what we do not know is rather a lot. We do not know if
the man-made CO2 will stay in the air or be absorbed. We do not know if
CO2 will make the long-term climate warmer or colder. We do not know if
the recent changes in the climate are due to natural or man-made causes.
That is a <strong>lot</strong> of unknowns!</p>
<p>So why does public discussion refer to "Global Warming" as a fact? Does
the "scientific community" show a sort of herd mentality?</p>
<p>This seems to be a case where we leapt from an early set of interesting
observations, to a popular cause based on a conclusion about cause and
effect. Seems like we skipped over an awful lot of middle ground.</p>
<p>Please do not think this puts me in agreement with the Bush
administration. I believe their handling of the issue has nothing to do
with the science, and everything with money and politics. I doubt anyone
admires the Bush administration for their scientific acuity.</p>
<p>We have another recent case that seems to show the same sort of herd
mentality.</p>
<p>Not so long ago Dupont funded a researcher at UCI (University of
California, Irvine) who somehow "proved" that flourocarbons were going
to destroy the ozone layer. Now this was quite a remarkable notion.
Oddly enough this was when Dupont's very profitable patents on
flourocarbons were about to run out (and Dupont had newly-patented
replacements ready).</p>
<p>In the 1960's they used to give demonstrations where the demonstrator
would "pour" freon out of a container, and you could watch the gas
extinguish lit candles in it's path. The gas flowed very much like a
liquid, and showed a remarkable disinterest in mixing with the general
atmosphere. Flourocarbon molecules are remarkably heavy compared to the
nitrogen that makes up the bulk of the atmosphere. You might wonder how
such a heavy gas would end up at the incredible heights of the ozone
layer.</p>
<p>Not long after we had observations that seemed to show the ozone layer
thinning, and a bigger hole in the ozone layer at the south pole. Pretty
interesting stuff, but the observations cover only an extremely short
period of time. We should not assume that the ozone layer is always
constant, and we <strong>should</strong> assume the existance of "natural' processes
that cause the ozone layer to vary. If we do not have a good
understanding of the natural variations, it may be impossible to
determine if a short-term variation is due to man-made causes.</p>
<p>Somehow I seem to have missed the leap from interesting theory, to
certainty about cause and effect.</p>
<p>More herd-like behavior? Could it be this has more to do with money and
politics than science?</p>
A rule of thumb2005-02-10T00:00:00Zhttps://bannister.us/weblog/2005/a-rule-of-thumb
<p>[ Fair warning - there is nothing "nice" in what follows. ]</p>
<p>Long ago my father offered a rule of thumb from his work on engineering
projects in the defense industry -- If someone insists on using "Dr." in
their name, they probably are not very good.</p>
<p>You meet all sorts of people on engineering-type projects. Some are very
capable, and many are less so. The capable folks might have advanced
degrees from school, but will seldom mention this up front. Rather they
will let their ability speak for them. The folks who are less sure of
their ability will insist on the title.</p>
<p>This rule came to mind after reading a completely mis-guided article
(not worth your time to read, BTW), and then looking at the
<a href="http://www.sys-con.com/story/feedback.cfm?storyid=47885">comments</a>. The
first comment is by someone (in fact the only commentor) who put a "Dr."
in front of his name, and who thinks the article is "brilliant".</p>
<p>The article is just about completely wrong, rather than "brilliant".
Geez, talk about an existance proof...</p>
<p>Just for reference, my third kid is in elementary school, my ex-wife was
an elementary school teacher, and I have spent a fair amount of time
with teachers over the years. Yes, there is pretty clearly a problem as
relates to using technology in schools. But the article is so far
off-target it is simply not worth your time.</p>
<p>BTW, you do not want to leave up the article page, as (at least when I
was looking) the page will throw up an error every minute or so. Not
exactly an inspiring example of web programming from a "WebSphere"
publication.</p>
<p>Another echo - the author wanted teachers to know what the term
"application server" meant. Perhaps not a big surprise from an article
in a publication focused on promoting one particular application server
(WebSphere). On the other hand I expect by the time the current kids in
elementary school graduate, application servers will be about as quaint
as punched cards :).</p>
<p>Just realised the "Dr." links to "JDL Technologies", and their mission
is apparently "to harness technology and deliver its full potential to
K-12 education". Right. I am thinking his guy would fit in just fine at
one of <a href="http://bannister.us/weblog/?p=155">Jim Taggart's cocktail
parties</a>.</p>
Photographer Seeks Resolution2005-02-07T00:00:00Zhttps://bannister.us/weblog/2005/photographer-seeks-resolution
<blockquote>
<p><a href="http://www.wired.com/news/technology/0,1282,66498,00.html">Wired News: Photographer Seeks
Resolution</a>
Using his optics expertise, Flint designed and built the camera, but
before he could begin, his New Mexico observatory was shut down by
health inspectors who discovered rats carrying a lethal virus.</p>
</blockquote>
<p>There are two main possible explanations here. The first is to take the
explanation at face value. The second is someone did not want high
resolution pictures taken of the sky.</p>
<p>Since the second is unusual, we need some justification for doubting the
first. A few bits stand out as somewhat improbable in the first story.</p>
<ol>
<li>The coincidence in time seems odd - just before he was to begin
taking pictures?</li>
<li>The event seems odd - virus-carrying rats in an observatory is
something I have never heard before. What would the rats live off?</li>
<li>The discovery seems odd - how often are observatories inspected for
rats?</li>
<li>The solution seems odd - rather than abandon the observatory, why
not just exterminate the rats?</li>
</ol>
<p>Taken together the above is nothing remotely like proof - but it sure
smells funny.</p>
Hidden brilliance2005-02-07T00:00:00Zhttps://bannister.us/weblog/2005/hidden-brilliance
<blockquote>
<p><a href="http://www.wired.com/news/technology/0,1282,66498,00.html">Wired News: Photographer Seeks
Resolution</a>
The gigapixel camera lenses were custom-designed and cut by a
specialist he knew from his defense contracting days, who is more
accustomed to making optics for military systems.</p>
<p>"They're essentially perfect," Flint said of the lenses. "They're
spectacular."</p>
</blockquote>
<p>I hope that we can re-capture more of the great expertise built up
during the cold war.</p>
<p>What we should not let slip from our grasp is the knowledge and
expertise of the folks retired from the defense industries. During the
period of the cold war we pushed technology to its limits to design new
ways of killing people and destroying things. By itself perhaps this is
awful. But technology is simply the knowledge of how to do things. The
way we choose to apply technology can be either constructive or
destructive, moral or immoral - the knowledge itself is neutral.</p>
<p>During the Cold War there were a lot of bright people who developed some
brilliant bits of technology -- funded by military spending. As military
projects, much of the work was kept secret, and much of the knowledge
gained was not widely spread. Companies tend to forget about past work
as soon as the funding stops. The folks that worked in the defense
industries through the 1960's and 1970's are largely retired, and not
all still with us. It would be a waste to completely lose the knowledge
they gained.</p>
<p>To point out the obvious - this message is carried on a medium built on
knowledge gained by old defense spending. The Internet was originally a
DARPA project. Your computer has a heritage with many roots in the work
of this period. In particular there is a path backwards from Silicon
Valley, Intel, Fairchild, to Autonetics (a once-part of Rockwell) and
advanced defense projects of that period that may not be otherwise
recorded.</p>
U.S. Guards Threw Mudwrestling Party2005-02-07T00:00:00Zhttps://bannister.us/weblog/2005/female-gis-flash-breasts-thong-in-mud-wrestling-contests
<p>Seems the military was having some trouble finding new recruits. More
news like this and there should be plenty (of males) signing up...</p>
<blockquote>
<p><a href="http://www.azcentral.com/php-bin/clicktrack/print.php?referer=http://www.azcentral.com/offbeat/articles/0207mudwrestling-GIs-ON.html">Female GIs flash breasts, thong in mud-wrestling
contests</a>
... female MPs mud-wrestled in October, with a crowd of male soldiers
cheering them on. According to snapshots obtained by the News, one
young military woman lifted her T-shirt to expose her breasts, while
another revealed her thong panties.</p>
</blockquote>
<p>Conduct unbecoming ... a prison guard?</p>
<blockquote>
<p><a href="http://olympics.reuters.com/printerFriendlyPopup.jhtml?type=oddlyEnoughNews&storyID=7557055">BAGHDAD
(Reuters)</a> -
U.S. military police threw a mudwrestling party at a prison camp in
Iraq and a woman who took part has been found guilty of indecent
exposure ...
At least three female guards stripped to their underwear and wrestled
each other in a paddling pool full of mud ...</p>
<p>"Detainees were nowhere in the vicinity and they had no possible way
of seeing what occurred."</p>
</blockquote>
<p>Darn. Might have missed the chance to convert them to our, er,
<a href="http://www.barking-moonbat.com/index.php/weblog/comments/mud_wrestling_in_iraq/">"Western" point of
view</a> -
or if innocent, to lighten their ordeal a bit.</p>
Rent your music?2005-02-06T00:00:00Zhttps://bannister.us/weblog/2005/rent-your-music
<p>Somehow I doubt <a href="http://www.cbsnews.com/stories/2005/02/03/tech/printable671496.shtml">"as little as
$10/month"</a>
rental music is going to fly. Pay to <a href="http://news.com.com/2102-1027_3-5183692.html?tag=st.util.print">rent your
music</a>?
Right. For that price you could <strong>buy</strong> at least 6 over-priced CDs per
year, every year. Frankly I have a hard time finding that much good new
music every year. From outfits like <a href="http://magnatune.com/">Magnatune</a>
you could <strong>buy</strong> perhaps 12 CDs per year, every year. At $15/month you
could instead <strong>buy</strong> at least 9 over-priced or 18 direct CDs per year,
every year.</p>
<p>No doubt the music "industry" loves the idea. A guaranteed income stream
even for old music! Heck, who needs to come up with new music?? Who
needs new artists?</p>
<p>No doubt Microsoft likes the scheme. If successful this gives them a
competitive wedge against Apple's iPod and iTunes. Likely they get a
slice of the "rental" money.</p>
<p>Maybe their hope is that young people with small collections and little
money with get hooked on the "rental" model. This assumes that they can
kill the bootleg copying of music ... used primarily by young people
with small collections and little money. Right. I certainly would would
not bet on this little swindle.</p>
<p>On the other hand I do believe notions like
<a href="http://magnatune.com/">Magnatune</a> have a real future. Buying music
directly with more money to the artist and less money from the consumer
is a better deal for both artists and consumers. Not such a good deal
for the middlemen - the record companies.</p>
<p>Better yet I can see a sort of subscription model where the you could
pre-order music from your favorite artists. The consumer gets more of
the favorite sorts of music at a good price. The artist gets a good
notion from consumers of the interest in their continuing efforts.</p>
<p>But "rental" music? No thanks!</p>
iRobot still dead :(2005-02-05T00:00:00Zhttps://bannister.us/weblog/2005/irobot-still-dead
<p>The iRobot folks sent out a replacement charger and battery. Tried
charging overnight ... the new battery only lasted a few minutes before
expiring. Tried "reseting" the charging system as recommended on the
iRobot website (taking out the battery, disconnecting the charger, wait
a few minutes). Another overnight charge ... and nothing. Now the
battery is completely dead.</p>
<p>I think the iRobot folks are suffering from too much success. Apparently
sales are strong, and quality has slipped. This is the point where an
early leader in a new market is most vulnerable. If a competitor steps
in with good quality, iRobot could become a historical footnote.</p>
<p>Funny thing is, that while it was working, I thought the improvement was
nice but minor. After the
<a href="http://bannister.us/weblog/2005/irobot-still-dead/">Roomba died</a>
I realized the dog was shedding again (carpets need vacuuming almost every day).</p>
<p>This is like when you get a new computer. At first the improvement in
speed seems minor, but when you go back and use the old computer, you
realise the old box is a <strong>lot</strong> slower.</p>
<p>For the same investment of my time, the end result (when the robot
vacuum works) is cleaner carpets. If only the thing worked.</p>
<p>Will have to call the iRobot folks again.</p>
Welcome to Solaris?2005-02-02T00:00:00Zhttps://bannister.us/weblog/2005/welcome-to-solaris
<p>Interested by <a href="http://blogs.sun.com/roller/page/jonathan">Jonathan's</a>
words, walked through the Solaris 10 download pages, and got this <a href="http://bannister.us/examples/Solaris-10-license.txt">warm
and friendly</a> email
from Sun.</p>
<p>Geez -- now I'm afraid to download the thing :).</p>
<p>Hey Jonathon! How about a couple of short paragraphs for non-lawyers,
and a link to the full license for the dozen-or-so compulsive people in
the world who actually read license agreements? I am not a lawyer, do
not want to be a lawyer, and do not pretend to be able to interpret
license agreements like a lawyer. This is like someone handing you a
disk, then yelling "<strong><u>DON'T!!!</u></strong>" in your face. I'm not exactly
sure what it is I am not supposed to be doing, but I think I'd rather
give the disk back...</p>
<p>( Remember the <a href="http://en.wikipedia.org/wiki/Solaris_(movie)">movie</a>
<a href="http://www.solaristhemovie.com/">Solaris</a>? This feels similar... )</p>
Building a better string class2005-01-31T00:00:00Zhttps://bannister.us/weblog/2005/building-a-better-string-class
<p>To sum up - the aim of the preceding exercise was to check my past
assumptions. Rather than use the standard C++ string classes, I have for
a number of years chosen to use a very thin wrapper class, with buffer
allocation off a free-list. At the end the measurements show performance
is indeed better than the standard C++ string classes, with one minor
surprise.</p>
<p>The minor surprise was that the x86 string instructions are no longer
optimal (at least on an AMD Athlon CPU). There are two alternates -
either write inlined C++ code to perform the equivalent operation
(better with small strings), or use the C library string functions
(better with large strings). To force the use of string functions rather
than string intrinsics in optimized code, you need to present the
following pragma to the Microsoft C++ compiler.</p>
<p>#pragma function(strcpy,strcat)</p>
<p>Other than the use of the pragma, it looks as though the existing string
classes in my applications do not need to be changed.</p>
<p><strong>Building a better string class - prior exercises</strong></p>
<ul>
<li><a href="https://bannister.us/weblog/2005/how-to-build-a-better-string-class-and-a-surprise">A surprise</a></li>
<li><a href="https://bannister.us/weblog/2005/continued-building-a-better-string-class-assumptions-revised">Assumptions revised</a></li>
<li><a href="https://bannister.us/weblog/2005/building-a-better-string-class-comparing-class-implementations">Comparing class implementations</a></li>
<li><a href="https://bannister.us/weblog/2005/building-a-better-string-class-what-advantage-in-copy-on-write-in-stdstring">What advantage in copy-on-write for std::string?</a></li>
<li><a href="https://bannister.us/weblog/2005/building-a-better-string-class-sentinels-and-wrap-up">Sentinels and wrap up</a></li>
</ul>
<p>Notions that go into choosing a string class in this form include...</p>
<ul>
<li>The string class is meant to be a thin, efficient wrapper around
conventional NUL-terminated C strings.</li>
<li>The string class is safer than C strings as the common operations
that can lead to overflow (<strong>strcpy()</strong> and <strong>strcat()</strong>) upsize the
string buffer as needed.</li>
<li>This is not an attempt hide or completely encapsulate C strings.</li>
<li>This is not a re-invention of C strings.</li>
<li>Constant strings are passed as "<strong>const char*</strong>" - to which the
string class readily converts.</li>
<li>The string class is not meant to be so general as to suit every
application in existance, and is not meant for inclusion in a
library. Rather you would simply take the base version and add any
functions needed.</li>
<li>The string class is optimal for strings of "usual" size (less than
256 characters).</li>
</ul>
<p>The end result is small, efficient, and easy to adapt as needed. Suits
my purpose at least :).</p>
Building a better string class - what advantage in copy-on-write for std::string?2005-01-30T00:00:00Zhttps://bannister.us/weblog/2005/building-a-better-string-class-what-advantage-in-copy-on-write-in-stdstring
<p>[<a href="https://bannister.us/weblog/2005/building-a-better-string-class">Summary</a>]
[<a href="https://bannister.us/weblog/2005/building-a-better-string-class-sentinels-and-wrap-up">Continued</a>]</p>
<p>The prior set of measurements in - <a href="http://bannister.us/weblog/?p=202">Building a better string class -
comparing class implementations</a> -
did not really measure the advantage (if any) of the use of
copy-on-write in the std::string implementation. Did some measurements
to see whether this helps improve the relative standing of std::string.</p>
<p>First, the same "mixed" measurement as in the prior tests, but using the
test strings as classes (rather than <code>const char*</code>).
Second, let's do everything we can to give std::string the advantage
(assuming copy-on-write is an advantage) by measuring only assignments.</p>
<p>RATE ZString string mixed calls 126.9 MB/second (1000.0 MB in 7.9 seconds)
RATE C++ string mixed calls 39.7 MB/second (1000.0 MB in 25.2 seconds)
RATE ZString string assign calls 144.9 MB/second (1000.0 MB in 6.9 seconds)
RATE C++ string assign calls 92.3 MB/second (1000.0 MB in 10.8 seconds)</p>
<p>The results seem to match up with my expectations. With mixed operations
the std::string class performs relatively poorly. With an
assignment-only test std::string does quite a lot better, but is still
slower.</p>
<p>This matches up to my expectation as the amount of code executed to
implement the copy-on-write "optimization" is in fact slower than simply
copying the buffer. At least this is true for small strings (what I see
as the more usual case). Tried increasing the test strings from 26 to 62
characters to see if std::string might fare better with longer strings.</p>
<p>RATE ZString string mixed calls 229.6 MB/second (1200.0 MB in 5.2 seconds)
RATE C++ string mixed calls 88.3 MB/second (1200.0 MB in 13.6 seconds)
RATE ZString string assign calls 268.7 MB/second (1200.0 MB in 4.5 seconds)
RATE C++ string assign calls 221.9 MB/second (1200.0 MB in 5.4 seconds)</p>
<p>Apparently not :).</p>
<p>Repeating the same test, but this time compiled with GNU C++ on Linux.</p>
<p>RATE ZString string mixed calls 192.3 MB/second (1200.0 MB in 6.2 seconds)
RATE C++ string mixed calls 108.8 MB/second (1200.0 MB in 11.0 seconds)
RATE ZString string assign calls 225.1 MB/second (1200.0 MB in 5.3 seconds)
RATE C++ string assign calls 324.3 MB/second (1200.0 MB in 3.7 seconds)</p>
<p>Interesting! The GNU std::string implementation is apparently better
than Microsoft's, and does indeed yield an advantage - at least when
doing only assignments.</p>
<p>Repeating the same test on Linux, but this time with the (original)
smaller strings.</p>
<p>RATE ZString string mixed calls 134.2 MB/second (1000.0 MB in 7.5 seconds)
RATE C++ string mixed calls 59.6 MB/second (1000.0 MB in 16.8 seconds)
RATE ZString string assign calls 155.5 MB/second (1000.0 MB in 6.4 seconds)
RATE C++ string assign calls 152.0 MB/second (1000.0 MB in 6.6 seconds)</p>
<p>For smaller strings, even with the better GNU implementation, a simple
buffer copy edges out copy-on-write in assignment.</p>
<p>The test program and <strong>ZString</strong> class sources follow.</p>
<p><strong>string.cpp</strong></p>
<p>#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <string.h></p>
<p>// Optimization that seems to work best (at least with an Athlon).
//#pragma function(strlen,strcpy,strcat)</p>
<p>#include "ZString.h"
#include <string></string></p>
<p>// test strings</p>
<p>//const int nLoop = 10000000;
//static const char sOut1[] = "abcdefghjklmnopqrstuvwxyz";
//static const char sOut2[] = "ABCDEFGHJKLMNOPQRSTUVWXYZ";</p>
<p>const int nLoop = 5000000;
static const char sOut1[] = "abcdefghjklmnopqrstuvwxyz0123456789ABCDEFGHJKLMNOPQRSTUVWXYZ";
static const char sOut2[] = "ABCDEFGHJKLMNOPQRSTUVWXYZ0123456789abcdefghjklmnopqrstuvwxyz";</p>
<p>int nLength = ::strlen(sOut1);</p>
<p>void report_times(const char* s,int dt,int cb)
{
//printf("TIME %s %d ticks for %d characters written\n",s,dt,cb);
double ts = ((double)dt) / CLOCKS_PER_SEC;
double mb = ((double)cb) / 1000000;
double rate = mb / ts;
printf("RATE %s %0.1f MB/second (%0.1f MB in %0.1f seconds)\n",s,rate,mb,ts);
}</p>
<p>//
// Perform a function for a fixed number of iterations and return time.
//</p>
<p>int dtLoop = 0;</p>
<p>typedef void (<em>doit)(const char</em>,const char*);</p>
<p>int time_function(doit fn)
{
clock_t t0 = ::clock();
for (int i=0; i<nLoop; ++i) {
const char* s1 = sOut1 + (15 & i);
const char* s2 = sOut2 + nLength - (15 & i);
(*fn)(s1,s2);
}
return (int)(::clock() - t0) - dtLoop;
}</p>
<p>//
// Time C string operations.
//</p>
<p>int nTotal = 0;</p>
<p>void do_total(const char* s1,const char* s2)
{
nTotal += 4 * nLength;
}</p>
<p>void do_z_string_mixed_calls(const char* _s1,const char* _s2)
{
ZString s1 = _s1;
ZString s2 = _s2;
ZString sWork;
sWork.strcpy(s1);
sWork.strcat(s2);
sWork.strcpy(s2);
sWork.strcat(s1);
sWork.strcpy(s1);
sWork.strcat(s1);
sWork.strcpy(s2);
sWork.strcat(s2);
}</p>
<p>void do_cpp_string_mixed_calls(const char* _s1,const char* _s2)
{
std::string s1 = _s1;
std::string s2 = _s2;
std::string sWork;
sWork.assign(s1);
sWork.append(s2);
sWork.assign(s2);
sWork.append(s1);
sWork.assign(s1);
sWork.append(s1);
sWork.assign(s2);
sWork.append(s2);
}</p>
<p>void do_z_string_assign_calls(const char* _s1,const char* _s2)
{
ZString s1 = _s1;
ZString s2 = _s2;
ZString sWork;
sWork.strcpy(s1);
sWork.strcpy(s2);
sWork.strcpy(s2);
sWork.strcpy(s1);
sWork.strcpy(s1);
sWork.strcpy(s1);
sWork.strcpy(s2);
sWork.strcpy(s2);
}</p>
<p>void do_cpp_string_assign_calls(const char* _s1,const char* _s2)
{
std::string s1 = _s1;
std::string s2 = _s2;
std::string sWork;
sWork.assign(s1);
sWork.assign(s2);
sWork.assign(s2);
sWork.assign(s1);
sWork.assign(s1);
sWork.assign(s1);
sWork.assign(s2);
sWork.assign(s2);
}</p>
<p>int main(int ac,char** av)
{
dtLoop = time_function(do_total);
report_times("ZString string mixed calls",time_function(do_z_string_mixed_calls),nTotal);
report_times("C++ string mixed calls",time_function(do_cpp_string_mixed_calls),nTotal);
report_times("ZString string assign calls",time_function(do_z_string_assign_calls),nTotal);
report_times("C++ string assign calls",time_function(do_cpp_string_assign_calls),nTotal);
return 0;
}</p>
<p><strong>ZString.h</strong></p>
<p>#ifndef <strong>ZSTRING_H</strong>
#define <strong>ZSTRING_H</strong></p>
<p>//
// Simple string class.
//</p>
<p>class ZString
{</p>
<p>protected:
char* sBuffer;
int cbBufferMax;</p>
<p>public:
ZString() { upsizeTo(1); }
ZString(const char* s) { upsizeTo(::strlen(s)); ::strcpy(sBuffer,s); }
~ZString() { recycle(); }</p>
<p>protected:
void recycle();
void upsizeTo(int);
void sizeTo(int n) {
if (cbBufferMax <= n) {
upsizeTo(n);
}
}</p>
<p>public:
operator const char*() { return sBuffer; }
char* getBuffer() { return sBuffer; }
char* getBuffer(int n) { sizeTo(n); return sBuffer; }
int getBufferSize() { return cbBufferMax; }</p>
<p>public:
void operator=(const char* s) {
strcpy(s);
}</p>
<p>public:
void strcpy(const char* s) {
sizeTo(::strlen(s));
::strcpy(sBuffer,s);
}
void strcpy(const char* s,int n) {
sizeTo(n);
::strncpy(sBuffer,s,n);
sBuffer[n] = 0;
}
void strcat(const char* s) {
int n1 = ::strlen(sBuffer);
int n2 = ::strlen(s);
sizeTo(n1 + n2);
::strcpy(sBuffer+n1,s);
}
void strcat(const char* s,int n) {
int n1 = ::strlen(sBuffer);
sizeTo(n1 + n);
::strncpy(sBuffer+n1,s,n);
sBuffer[n1+n] = 0;
}
void strlwr() {
::strlwr(sBuffer);
}
void strupr() {
::strupr(sBuffer);
}</p>
<p>};</p>
<p>#endif</p>
<p><strong>ZString.cpp</strong></p>
<p>#include <stdlib.h>
#include <string.h>
#include "ZString.h"</p>
<p>//
// Out-of-line string methods and free list maintenance.
//</p>
<p>enum { STRING_BUFFER_SIZE = 256 };
static void* g_pFreeList;</p>
<p>void ZString::recycle()
{
if (STRING_BUFFER_SIZE != cbBufferMax) {
delete sBuffer;
sBuffer = 0;
return;
}
<em>((void</em>*)sBuffer) = g_pFreeList;
g_pFreeList = sBuffer;
sBuffer = 0;
cbBufferMax = 0;
}</p>
<p>void ZString::upsizeTo(int n)
{
// Allocate oversize strings.
if (STRING_BUFFER_SIZE <= n) {
// round up to a quanta
n = ((n + STRING_BUFFER_SIZE + 1) / STRING_BUFFER_SIZE) * STRING_BUFFER_SIZE;
char* p = new char[n];
::strcpy(p,sBuffer);
recycle();
sBuffer = p;
cbBufferMax = n;
return;
}
cbBufferMax = STRING_BUFFER_SIZE;
// Grab a buffer from the free list if present (the usual case).
if (g_pFreeList) {
sBuffer = (char*) g_pFreeList;
g_pFreeList = <em>((void</em>*)g_pFreeList);
} else {
// Allocate a stock-sized buffer.
sBuffer = new char[STRING_BUFFER_SIZE];
}
*sBuffer = 0;
}</p>
Building a better string class - sentinels and wrap up2005-01-30T00:00:00Zhttps://bannister.us/weblog/2005/building-a-better-string-class-sentinels-and-wrap-up
<p>[<a href="https://bannister.us/weblog/2005/building-a-better-string-class">Summary</a>]</p>
<p>One final addition to the ZString class - sentinels. One common
programming error is buffer over-run, writing past the end of an
allocated array, and possibly overwriting a following item. We can catch
this common programming error by allocating an extra byte on both ends
of the string buffer and placing known values (sentinels) in each byte.
The sentinels are checked when the ZString instance is freed. This is
especially important when using a free list as any normal heap validity
tests on deallocation are not exercised.</p>
<p>Only the "debug" version of the code makes use of sentinels.</p>
<p><strong>ZString.cpp</strong></p>
<p>#include <stdlib.h>
#include <string.h>
#include "ZString.h"</p>
<p>#ifndef ASSERT
#include <assert.h>
#define ASSERT(X) assert(X)
#endif</p>
<p>//
// Out-of-line string methods and free list maintenance.
//</p>
<p>enum {
STRING_BUFFER_SIZE = 256,
BOB_SENTINEL = 0x66,
EOB_SENTINEL = 0x99
};</p>
<p>static void* g_pFreeList;</p>
<p>void ZString::recycle()
{
#ifdef _DEBUG
ASSERT(BOB_SENTINEL == (255&<em>(sBuffer-1)));
ASSERT(EOB_SENTINEL == (255&</em>(sBuffer+cbBufferMax)));
#endif
if (STRING_BUFFER_SIZE != cbBufferMax) {
delete (sBuffer-1);
sBuffer = 0;
return;
}
<em>((void</em>*)sBuffer) = g_pFreeList;
g_pFreeList = sBuffer;
sBuffer = 0;
cbBufferMax = 0;
}</p>
<p>void ZString::upsizeTo(int n)
{
// Allocate oversize strings.
if (STRING_BUFFER_SIZE <= n) {
// round up to a quanta
n = ((n + STRING_BUFFER_SIZE + 1) / STRING_BUFFER_SIZE) * STRING_BUFFER_SIZE;
#ifdef _DEBUG
char* p = new char[n+2];
p[0] = (char) BOB_SENTINEL;
p[1+n] = (char) EOB_SENTINEL;
++p;
#else
char* p = new char[n];
#endif
::strcpy(p,sBuffer);
recycle();
sBuffer = p;
cbBufferMax = n;
return;
}
cbBufferMax = STRING_BUFFER_SIZE;
// Grab a buffer from the free list if present (the usual case).
if (g_pFreeList) {
sBuffer = (char*) g_pFreeList;
g_pFreeList = <em>((void</em>*)g_pFreeList);
} else {
// Allocate a stock-sized buffer.
#ifdef _DEBUG
sBuffer = new char[2+STRING_BUFFER_SIZE];
*sBuffer++ = (char) BOB_SENTINEL;
*(sBuffer+STRING_BUFFER_SIZE) = (char) EOB_SENTINEL;
#else
sBuffer = new char[STRING_BUFFER_SIZE];
#endif
}
*sBuffer = 0;
}</p>
Building a better string class - comparing class implementations2005-01-30T00:00:00Zhttps://bannister.us/weblog/2005/building-a-better-string-class-comparing-class-implementations
<p>[<a href="https://bannister.us/weblog/2005/building-a-better-string-class">Summary</a>]
[<a href="https://bannister.us/weblog/2005/building-a-better-string-class-what-advantage-in-copy-on-write-in-stdstring">Continued</a>]</p>
<p>Having checked my assumptions earlier in - <a href="http://bannister.us/weblog/?p=189">Continued - building a
better string class - assumptions
revised</a> - time to compare C++ string
implementations.</p>
<p>The <strong>ZString1</strong> class (below) represents the string class used in most
of the C++ code I have written in the past decade. Nothing really exotic
here - the class is simply a thin wrapper around the standard C string
functions (made safe), with the string buffer allocated off a free list.</p>
<p>The <strong>ZString2</strong> class simply replaces the use of string functions with
inlined C++ code. From the earlier exercise, we gained the expectation
that this version might be slightly faster than the calls to standard C
string functions.</p>
<p>The micro-benchmark numbers tell pretty much the expected story.</p>
<p>RATE C string calls 262.1 MB/second (1000.0 MB in 3.8 seconds)
RATE ZString1 string calls 151.7 MB/second (1000.0 MB in 6.6 seconds)
RATE ZString2 string calls 158.0 MB/second (1000.0 MB in 6.3 seconds)
RATE C++ string calls 67.4 MB/second (1000.0 MB in 14.8 seconds)</p>
<p>The C string calls are fastest - at least when we are allocating the
string buffer off the stack, and do not have to check for buffer
overflow. This is traditional (and somewhat unsafe) practice in C
programs, but not always practical.</p>
<p>The thin wrapper classes do markedly better than the standard C++ string
class. To determine how much of the difference is due to the use of a
free list, made the ZString classes always-allocate instead of using a
free list, and re-ran the test.</p>
<p>RATE C string calls 266.3 MB/second (1000.0 MB in 3.8 seconds)
RATE ZString1 string calls 84.3 MB/second (1000.0 MB in 11.9 seconds)
RATE ZString2 string calls 88.8 MB/second (1000.0 MB in 11.3 seconds)
RATE C++ string calls 67.4 MB/second (1000.0 MB in 14.8 seconds)</p>
<p>Even without the use of a free list, the ZString classes do better
(nearly double the performance) compared to the standard C++ strings.
The use of the free list adds a substantial further boost to
performance.</p>
<p>There is another set of reasons to consider using a free list for
frequently allocated structures. Occasionally you can get patterns of
allocation and deallocation that cause heap fragmentation, and this can
become a problem in long-running programs. By greatly decreasing the
number of heap allocations, you likely improve the stability of your
program. This is not just theory - I have seen this more than once in
actual customer use.</p>
<p>Adding the pragma so that the compiler generates string function calls
instead of inline string intrinsics yields only slightly different
numbers.</p>
<p>RATE C string calls 289.4 MB/second (1000.0 MB in 3.5 seconds)
RATE ZString1 string calls 145.8 MB/second (1000.0 MB in 6.9 seconds)
RATE ZString2 string calls 158.0 MB/second (1000.0 MB in 6.3 seconds)
RATE C++ string calls 67.4 MB/second (1000.0 MB in 14.8 seconds)</p>
<p>Tried running the same code through GNU C++ on Linux.</p>
<p>RATE C string calls 304.0 MB/second (1000.0 MB in 3.3 seconds)
RATE ZString1 string calls 170.1 MB/second (1000.0 MB in 5.9 seconds)
RATE ZString2 string calls 187.6 MB/second (1000.0 MB in 5.3 seconds)
RATE C++ string calls 81.7 MB/second (1000.0 MB in 12.2 seconds)</p>
<p>The relative results are pretty much in line with the Windows results
(note the Linux box has a slightly faster CPU).</p>
<p>Tried the same code with Cygwin GNU C++ under Windows.</p>
<p>RATE C string calls 240.0 MB/second (1000.0 MB in 4.2 seconds)
RATE ZString1 string calls 72.0 MB/second (1000.0 MB in 13.9 seconds)
RATE ZString2 string calls 61.0 MB/second (1000.0 MB in 16.4 seconds)
RATE C++ string calls 4.9 MB/second (1000.0 MB in 202.9 seconds)</p>
<p>Yikes! Something is radically less efficient! The relative performance
story is still the same.</p>
<p>Note that I am not claiming this micro-benchmark tells the performance
story for every possible application using strings. Rather the intent
here is to give a starting point. Also there is no intent here to handle
anything other than single-byte character strings.</p>
<p>Note also that I am not trying to reproduce here every function offered
by the standard C++ string classes. Rather I start with something like
the ZString class as a base and add functions as-needed for the
individual application. (I have a preference for thin/minimalistic
classes).</p>
<p>The conclusion that I draw from all this is that my original string
class does indeed still greatly out-perform the standard C++ string
class (at least for the sort of usage I see most often). The string
class can be slightly improved by disabling the string intrinsics, or by
instead using equivalent inlined C++ code. In fact this micro-benchmark
likely understates the performance advantage, if your application
performs relatively more string allocations and relatively fewer string
copy operations.</p>
<p><strong>ZString.h</strong></p>
<p>#ifndef <strong>ZSTRING_H</strong>
#define <strong>ZSTRING_H</strong></p>
<p>//
// Simple string class.
//</p>
<p>class ZString
{</p>
<p>protected:
char* sBuffer;
int cbBufferMax;</p>
<p>public:
ZString() { upsizeTo(1); }
~ZString() { recycle(); }</p>
<p>protected:
void recycle();
void upsizeTo(int);
void sizeTo(int n) {
if (cbBufferMax <= n) {
upsizeTo(n);
}
}</p>
<p>public:
operator const char*() { return sBuffer; }
char* getBuffer() { return sBuffer; }
char* getBuffer(int n) { sizeTo(n); return sBuffer; }
int getBufferSize() { return cbBufferMax; }</p>
<p>};</p>
<p>#endif</p>
<p><strong>ZString1.h</strong></p>
<p>#ifndef <strong>ZSTRING1_H</strong>
#define <strong>ZSTRING1_H</strong></p>
<p>#include "ZString.h"</p>
<p>//
// Simple string class.
//</p>
<p>class ZString1 : public ZString
{</p>
<p>public:
void operator=(const char* s) {
strcpy(s);
}</p>
<p>public:
static int strlen(const char* s) {
return ::strlen(s);
}
int strlen() {
return strlen(sBuffer);
}
void strcpy(const char* s) {
sizeTo(strlen(s));
::strcpy(sBuffer,s);
}
void strcpy(const char* s,int n) {
sizeTo(n);
::strncpy(sBuffer,s,n);
sBuffer[n] = 0;
}
void strcat(const char* s) {
int n1 = strlen();
int n2 = strlen(s);
sizeTo(n1 + n2);
::strcpy(sBuffer+n1,s);
}
void strcat(const char* s,int n) {
int n1 = strlen();
sizeTo(n1 + n);
::strncpy(sBuffer+n1,s,n);
sBuffer[n1+n] = 0;
}
void strlwr() {
::strlwr(sBuffer);
}
void strupr() {
::strupr(sBuffer);
}</p>
<p>};</p>
<p>#endif</p>
<p><strong>ZString2.h</strong></p>
<p>#ifndef <strong>ZSTRING2_H</strong>
#define <strong>ZSTRING2_H</strong></p>
<p>#include "ZString.h"</p>
<p>//
// Simple string class.
//</p>
<p>class ZString2 : public ZString
{</p>
<p>public:
void operator=(const char* s) {
strcpy(s);
}</p>
<p>public:
static int strlen(const char* s) {
int n = 0;
while (<em>s++) ++n;
return n;
}
int strlen() {
return strlen(sBuffer);
}
void strcpy(const char</em> s) {
sizeTo(strlen(s));
char* p = sBuffer;
while (<em>p++ = <em>s++);
}
void strcpy(const char</em> s,int n) {
int n2 = strlen(s);
if (n2 < n) n = n2;
sizeTo(n);
char</em> p = sBuffer;
int i = 0;
while (i < n) { p[i] = s[i]; ++i; }
p[i] = 0;
}
void strcat(const char* s) {
int n1 = strlen();
int n2 = strlen(s);
sizeTo(n1 + n2);
char* p = sBuffer + n1;
while (<em>p++ = <em>s++);
}
void strcat(const char</em> s,int n) {
int n1 = strlen();
int n2 = strlen(s);
if (n < n2) n2 = n;
sizeTo(n1 + n2);
char</em> p = sBuffer + n1;
int i = 0;
while (i < n2) { p[i] = s[i]; ++i; }
}
void strlwr() {
::strlwr(sBuffer);
}
void strupr() {
::strupr(sBuffer);
}</p>
<p>};</p>
<p>#endif</p>
<p><strong>ZString.cpp</strong></p>
<p>#include <stdlib.h>
#include <string.h>
#include "ZString.h"</p>
<p>//
// Out-of-line string methods and free list maintenance.
//</p>
<p>enum { STRING_BUFFER_SIZE = 256 };
static void* g_pFreeList;</p>
<p>void ZString::recycle()
{
if (STRING_BUFFER_SIZE != cbBufferMax) {
delete sBuffer;
sBuffer = 0;
return;
}
<em>((void</em>*)sBuffer) = g_pFreeList;
g_pFreeList = sBuffer;
sBuffer = 0;
cbBufferMax = 0;
}</p>
<p>void ZString::upsizeTo(int n)
{
// Allocate oversize strings.
if (STRING_BUFFER_SIZE <= n) {
// round up to a quanta
n = ((n + STRING_BUFFER_SIZE + 1) / STRING_BUFFER_SIZE) * STRING_BUFFER_SIZE;
char* p = new char[n];
::strcpy(p,sBuffer);
recycle();
sBuffer = p;
cbBufferMax = n;
return;
}
cbBufferMax = STRING_BUFFER_SIZE;
// Grab a buffer from the free list if present (the usual case).
if (g_pFreeList) {
sBuffer = (char*) g_pFreeList;
g_pFreeList = <em>((void</em>*)g_pFreeList);
} else {
// Allocate a stock-sized buffer.
sBuffer = new char[STRING_BUFFER_SIZE];
}
*sBuffer = 0;
}</p>
<p><strong>string.cpp</strong></p>
<p>#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <string.h></p>
<p>// Optimization that seems to work best (at least with an Athlon).
//#pragma function(strlen,strcpy,strcat)</p>
<p>#include "ZString1.h"
#include "ZString2.h"
#include <string></string></p>
<p>// test strings
static const char sOut1[] = "abcdefghjklmnopqrstuvwxyz";
static const char sOut2[] = "ABCDEFGHJKLMNOPQRSTUVWXYZ";
int nLength = ::strlen(sOut1);</p>
<p>void report_times(const char* s,int dt,int cb)
{
//printf("TIME %s %d ticks for %d characters written\n",s,dt,cb);
double ts = (double)dt / CLOCKS_PER_SEC;
double mb = (double)cb / 1000000;
double rate = mb / ts;
printf("RATE %s %0.1f MB/second (%0.1f MB in %0.1f seconds)\n",s,rate,mb,ts);
}</p>
<p>//
// Perform a function for a fixed number of iterations and return time.
//</p>
<p>const int nLoop = 10000000;
int dtLoop = 0;</p>
<p>typedef void (<em>doit)(const char</em>,const char*);</p>
<p>int time_function(doit fn)
{
clock_t t0 = ::clock();
for (int i=0; i<nLoop; ++i) {
const char* s1 = sOut1 + (15 & i);
const char* s2 = sOut2 + nLength - (15 & i);
(*fn)(s1,s2);
}
return (int)(::clock() - t0) - dtLoop;
}</p>
<p>//
// Time C string operations.
//</p>
<p>int nTotal = 0;</p>
<p>void do_total(const char* s1,const char* s2)
{
nTotal += 4 * nLength;
}</p>
<p>void do_c_string_calls(const char* s1,const char* s2)
{
char sWork[256];
::strcpy(sWork,s1);
::strcat(sWork,s2);
::strcpy(sWork,s2);
::strcat(sWork,s1);
::strcpy(sWork,s1);
::strcat(sWork,s1);
::strcpy(sWork,s2);
::strcat(sWork,s2);
}</p>
<p>void do_z1_string_calls(const char* s1,const char* s2)
{
ZString1 sWork;
sWork.strcpy(s1);
sWork.strcat(s2);
sWork.strcpy(s2);
sWork.strcat(s1);
sWork.strcpy(s1);
sWork.strcat(s1);
sWork.strcpy(s2);
sWork.strcat(s2);
}</p>
<p>void do_z2_string_calls(const char* s1,const char* s2)
{
ZString2 sWork;
sWork.strcpy(s1);
sWork.strcat(s2);
sWork.strcpy(s2);
sWork.strcat(s1);
sWork.strcpy(s1);
sWork.strcat(s1);
sWork.strcpy(s2);
sWork.strcat(s2);
}</p>
<p>void do_cpp_string_calls(const char* s1,const char* s2)
{
std::string sWork;
sWork.assign(s1);
sWork.append(s2);
sWork.assign(s2);
sWork.append(s1);
sWork.assign(s1);
sWork.append(s1);
sWork.assign(s2);
sWork.append(s2);
}</p>
<p>int main(int ac,char** av)
{
dtLoop = time_function(do_total);
report_times("C string calls",time_function(do_c_string_calls),nTotal);
report_times("ZString1 string calls",time_function(do_z1_string_calls),nTotal);
report_times("ZString2 string calls",time_function(do_z2_string_calls),nTotal);
report_times("C++ string calls",time_function(do_cpp_string_calls),nTotal);
return 0;
}</p>
Tax-time and Staples "Easy" Rebates2005-01-28T00:00:00Zhttps://bannister.us/weblog/2005/welcome-to-staples-rebate-center
<p>I am impressed - <a href="https://www.stapleseasyrebates.com/img/staples/paperless/pages/Landing.html">Staples Easy
Rebates</a>
is a web application from a retail outfit that works and is not overly
flashy. Not to mention a <strong>really</strong> good idea.</p>
<p>It is tax-time again and I <a href="http://www.staples.com/products/spotlights/000000/tax2005/turbotax/deluxe.asp">needed to buy tax
software</a>.
Pretty much everyone is offering mail-in rebates.</p>
<p>I hate mail-in rebates. The one time I tried claiming a mail-in rebate
was just too much of a hassle to be worth the partial amount that came
back. Staples makes rebates really "easy". Where you see this button -
<img src="http://www.staples.com/products/SpotLights/Marketing/easyrebate/images/icon.gif" alt="untitled" /> -
on their site, you can skip the "mail-in" part and claim your rebate
over the web.</p>
<p>Not only that - the web application they use to process the rebates is
quite well done. The web interface is easy to use. They send an
immediate follow-up email, and a progress notice the next day. None of
this is exotic - just seldom done as well.</p>
<p>I will bet the suppliers are a lot less enthused. They make money when
rebates are seldom claimed, so "easy" rebate processing means more money
going back to customers.</p>
<p>Update 2/21/2005 -- the rebates showed up in today's mail. Guess this
really works :).</p>
<p><img src="https://bannister.us/weblog/images/2004-money.png" alt="untitled" />
Once I'd sent in my taxes, Quicken made it easy to take a look at where
my money has gone in the past year. Pretty straightforward story - I pay
taxes, own a house (in over-priced southern California), and am divorced
with three kids. That accounts for pretty much everything :( .</p>
No Bugs?2005-01-25T00:00:00Zhttps://bannister.us/weblog/2005/no-bugs
<p><img src="https://bannister.us/weblog/images/IMG_2341.jpg" alt="untitled" />
One of the critters starting to make a comeback after the rains.</p>
<p>Spent the day (and likely the remainder of the night) getting a
prototype web application working, Well, it worked already in the same
sense as a car works when it's motor is running in the garage. Want to
get this application out on the road...</p>
<p>( Speaking of which - time to run out to Trader Joe's for supplies. Have
to have cream for the coffee :) )</p>
The American SS?2005-01-24T00:00:00Zhttps://bannister.us/weblog/2005/199
<p>From <a href="http://www.bradenton.com/mld/bradenton/news/local/10717584.htm">McCain expects inquiry on new espionage
unit</a></p>
<blockquote>
<p>Defense Secretary Donald H. Rumsfeld has created a new espionage unit
called the Strategic Support Branch, according to the news report, but
McCain, speaking on CBS's "Face the Nation" said he doubts Rumsfeld
has broken any laws.</p>
</blockquote>
<p>The "Special Support" branch? So our government now has a semi-secret
unit with the initials "SS". Ouch.</p>
Speed versus complexity in User Interface interaction2005-01-23T00:00:00Zhttps://bannister.us/weblog/2005/speed-versus-complexity-in-user-interface-interaction
<p>Reflecting on user interface design and programming, there is a cluster
of notions I would like to get across.</p>
<p>When writing a GUI framework to run on the original 4.77Mhz Intel 8088
based PCs, after writing the initial set of primitives I found
performance unsatisfactory. I am a big believer in making the lower
level framework very fast (then and now), so that the higher level code
can be less concerned about efficiency. This was not an obtainable goal
with generalized graphics operations on 8088 (too many clock counts for
shift operations).</p>
<p>So I flipped the problem around. Instead of generalized graphics I came
at the problem differently. Graphics operations are at base moving bits
from one location to another. The 8088 string instructions were the
fastest means of moving bits around. By choosing the right constraints
(mainly byte-alignment in source and destination) I could write graphic
operations sufficient for a GUI framework (at the time), and deliver
very high performance levels.</p>
<p>It was nearly ten years later before Windows applications could count on
similar performance levels (though of course the operations supported
were far more general).</p>
<p>At about the same time I found an early shareware editor called Dewar
Advanced Screen Editor (DAED). The interesting thing about using this
editor was not the features offered (basic even for the time) but rather
the fluid, fast, predictable response time. I had turned up my
key-repeat rate up to much higher than standard levels (to something
like 100 repeats/second through a third-party TSR), and because of the
fast response of the editor, could simply zip from one location to
another using simple cursor movement commands. Because the simple
movement commands were (very!) fast and predictable, there was much less
need for the more complex movement commands. When moving vertically you
could judge where you were in a file simply by watching the text slide
smoothly past.</p>
<p>In contrast, when later programming on Unix I became accustomed to using
the complex movement commands available in Emacs, as this was the
fastest way to move around in a file when the screen was painted by
characters squirted across a serial line. Complex movement commands make
more sense when display and response time is relatively slow. Note also
on time-shared, multi-tasked systems the response time to simple
movement commands is unpredictable. On a single-task unshared system you
can learn to judge the distance per second moved through a file by
holding down a movement key. This sort of learning can only take place
when the response is immediate, predictable, and you can watch the shape
of the text flowing past (fluid movement with no flicker).</p>
<p>We have an entire generation of programmers and designers who - outside
of video games - are accustomed to relatively slow (certainly not fluid)
response from their user interfaces. This lack of experience means the
notion does not occur to most of the folks as even a possibility.</p>
<p>There is something fundamentally different about a user interface with
fast, fluid response.</p>
<p>Note that Windows does not let you set key repeat rates above the
standard 31 repeats/second. You cannot explore notions that are
impossible within the common framework (Windows).</p>
<p>Not sure the interrelationships in the above is at all clear...</p>
Nice weather2005-01-23T00:00:00Zhttps://bannister.us/weblog/2005/nice-weather
<p>Images from (not so) smoggy southern California. We had in series - cold
(lows in the 30's), rainy, and then warm weather. The warm weather came
on a mild desert wind, clearing the skies.</p>
<p><a href="https://bannister.us/weblog/images/2005_01_full/IMG_2344.jpg"><img src="https://bannister.us/weblog/images/2005_01_small/IMG_2344.jpg" alt="untitled" /></a>
Deer enjoying the new green stuff too much to be bothered by my
approach.</p>
<p><a href="https://bannister.us/weblog/images/2005_01_full/IMG_2346.jpg"><img src="https://bannister.us/weblog/images/2005_01_small/IMG_2346.jpg" alt="untitled" /></a>
A mudslide on the trail in Whiting Ranch. Due to the burst of warm and
dry weather after the rains, the ground was again quite firm, so walking
over was no problem.</p>
<p><a href="https://bannister.us/weblog/images/2005_01_full/IMG_2347.jpg"><img src="https://bannister.us/weblog/images/2005_01_small/IMG_2347.jpg" alt="untitled" /></a>
Looking out at Catalina Island from the hills above Foothill Ranch.
Note that Catalina is <a href="http://bannister.us/weblog/?p=140">about 50 miles
away</a>. Visible to the eye (but
outside this picture) you could also see San Clemente Island at about 70
miles.</p>
<p><a href="https://bannister.us/weblog/images/2005_01_full/IMG_2354.jpg"><img src="https://bannister.us/weblog/images/2005_01_small/IMG_2354.jpg" alt="untitled" /></a>
Over the top of Dreaded Hill.</p>
<p><a href="https://bannister.us/weblog/images/2005_01_full/IMG_2355.jpg"><img src="https://bannister.us/weblog/images/2005_01_small/IMG_2355.jpg" alt="untitled" /></a>
A bit of new color on the trail.</p>
<p><a href="https://bannister.us/weblog/images/2005_01_full/IMG_2358.jpg"><img src="https://bannister.us/weblog/images/2005_01_small/IMG_2358.jpg" alt="untitled" /></a>
Looking northwest from Whiting Ranch. Note the mountains in the
distance are northeast of Los Angeles.</p>
<p><a href="https://bannister.us/weblog/images/2005_01_full/IMG_2362.jpg"><img src="https://bannister.us/weblog/images/2005_01_small/IMG_2362.jpg" alt="untitled" /></a>
Down Dreaded Hill.</p>
<p><a href="https://bannister.us/weblog/images/2005_01_full/IMG_2363.jpg"><img src="https://bannister.us/weblog/images/2005_01_small/IMG_2363.jpg" alt="untitled" /></a>
California snow - the blooms falling from the Dwarf Apple (doubtless a
very confused tree at this point) cover the back patio.</p>
American influence2005-01-22T00:00:00Zhttps://bannister.us/weblog/2005/american-influence
<p>From <a href="http://www.iht.com/articles/2005/01/20/opinion/edfried.html">Thomas L. Friedman: An American in
Europe</a></p>
<blockquote>
<p>That sense that America is now so powerful that it influences everyone
else's politics more than their own governments - so everyone wants to
vote in our elections - is something you hear more and more these
days.</p>
<p>Elizabeth Angell, a 23-year-old American studying at Oxford, told me
that a Pakistani friend at school had asked her if he could just watch
her fill out her absentee ballot for the U.S. election. "He said to
me, 'It's the closest thing I am going to get to voting. ... I wish I
could vote in your election because your government affects my daily
life more than my own.' "</p>
</blockquote>
<p>Oddly enough I got the same sense (from an entirely different
perspective) from reading about <a href="http://www.amazon.com/exec/obidos/tg/detail/-/0895267462/qid=1106418687/sr=12-1/002-8155213-5331247?v=glance&s=books">the last dictator of
Romania</a>.</p>
Why is American Airlines gathering written dossiers on fliers' friends?2005-01-21T00:00:00Zhttps://bannister.us/weblog/2005/why-is-american-airlines-gathering-written-dossiers-on-fliers-friends
<p>From Cory Doctorow - <a href="http://www.boingboing.net/2005/01/19/why_is_american_airl.html">Why is American Airlines gathering written
dossiers on fliers'
friends?</a></p>
<p>Since we apparently have a (secret?) regulation that requires a visitor
to write down the names of friends, why not go the extra step? The
Soviets used to require papers granting permission to travel. Would we
be more secure (in the same sense) if we to required travel papers that
could be inspected on demand by any official?</p>
<p>[ For the humor-impaired or anyone who might take the above literally --
this might be called "dark humor" ].</p>
Sparkle Cleaning Service2005-01-21T00:00:00Zhttps://bannister.us/weblog/2005/sparkle-cleaning-service
<p>One morning while working I heard someone come to the front door.
Through the window I saw a woman (blonde hair, sunglasses) pick up and
inspect something small and white (a card?), put something down, and
walk away. Later I checked outside and found only a lime green
letter-size sheet advertising the "Sparkle Cleaning Service".</p>
<p>Guess the cleaning service business is more cut-throat than I thought...</p>
Jonathan and IBM2005-01-21T00:00:00Zhttps://bannister.us/weblog/2005/jonathan-and-ibm
<p>To be honest, I found some of Jonathan's past words about IBM to be just
a bit over the top. This time he is playing nice.</p>
<p><a href="http://blogs.sun.com/roller/page/jonathan/20050121">Today's message</a> on
the other hand, is perfectly reasonable and hits IBM dead-center. I can
imagine IBM customers bringing this letter to the table when they meet
with their IBM representatives. Ouch.</p>
<p>Not to mention the fact that here we have a Sun CEO who sounds like he's
actually worth his stock options :).</p>
Structure editors, IDEs, and another Lisp flashback2005-01-19T00:00:00Zhttps://bannister.us/weblog/2005/structure-editors-ides-and-another-lisp-flashback
<p>Tree structure editors were once all the rage in the Lisp community (and
elsewhere). The idea is compelling - work directly on the structure of
your code, rather than a text representation. In practice tree structure
editors turned out to be rather tedious to use. This of course was back
in the day of terminals with 4800 baud serial connections (or slower),
so perhaps faster computers with drag and drop GUI interfaces would
change the game enough. The <a href="http://subtextual.org/demo1.html">subtext
demo</a> linked to from Jon Udell's
article on <a href="http://www.infoworld.com/article/05/01/14/03OPstrategic_1.html">Exploring the deep structure of
code</a>
offers a GUI version of the old tree structure editor.</p>
<p>The example and the accompanying narrative is somewhat interesting.
Oddly enough it is not the tree-structure-editor aspect that I find
compelling. Rather it is the use of sample values, live computation, and
highlighting of "dead" (not executed) code.</p>
<p>None of this requires a new visual representation - by the way.</p>
<p>One of the gifts earned from early heavy exposure to Lisp was the notion
of surface representation. Lisp code could be automatically formatted
into MLISP - an Algol-like text, edited as MLISP, and the MLISP text
could be parsed directly back into Lisp. In another project, Ada source
code could be parsed into a Lisp structure representing the Ada parse
tree, the parse tree could be interpreted, compiled, or pretty-printed
as text for editing.</p>
<p>Put differently, your Java source code (or your language of choice) is
simply a surface representation for a parse tree. You can map from the
parse tree into Java source text. In fact you could do most everything
in the demo without having to use a different surface representation. So
I do not see (for example) Java source as "hiding" the deep structure of
the program -- rather this is simply a compact textual surface
representation.</p>
<p>Note that there are difficulties in preserving comments (you would
likely have to restrict comment placement somewhat). Note also that the
use of preprocessor macros in C/C++ makes this all a <strong>lot</strong> harder (a
good argument restricting or eliminating use of the preprocessor in
other languages - too late for C/C++).</p>
<p>One of the strong, subtle advantages in the Lisp environment was in
having the parser and pretty printer as simply another set of functions
in the library. In the C/C++ world the compiler is a large monlithic
seperate program, and offers only a one-way path from source text to
compiled code. You cannot reuse parser or gain access to the parse tree.
In the Java world the compiler is once again part of the environment
(with only slightly awkward access). This is one prime reason Java IDEs
can support refactoring, and "deep" operations on your Java programs.</p>
<p>In my opinion at least, the notion of tree-structure editing is still
only of limited value, and not a replacement for simple text editing.
Back in college, after we had all played with structure editors for a
time, <a href="http://drstephencw.blogspot.com/">one member of our group</a>
identified the source of our discomfort by noting that many simple
common operations in a text editor were much more complicated in a
structure editor.</p>
<p>What I take away from all this is that most of the time when
programming, what I want is a text editor. A smart text editor with
insight into the parse tree generated by the text is useful. Alternate
representations (tree views, etc.) for navigation and some sorts of
tree-oriented operations are useful. But for the 90+% of the time when
I'm hammering out code, the main interface should be a text editor.</p>
<p>Oddly enough this sounds an awful lot like a present day IDE :).</p>
<p>What we <strong>can</strong> do is go further down the path - finding new ways to use
the knowledge of the underlying parse tree. We can highlight and animate
the program text. We can offer alternate views (surface representations)
of the underlying structure.</p>
In the name of science2005-01-18T00:00:00Zhttps://bannister.us/weblog/2005/in-the-name-of-science
<p>Amatuer scientists engage in <a href="http://www.improb.com/airchives/paperair/volume6/v6i4/postal-6-4.html">Postal
Experiments</a>.</p>
A diversion into hash tables and binary searches2005-01-18T00:00:00Zhttps://bannister.us/weblog/2005/a-diversion-into-hash-tables-and-binary-searches
<p>A short diversion into hash tables and searching (blame Tim Bray for
<a href="http://googleresearch.blogspot.com/2006/06/extra-extra-read-all-about-it-nearly.html">mentioning</a>
an old article <a href="http://www.tbray.org/ongoing/When/200x/2003/03/22/Binary">On the Goodness of Binary
Search</a>).</p>
<p>Most hash tables involve lookup using character strings. A long time ago
I ran into a very simple hash function for character strings in an old
CACM article that is both so simple I can re-create it from memory and
efficient enough to hold up very well in testing.</p>
<p>// Simple hash function derived from:
// Communications of the ACM
// Volume 33, Number 6, June, 1990
// Peter K. Pearson
// "Fast hashing of variable-length text strings"</p>
<p>static unsigned char T[] = {
64, 67, 45, 157, 253, 237, 236, 112, 17, 69, 61, 182, 173, 44, 235, 153,
102, 223, 251, 95, 166, 136, 160, 25, 60, 198, 146, 62, 87, 200, 71, 169,
220, 5, 131, 133, 138, 99, 73, 48, 129, 96, 130, 139, 233, 246, 248, 41,
150, 175, 98, 214, 74, 177, 66, 219, 105, 78, 65, 32, 94, 16, 240, 14, 68,
174, 37, 81, 238, 107, 88, 135, 13, 180, 132, 28, 155, 222, 228, 70, 92,
232, 163, 168, 103, 167, 190, 91, 206, 205, 24, 179, 161, 255, 83, 31, 208,
12, 148, 189, 79, 106, 51, 137, 122, 159, 178, 224, 72, 191, 225, 11, 18,
193, 8, 126, 84, 50, 114, 140, 247, 215, 9, 221, 171, 152, 196, 59, 242, 35,
244, 56, 213, 164, 76, 209, 245, 226, 197, 75, 158, 216, 147, 211, 52, 186,
1, 195, 201, 46, 172, 165, 85, 170, 185, 0, 254, 7, 80, 144, 141, 6, 89,
217, 128, 86, 30, 121, 113, 184, 199, 252, 110, 57, 188, 54, 231, 183, 187,
156, 63, 47, 39, 118, 124, 90, 207, 43, 116, 2, 26, 212, 202, 234, 203, 218,
93, 210, 34, 55, 29, 101, 192, 21, 40, 49, 249, 82, 100, 230, 204, 20, 125,
239, 145, 108, 111, 27, 176, 4, 53, 241, 229, 3, 143, 77, 15, 149, 23, 154,
58, 36, 109, 123, 134, 119, 162, 104, 243, 127, 22, 42, 10, 19, 227, 115,
117, 33, 250, 38, 97, 151, 120, 194, 142, 181
};</p>
<p>static inline unsigned hashOf(unsigned h,const char* s)
{
for (int c = *s++; c; c = *s++) {
h = T[h ^ (255 & c)];
}
return h;
}</p>
<p>The table <strong>T[]</strong> is just the values 0-255 shuffled randomly (give me a
few minutes and I'll write you an AWK script to generate as many unique
<strong>T[]</strong>'s as you need). The hash function is very cheap to compute. As
the original article mentioned the distribution of hash values is
excellent.</p>
<p>The limitation of the hash function is that it only generates hash
values in the range 0-255. Turns out this works rather well (at least
for my purposes) in building a hash table.</p>
<p>Start with the observation that - if you make a lot of use of hash
tables - most hash tables are small. What you want is a hash table
implementation that is inexpensive and efficient at small sizes, and
that also scales well to reasonably large sizes. My approach is to use
the above cheap hash function to select from 256 hash buckets, and each
hash bucket is a binary tree. (If you really need to save memory and the
number of items hashed is small, you can reduce the number of hash
buckets to a smaller power-of-two value by simply masking the hash
value).</p>
<p>My approach is similar to Tim's in that I use a binary tree, but
front-ended by a hash and lookup on a 256 slot array. For small to
moderate sizes this tends to win over most everything else I've tested.
For large numbers of items (last time I measured I think the cross-over
was around a hundred thousand items) this is not the best solution ...
but the performance is only mildly off from the better solutions. For
the smaller number of items I usually find in my hash tables, this
simpler implementation is faster and uses less memory.</p>
<p>Algorithmically this solution is roughly O(1) for smaller tables,
changing to O(log(N)) for large tables. What you need to consider is
that the actual runtime of the algorithm is likely dominated (when doing
name lookups) by the string comparison time. Replacing (roughly) eight
string comparisons with one cheap hash function is a good deal.</p>
<p>Take one common degenerate case where the saved string comparisons are a
<strong>huge</strong> win - looking up data associated with filenames. If you have a
map of absolute filenames (the equivalent of "<code>find / -type f</code>" on Unix
or "<code>dir/s/b/a-d \</code>" on Windows) you have a large number of long strings
with many long common prefixes. You save a <strong>lot</strong> of CPU avoiding those
~8 string comparisons on every lookup.</p>
<p>As an aside - I tried further minimizing the number of string
comparisons by computing a second hash (same algorithm with a different
seed), storing the hash in each tree node, and comparing the hash before
performing a string compare. To my surprise the result actually
benchmarked <em>slower</em> than without the secondary hash. (Naturally, your
results may vary...).</p>
<p>Note that if you know up-front that your hash table is going to be huge,
the best hash function I found in my testing is from <a href="http://burtleburtle.net/bob/hash/evahash.html">Bob
Jenkins</a> (who has clearly
done his own research).</p>
<p>Heh. Found an <a href="http://groups.google.com/group/comp.programming/msg/e39e9f55b4f74c64?dmode=source">old USENET
posting</a>
(and wonder how long the link into Google Groups will remain valid...).</p>
My iRobot died :(2005-01-17T00:00:00Zhttps://bannister.us/weblog/2005/my-irobot-died
<p>After about 50 uses (and a cleaner house with less work - always a good
deal) my Roomba died. After the last run <a href="http://www.irobot.com/support/troubleshooting_detail.cfm?id=72">the battery would not
charge</a>.
After trying all the obvious alternatives (re-seating the battery,
connecting the charger directly, and giving the unit a moderate shake)
the problem stayed, so called the iRobot support line. The wait was
over-long (victim of their own success?), but when finally connected the
lady listened to the symptoms, and offered to ship out a new battery and
charger. Not keen about the failure or the long wait on hold ... but am
encouraged by the response.</p>
<p>Only problem is the 7-10 days until the replacements arrive. I can
already see the gold dog fur (seemingly everywhere) on the dark blue
carpet. Might have to actually use the vacuum for a few days...</p>
How to build a better string class - and a surprise2005-01-17T00:00:00Zhttps://bannister.us/weblog/2005/how-to-build-a-better-string-class-and-a-surprise
<p>[<a href="https://bannister.us/weblog/2005/building-a-better-string-class">Summary</a>]
[<a href="https://bannister.us/weblog/2005/continued-building-a-better-string-class-assumptions-revised">Continued</a>]
[<a href="https://bannister.us/weblog/2006/kind-of-annoying-actually">A later note...</a>]</p>
<p>I seldom use the C++ string classes supplied with the standard
libraries, out of a belief that (for my purposes) that I can easily do
better, building on bits of history and experience. Considerations that
go into building a simple and highly efficient C++ string class include
the following.</p>
<ol>
<li>The standard <string.h> supplied C string functions are highly
optimized (as described in a
<a href="https://bannister.us/weblog/2005/legacy-of-dhrystone">previous post</a>).</li>
<li>Heap operations are best avoided (where practical) in long running
applications. Use of a free list is very effective when the
application has a cyclic workload (as most do).</li>
<li>Use of C++ inline class methods allows both readable code and most
effective use of the optimizer.</li>
</ol>
<p>In particular the Microsoft C/C++ compiler will emit x86 string
instructions for common string operations. The x86 string operations are
substantially faster than the equivalent sequence of generic x86
instructions. In fact I used x86 string instructions as the chief trick
to write a fast GUI framework for the original 4.77Mhz 8088 original IBM
PC (this is pre-Windows by quite a bit).</p>
<p>At least I knew this all was once true. Checking your assumptions is
always a good idea. Last time I checked this particular assumption the
i386 and i486 were current generation CPUs. Certainly the current
generation of x86 CPUs are considerably changed.</p>
<p>Turns out I was in for a surprise. The source of the test program is at
the end. First the results.</p>
<p>C:\tmp\benchmarks>bin\debug\string
TIME old strings 5568 ticks for 1180000000 characters written
RATE old strings 211.9 MB/second (1180.0 MB in 5.6 seconds)</p>
<p>C:\tmp\benchmarks>bin\release\string
TIME old strings 8462 ticks for 1180000000 characters written
RATE old strings 139.4 MB/second (1180.0 MB in 8.5 seconds)</p>
<p>Yikes! The non-optimized "debug" code is <strong>faster</strong> than the optimized
"release" code?! Not exactly what I was expecting.</p>
<p>This above results are from compiling with the Microsoft Visual C++ 6.0
compiler.</p>
<p>Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8804 for 80x86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.</p>
<p>After some experimentation I found that turning off inlined intrinsic
functions (which in the case of string functions emits x86 string
instructions) erased essentially all of the performance difference.
(Note the pragma in the final sources found below).</p>
<p>C:\tmp\benchmarks>bin\debug\string
TIME old strings 5859 ticks for 1180000000 characters written
RATE old strings 201.4 MB/second (1180.0 MB in 5.9 seconds)</p>
<p>C:\tmp\benchmarks>bin\release\string
TIME old strings 5738 ticks for 1180000000 characters written
RATE old strings 205.6 MB/second (1180.0 MB in 5.7 seconds)</p>
<p>While the above results were a surprise, in a way they make sense.
Current CPUs throw an insane amount of hardware at the problem of making
a single instruction stream run as fast as possible. Likely the
instruction traces showed the x86 string instructions to be rarely used.
If so the CPU designers would quite logically choose to optimize the
commonly used instructions, and not the string ops -- thus explaining
the results above.</p>
<p>Note that my timings were all done on AMD Athlon CPUs (all I have on my
home network). The results may be different for Intel Pentium CPUs --
and are almost certainly different between older and newer models.
Comparative times between debug/release builds for each Pentium
generation would be interesting, and might tell us when the CPU
designers made the suspected tradeoff. (My guess would be that the
string operations started to lose ground after the first generation
Pentiums - but that is only a guess).</p>
<p>This deserves a bit more exploration. Tried compiling the same sources
with the GNU C++ compiler.</p>
<p>C:\tmp\benchmarks>g++ -o string-gcc string\string.cpp</p>
<p>C:\tmp\benchmarks>string-gcc
TIME old strings 7371 ticks for 1180000000 characters written
RATE old strings 160.1 MB/second (1180.0 MB in 7.4 seconds)</p>
<p>C:\tmp\benchmarks>g++ -O6 -o string-gcc string\string.cpp</p>
<p>C:\tmp\benchmarks>string-gcc
TIME old strings 7381 ticks for 1180000000 characters written
RATE old strings 159.9 MB/second (1180.0 MB in 7.4 seconds)</p>
<p>In this case un-optimized code again beats the optimized code by a small
amount. The GNU compiler times are not as good as the Microsoft compiler
times -- but given this is a micro-benchmark, do not count too much on
the significance of this lone measure. Apparently the GNU compiler does
not emit inline x86 string instructions.</p>
<p>From looking at the assembly listing it appears with inlined intrinsics
suppressed, the Microsoft compiler emits calls to the standard C library
string functions. We might expect the code to do a bit better without
the call overhead, so I added inline functions for the tested
operations. Also tried the usual combinations of loop unrolling, word
versus byte moves, autoincrement versus array offsets (none of which
were used in my original string class).</p>
<p>C:\tmp\benchmarks>bin\release\string
RATE C intrinsic string calls 428.5 MB/second (1180.0 MB in 2.8 seconds)
RATE C function string calls 442.9 MB/second (1180.0 MB in 2.7 seconds)
RATE x1 string calls 329.1 MB/second (1180.0 MB in 3.6 seconds)
RATE x2 string calls 219.8 MB/second (1180.0 MB in 5.4 seconds)
RATE x4 string calls 197.4 MB/second (1180.0 MB in 6.0 seconds)
RATE x4x string calls 266.0 MB/second (1180.0 MB in 4.4 seconds)
RATE x8 string calls 218.6 MB/second (1180.0 MB in 5.4 seconds)
RATE x8a string calls 208.9 MB/second (1180.0 MB in 5.6 seconds)
RATE x8j string calls 208.9 MB/second (1180.0 MB in 5.6 seconds)
RATE x16j string calls 217.8 MB/second (1180.0 MB in 5.4 seconds)
RATE x16a string calls 249.6 MB/second (1180.0 MB in 4.7 seconds)
RATE mem string calls 239.5 MB/second (1180.0 MB in 4.9 seconds)</p>
<p>Since the MSVC 6.0 compiler pre-dates the Athlon CPU by a few years, you
might wonder how code emitted from the current Microsoft C++ compiler
compares. As it turns out, even when the newer compiler is told to
optimize specifically for the Athlon, the benchmark results are
essentially the same.</p>
<p>C:\tmp\benchmarks>"c:\program files\Microsoft Visual C++ Toolkit 2003\bin\cl.exe" /G7 /O2 string\string.cpp
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 13.10.3077 for 80x86
Copyright (C) Microsoft Corporation 1984-2002. All rights reserved.</p>
<p>string.cpp
Microsoft (R) Incremental Linker Version 7.10.3077
Copyright (C) Microsoft Corporation. All rights reserved.</p>
<p>/out:string.exe
string.obj</p>
<p>C:\tmp\benchmarks>string
RATE C intrinsic string calls 315.1 MB/second (1180.0 MB in 3.7 seconds)
RATE C function string calls 439.6 MB/second (1180.0 MB in 2.7 seconds)
RATE x1 string calls 381.3 MB/second (1180.0 MB in 3.1 seconds)
RATE x2 string calls 210.8 MB/second (1180.0 MB in 5.6 seconds)
RATE x4 string calls 201.7 MB/second (1180.0 MB in 5.8 seconds)
RATE x4x string calls 246.5 MB/second (1180.0 MB in 4.8 seconds)
RATE x8 string calls 210.8 MB/second (1180.0 MB in 5.6 seconds)
RATE x8a string calls 220.2 MB/second (1180.0 MB in 5.4 seconds)
RATE x8j string calls 217.4 MB/second (1180.0 MB in 5.4 seconds)
RATE x16j string calls 218.6 MB/second (1180.0 MB in 5.4 seconds)
RATE x16a string calls 267.2 MB/second (1180.0 MB in 4.4 seconds)
RATE mem string calls 244.5 MB/second (1180.0 MB in 4.8 seconds)</p>
<p>When optimized for the Athlon the times change a bit, but the
conclusions work out pretty much the same:</p>
<ul>
<li>Calling the string functions in the C library yields the highest
performance.</li>
<li>All the usual optimizations (loop unrolling, word moves) come in
slower than a simple one-character-at-a-time <strong>while</strong> loop.</li>
<li>The "intrinsic" string calls (using inline x86 string instructions)
sometimes lose to a simple inlined <strong>while</strong> loop.</li>
</ul>
<p>Looks like we can forget about all the old/usual optimization tricks.
That leaves the string functions, an inlined one-character <strong>while</strong>
loop, and inlined x86 string instructions as our top three choices.</p>
<p>Note that in this micro-benchmark the inner loop is quite short, and the
number of characters moved by each string operation is relatively large.
Compared to a more "usual" program (more characters moved / larger inner
loop) this minimizes the calling overhead for out-of-line string
functions, and gives the compiler less of an opportunity to optimize
inline code. My theory is that for a larger inner loop with smaller
strings, the out-of-line string functions will lose much of their
advantage. In fact, I suspect the simple inlined one-character <strong>while</strong>
loop will end up our top contendor. Something the explore in the next
iteration...</p>
<p>#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <string.h>
//#include <string></string></p>
<p>static const char sOut[] = "ABCDEFGHJKLMNOPQRSTUVWXYZabcdefghjklmnopqrstuvwxyz123456789";
int nLength = ::strlen(sOut);</p>
<p>//using namespace std;</p>
<p>void report_times(const char* s,int dt,int cb)
{
//printf("TIME %s %d ticks for %d characters written\n",s,dt,cb);
double ts = (double)dt / CLOCKS_PER_SEC;
double mb = (double)cb / 1000000;
double rate = mb / ts;
printf("RATE %s %0.1f MB/second (%0.1f MB in %0.1f seconds)\n",s,rate,mb,ts);
}</p>
<p>//
// Perform a function for a fixed number of iterations and return time.
//</p>
<p>const int nLoop = 10000000;
int dtLoop = 0;</p>
<p>typedef void (<em>doit)(const char</em>,const char*);</p>
<p>int time_function(doit fn)
{
clock_t t0 = ::clock();
for (int i=0; i<nLoop; ++i) {
const char* s1 = sOut + (31 & i);
const char* s2 = sOut + nLength - (31 & i);
(*fn)(s1,s2);
}
return (int)(::clock() - t0) - dtLoop;
}</p>
<p>//
// Time C string operations.
//</p>
<p>char sWork[256];
int nTotal = 0;</p>
<p>void do_total(const char* s1,const char* s2)
{
nTotal += nLength;
nTotal += nLength;
}</p>
<p>void do_c0_string_calls(const char* s1,const char* s2)
{
::strcpy(sWork,s1);
::strcat(sWork,s2);
::strcpy(sWork,s1);
::strcat(sWork,s2);
}</p>
<p>// Optimization that seems to work best (at least with an Athlon).
#pragma function(strlen,strcpy,strcat)</p>
<p>void do_c1_string_calls(const char* s1,const char* s2)
{
::strcpy(sWork,s1);
::strcat(sWork,s2);
::strcpy(sWork,s1);
::strcat(sWork,s2);
}</p>
<p>inline void x1_strcpy(char* s1,const char* s2)</p>
<p>{
while (*s1++ = *s2++);
}</p>
<p>inline void x1_strcat(char* s1,const char* s2)
{
while (*s1) ++s1;
x1_strcpy(s1,s2);
}</p>
<p>void do_x1_string_calls(const char* s1,const char* s2)
{
x1_strcpy(sWork,s1);
x1_strcat(sWork,s2);
x1_strcpy(sWork,s1);
x1_strcat(sWork,s2);
}</p>
<p>inline void x2_strcpy(char* s1,const char* s2)
{
const char* p = s2; while (*p++); int n = (int)(p - s2) >> 1;
while (n--) {
*s1++ = *s2++;
*s1++ = *s2++;
}
while (s2 < p) {
*s1++ = *s2++;
}
}</p>
<p>inline void x2_strcat(char* s1,const char* s2)
{
while (*s1) ++s1;
x2_strcpy(s1,s2);
}</p>
<p>void do_x2_string_calls(const char* s1,const char* s2)
{
x2_strcpy(sWork,s1);
x2_strcat(sWork,s2);
x2_strcpy(sWork,s1);
x2_strcat(sWork,s2);
}</p>
<p>inline void x4_strcpy(char* s1,const char* s2)
{
const char* p = s2; while (*p++); int n = (int)(p - s2) >> 2;
while (n--) {
*s1++ = *s2++;
*s1++ = *s2++;
*s1++ = *s2++;
*s1++ = *s2++;
}
while (s2 < p) {
*s1++ = *s2++;
}
}</p>
<p>inline void x4_strcat(char* s1,const char* s2)
{
while (*s1) ++s1;
x4_strcpy(s1,s2);
}</p>
<p>void do_x4_string_calls(const char* s1,const char* s2)
{
x4_strcpy(sWork,s1);
x4_strcat(sWork,s2);
x4_strcpy(sWork,s1);
x4_strcat(sWork,s2);
}</p>
<p>inline void x4x_strcpy(char* s1,const char* s2)
{
const char* p = s2; while (<em>p++); int n = (int)(p - s2) >> 2;
int</em> p1 = (int*)s1;
int* p2 = (int*)s2;
while (n--) {
<em>p1++ = <em>p2++;
}
s1 = (char</em>)p1;
s2 = (const char</em>)p2;
while (s2 < p) {
*s1++ = *s2++;
}
}</p>
<p>inline void x4x_strcat(char* s1,const char* s2)
{
while (*s1) ++s1;
x4x_strcpy(s1,s2);
}</p>
<p>void do_x4x_string_calls(const char* s1,const char* s2)
{
x4x_strcpy(sWork,s1);
x4x_strcat(sWork,s2);
x4x_strcpy(sWork,s1);
x4x_strcat(sWork,s2);
}</p>
<p>inline void x8_strcpy(char* s1,const char* s2)
{
const char* p = s2; while (*p++); int n = (int)(p - s2) >> 3;
while (n--) {
*s1++ = *s2++;
*s1++ = *s2++;
*s1++ = *s2++;
*s1++ = *s2++;
*s1++ = *s2++;
*s1++ = *s2++;
*s1++ = *s2++;
*s1++ = *s2++;
}
while (s2 < p) {
*s1++ = *s2++;
}
}</p>
<p>inline void x8_strcat(char* s1,const char* s2)
{
while (*s1) ++s1;
x8_strcpy(s1,s2);
}</p>
<p>void do_x8_string_calls(const char* s1,const char* s2)
{
x8_strcpy(sWork,s1);
x8_strcat(sWork,s2);
x8_strcpy(sWork,s1);
x8_strcat(sWork,s2);
}</p>
<p>inline void m_strcpy(char* s1,const char* s2)
{
const char* p = s2; while (*p++); int n = (int)(p - s2);
::memcpy(s1,s2,n+1);
}</p>
<p>inline void m_strcat(char* s1,const char* s2)
{
while (*s1) ++s1;
m_strcpy(s1,s2);
}</p>
<p>void do_m_string_calls(const char* s1,const char* s2)
{
m_strcpy(sWork,s1);
m_strcat(sWork,s2);
m_strcpy(sWork,s1);
m_strcat(sWork,s2);
}</p>
<p>inline void x8a_strcpy(char* s1,const char* s2)
{
const char* p = s2; while (*p++); int n = (int)(p - s2) >> 3;
while (n--) {
s1[0] = s2[0];
s1[1] = s2[1];
s1[2] = s2[2];
s1[3] = s2[3];
s1[4] = s2[4];
s1[5] = s2[5];
s1[6] = s2[6];
s1[7] = s2[7];
s1 += 8;
s2 += 8;
}
while (s2 < p) {
*s1++ = *s2++;
}
}</p>
<p>inline void x8a_strcat(char* s1,const char* s2)
{
while (*s1) ++s1;
x8a_strcpy(s1,s2);
}</p>
<p>void do_x8a_string_calls(const char* s1,const char* s2)
{
x8a_strcpy(sWork,s1);
x8a_strcat(sWork,s2);
x8a_strcpy(sWork,s1);
x8a_strcat(sWork,s2);
}</p>
<p>inline void x8j_strcpy(char* s1,const char* s2)
{
const char* p = s2; while (*p++); int n = (int)(p - s2);
goto _0;
_8:
*s1++ = *s2++;
*s1++ = *s2++;
*s1++ = *s2++;
*s1++ = *s2++;
*s1++ = *s2++;
*s1++ = *s2++;
*s1++ = *s2++;
*s1++ = *s2++;
_0:
if (n >> 3) { n -= 8; goto _8; }
if (1 & n) {
*s1++ = *s2++;
}
if (2 & n) {
*s1++ = *s2++;
*s1++ = *s2++;
}
if (4 & n) {
*s1++ = *s2++;
*s1++ = *s2++;
*s1++ = *s2++;
*s1++ = *s2++;
}
}</p>
<p>inline void x8j_strcat(char* s1,const char* s2)
{
while (*s1) ++s1;
x8j_strcpy(s1,s2);
}</p>
<p>void do_x8j_string_calls(const char* s1,const char* s2)
{
x8j_strcpy(sWork,s1);
x8j_strcat(sWork,s2);
x8j_strcpy(sWork,s1);
x8j_strcat(sWork,s2);
}</p>
<p>inline void x16j_strcpy(char* s1,const char* s2)
{
const char* p = s2; while (*p++); int n = (int)(p - s2);
goto _0;
_16:
*s1++ = *s2++;
*s1++ = *s2++;
*s1++ = *s2++;
*s1++ = *s2++;
*s1++ = *s2++;
*s1++ = *s2++;
*s1++ = *s2++;
*s1++ = *s2++;
*s1++ = *s2++;
*s1++ = *s2++;
*s1++ = *s2++;
*s1++ = *s2++;
*s1++ = *s2++;
*s1++ = *s2++;
*s1++ = *s2++;
*s1++ = *s2++;
_0:
if (n >> 4) { n -= 16; goto _16; }
if (1 & n) {
*s1++ = *s2++;
}
if (2 & n) {
*s1++ = *s2++;
*s1++ = *s2++;
}
if (4 & n) {
*s1++ = *s2++;
*s1++ = *s2++;
*s1++ = *s2++;
*s1++ = *s2++;
}
if (8 & n) {
*s1++ = *s2++;
*s1++ = *s2++;
*s1++ = *s2++;
*s1++ = *s2++;
*s1++ = *s2++;
*s1++ = *s2++;
*s1++ = *s2++;
*s1++ = *s2++;
}
}</p>
<p>inline void x16j_strcat(char* s1,const char* s2)
{
while (*s1) ++s1;
x16j_strcpy(s1,s2);
}</p>
<p>void do_x16j_string_calls(const char* s1,const char* s2)
{
x16j_strcpy(sWork,s1);
x16j_strcat(sWork,s2);
x16j_strcpy(sWork,s1);
x16j_strcat(sWork,s2);
}</p>
<p>inline void x16a_strcpy(char* s1,const char* s2)
{
const char* p = s2; while (<em>p++); int n = (int)(p - s2);
goto _0;
_16:
((int</em>)s1)[0] = ((int*)s2)[0];
((int*)s1)[1] = ((int*)s2)[1];
((int*)s1)[2] = ((int*)s2)[2];
((int*)s1)[3] = ((int*)s2)[3];
s1 += 16; s2 += 16;
_0:
if (n >> 4) { n -= 16; goto _16; }
if (1 & n) {
*s1++ = *s2++;
}
if (2 & n) {
*s1++ = *s2++;
*s1++ = *s2++;
}
if (4 & n) {
*s1++ = *s2++;
*s1++ = *s2++;
*s1++ = *s2++;
*s1++ = *s2++;
}
if (8 & n) {
*s1++ = *s2++;
*s1++ = *s2++;
*s1++ = *s2++;
*s1++ = *s2++;
*s1++ = *s2++;
*s1++ = *s2++;
*s1++ = *s2++;
*s1++ = *s2++;
}
}</p>
<p>inline void x16a_strcat(char* s1,const char* s2)
{
while (*s1) ++s1;
x16a_strcpy(s1,s2);
}</p>
<p>void do_x16a_string_calls(const char* s1,const char* s2)
{
x16a_strcpy(sWork,s1);
x16a_strcat(sWork,s2);
x16a_strcpy(sWork,s1);
x16a_strcat(sWork,s2);
}</p>
<p>int main(int ac,char** av)
{
dtLoop = time_function(do_total);
report_times("C intrinsic string calls",time_function(do_c0_string_calls),nTotal);
report_times("C function string calls",time_function(do_c1_string_calls),nTotal);
report_times("x1 string calls",time_function(do_x1_string_calls),nTotal);
report_times("x2 string calls",time_function(do_x2_string_calls),nTotal);
report_times("x4 string calls",time_function(do_x4_string_calls),nTotal);
report_times("x4x string calls",time_function(do_x4x_string_calls),nTotal);
report_times("x8 string calls",time_function(do_x8_string_calls),nTotal);
report_times("x8a string calls",time_function(do_x8a_string_calls),nTotal);
report_times("x8j string calls",time_function(do_x8j_string_calls),nTotal);
report_times("x16j string calls",time_function(do_x16j_string_calls),nTotal);
report_times("x16a string calls",time_function(do_x16a_string_calls),nTotal);
report_times("mem string calls",time_function(do_m_string_calls),nTotal);
return 0;
}</p>
Google. 'dark fiber', and killer web applications2005-01-17T00:00:00Zhttps://bannister.us/weblog/2005/google-dark-fiber-and-killer-web-applications
<p>This item grabbed my attention <a href="http://news.zdnet.com/2100-1035_22-5537392.html">Google wants 'dark
fiber'</a>, though I
suspect the speculation by the writer is dead wrong.</p>
<p>Google is building a mega-computer to run web applications. Web search
was their first application. GMail is an outstanding take at a web-based
email. If you take a peek into Google Labs, you can see a whole
collection of very impressive works in progress.</p>
<p>To make the web applications perform optimally, you need to limit the
number of hops to the desktop. The more hops the greater the latency
(slowness) in the network. The more hops the greater the risk of failure
or poor performance at some level. If you are building world-beating web
applications, one next logical step is to buy or build your own fast and
fat backbone. The alternative is to use the existing backbone
providers -- and there is no question that their priorities are going to
focused differly than your needs as a web application company. In
particular the backbones are more interested in economy (of their
operations) than end-to-end latency.</p>
<p>The glut of dark fiber on the market offers a unique possible
opportunity. Google may be able to buy the backbone fiber that they need
at a fraction of the cost otherwise required to build from scratch. You
can expect Google to focus ruthlessly on latency. Eliminating latency is
a key ingredient in building killer web applications.</p>
<p>Do not know if Google will succeed in acquiring the fiber needed - but
given all the 'dark fiber' out there this is certainly a worth a try!</p>
<p>My respect for the folks at Google just went up another notch :).</p>
Continued - building a better string class - assumptions revised2005-01-17T00:00:00Zhttps://bannister.us/weblog/2005/continued-building-a-better-string-class-assumptions-revised
<p>[<a href="https://bannister.us/weblog/2005/building-a-better-string-class">Summary</a>]
[<a href="https://bannister.us/weblog/2005/building-a-better-string-class-comparing-class-implementations">Continued</a>]</p>
<p>Changed the micro-benchmark to use shorter strings, longer inner loops,
and compare just:</p>
<ul>
<li>String intrinsics (inline x86 string instructions)</li>
<li>String functions (from the standard C library)</li>
<li>A simple inlined <strong>while</strong> loop.</li>
</ul>
<p>The following series of measurements seem to largely follow my initial
(revised) theory - that a simple one-character <strong>while</strong> loop tends to
win out as the strings copied become shorter and the inner loop longer.
(Note that I suspect the "typical" program uses even shorter strings on
average than even this benchmark - so we might expect the gain here to
be more pronounced).</p>
<p>MSVC 6.0 optimizer set to "minimize size".</p>
<p>RATE C intrinsic string calls 292.8 MB/second (1000.0 MB in 3.4 seconds)
RATE C function string calls 293.7 MB/second (1000.0 MB in 3.4 seconds)
RATE x1 string calls 249.6 MB/second (1000.0 MB in 4.0 seconds)</p>
<p>MSVC 6.0 optimizer set to "maximize speed".</p>
<p>RATE C intrinsic string calls 227.0 MB/second (1000.0 MB in 4.4 seconds)
RATE C function string calls 288.6 MB/second (1000.0 MB in 3.5 seconds)
RATE x1 string calls 290.3 MB/second (1000.0 MB in 3.4 seconds)</p>
<p>Using the (most current?) Microsoft C++ compiler optimizing for Athlon
and speed.</p>
<p>C:\tmp\benchmarks>"c:\program files\Microsoft Visual C++ Toolkit 2003\bin\cl.exe" /G7 /O2 string\string.cpp
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 13.10.3077 for 80x86
Copyright (C) Microsoft Corporation 1984-2002. All rights reserved.</p>
<p>string.cpp
Microsoft (R) Incremental Linker Version 7.10.3077
Copyright (C) Microsoft Corporation. All rights reserved.</p>
<p>/out:string.exe
string.obj</p>
<p>C:\tmp\benchmarks>string
RATE C intrinsic string calls 230.1 MB/second (1000.0 MB in 4.3 seconds)
RATE C function string calls 291.1 MB/second (1000.0 MB in 3.4 seconds)
RATE x1 string calls 307.2 MB/second (1000.0 MB in 3.3 seconds)</p>
<p>Using the MSVC 6.0 compiler optimizing for Pentium Pro.</p>
<p>C:\tmp\benchmarks>cl /nologo /G6 /O2 string\string.cpp
string.cpp</p>
<p>C:\tmp\benchmarks>string
RATE C intrinsic string calls 236.1 MB/second (1000.0 MB in 4.2 seconds)
RATE C function string calls 292.0 MB/second (1000.0 MB in 3.4 seconds)
RATE x1 string calls 299.0 MB/second (1000.0 MB in 3.3 seconds)</p>
<p>Using the MSVC 6.0 compiler optimizing for Pentium.</p>
<p>C:\tmp\benchmarks>cl /nologo /G5 /O2 string\string.cpp
string.cpp</p>
<p>C:\tmp\benchmarks>string
RATE C intrinsic string calls 228.0 MB/second (1000.0 MB in 4.4 seconds)
RATE C function string calls 292.8 MB/second (1000.0 MB in 3.4 seconds)
RATE x1 string calls 285.3 MB/second (1000.0 MB in 3.5 seconds)</p>
<p>Using the MSVC 6.0 compiler optimizing for i486.</p>
<p>C:\tmp\benchmarks>cl /nologo /G4 /O2 string\string.cpp
string.cpp</p>
<p>C:\tmp\benchmarks>string
RATE C intrinsic string calls 229.0 MB/second (1000.0 MB in 4.4 seconds)
RATE C function string calls 292.0 MB/second (1000.0 MB in 3.4 seconds)
RATE x1 string calls 288.6 MB/second (1000.0 MB in 3.5 seconds)</p>
<p>Using the MSVC 6.0 compiler optimizing for i386.</p>
<p>C:\tmp\benchmarks>cl /nologo /G3 /O2 string\string.cpp
string.cpp</p>
<p>C:\tmp\benchmarks>string
RATE C intrinsic string calls 230.1 MB/second (1000.0 MB in 4.3 seconds)
RATE C function string calls 292.0 MB/second (1000.0 MB in 3.4 seconds)
RATE x1 string calls 287.8 MB/second (1000.0 MB in 3.5 seconds)</p>
<p>Using the GNU C++ compiler.</p>
<p>C:\tmp\benchmarks>g++ -O6 -o string-gcc.exe string/string.cpp</p>
<p>C:\tmp\benchmarks>string-gcc
RATE C intrinsic string calls 238.3 MB/second (1000.0 MB in 4.2 seconds)
RATE C function string calls 243.5 MB/second (1000.0 MB in 4.1 seconds)
RATE x1 string calls 320.0 MB/second (1000.0 MB in 3.1 seconds)</p>
<p>While the results vary a bit, it seems reasonable to assume that the
simple inlined <strong>while</strong> loop will equal or win over the alternatives
for short string copies - especially for longer inner loops where the
optimizer will have more of an opportunity to do interesting things with
the inlined code.</p>
<p>Source for the micro-benchmark.</p>
<p>#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <string.h></p>
<p>//static const char sOut[] = "ABCDEFGHJKLMNOPQRSTUVWXYZabcdefghjklmnopqrstuvwxyz123456789";
static const char sOut1[] = "abcdefghjklmnopqrstuvwxyz";
static const char sOut2[] = "ABCDEFGHJKLMNOPQRSTUVWXYZ";
int nLength = ::strlen(sOut1);</p>
<p>void report_times(const char* s,int dt,int cb)
{
//printf("TIME %s %d ticks for %d characters written\n",s,dt,cb);
double ts = (double)dt / CLOCKS_PER_SEC;
double mb = (double)cb / 1000000;
double rate = mb / ts;
printf("RATE %s %0.1f MB/second (%0.1f MB in %0.1f seconds)\n",s,rate,mb,ts);
}</p>
<p>//
// Perform a function for a fixed number of iterations and return time.
//</p>
<p>const int nLoop = 10000000;
int dtLoop = 0;</p>
<p>typedef void (<em>doit)(const char</em>,const char*);</p>
<p>int time_function(doit fn)
{
clock_t t0 = ::clock();
for (int i=0; i<nLoop; ++i) {
const char* s1 = sOut1 + (15 & i);
const char* s2 = sOut2 + nLength - (15 & i);
(*fn)(s1,s2);
}
return (int)(::clock() - t0) - dtLoop;
}</p>
<p>//
// Time C string operations.
//</p>
<p>char sWork[256];
int nTotal = 0;</p>
<p>void do_total(const char* s1,const char* s2)
{
nTotal += 4 * nLength;
}</p>
<p>void do_c0_string_calls(const char* s1,const char* s2)
{
::strcpy(sWork,s1);
::strcat(sWork,s2);
::strcpy(sWork,s2);
::strcat(sWork,s1);
::strcpy(sWork,s1);
::strcat(sWork,s1);
::strcpy(sWork,s2);
::strcat(sWork,s2);
}</p>
<p>// Optimization that seems to work best (at least with an Athlon).
#pragma function(strlen,strcpy,strcat)</p>
<p>void do_c1_string_calls(const char* s1,const char* s2)
{
::strcpy(sWork,s1);
::strcat(sWork,s2);
::strcpy(sWork,s2);
::strcat(sWork,s1);
::strcpy(sWork,s1);
::strcat(sWork,s1);
::strcpy(sWork,s2);
::strcat(sWork,s2);
}</p>
<p>inline void x1_strcpy(char* s1,const char* s2)
{
while (*s1++ = *s2++);
}</p>
<p>inline void x1_strcat(char* s1,const char* s2)
{
while (*s1) ++s1;
x1_strcpy(s1,s2);
}</p>
<p>void do_x1_string_calls(const char* s1,const char* s2)
{
x1_strcpy(sWork,s1);
x1_strcat(sWork,s2);
x1_strcpy(sWork,s2);
x1_strcat(sWork,s1);
x1_strcpy(sWork,s1);
x1_strcat(sWork,s1);
x1_strcpy(sWork,s2);
x1_strcat(sWork,s2);
}</p>
<p>int main(int ac,char** av)
{
dtLoop = time_function(do_total);
report_times("C intrinsic string calls",time_function(do_c0_string_calls),nTotal);
report_times("C function string calls",time_function(do_c1_string_calls),nTotal);
report_times("x1 string calls",time_function(do_x1_string_calls),nTotal);
return 0;
}</p>
Warlords2005-01-16T00:00:00Zhttps://bannister.us/weblog/2005/warlords
<p>To really understand both local and world events, you need to identify
all of the significant players. Some players are quite easily
identifiable. Others are not always so easy to find or understand.</p>
<p>One group of actors present in every scene but not always plainly
visible I refer to as "warlords". A warlord is generally an individual
who derives some measure of wealth and power through dominance over a
domain, and who is willing to use destructive means to maintain that
dominance. Put differently we are largely talking about ego-driven
individuals with wealth and power, relatively untroubled by any need for
"moral" behavior. (Yes, I know this isn't exactly someone else's
definition -- Tough).</p>
<p>You can find "warlords" pretty much everywhere. In the USA a warlord
will invariably employ lawyers (sometimes politicians), and will use
legal action and the threat of legal action as a means of intimidation
and coercion. In other countries where the "rule of law" is less well
established, the local warlords are more likely to use direct violence -
thugs, para-military or military organizations.</p>
<p>I believe that if we look closely at the economic ties of "insurgents",
"rebels", "freedom fighters", and some of the nastier governments in
power -- in the background you will nearly always find one or a
collection of warlords. In every case, to understand events you must
carefully follow the flow of money (weapons are not cheap) to really
understand the roots of the conflict. The mainstream news almost never
offers any insight along these lines, and so almost never offers more
than a record of superficial events.</p>
<p>How else to describe the beginnings of events like those that occurred
in Yugoslavia, as the country dissolved into a collection of conflicts?</p>
<p>I wonder if the US "intelligence" community really follows through on
this sort of information? If so I would expect some sort of record of
this insight into past (and sometimes current) events. Yes, I understand
the classify-everything-unless-forced mindset. The best proof of value
for the money spent would be to sponsor a historical record of events
reflecting the insight (one would hope) offered by the intelligence
community to government leaders. On the other hand, if the intelligence
community offers poor or bad insight, then I could understand the desire
not to have this exposed.</p>
<p>To steal a notion from <a href="http://research.microsoft.com/~lampson/33-hints/WebPage.html">Butler
Lampson</a> --
this is an end-to-end test. If the intelligence community offers good
insight to the government, this should make it's way into the historical
record, and should add considerably to history. If the intelligence
community did a poor job -- well we would like that in the record as
well.</p>
<p>What bought this to mind was Apple (a company I otherwise respect)
<a href="http://www.wired.com/news/print/0,1294,66293,00.html">acting like a
bully</a>, using the
law as a means of coercion (and by extension, lawyers as thugs).</p>
<p>There are local examples. About a decade ago the Navy announced the
intended closure of two local Marine bases. Since the bases were
surrounded by over-priced southern California suburbia, this made the
cost of operation and cost of living higher than elsewhere. The impact
to the local economy from closing the bases would be almost nothing. If
they had to choose a bases to close, it made sense that these would be
on the list.</p>
<p>Almost instantly there was a political group put together to promote
turning the larger base (El Toro) into a commercial airport. On this
surface, this almost seemed to make sense - a large open space, with
existing runways, and a county with a growing need for air travel. Dig
just a little deeper, and suddenly almost nothing made sense. The
existing Orange County airport (SNA) had just spent nearly a billion
dollars on a massive upgrade, and the new airport would be too near the
existing airport. The proposed use of the existing runways would have
airliners taking off uphill and downwind directly towards a series of
progressively taller hills. (Ask a pilot - this is an amazingly bad
idea). The non-sense did not end here - but the question you have to ask
is why this notion went anywhere at all.</p>
<p>As it turns out, the main backer of this nonsense was a very rich local
guy, whose wealth was largely tied into local (rental) real estate.
Every time real estate values go up, he can re-finance his existing
holdings, take out the increased value, and buy more real estate (sound
like a game of Monopoly?). Naturally anything that would keep real
estate values from rising would also limit his future gains. Even
worse - if prices <em>dropped</em> he could very quickly find his economic
position very strained!</p>
<p>Since the decommissioned bases were in prime locations, the huge amount
of new space once it reached the market is sure to hold down prices (at
the very least). This would have a direct impact on the bottom line for
anyone whose wealth was tied up in real estate. The political and legal
battles that followed could well have been titled "Meet your local
Warlords (or their lackeys)".</p>
<p>The new airport notion was eventually recognized as complete nonsense
and defeated. The local warlords did not lose, in fact for their
investment they got a considerable delay. Little or no of the new space
has yet reached market. In this time the local real estate prices rose
considerably, and likely the warlords of real estate have seen
considerable profit.</p>
What to wear to a costume party?2005-01-15T00:00:00Zhttps://bannister.us/weblog/2005/what-to-wear-to-a-costume-party
<p>This is another instance of Politically Correct gone amok.</p>
<p><a href="http://www.npr.org/templates/story/story.php?storyId=4283196">Prince Harry Draws Criticism for Nazi
Costume</a></p>
<p>Last I checked, a <strong>costume party</strong> is a place where dressing up as
various sorts of monsters is considered amusing and acceptable. When you
dress up as an axe murderer, usually folks understand that you are not
expressing your approval of that sort of behavior.</p>
<p>So a political figure (Prince Henry) wears a Nazi uniform to a costume
party, and a whole set of people start foaming at the mouth. Get a clue
folks, it was a <strong>costume party</strong>, and not meant as an opportunity for a
serious and meaningful political statement. Do they really think he was
expressing approval of any sort?</p>
<p>This story started in the tabloids. That tabloids would get trashy is
not a surprise. That the mainstream press would act in the same way is
disappointing. Guess this proves the difference between the tabloids and
the mainstream press is not all that significant.</p>
<p>Then there is the Jewish guy in the audio segment who says the Holocaust
is "greatest evil that ever occurred". There were mass killings in
Cambodia, Africa, and Yugoslavia (just to name more recent events). Were
these deaths less "evil"? Should we ask the surviving family members?</p>
How Many Percent?2005-01-11T00:00:00Zhttps://bannister.us/weblog/2005/ongoing-how-many-percent
<p>RSS feed number from <a href="http://www.tbray.org/ongoing/When/200x/2005/01/10/FeedGrowth">ongoing · How Many
Percent?</a>.</p>
<p>Interesting graph as I see a similar bobble in my own (much smaller)
numbers. Could this be in part the effect of aggregators like
<a href="http://bloglines.com/">bloglines</a>?</p>
<p>I guess you could look for the number of incoming readers who did not
fetch from the RSS feed. This does not tell you how many readers only
visit the aggregator.</p>
<p>Update: If you really want (more) accurate numbers, you could always use
a "webbug" 1x1 pixel image in all your posts. Presumably aggregators do
not re-write image links and prefetch images. Somehow this seems just a
little distasteful, given this was a favored technique of some highly
(dis-)regarded advertisers. The image link would have to be different in
every post, so as not to be cached by the browser. On the other hand --
you didn't hear this idea from me :).</p>
IBM Press room - Press releases2005-01-11T00:00:00Zhttps://bannister.us/weblog/2005/ibm-press-room-press-releases
<p><a href="http://www-1.ibm.com/press/PressServletForm.wss?MenuChoice=pressreleases&TemplateName=ShowPressReleaseTemplate&SelectString=t1.docunid=7473&TableName=DataheadApplicationClass&SESSIONKEY=any&WindowTitle=Press+Release&STATUS=publish">IBM Press room - Press
releases</a></p>
<p>An encouraging step by IBM. Still -- 3,248 new software patents <strong>in one
year!!?!</strong></p>
<p>Not that I would select out IBM for doing this, as apparently all large
technology companies generate boatloads of patents -- primarily as a
form of self-defense. Hard to see this whole process as anything but
badly broken.</p>
<p>Donating 500 patents out of that large set is either a minor token (and
thus bogus), or a key first step. If the 500 were selected as
potentially threatening to users of open-source software, then this is
worthy first step. Perhaps IBM would like to see other companies chip in
with their own contributions before making a larger donation.</p>
<p>Who will step up and make their own contribution next?</p>
<p>(Somehow I am not expecting to see Microsoft on this list).</p>
Legacy of Dhrystone2005-01-08T00:00:00Zhttps://bannister.us/weblog/2005/legacy-of-dhrystone
<p>Back in the 1980's the <a href="http://en.wikipedia.org/wiki/Dhrystone">Dhrystone
benchmark</a> provided motivation
for compiler vendors to improve their optimized code and standard
libraries. To some extent this benefit is applies today, if you know how
to take advantage.</p>
<p>In particular on the functions in both <stdio.h> and <string.h>
received particular attention in this period (the later due to
Dhrystone).</p>
<p>If you were to look at the majority of the C++ code I have written over
the past dozen years, you would find frequent use of <stdio.h> and
little or no use of standard C++ streams. The reason for this is my
expectation of greater efficiency from <stdio.h>.</p>
<p>As an exercise I wrote a simple program to test whether this expectation
is still true. The source is listed at the end -- first the results.</p>
<p>Results from compilation using Microsoft Visual C++ 6.0 and run on my
2.2Ghz Athlon notebook running Windows XP Pro.</p>
<p>TIME ofstream(NUL) 13209 ticks for 445000000 characters written
RATE ofstream(NUL) 33.7 MB/second (445.0 MB in 13.2 seconds)
TIME stdio(NUL) 3875 ticks for 445000000 characters written
RATE stdio(NUL) 114.8 MB/second (445.0 MB in 3.9 seconds)</p>
<p>Results from compilation using GNU C++ 3.4.2 and run on my 2.4Ghz Athlon
desktop running Linux (Fedora core 3).</p>
<p>TIME ofstream(NUL) 1850000 ticks for 445000000 characters written
RATE ofstream(NUL) 240.5 MB/second (445.0 MB in 1.9 seconds)
TIME stdio(NUL) 1310000 ticks for 445000000 characters written
RATE stdio(NUL) 339.7 MB/second (445.0 MB in 1.3 seconds)</p>
<p>Yes - looks like this is still true when using MSVC 6.0. Using GNU C++
the results are still true, though the difference is not as great. Looks
like C++ streams in the GNU library have received more attention than in
the Microsoft library.</p>
<p>The fact that the numbers are much higher on Linux is probably not
significant (we seldom care if "NUL" is faster than "/dev/null").</p>
<p>Test program source:</p>
<p>#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <string.h>
#include <fstream></fstream></p>
<p>#ifdef WIN32
static const char sNUL[] = "NUL";
#else
static const char sNUL[] = "/dev/null";
#endif</p>
<p>static const char sOut[] = "ABCDEFGHJKLMNOPQRSTUVWXYZabcdefghjklmnopqrstuvwxyz123456789\n";</p>
<p>using namespace std;</p>
<p>void report_times(const char* s,int dt,int cb)
{
printf("TIME %s %d ticks for %d characters written\n",s,dt,cb);
double ts = (double)dt / CLOCKS_PER_SEC;
double mb = (double)cb / 1000000;
double rate = mb / ts;
printf("RATE %s %0.1f MB/second (%0.1f MB in %0.1f seconds)\n",s,rate,mb,ts);
}</p>
<p>//
// Time output to the NUL file using C++ streams.
//</p>
<p>void time_fstream()
{
const int nLoop = 10000000;</p>
<p>int nTotal = 0;
int nLength = ::strlen(sOut);</p>
<p>// Time loop overhead and sum total length to be written.
clock_t t0 = ::clock();
for (int j=0; j<nLoop; ++j) {
nTotal += nLength - (31 & j);
}
int dtLoop = ::clock() - t0;</p>
<p>// Time varying writes to NUL (bitsink) file.
t0 = ::clock();
ofstream log;
log.open(sNUL,ios_base::out);
for (int i=0; i<nLoop; ++i) {
log << (sOut + (31 & i));
}
log.close();
int dt = (int)(::clock() - t0) - dtLoop;</p>
<p>// Report benchmark times.
report_times("ofstream(NUL)",dt,nTotal);
}</p>
<p>//
// Time output to the NUL file using stdio.
//</p>
<p>void time_stdio()
{
const int nLoop = 10000000;</p>
<p>int nTotal = 0;
int nLength = ::strlen(sOut);</p>
<p>// Time loop overhead and sum total length to be written.
clock_t t0 = ::clock();
for (int j=0; j<nLoop; ++j) {
nTotal += nLength - (31 " j);
}
int dtLoop = ::clock() - t0;</p>
<p>// Time varying writes to NUL (bitsink) file.
t0 = ::clock();
FILE* f = ::fopen(sNUL,"w");;
for (int i=0; i<nLoop; ++i) {
::fputs(sOut + (31 " i),f);
}
::fclose(f);
int dt = (int)(::clock() - t0) - dtLoop;</p>
<p>// Report benchmark times.
report_times("stdio(NUL)",dt,nTotal);
}</p>
<p>int main(int ac,char** av)
{
time_fstream();
time_stdio();
return 0;
}</p>
HP Tech Support2005-01-06T00:00:00Zhttps://bannister.us/weblog/2005/hp-tech-support
<p>Bought and setup an HP Photosmart 8450 printer. The printer comes with a
ethernet port, so I can use it from any computer on my home network,
without requiring another machine to be powered on. The installation
instructions require that you install the supplied software on any PC
that will use the printer (seven at last count - ick).</p>
<p>Made the mistake of reading the software license agreement -- which says
I can only install the software on <strong>one</strong> machine!</p>
<p>Somehow I do not think this is what HP really wants, so I tried to tell
them. The Legal group at HP does not seem to have a email (at least not
one I could find one the hp.com website). Finally tried submitting a
software bug report. From the first answer I received (below) either
"Pamela" did not read my message (nothing complicated), or has trouble
understanding English.</p>
<blockquote>
<p>Date: Thu, 06 Jan 2005 13:10:42 -0700
To: Preston <preston @bannister.us> Subject: Re: HP PhotoSmart 8450
photo printer (KMM8817956V42239L0KM)
From: HP PhotoSmart Printer E-mail Support
<photosmartptr_support_en @mail.support.hp.com></p>
<p>Dear Preston,</p>
<p>Thank you for contacting HP Total Care.</p>
<p>After reading your e-mail, I infer that you are experiencing an issue
while using your Photosmart 8450 printer in network.</p>
<p>I appreciate your efforts in providing precise details about the
issue in a descriptive yet simple language. It helped me understand
the issue better.</p>
<p>Let me assure you that by working together we will
resolve the issue and your product would surely be working fine.</p>
<p>To resolve the issue, please download the networking manual
for this printer. Below, I am providing you the Web site to download
the manual.</p>
<p>http://h10025.www1.hp.com/ewfrf/wc/manualCategory?lc=en⟨=en&cc=us&dlc=en&product=402150&</p>
<p>NOTE: Clicking the link may give an error indicating it is
invalid. If this occurs, copy the portion of the address
on the remaining line(s) and paste it at the end of the
address showing in your browser until the complete address
is displayed in the Address box.</p>
<p>If the issue persists or if you need further assistance in
performing these steps, please get back to us. We will be
happy to help you further.</p>
<p>Have a nice day!!!</p>
<p>Sincerely,</p>
<p>Pamela
HP Total Care</p>
<p>Our advice is strictly limited to the question(s) asked and is based
on
the information provided to us. HP does not assume any
responsibility
or liability for the advice given and shall not be liable for any
direct, indirect, special, incidental or consequential damages in
connection with the use of this information. Always back up your
data.
For more information, including technical information updates,
please
visit our Web site at http://www.hp.com/support.</p>
<h2>Original Message Follows:</h2>
<p>webform_submit_time : Thu Jan 06 14:16:15 EST 2005
problem_area : installation/setup
problem_description : Software license does not make sense. The
printer
has an ethernet port, and the instructions say to install the
software
on every PC that will use the printer. The license seems to say I
cannot do this :).</p>
<b>
LICENSE TERMS
FOR
HP IMAGE ZONE SOFTWARE
<p>These License Terms govern your Use of the HP Image Zone Software.</p>
<ol>
<li>License Grant. HP grants you a license to Use one copy of the
Software. "Use" includes using, storing, loading, installing,
executing, and displaying the Software. You may not modify the
Software
or disable any licensing or control features of the Software.
(snip)
</li></ol></b>
<p>
trouble\_shooting : You might want to suggest they update the
license.
Frankly HP should only care that the software is used with the HP
printer for which it was intended.
</p></blockquote>
Screwed by Microsoft2005-01-05T00:00:00Zhttps://bannister.us/weblog/2005/screwed-by-microsoft
<p>My two boys got HP notebooks for Xmas (not from me). The notebooks came
with Windows XP Home. My older boy remembered by advice, and declined to
hook up the notebook to the Internet until I had a chance to look at it.
When the boys came here I scanned the notebook, found it clean, and
configured it to use my home wireless network and Internet connection
without trouble.</p>
<p>My younger boy's notebook was an entirely different story. He claims
someone else may have played with it first. In any case as soon as I
fired up Internet Explorer, advertising popups started appearing (and
not from the websites), so I knew we had a problem.</p>
<p>My ex-inlaws apparently now have broadband Internet connections --
mostly for my kids benefit when visiting -- and this scares me.
Understand the most mechanically gifted of their family installed a
screen door closer sideways (I kid you not). I do not want to imagine
the state of machines.</p>
<p>After a number of hours, I found and removed about 12 different
spyware/adware packages that had infested his PC. After all this I still
would not bet his machine was clean. Worse the IE installation no longer
worked, so I could not run Windows Update.</p>
<p>At this point a complete re-installation seemed in order, but the
re-installation disks were not to be found. No problem - I have a
developer's license and can download a CD image of Windows XP Home (with
SP2) from Microsoft, and the machine has a sticker on the bottom with
proper XP Home license key.</p>
<p>Well, guess what -- this didn't work. Burned a CD, fired up the
installation, and the Windows XP Home installation will not accept the
Windows XP Home license key on the notebook.</p>
<p>Now maybe HP is selling bootleg copies of Windows XP Home (this I
doubt). Maybe Microsoft has some brain-damaged excuse why this should
make sense (ha!). In any case I have now wasted hours and am more than a
little annoyed.</p>
<p>My concern with "product activation" codes and the like has always been
that when the vendor's system does not work, then the customer is
screwed. I sincerely hope that vendor's eventually realise that screwing
your legitimate customers just to increase the company's profit is a
dangerous trade-off.</p>
<p>Just a week ago I installed Fedora Core 3 on one of my test machines,
and the installation wents very smoothly. Heck, in the time wasted so
far trying to cleanup this notebook, I could have completely installed
Linux and all the usual desktop applications.</p>
<p>Of course, the kid's want to play games, and the games require
Windows...</p>
What do we really need from a database?2005-01-02T00:00:00Zhttps://bannister.us/weblog/2005/what-do-we-really-need-from-a-database
<p>In <a href="http://www.adambosworth.net/archives/000038.html">Where have all the good databases
gone</a> Adam Bosworth
visits the subject of databases, and the differences between what
customers need, and what the database vendors offer. Since posting the
article he has received a lot of criticism. For my part I think the
questions Adam asks and the points raised are all good.</p>
<p>From a pragmatic standpoint, a good database is whatever is suitable for
the needs of the particular customer and the particular application.
Anything beyond the needs of the application is just overhead.</p>
<p>We <strong>should</strong> be concerned, on the one hand, with folks developing
database applications without understanding of the ACID model. On the
other hand as developers we <strong>should</strong> understand what exactly the
application needs from the database.</p>
<p>A good database could be a anything from simple text file, to a
collection of files in the filesystem, up to a full-featured RDBMS --
what qualifies as "good" depends on the application.</p>
<p>Most of the current mainstream commercial databases are built around the
relational database model. Most (all?) the mainstream commercial
databases started development when "practical" constraints on CPU,
memory and disk usage where very much different from today. What all
this leads to is a series of constraints and tradeoffs built into the
design of the database that may no longer be appropriate.</p>
Robot Vacuum2004-12-31T00:00:00Zhttps://bannister.us/weblog/2004/robot-vacuum
<p>Bought new toy -- a "Roomba" robot vacuum. It is bumping it's way around
the downstairs now on it's first run. It is a little noisy, though
certainly not as noisy a regular vacuum. Will have to see if it can find
the way back to the charging station. The downstairs is sort of
H-shaped.</p>
<p>Yes, and the commercial is amusing :)</p>
<p><a href="http://www.irobot.com/community/commercial_wm.cfm">iRobot - Robots for the Real World : Commercial
WM</a></p>
<p>Was curious how the dog would react. So far he just looks a little
puzzled, and moves whenever this noisy little object heads his way.</p>
<p>Watching this thing bump it's way into corners, under tables, and under
the dining room chairs ... I am starting to think this thing might
actually be useful.</p>
<p>Update: Nope - it didn't find the charging station. Will try a different
location.</p>
<p>Update: Next morning let it loose upstairs. The upstairs with the doors
to the kids' bedrooms closed off is a bit smaller than the downstairs,
and was badly in need of cleaning (more than a week since the last
vacuuming). The poor little thing bumped around until it's battery was
exhausted, and the dust bin and insides were choked with dust. Bit of an
unfair test, but I wanted to see how well it would do. To the credit of
the designers, it did not get stuck once (though it did unplug one of
the floor lamps). The upstairs could definitely use another pass, though
I have to note the machine got into and cleaned places I do not normally
reach with the vacuum.</p>
<p>My only (minor and tentative) criticism is that the thing either needs
to have a bigger battery, or be a bit smarter about finding it's way
back to the charging station. Wearing the designer's hat I would choose
the second option. If you have a bigger battery, then you likely need a
bigger dust bin. With a bigger battery and dust bin the manufacturing
costs increase, and if the unit gets bigger it cannot get into the
smaller places to clean. People with smaller places do not need the
bigger battery. In larger places for the little beast to go back,
recharge, then continue it's run, seems entirely acceptable. Making the
device a bit smarter should not increase manufacturing costs.</p>
<p>Update: Moved the charging station to a different location, and let the
thing loose downstairs. The charging station was in one corner under a
~2' square table. At the end of the run it clearly was trying to get to
the charging station, but it just could not get past the opposite table
leg. Moved the charging station to under the center of the table (no
longer on the diagonal) and it found the charging station just fine.</p>
<p>Update: Let it loose again upstairs. It didn't really finish the job
last time (not a criticism as the upstairs was overdue). Opened the door
to the hall bathroom, which it cleaned, but could not find it's way out
(stopped on the bathroom tile to hall carpet transition). Used a laundry
basket (no batteries needed) to block it out of the master bedroom, so
it would have a better chance at doing a thorough job.</p>
<p>Ouch!! It just fell down the stairs!! A short fall on carpeted stairs,
so no damage. After the crash it made a little "uh-oh" noise (cute). It
made quite a few passes at the top edge of the stairs before falling, so
the algorithm used <strong>almost</strong> works :). A bit later it almost went over
the edge, but stopped just in time.</p>
<p>On reflection, cleaning the dusty innards is a bit more trouble than I'd
like. Used a compressed air can to blow out dust where I could not reach
(and got a nose full of dust). The filter assembly built into the dust
bin is a bit flimsy and just a shade more trouble to reassemble than I
would recommend for the general population. Might be better to put the
filter on a hinge, with a "pull me" tab on one side.</p>
Battling the antibodies2004-12-31T00:00:00Zhttps://bannister.us/weblog/2004/battling-the-antibodies
<p>For the record, I completely agree <a href="http://weblog.infoworld.com/udell/2004/12/31.html#a1141">Jon
Udell</a>, both in
regarding <a href="http://weblog.infoworld.com/udell/2004/11/02.html#a1106">Monad (aka
MSH)</a> as a
brilliant piece of work, and as having spent a fair amount of time
battling antibodies myself. Episodes I remember:</p>
<ul>
<li>"You have to write in assembly for efficiency, not Pascal!" When
writing an application in Pascal that ended up more efficient than
it's competitors written in assembly.</li>
<li>"Why can't I have a main program in my application, instead of event
callbacks?" When writing a GUI framework (long before Windows).</li>
<li>"Why do we need encryption and authentication?" When working on a
distributed system long before widespread use of networks.</li>
<li>"Writing upwards/downwards compatible client/server applications is
too hard." Right after having done just that at a prior job.</li>
<li>"Web applications just cannot be practical." When pointing out that
most applications can and should end up as web applications.</li>
</ul>
<p>Jeffrey Snover's
<a href="http://dotnetjunkies.com/WebLog/stefandemetz/archive/2004/04/20/11794.aspx">Monad</a>
is a brilliant piece of work (wish this guy had a website). It really
does capture the strength of shell scripting in Unix, and takes things
to a whole new level.</p>
<p>Doubtless the Unix folks can and will replicate this new abstraction in
shell scripting, but in this case someone at Microsoft got there first.</p>
The Tyranny of Resturant Cooking2004-12-30T00:00:00Zhttps://bannister.us/weblog/2004/the-tyranny-of-resturant-cooking
<p>Why is it that recipes always call for the same set of oven
temperatures? Why does the 350° (Fahrenheit) temperature (plus or minus
25°) show up in so many recipes?</p>
<p>Cooking is a minor hobby, and lately I have been trying various
approaches to cooking meat -- of late specifically roasting meat.</p>
<p>I have experimented with higher temperatures. Sometimes the results are
decent or interesting, but less than inspiring. Of late I am trying
lower temperatures, and it seems the lower the oven temperature the
better the results. Naturally the cooking times are longer, and to hit
the desired internal temperature a temperature monitor (with alarm) is
essential. I have done several small cuts of beef aiming first for 130°
(good results), then 140° (better results). The flavor is rather nice,
and the longer times the seem to make the meat tender.</p>
<p>Understand that I <em>hate</em> the taste of overcooked beef, so this meat is
coming out nicely done.</p>
<p>Watching a cooking show I suddenly understand <em>why</em> so many recipes call
for the same temperatures. Many recipes originate with resturants.
Resturants need to perform their cooking in the shortest possible time.
Resturants also leave their ovens on all the time, so they really need
all their food to cook at the same temperature (though they might have
more than one oven, each set at different temperatures). Naturally
resturants will use the highest temperatures that deliver decent
results, and will only use one or two different oven temperatures in
their recipes.</p>
<p>Duh. Of course....</p>
<p>I have a 12 pound beef roast (the market had a half-price deal during
the holidays) in with the oven set at 220° and the alarm set to 140°.
Doubtless the cooking time will be long for this heavy piece of meat --
but then I am not in any hurry.</p>
<p>I am tempted to try even lower temperatures. The digital control on my
oven goes down to 170°. What I do not know about is safety. If the
temperature is too low in the oven, will the meat spend too much time at
temperatures where bacteria can multiply?</p>
<p>While writing this a possible answer came to mind: Use a higher 220°
oven temperature until the internal temperature reaches 130° (at which
point I believe we are safe from bacteria) then <strong>lower</strong> the oven
temperature for the remainder of the cooking time.</p>
<p>When the internal temperature reached 130° I dropped the oven
temperature to 190° to prolong the cooking time. Shut off the oven when
the internal temperature reached 140°. With the oven off the temperature
stayed at 140° for about another hour.</p>
<p>Result is decent. Going to have to buy more meat....</p>
Reverse Proxies and the "Location" or "Content-Location" headers.2004-12-30T00:00:00Zhttps://bannister.us/weblog/2004/reverse-proxies-and-the-location-or-content-location-headers
<p>Turns out the proper name for what I am attempting to do with
<strong>isapi_reward</strong> is a <a href="http://www.apacheweek.com/features/reverseproxies">"reverse
proxy"</a>. I want users
to be able to access a number of web applications through a single
machine, with the web applications possibly deployed on different
machines.</p>
<p>Specifically I am interested in one particular use-case. I want to write
web applications in Java, and be able to deploy those applications on a
company intranet. I want the web applications able to run stand-alone
(as sometimes that is all you need). I want those web applications work
well on a company intranet, and most of the time that means support for
NTLM authentication. I would also like to allow the web application to
reside on it's own machine, and be accessible to users through a common
website with a stable (permanently bookmarkable) address.</p>
<p>By using IIS as a front-end we get first-class support for NTLM
authentication. We also get efficient native-code SSL (https) support --
Java code doing encryption is just not a good idea if you want to scale.</p>
<p>Note this spins the design considerations in a number of ways. I am
<strong>not</strong> interested in caching by the proxy. I am interested in <strong>only</strong>
the highest possible server throughput. I am interested in <strong>only</strong> the
highest possible stability under load and over time. I am <strong>not</strong>
interested in extraneous features that compromise throughput or
stability.</p>
<p>This means supporting <strong>only</strong> HTTP/1.1 between the proxy and backend
servers. This means keeping the connection(s) between the proxy and
backend servers open for long periods of time, and multiplexing requests
from different users over the same common backend connections (looks
like this makes HTTP 1.1 pipelining dubious).</p>
<p>Got the re-write to use I/O Completion Ports working. I still find it
spooky when large chunks of newly-written code work the first time :).
The connection-maker thread makes the connection, and passes the
connection to the background I/O thread. There can be any number of
connection-maker or I/O threads, but I suspect one of each is optimal or
near-optimal for nearly all websites. Stepped through most of the code
with the debugger (one of those "best practices" I find worthwhile). The
request/response cycle between the client and the backend server through
the proxy works, and headers are rewritten as I understand they should
be.</p>
<p>That last is the current problem. Clearly I need to do something so the
(relative) links in the response are interpreted correctly by the web
browser. I think this means using the
<a href="http://www.cse.ohio-state.edu/cgi-bin/rfc/rfc2616.html#sec-14.14">Content-Location</a>
and <a href="https://bannister.us/weblog/2004/reverse-proxies-and-the-location-or-content-location-headers">Location</a> headers, but I still am unclear as to the exact
semantics.</p>
<p>Also I am not interested in attempting to re-write HTML links inside the
response (this just seems like a generally Bad Idea).</p>
<p>Reading the RFC is not enough to make this bit clear. Guess it is back
to Google and a bit of experimenting.</p>
Retirement math - Social Security wins2004-12-30T00:00:00Zhttps://bannister.us/weblog/2004/retirement-math-social-security-wins
<p>Guess it all depends on timing -- and on who crunches the numbers.</p>
<p><a href="http://www.csmonitor.com/2004/1227/p01s03-cogn.html">One man's retirement math: Social Security wins |
csmonitor.com</a></p>
<p>The note about Britain's retirement shortfall should snag your
attention.</p>
One IDE to Rule Them All?2004-12-30T00:00:00Zhttps://bannister.us/weblog/2004/one-ide-to-rule-them-all
<p>From Don Box <a href="http://pluralsight.com/blogs/dbox/archive/2004/12/29/4113.aspx">Yet Another 2005 Prediction
List</a>:</p>
<blockquote>
<p><strong>Sun Microsystems will embrace Eclipse.</strong>
Eclipse 3.x is now way above the "good enough" bar and has IBM's deep
pockets behind it. In 2005, Sun will cut its losses on Netbeans and do
the right thing for Java by unifying on a common tool platform.</p>
</blockquote>
<p>Well, I suspect Sun has too much ego invested in NetBeans for this to
happen. Maybe this is what <a href="http://www.tbray.org/ongoing/When/200x/2004/12/29/IDE-Ecosystem">Tim
Bray</a>
is saying, though perhaps not intentionally :).</p>
<p>Don't get we wrong. NetBeans is a pretty interesting product, and each
successive release knocks out some of the rough spots. Yet after trying
each and every release of NetBeans, I just do not find any real
advantage over Eclipse. Since I only recently returned to Java
programming, I only recently adopted Eclipse (and used mostly JDeveloper
during the last round of Java work - a few years back).</p>
<p>Competition between IDEs is a great thing, and if Sun wants to spend
money on NetBeans ... nothing wrong with that in itself.</p>
<p>What is wrong is when this causes fragmentation in the surrounding
development community. Eclipse accepts plugins, and the plugins are
largely developed by folks outside the Eclipse group proper. NetBeans
accepts plugins, and doubtless many of the useful plugins are not
developed by Sun. If building a plugin for Eclipse is too different from
building a plugin for NetBeans -- this is not a good thing.</p>
<p>If Sun wants to spend money building a better IDE -- this is great.</p>
<p>If Sun fragments the surrounding development community more than
absolutely necessary -- this is uncool.</p>
<p>Of particular note are the Eclipse plugins to support languages other
than Java, or frameworks other than those built by Sun. It is not
reasonable (and not efficient) to ask those third-party developers to
build completely different plugins for NetBeans -- and NetBeans is the
poorer for this.</p>
<p>My hope is that Sun will invest some effort in arriving at a "common
tool platform" <strong>at the plugin level</strong>. This will contribute to making
everyone more efficient.</p>
Comments off2004-12-28T00:00:00Zhttps://bannister.us/weblog/2004/comments-off
<p>Turned off comments today. The WordPress built-in checks for too many
links in one comment, or certain common "spam" words worked well for a
while. More recently <a href="http://mookitty.co.uk/devblog/category/kittens-spaminator/">Kitten's
Spaminator</a>
did an excellent job of suppressing the last wave of automated comment
spammers.</p>
<p>Today a couple comments appeared with one link per comment, and none of
the common spam words. I don't want to make a hobby of cleaning up after
spammers, so comments are off.</p>
<p>Seems that with "trackback" there is a lot less need for comments. On
the other hand, I do not know if trackback (either outgoing or incoming)
works with my WordPress installation.</p>
isapi_reward restart2004-12-26T00:00:00Zhttps://bannister.us/weblog/2004/isapi_reward-restart
<p>Restarted work on the isapi_reward ISAPI filter/extension mentioned
<a href="http://bannister.us/weblog/index.php?p=70">earlier</a>.</p>
<p>The trick seems to be to handle outgoing connections (for forwarded
requests) in an efficient and scalable manner. Started out using
non-blocking sockets and events, but the WaitForMultipleEvents() call
puts a hard upper limit of 64 on the number of active sockets. While it
is rather unlikely that many sites would need that many back-end
connections, I was not happy with the hard limit.</p>
<p>Turns out I had mostly forgotten about IO completion ports on Win32, as
I had never had an application that called for their use before. Using
IO completion ports removes the hard limit - though I have to wonder if
Windows has limits on the number of associated handles (sockets).</p>
<p>Was a bit stumped at first about how to do the initial connect() or
WSAConnect() as there was no mention of behavior when used with IO
completion ports - then found a reference to
<a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/winsock/connectex_2.asp">ConnectEx()</a>.
which performs overlapped connections using completion ports - but only
works on Windows XP and later. Guess that answers the question.</p>
<p>Since I'd like to support Windows 2000, looks like I will need separate
thread(s) to perform blocking connect() calls. Likely this is not an
issue, as the number and rate of connect() calls should not be an issue
in expected usage. Might even be a good means to limit the connection
rate when a back-end server is misbehaving.</p>
<p>One more re-write...</p>
Promised Deficits2004-12-20T00:00:00Zhttps://bannister.us/weblog/2004/promised-deficits
<p>Today the Bush administration promised us another four years of near
record-high deficits. Not that they phrased things in quite that way.</p>
<p><a href="http://abcnews.go.com/Politics/wireStory?id=345663">Bush Says Tight Budget Will Slash
Deficit</a>
<a href="http://www.npr.org/templates/story/story.php?storyId=4236304">Bush Says New Budget Will Cut Deficit in
Half</a></p>
<p>The current budget deficit is at a record high, so cutting that in half
is not exactly a lofty goal. Remember the Bush administration started
with a budget <strong>surplus</strong>.</p>
<p>It gets better. The promise is for <strong>five years from now</strong> when Bush
will no longer be in office. When a politican makes a promise that does
not take effect until <em>after</em> he is out of office, I would not bet on
seeing the promise fulfilled.</p>
<p>Note also this says they do expect the budget deficit to <strong>never be
less</strong> than half the current level in the next four years. So can expect
at least another <strong>trillion</strong> dollars added to the federal debt over the
next four years.</p>
Can LEDs emit polarized light?2004-12-20T00:00:00Zhttps://bannister.us/weblog/2004/can-leds-emit-polarized-light
<p>Read an article back in the 1970's that proposed the use of polarized
light filters on automobile headlights combined with polarized filters
lights on windshields. The notion was to block glare from the headlights
of oncoming cars, while allowing through light reflected from your own
headlights.</p>
<p>If you have ever gone driving at night on a twisting two-lane road with
lots of oncoming cars, the merit of this idea is clear.</p>
<p>The downside is that polarized light filters on headlights is a very
inefficient solution. The filter is going to block most of the light,
meaning you need much stronger lights to get the same amount of light on
the road. Much stronger lights means greater cost, and likely a lot of
heat buildup in the headlight/filter assembly.</p>
<p>If the light source itself emitted polarized light, then the efficiency
problem would be gone. LEDs are starting to get bright enough to be
considered for headlights. Is it possible to fabricate an LED that emits
polarized light?</p>
<p>I have a vague memory of reading about LED's or some other solid-state
device that emitted polarized light, but have no idea how to track down
this notion.</p>
<p>If LED headlights could be required to emit polarized light (45 degrees
off vertical), then after perhaps a decade you could wear inexpensive
glasses with polarized filters, and driving on backroads at night would
be a lot safer.</p>
Welcome to Jim Taggart's cocktail party2004-12-19T00:00:00Zhttps://bannister.us/weblog/2004/welcome-to-jim-taggarts-cocktail-party
<p>In the book <a href="http://www.amazon.com/exec/obidos/ASIN/0451191145/qid%3D1103481966/sr%3D11-1/ref%3Dsr%5F11%5F1/002-8155213-5331247">"Atlas
Shrugged"</a>
Ayn Rand wrote a straightforward story -- about the creators of value
withdrawing from society -- laden with a lot of her personal philosophy.
From the book there is one metaphor I find use for rather a lot lately
when framing my opinion of a group or organization:</p>
<blockquote>
<p>Would this person fit in at Jim Taggart's cocktail party?</p>
</blockquote>
<p>Sorry if the allusion in obscure. Go read the book. I will wait ...</p>
<p>Recently Tim Bray was going on (in
<a href="http://www.tbray.org/ongoing/">ongoing</a>) about <a href="http://www.tbray.org/ongoing/When/200x/2004/12/19/SDI-no">"Missile Defense Is A
Cult"</a> and how
the program just isn't going to work. My opinion is a little different.
Intercepting a ballistic missile in flight is an <strong>extremely</strong> hard
problem -- but I would not go so far as call it impossible. When Reagan
announced the SDI program in the 1980's my thought was that a lot of
hard research was needed. My first concern was that someone would spend
too much money deploying a technology before it was ready.</p>
<p>Well, guess what ... twenty years later we have a "Missile Defense"
program that is clearly doomed to fail. How can we tell? Simple -
whenever you are faced with a extremely hard problem, the best approach
is to divide the problem into a series of smaller problems, and work on
the smaller problems first. Also you know it is likely that many of your
initial solutions will not work, so you plan on trying lots of solutions
cheaply.</p>
<p>So how does this translate into solving the difficult problem of
intercepting a ballistic missile? Simple - start with the smaller
problem of intercepting a ballistic object at short distances. First
design, build and test (and test & test & ...) a targeting system that
can acquire and intercept a ballistic object thrown from 100 yards away.
This stage is pretty cheap, so you can try a lot of different variations
to see what works best. When you get good at intercepting at that
distance, then you increase to 500 yards, then a mile, then 10 miles,
100, 1000 ... in each stage only moving on to the greater distances (and
more expensive tests) when your solution(s) work well at the current
distance.</p>
<p>Maybe at some stage we would find that current technology just cannot be
stretched to meet the end goal (though I doubt this). Likely there would
be useful spin-offs (imagine a system that could intercept incoming
mortar shells), though we cannot predict exactly how things would work
out.</p>
<p>So instead our current "Missile Defense" program starts with $100
million dollar missile tests -- and fails a lot -- to my absolute
complete lack of surprise. Since they skipped the smaller problems we
can pretty much assume the folks running the program do not know how to
solve hard problems. Since this is indeed a hard problem, we can expect
the program to fail (and waste huge amounts of money in the process).</p>
<p>I am thinking the folks in charge of this program would fit in just fine
at Jim Taggart's cocktail parties.</p>
<p>Even better, the guy currently in charge of the missile defense program
is the Bush administration's candidate for the new head of NASA. Ouch.
Is NASA a write-off?</p>
Shallow Bush2004-12-17T00:00:00Zhttps://bannister.us/weblog/2004/shallow-bush
<p>Guess my opinion of Bush the current President dropped yet another
notch. The bit about putting social security money into the stock market
was pretty much the final straw.</p>
<p>Now at the most superficial level, putting retirement money into the
stock market <em>seems</em> to make sense, as the average return over time is
higher. First I heard of this notion was in the middle of the crazy
late-1990's stock bubble. Nevermind the short-term effects of when the
stock market dives. Nevermind the fact that it seems there is already
too much money in the stock market (many stocks far above their apparent
intrinsic value). Nevermind the huge transition cost, for a system
already strapped for cash.</p>
<p>Surely if he is proposing this notion he must have a plan, and with the
plan this will all make sense?</p>
<p>A few weeks back I was listening to one of the political opinion
programs, where people from different points of view try to analyse the
topic of the day. At the end of the program it was clear - whether for
or against the proposal - no one had any idea how this was going to
work.</p>
<p>A bit later, it suddenly occurred to me that I was over-analysing the
problem. <strong>Bush does not have a plan to make this work, and he never
did!</strong></p>
<p>Guess I was trying to look at Bush as something like Reagan. Often I did
not like specific actions of the Reagan administration. At the same
time, I did in the end believe that Reagan was trying to make America a
better place. Reagan was by no means the brightest guy on the planet,
but he surrounded himself with bright people, and plainly made use of
their council. Even when I disagreed with the actions of the Reagan
administration, I had some reason to believe the actions were well-meant
and well-thought.</p>
<p>Turns out I had tried to look at the Bush administration the same way -
and things just did not add up. It suddenly occurred to me <strong>there is
nothing deeper to Bush</strong>! If you look for the most superficial reason to
explain his actions, most likely that is <strong>all</strong> there is.</p>
<p>Now we know that Bush is not especially bright. Unlike Reagan, Bush
seems to have little interest in bright minds or their council. Unlike
Reagan, Bush does not seem to care especially about making America a
better place. Unlike Reagan, Bush was born into wealth and privilege,
and likely can neither understand nor care about the life and concerns
of average Americans.</p>
<p>If instead of looking for deeper reasoning, you instead went with the
superficial explanations, then suddenly actions of the Bush
administration are easy to understand.</p>
<p>War with Iraq? Daddy Bush withdrew from Iraq when we were winning. We
all know that "early withdrawal" is a bad thing. We now know the Bush
administration started planning for war in Iraq long before 9/11. We
also know the link between Iraq and 9/11 was somewhere between dubious
and non-existant. Go with the most superficial explanation - fix the
"early withdrawal".</p>
<p>Now when the war with Iraq was announced, while I thought the reasons
given bogus, there was a chance this could be a good thing. If we could
step in and replace an evil dictator with a free and open democratic
government - this <strong>could</strong> be one of the most important events in world
history. Too long have we stood by and watch millions suffer under evil
governments. If we could make a change for the better - this would be
well worth doing.</p>
<p>This is a hard thing. Not the war - while war always as risks, we knew
our military was superior, and with careful planning we could expect to
defeat the Iraqi military. The tricky part was planning the
reconstruction of Iraq. This is something that had never been done
before (though bearing some semblence to the reconstruction of Germany
and Japan after World War II). Clearly this was going to require some
careful planning and hard work by the best minds both in the United
States (and friends) and in Iraq.</p>
<p>So we invaded Iraq ... and I waited for the plan to appear. By now I
think it is relatively clear that there never really was much of a
plan - if any. When faced with a task that could have <em>changed the
course of world history</em> - the Bush administration didn't bother to do
their homework, and went golfing instead. Go with the most superficial
explanation - the reconstruction of Iraq is a great chance to hand out
"pork" (fat government contracts that profit Bush's "friends" and
political allies).</p>
<p>Now we have the plan to put Social Security money in the stock market.
It is not clear how this makes sense, or can be made to work. Go with
the most superficial explanation - Bush has "friends" that will profit
from fees (who will administer the plan?), or will profit from inflated
stock prices (when more money is pumped into an already over-valued
market).</p>
<p>My only hope is that the Republicans who really do care about the
country will find their backbone, and start saying "No!" a lot more
often. It is no longer an election year, so it is no longer political
suicide to oppose the administration.</p>
<p>I can hope.</p>
Optimal code2004-12-05T00:00:00Zhttps://bannister.us/weblog/2004/optimal-code
<p>Read another posting recently which could be summarized as "You'd be
crazy to write code in C++". While I generally agree with many of the
usual points, there are simply times when it <strong>is necessary</strong> to write
optimal code.</p>
<p>Take today's task as an example.</p>
<p>The "publisher" portion of our product at
<a href="http://www.asg.com/products/product_details.asp?code=299&id=47&src=Information">work</a>
takes as input a customer's "printed" report, performs some fairly heavy
processing, then outputs processed/burst/compressed output suitable for
efficient serving over the web. It seems that every year our customers
are running larger reports through our product - almost as though they
were dumping their <em>entire</em> database into a "printed" report!</p>
<p>In fact, this makes perfect business sense. "Printing" a report to the
web is a lot cheaper/less risky than developing a new web application.
Also the "publisher" portion of our product is indeed <em>designed</em> to
handle very large input files.</p>
<p>Now I have a lot of experience writing extremely efficient code (when
needed), and pulled out pretty much every trick in the book to push
performance up to the limit of the hardware. With the prior "publisher"
component (licensed from a third party) we had customers whose
publishing runs were taking all night for ~100MB files. With the
current publisher those same reports complete in a few minutes (with
modest variation depending on the options used), and is generally I/O
bound (with no extraneous I/O).</p>
<p>Still there are a rather large number of possible variations between
customer data and the (many) options to publishing. Every once and a
while a customer runs across a combination not covered in our testing.</p>
<p>Last week we received a report of a performance problem with a 759MB(!)
report. Turns out there was a bit of O(n^2) code I'd missed that also
achieved near-optimal heap fragmentation. Naturally this required the
right set of options, and was not bothersome even with 500MB input files
(why we have not seen this before).</p>
<p>Just finished replacing the naughty bit of code. Memory use is exactly
optimal. Performance is excellent. Doubled the input file size to get a
(pessimistic) performance number for a non-cached input file. From the
log:
<code> Elapsed time 262 seconds - processed 185356 pages, 11105172 lines, 1499383577 characters (5722838 characters/second)</code>
The output consists of 1854 (compressed) files totalling 119MB. This is
all on my modest 2.2GHz Athlon test machine. Heh :).</p>
<p>Turns out we had a second customer regularly publishing a ~936MB(!)
report (somehow I doubt this report was ever printed), and they were
seeing a related problem (since resolved). Funny thing is we don't hear
anything from customers when there is not a problem. So the only time we
get confirmation about real-world usage is when there is a problem. We
have customers publishing huge volumes, and it just worked - this is a
good thing.</p>
<p>My point in all this is that there are some applications where
performance is essential. I would estimate that this same application
coded in Java (or C#) would take 10 to 100 times longer to run, and
require considerably more memory (too much in some scenarios). This
application uses custom memory allocation, I/O, strings, hash tables,
and lots of low-level character and pointer manipulation. The debug
version is heavy laced with assertions (much like Java's runtime range
checking - and thus slower), and is run against a substantial set of
regression/unit tests before <strong>every</strong> release. The release version is
compiled without the assertions.</p>
<p>I do agree that coding in C++ is relatively risky, and is neither
required nor desirable for <em>most</em> applications. Still there are cases
where is necessary to extract every last bit of performance, and it is
just not possible to achieve the performance needed with a
"higher-level" language.</p>
<p>On the flip side, outside some <em>extremely</em> rare exceptions, I do not
believe there is a need for a "lower" level language than C++. With
careful coding it is possible with C++ to get very close to the limits
of the hardware. In fact with an equivalent programming effort you
<em>could not</em> develop an equally efficient program in "C" or assembly.</p>
<p>Back to writing Java code ... (in another application).</p>
Persimmons2004-12-04T00:00:00Zhttps://bannister.us/weblog/2004/persimmons
<p>Did a bit of vacating Friday. Was on vacation all last week, but somehow
work kept interfering...</p>
<p>Drove down to <a href="http://www.julianca.com/">Julian</a> to do a bit of walking
around, and pick up a couple <a href="http://www.julianpie.com/">apple pies</a>. To
be perfectly honest, the apple pies were pretty good, but not fantastic.
What makes the trip worthwhile was the drive itself.</p>
<p>Took Ortega Highway east, drove along the west edge of Lake Elsinore
(never been entirely through this area), hopped on the I-15 south to the
76 and wandered south-east toward Julian. This time of year when
preceeded by a good dose of rain, rural southern California really does
look rather nice. Lots of green. Forgot to bring the camera though.</p>
<p>Oddities along the way - driving through farms, pastures, and orange
groves - drop into the next valley and up pops a tall Las Vegas style
<a href="http://www.palacasino.com/directions/">casino</a> out pretty much in the
middle of nowhere. Surreal - as I drove past there was not a single
other soul in sight.</p>
<p>Saw a small sign advertising persimmons for sale along the road. Been a
while since I'd tried persimmons, and the ones from the local market are
usually disappointing, so stopped (had to backtrack after missing the
entrance first time past). They had a small grove loaded with ripe
persimmons, and you could go and pick your own. Since I had no idea how
to tell if a persimmon was over- or under- ripe, I just loaded up on
already-picked fruit. Brought seven pounds at 40 cents per pound.</p>
<p><a href="https://bannister.us/weblog/images/persimmons.jpg"><img src="https://bannister.us/weblog/images/tn_persimmons.jpg" alt="Persimmons" /></a></p>
<p>Turns out the fruit I brought home is pretty good. Now as to what to do
with all this fruit ... :).</p>
Indeed2004-12-01T00:00:00Zhttps://bannister.us/weblog/2004/indeed
<p><img src="http://www.tbray.org/ongoing/When/200x/2004/11/30/-big/Tanya-King.jpg" alt="Dictionary page on a
shirt." /></p>
<p><a href="http://www.tbray.org/ongoing/When/200x/2004/11/30/Lustrous">"and the plate detail are probably both worth a click to
enlarge."</a></p>
<p>Referring to the technical capability of a Canon S70, no doubt.</p>
Secret Law2004-11-29T00:00:00Zhttps://bannister.us/weblog/2004/secret-law
<p><a href="http://www.fas.org/sgp/news/secrecy/2004/11/111404.html">THE ARRIVAL OF SECRET
LAW</a></p>
<p>If this doesn't give you the creeps - it should.</p>
<p>Remember the American Revolution some 200-odd years ago? The Founding
Fathers of this country believed in individual rights, freedom, liberty,
due process, and in limiting the power of the government. Hopefully this
all sounds very familiar if you are an American.</p>
<p>Now our government is making secrets laws. WHAT!!!</p>
<p>This is <strong>evil</strong>. There is no other word for it. No wait - there is
another word that fits - <strong>subversive</strong>. The making of secret laws
subverts the founding principles of this country. In a response to a
limited threat from the outside, folks inside the government are
destroying from within the country founded on the principles of the
American Revolution.</p>
<p>There is NO excuse that can possibly justify the making of secret laws
in this country.</p>
Remember South Africa?2004-11-28T00:00:00Zhttps://bannister.us/weblog/2004/remember-south-africa
<p>A friend goes to retrieve his elderly parents from South Africa from the
aftermath of the end of apartheid.</p>
<p><a href="http://zakkong.blogspot.com/">Zak's RSA Saga</a></p>
Yikes!2004-11-25T00:00:00Zhttps://bannister.us/weblog/2004/yikes
<p><img src="http://www.cherryflava.com/photos/uncategorized/shark01.jpg" alt="Hope he's not
hungry." /></p>
<p>The <a href="http://surfshooter.com/DolphinInfo.html">guy who took the photo</a>
says the critter in this picture is in fact a dolphin (though widely
mis-identified as a shark).</p>
<p>Funny thing is I found the picture on a weblog of a South African
website where the subject was shark encounters. Turns out the photo was
taken in Malibu, California - a short drive from here (in fact drove
through Malibu this last weekend).</p>
<p>Looking at the photo, the blurred outline distorted by the water looks a
bit "pointed" - more like a shark than a dolphin.</p>
Thanksgiving2004-11-25T00:00:00Zhttps://bannister.us/weblog/2004/thanksgiving
<p>Just me and the kids this Thanksgiving.</p>
<p>We decided on yams (with butter, cream, cinnamon, nutmeg, and topped
with melted marshmellows), corn bread (using the excellent sweet canned
corn from Trader Joe's), and a roast turkey. Got a 20lb turkey (why
not?) and marinated overnight. Made the marinade out of equal parts
lemon juice, olive oil, light soy sauce, and packet of dried oregano.
The marinade tasted really good - might use this for other things, in
fact this might even make a good salad dressing. Rubbed the turkey with
olive oil, and popped into a 450 degree oven until browned (about 25
minutes). Dropped the temperature to 350 degrees, stuck in the
temperature probe, poured some water into the bottom of the roasting pan
(to raise the humidity), and covered with aluminum foil.</p>
<p>The yams and corn bread are done. Hopefully in about 3 to 5 hours we
will have turkey...</p>
Relative noise2004-11-25T00:00:00Zhttps://bannister.us/weblog/2004/relative-noise
<p>I think she's got the meaningless nature of much travel right in
“<a href="http://blogs.law.harvard.edu/philg/2004/11/24#a6927">Helicopter versus airplane
noise</a>”.</p>
If a picture is worth a thousand words...2004-11-19T00:00:00Zhttps://bannister.us/weblog/2004/if-a-picture-is-worth-a-thousand-words
<p><img src="http://sorryeverybody.com/upload_files/se13314.jpeg" alt="Exported
apologies" /></p>
<p>From <a href="http://sorryeverybody.com/gallery/1/">Sorry Everybody</a>.</p>
Can We Please Bury the Netscape Metaphor?2004-11-15T00:00:00Zhttps://bannister.us/weblog/2004/can-we-please-bury-the-netscape-metaphor
<p>In the "how not to miss the point" column...</p>
<p>John Battelle writes about: <a href="http://battellemedia.com/archives/001026.php">Can We Please Bury the Netscape
Metaphor?</a> and I am in
complete agreement with the points he makes.</p>
<p>Netscape as a phenomena was built on a small clever idea and a massive,
insane over-reaction by the stock market. The company itself had very
little depth outside the one clever but not original idea. If you want a
model for what Netscape could have been, look at the <a href="http://www.opera.com/">outfit that sells
the Opera web browser</a> - a small company with a
respectible product that is both competitive and steadily evolving.
There is no way Netscape could ever have met the expectations set by the
stock market. They had to take the money from the stock market and try
to build a company to match the stock price. In the end they failed -
not for lack of trying, but simply because building a successful large
company from scratch is quite difficult.</p>
<p>Google is almost exactly the opposite of Netscape. They started with one
small clever idea (an unusually effective search engire) and spent years
building steadily on this base. Google also built something more
valuable - customer trust - by clearly putting the interests of the
customer first. In the years before going to the stock market Google
made a series of very smart, largely incremental improvements to their
collection of offerings. As a user I am continually pleased with the
service they provide. As a software developer I am repeatedly impressed
by their choices both in enhancing their existing services, and in their
amazing good taste in acquisitions.</p>
<p>Google is much more likely to succeed that Netscape in that they
<strong>earn</strong> their position everyday. Google is also more likely to succeed
against Microsoft for essentially the same reason the makers of large
computers could not succeed against the makers of small computers - the
new approach is fundamentally different, and the older company cannot
compete without largely abandoning their existing business model.</p>
After the rain2004-11-15T00:00:00Zhttps://bannister.us/weblog/2004/after-the-rain
<p>We had a bit a of rain in the last few weeks. In fact, for southern
California we got quite a lot of rain. A bit of before and after...</p>
<p>September 12 - lunch?
<img src="https://bannister.us/weblog/images/IMG_2104.JPG" alt="Pickly" /></p>
<p>September 25 - Small brush fire off Santiago Canyon Road.
<img src="https://bannister.us/weblog/images/IMG_2172.JPG" alt="Small fire" /></p>
<p>November 1st - even the trail is turning green.
<img src="https://bannister.us/weblog/images/IMG_2296.JPG" alt="Green trail" /></p>
<p>November 1st - distressed cactus.
<img src="https://bannister.us/weblog/images/IMG_2298.JPG" alt="Cactus" />
Note the bit of green near the bottom of the picture. Weeks after the
rain the cactus is still recovering from the dry spell.</p>
<p>November 15th - Catalina Island outlined against the setting sun.
<img src="https://bannister.us/weblog/images/IMG_2318_a.jpg" alt="Catalina at sunset" /></p>
Good stuff - Kitten's Spaminator2004-11-14T00:00:00Zhttps://bannister.us/weblog/2004/good-stuff-kittens-spaminator
<p>Lately the scum-of-the-earth spammers have been attempting to attach
bogus (spam) comments to my weblog entries. WordPress has options for
requiring comment moderation <em>sufficient</em> to keep the comments from
appearing in public, but chew up my time zapping the bogus entries.</p>
<p>Since the spammers use web robots, this became bothersome.</p>
<p>Another WordPress user (and contributor) was sufficiently bothered to
come up with a plugin to zap just this particular sort of comment spam.
After adding the <a href="http://mookitty.co.uk/devblog/category/kittens-spaminator/">Kitten's
Spaminator</a>
plugin to my installation, I have found it indeed works quite well.</p>
<p>Good stuff :)</p>
Islands in the distance2004-11-10T00:00:00Zhttps://bannister.us/weblog/2004/islands-in-the-distance
<p>Google bought another web/software outfit -
<a href="http://www.keyhole.com/index.php">Keyhole</a>. Once again the Google folks
have made a very smart acquisition. Keyhole is an amazingly well done
application that works exactly the way I had always hoped a
geographic/map application would.</p>
<p>Contrast Delorme's map application, while it may have more topographic
information (though less accurate in the areas I checked), the user
interface is awkward, and the implementation is pretty obviously far
from optimal.</p>
<p>Hiking in the hills up on clear days there are three major islands I can
see out on the ocean. Keyhole made it easy to measure the distances -
Santa Catalina (45-55 miles), San Clemente (70-72 miles), and Santa Cruz
(110-130 miles). Depending on the time of year, can see Catalina fairly
often - a few to several times a month. Days when you could see Santa
Cruz are rare - only a few times a year.</p>
<p>There are 10 million or so people (likely more by now) in the greater
Los Angeles basin who spend all their time nearer sea level, amid
buildings, trees, and people. Despite the nearness of this mass of
people, you can hike a few miles into the hills and be suddenly alone.
Very few venture out and up. So few know when looking at the haze above
the horizon whether they are looking through a couple miles or a couple
hundred miles of air.</p>
<p>Might be there are fewer people on my regular hike, after the cougar ate
the mountain biker...</p>
Puzzled2004-11-07T00:00:00Zhttps://bannister.us/weblog/2004/puzzled
<p>On election day the Orange County (California) Registrar of Voters had a
number of roving people out with the title "Election Day Coordinator"
(or something similar). The notion was to help out the local voting
places if the ran out of supplies or had some other sort of trouble - a
good idea. The number of precincts must be fairly large - there are
1495824 total registered voters in OC, and about 960 in my precinct.
Assuming other precincts were of similar size that makes for ~1500
precincts. Since our "coordinator" was covering 6 voting places, that
would put the number of "coordinator" at ~250. Now I don't think the
RoV office has anywhere near that many people, so they must be pulling
in people from somewhere.</p>
<p>The election day coordinator that walked into my voting place looked
amused - every time.</p>
<p>Now I have a fondness for puzzles, but this is too much - just exactly
<strong>what</strong> was so amusing??</p>
<p>Admittedly I did not have to work very hard this election. There were
three high school girls (actually one I think is now in college) that
worked very well together handling the people as they came in. There was
a older woman from up the street that easily handled the controller for
the voting machines.</p>
<p>That meant I only had to handle the exceptional cases. During idle times
I answered email (with a 802.11g connection - an advantage to hosting
the voting place at your house), and did some
<a href="http://www.amazon.com/exec/obidos/ASIN/0553212788/qid=1099878959/sr=2-1/ref=pd_ka_b_2_1/002-2399794-3023202">reading</a>.</p>
<p>An odd observation - I have an unfair advantage. Confused voters often
were not keen on accepting advice from teenage girls. As a middle-aged
white male, I had no such difficulty.</p>
<p>I see this in the voting place. The girls would try to help handle the
odd cases (and they did a fair job), but some folks did not look
assured. I could step in, and while likely offering the same advice,
could help folks understand and become confident in their choices.</p>
<p>I see something like this even when out hiking ... don't ask me to
explain.</p>
<p>In any case, the end result as a group was to make the day's voting go
smoothly. Discounting the voters' (justified) mild frustration with the
new voting machines, there was no real trouble.</p>
<p>The very first time I volunteered to help in an election (several years
back) to my surprise they made me an "Inspector". The role of the
Inspector is to run the local polling place. What I did not know was
that it was important to remind the other poll workers to show up - and
on election day no one else did! Yikes! After a somewhat urgent(!) call
to the Registrar of Voters, they pulled in a girl from another precinct
to help. The two of us ran the polling place alone - which made for a
<em>very</em> intense day.</p>
<p>Needless to say this time I made sure to call all the poll workers well
ahead of time. They did indeed all show up, had more help than in any
prior year, and the day went very smoothly.</p>
<p>Which leaves me with a puzzle. <em>Just what did our election day
supervisor find so amusing?</em>
What is worse - I cannot remember her name. I have always had trouble
with names. For some reason I can remember an interesting article or
algorithm I saw ten years ago, but cannot remember a person's name a few
minutes later. Argh.</p>
<p>On an entirely different note - winced a bit when I saw the <a href="http://www.oc.ca.gov/election/">Registrar
of Voters website</a>. A classic nested
tables layout that does not adapt gracefully to changes in screen width.
Now in part we have to cut the website author <em>some</em> slack, as surely
the site was originally written to work with the mash of browser
versions common only a few years ago. But still ... this could be
better.</p>
<p>Mostly as a exercise I took their homepage and <a href="http://bannister.us/examples/oc-registrar-of-voters/">re-worked to use clean
HTML 4.0 and CSS</a>.
Could do more with this (of course) but this is an exercise only. (There
is something odd with the Korean & Chinese characters - they render on
my desktop but not on my notebook).</p>
Eliza's shady sisters?2004-11-07T00:00:00Zhttps://bannister.us/weblog/2004/elizas-shady-sisters
<p>I wonder if Joseph Weizenbaum thought
<a href="http://en.wikipedia.org/wiki/ELIZA">ELIZA</a> might lead to IM robots
selling porn sites, and things like <a href="http://www.virtualbartender.beer.com/beer_usa.htm">this virtual "beer"
girl</a>. If he had
known might he have taken up dentistry instead?</p>
Working the polls2004-11-02T00:00:00Zhttps://bannister.us/weblog/2004/working-the-polls
<p>Opened the polls at 7am. We have about 960 people listed in this
precinct. From 7am to 9:15am we were busy with all the voting machines
occupied, and 100 people voting. Busier than I remember from previous
years, though it seems they expanded my precinct somewhat. With 4 other
poll workers (including 3 girls recruited from the local high schools)
the load wasn't too bad.</p>
<p>We have 5 voting machines (Hart eSlates) here. We could use more to cut
down the wait during the busy times.</p>
<p>We had another minor rush around lunchtime, and another minor rush
around 5pm ... and then nothing. In prior years we were often quite busy
right up to the time the polls closed (at 8pm). Odd - why so quiet in
the evening? Was it because of the news reports? Some folks coming in
were expecting very long times because of what they had heard in the
news.</p>
<p>Total votes at the end of the day - 321 votes cast for the precinct (not
counting absentee ballots).</p>
At the intersection of politics, technology and economics2004-11-01T00:00:00Zhttps://bannister.us/weblog/2004/at-the-intersection-of-politics-technology-and-economics
<p>Another episode in the "War on Drugs".</p>
<p>Apparently there is now through assisted natural selection a
herbicide-resistant Coca plant - <a href="http://www.wired.com/wired/archive/12.11/columbia.html">The Mystery of the Coca Plant That
Wouldn't Die</a>.</p>
<p>Follow the money...</p>
<ul>
<li>"The coke habit in the US alone was worth $35 billion in 2000" -
which means lots of money for corrupt folks in both Columbia and the
United States.</li>
<li>"US aid to Colombia totaled more than $750 million last year ...
About 20 percent of the money was devoted to maintaining a fleet of
crop dusters and support planes" - which works out to something
under $150 million in RoundUp sales for Monsanto, and over $600
million distributed by the Columbian government.</li>
</ul>
<p>That makes for a lot of folks who want things to stay pretty much as-is.</p>
Mobility and dancing bears2004-10-28T00:00:00Zhttps://bannister.us/weblog/2004/mobility-and-dancing-bears
<p>I am with
<a href="http://www.tbray.org/ongoing/When/200x/2004/10/26/Mobility">Tim</a> and
<a href="http://jeremy.zawodny.com/blog/archives/002883.html">Jeremy</a> here ...
and while <a href="http://www.russellbeattie.com/notebook/1008112.html">Russell</a>
has a point, he is just about completely wrong :).</p>
<p>Size is the problem.</p>
<p>Cell phones are small. In fact with the current generation of phones
they are <strong>too small</strong> - at least in the keyboard. Unless you are a kid
or a skinny Asian female the size and placing of the buttons on the
phone is a lot smaller than your fingers. This is just <strong>bad design</strong>.</p>
<p>(Why is it the very latest cellphone/gadgets are usually shown with
skinny Asian females? ... oh nevermind).</p>
<p>For talking cellphones are great. For sending short text messages (I
have a teenager) cellphones are - a bit of a pain but tolerable. For web
access - between the tiny screen and tiny keyboard - cellphones are a
dancing bear.</p>
<blockquote>
<p>"The wonderful thing about a dancing bear is not how well he dances,
but that he dances at all."</p>
</blockquote>
<p>My new cellphone has a (lousy) builtin camera, with truly brain-dead
supporting software/GUI in the phone, and an uninspiring picture gallery
at the phone company site. Dancing bear time again.</p>
<p>No, I don't have a PDA or cellphone/PDA hybrid. Ever see the George
Carlin routine about <a href="http://www.jefallbright.net/node/view/1581">different versions of
"stuff"</a>? PDAs are little
limited computers with small screens and <strong>way</strong>-too-small keyboards.
One friend is on - I dunno - his sixth(?) PDA. Seems to be more of a
hobby than a useful tool.</p>
<p>Cellphones are great for talking. Bluetooth to a wireless headset sounds
pretty nice, though with my latest cellphone has a "speakerphone" mode,
I have almost stopped using headsets. Flat-rate high-speed connection to
the Internet via bluetooth to my notebook sounds like a killer app - if
you can talk at the same time.</p>
<p>I will take <strong>usable</strong> and useful over whizzy every time :).</p>
Doctors are doing just fine...2004-10-25T00:00:00Zhttps://bannister.us/weblog/2004/doctors-are-doing-just-fine
<p><a href="http://gadflyer.com/articles/?ArticleID=241">Despite their malpractice premiums, America's doctors are doing just
fine.</a></p>
<p>Guess the rumors that HMOs and Insurance companies were cutting into
doctors incomes is not of concern.</p>
This still bothers me...2004-10-23T00:00:00Zhttps://bannister.us/weblog/2004/this-still-bothers-me
<p>Back when the Republican Convention was in New York, there were a number
of arrests that I find ... disturbing.</p>
<p>First there was the guy with a bike that wrote messages on the sidewalk
in washable chalk. You could send messages to be written by the bike
from <a href="http://www.bikesagainstbush.com/blog/index.php">his website</a>.
Overall a <a href="http://www.wired.com/news/print/0%2C1294%2C64782%2C00.html">pretty clever
idea</a>. He
was going to ride around during the RNC writing other folks words on the
sidewalk. A pretty neat twist on freedom of speech :).</p>
<p>He was <a href="http://www.bikesagainstbush.com/blog/arrest.html">arrested by the NYC
police</a> - while being
<a href="http://www.bikesagainstbush.com/blog/hardball.html">interviewed for
TV</a>. Personally I
think it a bit of a stretch to arrest someone for writing with washable
chalk. Sounds too much like an excuse, given the "damage" washes away
with a bit of water. Seems somehow that "freedom of speech" should have
weighed in here in favor of <strong>not</strong> bothering this guy who was clearly
not out to do any real harm (not counting political damage).</p>
<p>As a side note - it took the police the better part of an hour to decide
if they should make an arrest. I wonder if they would have taken as long
if there were not TV cameras present?</p>
<p>Though <a href="http://www.msnbc.msn.com/id/5850151/#040829e">he was released somewhat
later</a> they kept his
equipment through the RNC and up to the present. Guess he won't get his
stuff back until after the election. Funny how that works out...</p>
<p>Around the same time the NYC police
<a href="http://oldskooltrack.com/files/rnc.cm.frame.html">arrested</a> a <a href="http://www.times-up.org/call_rnc.php">large
number of other people</a> for
<a href="http://www.indybay.org/news/2004/08/1693267.php">riding bicycles</a>
(doubtless a dangerous activity) or for just being in the <a href="http://images.indymedia.org/imc/nyc/image/1/large/MSG.jpg">general
area</a>.</p>
<p>I have a hard time seeing the arrests as <strong>anything other than
politically motivated</strong>.</p>
Wildfire2004-10-18T00:00:00Zhttps://bannister.us/weblog/2004/wildfire
<p><img src="https://bannister.us/weblog/images/wildfire.jpg" alt="Wildfire" />
By <a href="mailto:John_McColgan@ak.blm.gov">John McColgan</a> of the BLM Alaska
Fire Service. <a href="https://bannister.us/weblog/images/wildfire-large.jpg">[large image]</a></p>
<p>The image was captured in the late afternoon of Sunday, August 6, from a
bridge over the East Fork of the Bitterroot River just north of Sula,
Montana. The elk sought refuge in the river bottom during what may have
been the most extreme day of fire behavior on the Bitterroot in more
than 70 years. "I do shoot some photography, but certainly that was a
once in a lifetime, stunning opportunity."</p>
<p>He was traveling to the Valley Complex along with the deputy incident
commander of the Sula Complex. "I was on that ridge for maybe 15
seconds." "We just saw the elk, and I stopped and said, 'I'm taking 15
seconds here.'" McColgan said the photo does not fully convey the
extreme weather conditions that day. "It was a fairly violent situation
out there," he said. "It looks fairly serene, but the wind was really
whipping."</p>
<p>McColgan used a <a href="http://www.amazon.com/exec/obidos/ASIN/B000038AB2/qid%3D1105297118/sr%3D11-1/ref%3Dsr%5F11%5F1/103-6409619-7392631">Kodak DC 280 digital
camera</a>,
set at high resolution (1,792 x 1,200), but also at a medium to high
level of compression to save on storage space. "I wasn't out shooting
art photos. I was doing fire behavior documentation." After the photo
was taken, it circulated widely and anonymously until it got picked up
by the Associated Press and the Montana newspaper "The Missoulian." "I
had given a copy to someone while I was down there [in Montana], and it
inadvertently made its way into the e-mail system." He received e-mail
from friends in Europe, sending the photo back to the US and asking him
if he'd seen it.</p>
<p>Since McColgan was working as a Forest Service firefighter, the shot is
public property and cannot be sold or used for commercial purposes</p>
<p>Although the photo originally went out with no credit information, a
reporter from "The Missoulian" tracked the photographer down at home in
Alaska. McColgan, who normally works as a fuels management specialist
for the Bureau of Land Management Alaska Fire Service, doesn't mind the
lack of credit, or that he can't use the photo to make a profit.</p>
<p>As McColgan described the experience to a writer for the Western Montana
newspaper The Missoulian:</p>
<blockquote>
<p>"That's a once-in-a-lifetime look there. I just happened to be in the
right place at the right time. I've been doing this for 20 years and
it ranks in the top three days of fire behavior I've seen."</p>
<p>The day was Aug. 6, the Sunday when several forest fires converged
near Sula into a firestorm that overran 100,000 acres and destroyed 10
homes. Temperatures in the flame front were estimated at more than 800
degrees. Nevertheless, McColgan said, the wildlife appeared to be
taking the crisis in stride, gathering near the East Fork of the
Bitterroot River where it crosses under U.S. Highway 93.</p>
<p>"They know where to go, where their safe zones are," McColgan said. "A
lot of wildlife did get driven down there to the river. There were
some bighorn sheep there. A small deer was standing right underneath
me, under the bridge."</p>
</blockquote>
<p>John McColgan has been a wildland firefighter for 20 years. He currently
works for the Department of Interior, Bureau of Land Management, Alaska
Fire Service as a Fuels Management Specialist. John coordinates fuel
management and prescribed fire activities for the BLM in Alaska. During
fire season he serve as a Fire Behavior Analyst on the Alaska Type I
Incident Management Team. John has been in Alaska since 1989 where he
has worked with the Alaska Smokejumpers for 10 years. Prior to 1989 he
worked on hotshot crews with the National Park Service in Sequoia-Kings
Canyon National Park and with the U.S. Forest Service on the Mt. Hood
National Forest where he started my wildland fire career. In 1987, He
graduated from Colorado State University with a bachelors degree in
Natural Resource Management with an emphasis in wildland fire science.</p>
Web criminals & Whack-a-mole2004-10-16T00:00:00Zhttps://bannister.us/weblog/2004/web-criminals-whack-a-mole
<p>Tim Bray writes about <a href="http://www.tbray.org/ongoing/When/200x/2004/10/16/ThaiPhish">Crooks in Plain
Sight</a> and
asks "What am I missing?". Why do we have web criminals when the sources
are so easy to identify?</p>
<p>In fact the lack of sense it is much worse (or better - depending on
your point of view).</p>
<p>It is easy to shut down script kiddies, if you have lots of time to
waste. It is not too hard to identify machines sending spam, or websites
hosting scam artists. In the end this is about as effective as playing a
game of <a href="http://www.spymuseum.org/games/mole.html">Whack . A . Mole</a>.
There are an almost endless number of clueless teenagers, unsecured
machines, and careless webhosts.</p>
<p>Still the problem is entirely solvable. How do you avoid scam artists in
real life? Know who to trust.</p>
<p>Trust can be built into algorithms.</p>
<p>Want to shut down spammers at the source? Block outgoing SMTP
connections for most customers. Count the number of emails sent per hour
or day. Shutdown accounts with unusual activity. Trust your users as you
would in real life - let experience be your guide. A new user who starts
posting hundreds of messages should get your attention. An old user
(someone you have come to trust) would get less attention.</p>
<p>Handle irresponsible ISPs by blocking <em>all</em> traffic until they get their
act together. Script kiddies are easy to spot - setup honeypots.</p>
<p>Want to shutdown scam artists? Follow the money. Create "poison pill"
accounts with the credit card companies. Shutdown the business account
of anyone who trys to use a poisoned account. Cut off a scam artist's
money, and you make their business a lot less attractive.</p>
<p>Want to spot spammers who harvest email addresses and clearly are in
violation of "opt-in" requirements? Plant "poisoned" email addresses on
USENET newsgroups and bogus websites. Anyone sending to a "poisoned"
email address is almost certainly dishonest.</p>
<p>Cutoff the money, the email, and the ISP used by dishonest folks and you
can pretty much wipe out the problem.</p>
Oil wars?2004-10-12T00:00:00Zhttps://bannister.us/weblog/2004/oil-wars
<p>The chaos in the world oil markets and the resulting record high prices
must be extremely profitable for some. If you are an oil producer and
your production is unaffected, you are now accumulating an enormous
extra pool of cash. Clearly it is in your interest for prices to stay
high. Funding a bit of chaos in other oil-producing regions could prove
highly profitable.</p>
<p><a href="http://quote.bloomberg.com/apps/news?pid=10000006&sid=aOwb0Llbmrx0&refer=home">Reading the
news</a>,
I have to wonder if this has already begun. Perhaps that is part of the
troubles in Iraq? Other oil-producing outfits/countries have interest in
seeing oil production in Iraq kept limited. Funding terrorists is
relatively cheap compared to the profits brought in by high oil prices.</p>
<p>Welcome to the Oil Wars?</p>
A viewpoint - War in Vietnam2004-10-12T00:00:00Zhttps://bannister.us/weblog/2004/escapable-logic-war-in-vietnam
<p>A well-expressed viewpoint from someone who served in the <a href="http://www.blaserco.com/blogs/2004/10/10.html">War in
Vietnam</a>.</p>
What happened to Microsoft?2004-10-09T00:00:00Zhttps://bannister.us/weblog/2004/what-happened-to-microsoft
<p>Why does it seem that very little has come out of Microsoft lately?</p>
<p><a href="http://blogs.msdn.com/dmassy/archive/2004/08/05/209428.aspx#FeedBack">Transparent PNG
Support</a></p>
Verified Voting - Campaign To Demand Verifiable Election Results2004-10-09T00:00:00Zhttps://bannister.us/weblog/2004/verified-voting-campaign-to-demand-verifiable-election-results
<p>This November I will be hosting the local polling place at my home. This
is the first time I will host an election with California's new
"electronic" voting machines (rather than paper ballots as in the past).
While I generally believe moving away from paper ballots is a good
thing, I am concerned that without proper checks it is possible for
corrupt insiders change the voting result.</p>
<p><a href="http://www.verifiedvoting.org/article.asp?id=2334">Verified Voting - Campaign To Demand Verifiable Election
Results</a></p>
My Politics2004-10-09T00:00:00Zhttps://bannister.us/weblog/2004/my-politics
<p>I have removed most of the political posts from the weblog. While I have
some rather strong feelings on the subject, in the end I would rather do
something constructive, and surfing along the edge of current politics
isn't. The quote that brought this into focus:</p>
<blockquote>
<p><a href="http://www.google.com/search?hl=en&ie=UTF-8&q=%22Without%20the%20objective%20of%20finding%20common%20ground%2C%20political%20discourse%20is%20just%20a%20means%20of%20pissing%20people%20off.%22&btnG=Google%20Search">"Without the objective of finding common ground, political discourse
is just a means of pissing people
off."</a>
(apparently from <a href="http://www.scottmalensek.com/">Scott Malensek</a>
though I'm not sure about the pseudonyms).</p>
</blockquote>
<p>Most political dialog tends to be inflammatory - to polarize and invoke
anger rather than reason. In the end this is distasteful and not
productive.</p>
<p>As a white, middle-aged, upper-middle class male I'm right in the middle
of the demographic that votes most often. The generalization fits - I
registered to vote as soon as I was of age, and have voted regularly
(might have missed a total of 3 elections). In fact I take that
over-developed sense of civic responsibility a bit further. For the past
several years I have volunteered as a local poll worker, and for the
last few years have hosted and run the local polling place at my home.
In part this is out of a sense of duty, and part to insure at least this
portion of the political process was honest.</p>
<p>My political affiliation is listed as "undeclared" which means I am not
a registered member of any political party. Frankly I could not stomach
the behavior of either the Democratic or Republican parties well enough
to want to join either. My views tend to be somewhat conservative - not
"Conservative" as is buying the Republican platform wholesale (yuck),
but rather in the sense of "marked by moderation or caution (as in a
conservative estimate)" rather than a blind adherance to tradition.</p>
<p>I believe that the United States of America is a remarkable and unique
creation by men of unusual foresight. However imperfect our country may
seem (and there are <em>many</em> imperfections), on balance there is as of yet
nothing better. At the same time there are clearly people of influence
who care only for their personal gain, and care nothing for the country
or it's future. In this opposing this corruption lies the future of the
country.</p>
<p>At the end of the day, my hope is to help - by however small a measure -
make this country a better place for my children. Pretty much everything
else in politics is secondary. There are two events in politics that
before I had little hope of seeing in my lifetime. The first was the
fall of the Soviet Union and the almost complete disappearance of
Communism and the threat of nuclear annihilation. The second was the was
a federal budget <strong>surplus</strong> and a beginning to paying down the massive
government debt.</p>
<p>From the second you can pretty much guess my point of view for the
upcoming election. During the Bush presidency we have gone from a budget
surplus to a <em>record</em> deficit. In theory the Republican party stands for
fiscal responsibility and smaller government. During Bush's presidency
we got neither. Instead we got massive growth in both debt and the size
of the government. Clearly Bush as President is a disaster. While I
don't particularly care for Kerry, odds are he won't be as bad as Bush.</p>
<p>On a more hopeful note - there are "moderate" voices within the
Republican party that might be better heard if Bush loses, and the
Republican party might well be improved . If Bush wins we can pretty
much expect things to stay as they are (not a good thing).</p>
Server-side Java performance2004-10-09T00:00:00Zhttps://bannister.us/weblog/2004/mblog-greg-wilkins
<p>Admittedly I am something of a performance freak. I have a knack for
understanding the potential performance of an application. This has
meant picking up existing software and radically improving performance.
This means writing new software that performs at the limits of the
hardware and out-performing the contemporaries.</p>
<p>Working with the existing Java web servers and frameworks I am bothered
by the sense that all this well-thought and carefully abstracted
software is somehow far from the potential limits of performance.
Understand that I am not saying all this software is badly written.
Rather the exercise of boiling down the critical path through an
application to just essential steps is quite difficult.</p>
<p>Seems that <a href="http://www.mortbay.com/MB/log/gregw/?permalink=servletNG.html">Greg
Wilkins</a>
is having somewhat similar thoughts at least in regards to Java
Servlets.</p>
Attack of the Repo Men2004-09-06T00:00:00Zhttps://bannister.us/weblog/2004/attack-of-the-repo-men
<p><a href="http://www.acme.com/software/thttpd/repo.html">Attack of the Repo
Men</a> - this story has
been around for a while.</p>
<p>I first ran across the work of Jef Poskanzer when his <a href="http://www.acme.com/software/pbmplus/">Portable Bitmap
Package</a> was <a href="http://groups.google.com/groups?q=pbm+Jef+Poskanzer&start=70&hl=en&lr=&ie=UTF-8&scoring=d&as_drrb=b&as_mind=12&as_minm=5&as_miny=1981&as_maxd=6&as_maxm=9&as_maxy=1989&selm=5216%40well.UUCP&rnum=75">first posted the
USENET</a>.
He has since turned out a whole <a href="http://www.acme.com/">series</a> of
<a href="http://mapper.acme.com/?lat=33.688396&long=-117.66968&scale=10&theme=Image&width=6&height=3%CB%99=Yes">interesting</a>
and <a href="http://www.acme.com/software/thttpd/">brilliant</a> bits of work.</p>
<p>Seems like this story could remind us that human intelligence does have
an average.</p>
Apple - iMac G52004-09-06T00:00:00Zhttps://bannister.us/weblog/2004/apple-imac-g5
<p>Apple sure makes beautiful hardware. I have always admired Apple's
hardware, even though the last Apple product I spent any real time with
was the <a href="http://en.wikipedia.org/wiki/Apple_Lisa">Lisa</a>. On the other
hand, I have had the opportunity to take apart a few Apple products over
the years :).</p>
<p><a href="http://www.apple.com/imac/">Apple - iMac G5</a></p>
<p>Too bad my work pretty much requires that I use a Windows machine.</p>
No bull?2004-08-31T00:00:00Zhttps://bannister.us/weblog/2004/incogblogonet-comments-on-cheer-bear
<p>As an American with German and British ancestors, the following makes an
odd sort of sense :).</p>
<p>Stolen from: <a href="http://www.incogblogo.net/index.php/weblog/comments/1702/">Incogblogo.net - comments on cheer
bear</a></p>
<p>TRADITIONAL CORPORATION
You have two cows.
You sell one and buy a bull. Your herd multiplies, and the economy
grows. You sell them and retire on the income.</p>
<p>AMERICAN CORPORATION
You have two cows.
You sell three of them to your publicly listed company, using letters
of credit opened by your brother-in-law at the bank, then execute a
debt/equity swap with an associated general offer so that you get all
four cows back, with a tax exemption for five cows. The milk rights of
the six cows are transferred via an intermediary to a Cayman Island
company secretly owned by the majority shareholder who sells the rights
to all seven cows back to your listed company. The annual report says
the company owns eight cows, with an option on one more. Sell one cow to
buy a new president of the United States, leaving you with nine cows. No
balance sheet provided with the release. The public buys your bull.</p>
<p>AN AUSTRALIAN CORPORATION
You have two cows.
You sell one, and force the other to produce the milk of four cows. You
are surprised when the cow drops dead.</p>
<p>FRENCH CORPORATION
You have two cows.
You go on strike because you want three cows.</p>
<p>JAPANESE CORPORATION
You have two cows.
You redesign them so they are one-tenth the size of an ordinary cow and
produce twenty time the milk. You then create clever cow cartoon images
called Cowikimon and market them worldwide.</p>
<p>A GERMAN CORPORATION
You have two cows.
You reengineer them so they live for 100 years, eat once a month, and
milk themselves.</p>
<p>AN ITALIAN CORPORATION
You have two cows, but you don't know where they are... You break for
lunch.</p>
<p>A RUSSIAN CORPORATION
You have two cows.
You count them and learn you have five cows.
You count them again and learn you have 42 cows.
You count them again and learn you have 12 cows.
You stop counting cows and open another bottle of vodka.</p>
<p>A SWISS CORPORATION
You have 5000 cows, none of which belong to you. You charge others for
storing them.</p>
<p>CHINESE CORPORATION
You have two cows.
You have 300 people milking them.
You claim full employment, high bovine productivity, and arrest the
newsman who reported the numbers.</p>
<p>A BRITISH CORPORATION
You have two cows... both are mad.</p>
<p>A NEW ZEALAND CORPORATION
You have two cows... and the one on the left is kinda cute...</p>
Patents and Linux2004-08-22T00:00:00Zhttps://bannister.us/weblog/2004/ongoing-patents-and-linux
<p>An interesting, and sobering story about <a href="http://www.tbray.org/ongoing/When/200x/2004/08/05/LinuxPatents">Patents and
Linux</a>
from Tim Bray.</p>
Maybe using XHTML is not such a good idea2004-08-22T00:00:00Zhttps://bannister.us/weblog/2004/mollycom-doctypes-not-relevant
<p>File these under "why you should not use XHTML" - why <a href="http://www.molly.com/2004/07/31/doctypes-not-relevant/">DOCTYPES not
relevant?</a> and
<a href="http://hixie.ch/advocacy/xhtml">Sending XHTML as text/html Considered
Harmful</a>.</p>
<p>My conclusion - always declare the DOCTYPE from HTML 4.0 for web pages,
and ignore XHTML.</p>
<p>Frankly using XHTML is like filing all your bills alphabetically - it
sounds like a good idea, but turns out not to be worth the time
invested. After digesting a series of books on HTML 4, CSS, Javascript
and DOM - I just don't see any advantage to XHTML. Sure it is "nice"
that as well-formed XML it passes validation (or at least can in
theory). Since web <em>pages</em> are in almost every case served to web
<em>browsers</em>, and browsers have excellent HTML parsers, there is no gain
there. If you want to serve XML over the web as an API to non-browser
clients, there just isn't any reason I can see to use XHTML. Sure, XHTML
is a new-and-improved cleaner version of HTML. This is "nice" but not
important. Sure it would be "nice" if all the HTML on the web was XHTML
(as this makes writing parsers easier), but this will never happen. As
long as the majority of the web is HTML you will need HTML parsers. As
long as you must have HTML parsers, the XHTML parsers are simply
redundant.</p>
<p>There is a <strong>lot</strong> of function in HTML 4, CSS, DOM and Javascript. We
have only recently been able to count on near-universal HTML 4 support,
and the majority of the web does not take advantage of what is already
there. I think it fair to say that as a profession we are still learning
to take advantage of current available function. I am a long ways from
convinced that XHTML or XForms or CSS3 (or the like) is really enough of
a gain to be worth the trouble.</p>
Litmus tests for Java2004-08-22T00:00:00Zhttps://bannister.us/weblog/2004/litmus-tests-for-java
<p>After reading <a href="http://today.java.net/jag/page7.html">Gosling's posts on
Java</a> and whether open-source
makes sense when applied to the Java platform, I have to admit that my
interest in open-source Java is a <em>means</em> not an end. I do think Sun's
control over Java <em>in the present form</em> is a problem, but I am not at
all clear on the appropriate solution. Got stopped for a while on this
point.</p>
<p>A bit later I ran across a discussion about Linux desktops and how Gnome
was implemented in C, and KDE was using C++ code. Ack. My personal
belief is that code of this sort should be written in something higher
level (like Java) rather than C/C++, so this just strikes me as wrong.
On the other hand the most likely alternatives are Java or Mono. Sun's
Java does not ship with most (all?) Linux distributions, and certainly
is not a guaranteed part of the basic installation. Presumably this has
something to do with Sun's licensing. Mono is a great idea, but copying
Microsoft seems a risky strategy.</p>
<p><strong>Test #1:</strong></p>
<p>Java is most useful <a href="http://blogs.sun.com/roller/page/jonathan/20040712#commodities_railroads_and_how_sun">when it is
everywhere</a>.
One good end-to-end test for Java licensing would be if the Sun JRE
shipped with all the mainstream Linux distributions as a part of the
basic installation. Sun will need to adopt a whatever-it-takes attitude
to make this happen.</p>
<p><strong>Test #2:</strong></p>
<p>Mono came about in part because Microsoft's notion of a Common Language
Runtime is indeed a step upwards. Sun's JVM is good at supporting
Java-like languages, and perhaps not much else. The ability to have near
seamless integration between languages is, from a programmer's
perspective, extremely cool.</p>
<p>A good end-to-end test would be to host Perl on the Sun JVM, and do
whatever-it-takes to make Perl on the (J)VM outperform the current Perl
5 interpreter. This entails some careful profiling and likely some small
changes to the VM, and should obviate the need for "Parrot". I fully
expect the fancy JIT compiler in the JVM to out-perform both the Perl 5
interpreter and "Parrot". Perl is sufficiently different from Java so
that once the VM can support Perl well, likely all the mainstream
languages will perform well.</p>
<p><strong>Maybe we do not need open-source Java</strong></p>
<p>Open-source Java is a <em>means</em> to make Java more prevalent, but what we
are really interested in is the <em>end</em> result. The above two tests
measure the prevalence of Java (or more exactly the JVM) in two
independent dimensions. In the end it does not much matter which path
Sun takes, as long as we get where we need to go.</p>
Sun was cool2004-08-20T00:00:00Zhttps://bannister.us/weblog/2004/sun-was-cool
<p>Tim Bray asks an interesting question in <a href="http://www.tbray.org/ongoing/When/200x/2004/08/19/BackDoor">The Back
Door</a>.</p>
<p>I remember a time where a Sun workstation was possibly the coolest thing
to have on a programmer's desk. Much of the most interesting new
software and research was done on Sun boxes. Techies loved Sun and
pulled Sun hardware in the back door whenever possible. Over time the
Sun reputation percolated up to the front office, just in time for the
1990's boom and .com bubble. Somewhere in there Sun became a
well-respected vendor coming in the front door, and did terrific
business.</p>
<p>Sun was once cool because if you wanted cutting edge workstation
techology (bitmapped graphic displays, fast CPUs) there just wasn't any
real competition. BSD Unix had become nearly a standard in the academic
and research communities, and Sun had a superbe version of BSD Unix. The
fact that Sun eventually made pretty decent servers allowed the techies
to stay with the company they loved, and push Sun hardware to the front
office.</p>
<p>But as Tim's note brings to mind - Sun is no longer cool. At one point
in time I would have been thrilled to have a Sun box on my desk. Now -
it simply seems like too much of a bother.</p>
<p>There are two obvious points where Sun is off-target. First, the Solaris
version of Unix has become an off-brand, as for all practical purposes
Linux has become the standard version of Unix. I know this statement
freaks out long-time Solaris fans, but walk in the "back door" and you
will find MS Windows and Linux. Pretty much everything else is foisted
on the techies by the front office or out-of-touch old fogies. Who wants
to learn a non-standard version of Unix?</p>
<p>( My teenage son would if given the opportunity point out the that I am
one of the old guys, but that is just his opinion ).</p>
<p>The second point is Sun hardware at the desktop - is just not
interesting. Generic x86 and Apple PCs are entirely sufficient, and a
lot less hassle.</p>
<p>What would make Sun cool once again? Well, I would say that the Sun
folks got handed an asteriod-size hint at JavaOne. From all reports
Apple laptops outnumbered pretty much everything else! Apple laptops run
Unix - a BSD Unix descendent oddly enough, and admittedly a
"non-standard" OS to all those folks accustomed to Windows and Linux.
Apple more than made up for the difference by providing a superbe
complete package.</p>
<p>Warning - a herd of scared cows is headed for slaughter in the
following....</p>
<p>For years (decades?) an Apple-Sun alliance has <em>almost</em> seemed to make
sense. Both companies produce really <em>very</em> nice hardware. The bottom of
Sun's range pretty much marked the top of Apple's range. They are even
both located in the same general area. We may have finally reached the
time where the "almost" part goes away.</p>
<p>The general notion is for Sun to lock in a clean upscale path from the
coolest desktop around.</p>
<p>Now this presents some internal stumbling blocks for the Sun folks. The
Sparc CPU will have to fade away. We don't need Sparc on the desktop,
and eventually only legacy customers will be interested in Sparc on the
server. This means that Sun adopts use of IBM's PowerPC CPU, starting
from the desktop and eventually moving up to the server. I know that
just this alone will cause a great deal in internal, er "discussion"
within Sun.</p>
<p>Oooo ... interesting side-thought. Given the current technology
landscape Sun could gracefully bow out of the single-CPU performance
race with Sparc. If you are not (on the server) especially interested in
single CPU performance, that leaves the Sparc folk with just shrinking
the chip (lowering cost and power use) as new fab technologies come
along. Not much need for new architecture. Sun could well support their
legacy Sparc customers with a much smaller R&D outlay.</p>
<p>There is a wildcard in the JDS desktop and Opteron server combo.
Offering a good upscale server path to Linux crowd is a good bet. As to
the Java Desktop - I just don't know. Sun is historically good at coming
up with some really excellent ideas, but somehow when it comes to
desktop software fails to put out really polished implementations. Don't
know why this is - probably something in the company mindset.</p>
<p>As to open-source Solaris - I really want to care about this. Probably
this has something to do with the fact at one point I would have killed
for a Sparcstation 1 (figuratively speaking). I've even downloaded
Solaris x86 ISOs, burned CDs ... but just can't quite see reason to
spend time with Solaris.</p>
Upgraded my wireless network2004-08-06T00:00:00Zhttps://bannister.us/weblog/2004/upgraded-my-wireless-network
<p>Setup a Linksys 802.11b router and notebook and a bit over a year ago (a
bit before 802.11g was quite standard). Worked pretty well - could use
the notebook anywhere in the house, and both in the front and back yard.</p>
<p>Over the last several months the range and reliability of the wireless
network dropped off badly. I suspect both my neighbors bought 802.11g
hubs, as there were two new SSIDs visible when reception was poor. Some
of the online reviews suggest that older 802.11b hardware may not
co-exist well with nearby active 802.11g gear.</p>
<p>Add to this the fact that the Linksys router would die about once a day
(both local and wireless) and would only come back up if power cycled.
More than a little annoying.</p>
<p>Taking this as a hint, ordered a D-Link DI-624 802.11g router (based on
good reviews), and an 802.11a/b/g mini PCI card for the notebook. The
D-Link works well, and has some very useful features not offered by the
old Linksys. The D-Link router came first, and once setup the network
stayed up without incident. So far so good...</p>
<p>The mini PCI network card for the notebook came last. Opened up the
notebook to replace the card, and noticed that one of the two antenna
connections to the card was loose.</p>
<p>Oh.</p>
<p>Seems the limited range on 802.11b might just have been due to the loose
connection. Had not thought to open up the notebook and look for loose
connections.</p>
<p>Oh well. With the new card the range is better, reception is again
reliable, and speed (which really wasn't an issue) is indeed somewhat
better. Plus the notebook will now be usable on any 802.11 a, b or g
network, which might someday be of use.</p>
IBM and Linux2004-08-02T00:00:00Zhttps://bannister.us/weblog/2004/ibm-and-linux
<p>Interesting take on IBM and Linux in <a href="http://blogs.sun.com/roller/page/jonathan/20040801#ibm_is_in_a_pickle">IBM is in a Pickle
(Again)</a>.
Given this is a significant Sun guy talking, this might even be mistaken
as Sun's point of view (don't take that last literally).</p>
<p>I do think Jonathon has a point - but I suspect he is a little off
target.</p>
<p>On a semi-related subject, I have been playing with different Linux
distributions again. Had to - the Redhat 7.3 box died I was using for
the SMB domain controlller (with roaming profiles) and file server.</p>
<ul>
<li>Installed Fedora core 2 (the latest) on the box meant to be the new
shared server. This was a mixed bag - some things went very well,
and some things were extremely frustrating. The Redhat startup
scripts are a continuing royal pain to deal with, as even when I
know exactly what I need to do, puzzling out the tangled mess of
scripts run at startup can take days before I can find where to plug
in my changes. Shell scripts are a useful tool, but the performance
freak in my nature looks at the endless startup scripts written by
Redhat and wants to run away screaming. Running up2date chewed up
pretty much an entire day, as I had to limit the updates to a few
items at a time to prevent up2date from hanging.</li>
<li>Installed Gentoo Linux on the fastest box in the house (I have
delusions of doing my Windows development in a VMware session on a
Linux box). There is something quite satisfying in compiling for my
hardware with exactly the options what I want want. On the other
hand I have not finished - X and Gnome are compiled but not yet
configured. I really like the notion of compiling exactly for my
hardware and configuration - and the "emerge" feature in Gentoo is
quite impressive - though my "free" time is a little too finite.</li>
<li>Installed Xandros Linux on a slower box (a mere 800Mhz CPU) after
reading a recommendation on the web. The install was slick and went
well. There was trouble once the desktop came up as for some reason
the system would go completely non-responsive every few seconds.</li>
<li>Installed Debian in place of Xandros. The Debian "netinst" install
is not as flashy (no GUI) but is running well (nice to have a KVM
switch at times like this :)).</li>
</ul>
<p>How does this relate to IBM, Sun, and Linux? Simple - there are too many
Linux distributions, and it is easy to create a new Linux distribution.
IBM can use the Suse distribution, or they can create their own. IBM
could produce their own distribution, or could adopt a family of
distributions. Do you need a near-stock installation for a small number
of machines? If so IBM could put in and maintain Redhat, Fedora, Suse,
or Debian. Do you want to squeeze every once of performance out of a
large homogeneous collection of servers? If so IBM could use Gentoo to
build a customized distribution exactly for your hardware and needs.</p>
<p>What is the point of all this? Redhat is not Microsoft. Linux cannot be
made into a proprietary product. IBM has choices with Linux that were
not possible with Microsoft. Customers don't generally care which exact
Linux distribution is installed on their machines. They do care about
service. They do care if their applications run and run well. Otherwise
if IBM promises support at a reasonable price, they should be perfectly
happy with whatever IBM chooses to install.</p>
<p>Jonathon has a point - but it may not be the one he intended.</p>
Backyard needs work...2004-08-01T00:00:00Zhttps://bannister.us/weblog/2004/backyard-needs-work
<p>Hired a gardener to cut the grass a bit over a year ago. Have to admit
that since I have not paid a lot of attention to the state of the
backyard. A few weeks ago I noticied the north side of the house was
getting soggy*, and there seemed to be a dry spot yard on the east
side. Not big deal - I thought - the weather has changed and the
sprinklers need adjusting. A couple weeks after changing the watering
times on the sprinklers things were not improved, so I fired up the
sprinklers, walked around, and found problems. Turns out I have at least
two broken sprinkler heads, and at least one tree that needs to be
removed. Oh fun.</p>
<p>A soggy yard means muddy dog footprints in the house, so I cannot ignore
the problem...</p>
<p>This is Southern California. We get a fair amount of humidity from the
ocean, but very little rain. Without that added humidity (and the
imported Colorado river water) this area would be pretty close to hard
desert. Lose the sprinklers and that part of your yard dies.</p>
<p>The house was built a bit over ten years ago and is located up in the
foothills with the development bordered by a wilderness area. To form
the lots they had to do a lot of the usual sculpting with an earthmover.
The end result is that the ground is 1-2 feet of poor soil underlaid by
very hard clay. Water cannot drain through the clay. On the plus side
the entire community is very well drained, and even the heaviest
rainfall disappears without trouble once it hits the street. Draining
your own yard is your responsibility.</p>
<p>If you are putting in drainage into your yard, the usual practice of
putting in visible surface drains makes remarkably little sense. When
you to stop to think a bit you realise that for surface drains to work
all the ground must be saturated up to the level of the drains(!). This
makes no sense unless you are in an area where water soaks easily into
the ground. My last house was like this - when you dug downward you
found deep loose sandy soil. With that sort of soil you could dump
seemingly any amount of water on the yard, and never get standing water
(surface drains where not really needed). With ground like my present
house proper drainage is critical. Surface drains are pretty near
useless.</p>
<p>* The soggy side of the yard is in part due to my respect for the
landscaper's expertise - or as it turns out lack of expertise. I let the
guy talk me out of putting in subsurface drains in the north part of the
yard. That was a big mistake.</p>
<p>In contrast I had earlier put in subsurface drains on the south side of
the house. The south side is slightly downslope, and just with normal
watering the drainage from both my and my neighbor's yard made that area
into smelly muck. Since putting in subsurface drains that part of the
yard is never a problem, and even with the heaviest rain that part of
the yard never has standing water.</p>
<p>The back (east) side of the yard is at the bottom of a slope maintained
by the community. I was concerned that drainage from the slope might be
a problem. When the landscaper was working on the yard, I insisted on
subsurface drains all along that edge of the yard. The drains in
combination with a low wall on the downslope have worked very well. On
the years with the heaviest rain (every few years we get about a month
of relatively heavy rain) when my neighbors had problem with standing
water, I did not.</p>
<p>In truth I was not satisfied with the sprinkler system as put in
landscaper originally. He tried to divide the yard into too few zones,
with the end result that one part of the yard would be near-dead for
lack of water, and a nearby area would be muck.</p>
<p>Looks like I need to find another someone to work on the backyard - at
least to fix the broken sprinklers, remove the offending tree, probably
to put in proper subsurface drains in the north side yard, and possibly
to re-do the entire sprinkler system.</p>
<p>Don't know how to pick someone reasonable to do the work. There are
leaflets dropped at the front door pretty much every week, so I guess
that has to be the starting point.</p>
Mozilla trumps IE - again2004-07-27T00:00:00Zhttps://bannister.us/weblog/2004/mozilla-trumps-ie-again
<p>Got to feel a bit sorry for the <a href="http://blogs.sun.com/roller/page/DaneseCooper/20040723#what_if_mozilla_were_to1">poor guy from the IE
team</a>.
Pretty amusing story...</p>
Display envy2004-07-27T00:00:00Zhttps://bannister.us/weblog/2004/display-envy
<p>A case for display envy... Apple's new flat panel displays (via <a href="http://news.com.com/1607-2_3-5250761-2.asx?PSDir=null&videoName=4n0628applemonitor&NumClips=1">Windows
Media
Player</a>
or
<a href="http://news.com.com/1607-2_3-5250761-4.ram?PSDir=null&videoName=4n0628applemonitor&NumClips=1%20">RealPlayer</a>).</p>
<p>One screen at 4.1 megapixels and 8.2 megapixels with two screens - very
cool. Just hope no one runs a Java app with <a href="http://c2.com/cgi/wiki?DoubleBufferedGraphicsInJava">double-buffered
graphics</a> on such a
display.</p>
Compilers - back to basics2004-07-27T00:00:00Zhttps://bannister.us/weblog/2004/compilers-back-to-basics
<p>C++ is <a href="http://www.research.att.com/~bs/evol-issues.html">growing</a>, and
I am a bit disappointed.</p>
<p>I heard recently that the working group is considering how to add
garbage collection to the C++ standard. This is a bad idea. The C
language was all about writing low-level code, and did this job well.
The C++ language <em>should have been</em> the introduction of some new ideas
into C without changing the nature of the language.</p>
<p>If you ignore the right bits then C++ is exactly a better C. If you need
to write code that allows you exact low-level control and extreme
performance, then C/C++ is a good tool. Not every application needs this
kind control, and so you want to pick a higher-level language in which
to express your solutions.</p>
<p>Garbage collection is a great idea, but does not belong in a language
for writing low-level code. Unfortunately there are bits in C++ that
should not be there, and this looks to be another addition to an already
overstuffed bag.</p>
<p>How to explain this has bothered me. The answer seems to lie at the
intersection of a series of notions.</p>
<ul>
<li>Complex languages have "dusty corners" where behavior differs.</li>
<li>Compilers should translate between machine independent notation to
machine dependent executable code.</li>
<li>First class languages are extensible.</li>
<li>Minimalist design.</li>
</ul>
<p><strong>Dusty corners</strong></p>
<p>Quite a ways back the guy in the next office was part of a group working
on one of the first compilers for Ada. When he ran into problems where
the solution was unclear, he would call me over and we would try to work
out the most reasonable solution. Now recall that at the time Ada was
meant to be a model of the most carefully designed and rigorously
defined programming language. The Ada language was also stuffed full of
all the coolest features of the day. In implementing the Ada compiler we
found the complexity of the language introduced quite a few dusty
corners where more than one behavior could be reasonable, and it was up
to the compiler writer to choose the most reasonable (hopefully after
careful thought).</p>
<p>Clearly there was something not quite right. Differing behaviors in
different implementations is not a good thing.</p>
<p>Today with ready communication via email and Internet we might have
gotten in contact with the language designer, and sought clarification.
The reference manual describing the Ada language was already pretty
thick and hard to digest. Cleaning out all the dusty corners would have
made the manual thicker and even more difficult to read.</p>
<p><strong>The job of a compiler</strong></p>
<p>Recall that the original purpose of a compiler was to translate from a
human readable notion into executable machine code. Writing in machine
code was a drag. Assembly code was better but still a drag, and not at
all portable.</p>
<p>When moving your code from one machine to another you would like the
compiled code to behave the same. The more the implementation <strong>in the
compiler</strong> differs from one machine to another, the greater the chance
that some decision in the compiler code will cause the behavior of the
generated code to differ.</p>
<p><strong>First class languages and shared implementations</strong></p>
<p>The templates in C++ are essentially very fancy macros. Note that the
interpretation of templates into expanded C++ code should be entirely
machine independent, and <em>must</em> be the same across compilers.
Historically we have seen a lot of trouble with C++ template code
behaving differently with different compilers.</p>
<p>Since compilers are all about translating machine independent notation
into machine specific code, why is the code for templates built into the
compiler?</p>
<p>In Lisp there are lots of examples of things like templates in C++. The
key difference is that in Lisp the code for interpreting templates <strong>is
also <em>written</em> in Lisp</strong>. Note that the implementation is not buried in
the compiler. Note that the Lisp code can be moved to another Lisp
system (discounting the effect of dialects) and can be expected to
behave the same everywhere.</p>
<p><strong>Minimalist design</strong></p>
<p>Instead of trying to find more things to add, might it not be better to
look for things to take away? Not many folks remember the Algol-68
experience (it is a bit before my time even). I do like the approach
Wirth took with the Pascal/Modula-2/Oberon family, in looking to build
the <em>least possible</em> into the compiler.</p>
<p>Eh - somehow I doubt this explanation is at all as clear as I would
like...</p>
Books read recently2004-07-14T00:00:00Zhttps://bannister.us/weblog/2004/books-read
<p><a href="http://www.amazon.com/exec/obidos/ASIN/0440500117/prestolbannis?dev-t=D2B1IIRG931JN5%26camp=2025%26link_code=sp1" title="Save Your Knees"><img src="http://images.amazon.com/images/P/0440500117.01.MZZZZZZZ.jpg" alt="Save Your
Knees" /></a><a href="http://www.amazon.com/exec/obidos/ASIN/0380008203/prestolbannis?dev-t=D2B1IIRG931JN5%26camp=2025%26link_code=sp1" title="Between Parent and Teenager"><img src="http://images.amazon.com/images/P/0380008203.01.MZZZZZZZ.jpg" alt="Between
Parent and
Teenager" /></a><a href="http://www.amazon.com/exec/obidos/ASIN/0609809881/prestolbannis?dev-t=D2B1IIRG931JN5%26camp=2025%26link_code=sp1" title="Between Parent and Child : The Bestselling Classic That Revolutionized Parent-Child Communication"><img src="http://images.amazon.com/images/P/0609809881.01.MZZZZZZZ.jpg" alt="Between
Parent and Child : The Bestselling Classic That Revolutionized
Parent-Child
Communication" /></a><a href="http://www.amazon.com/exec/obidos/ASIN/0345405730/prestolbannis?dev-t=D2B1IIRG931JN5%26camp=2025%26link_code=sp1" title="Dreamers, Discoverers and Dynamos : How to Help the Child Who Is Bright, Bored and Having Problems in School"><img src="http://images.amazon.com/images/P/0345405730.01.MZZZZZZZ.jpg" alt="Dreamers,
Discoverers and Dynamos : How to Help the Child Who Is Bright, Bored and
Having Problems in
School" /></a></p>
<p>In May 2003 I took three fast hikes in four days, and could barely walk
the following day. Did something bad to my left knee, and have only been
able to resume hiking (carefully!) in the last few weeks. Only resumed
walking and hiking after reading in this book that (limited) exercise of
an injured knee is encouraged, and in some cases the only treatment.</p>
<p>The author notes that considerable progress was made in the 17 years
between when he began his practice to when the book was written. Since
the book was written about 17 years ago, you might expect an update to
the book is in order.</p>
<p>As you might guess from the remainder ... I have a teenager :).</p>
Klunky user interfaces2004-07-11T00:00:00Zhttps://bannister.us/weblog/2004/klunky-user-interfaces
<p>Several months back I switched to Verizon and bought an Audiovox CDM8900
cellphone with built-in 640x480 camera, and support for
<a href="http://brew.qualcomm.com/brew/en/">BREW</a>. Verizon's service has been
decent - certainly better than Sprint whose coverage became useless both
at home and at the office.</p>
<p>The cellphone camera is ... passable. I did not have very high
expectations of the built-in camera, and got pretty much what I
expected.</p>
<p>But the user interface - holy revenge of the twerps! - is really very
horrible. This is my third and fanciest cellphone, and with each
successive generation the user interface design gets worse. Sure we get
pretty colors, higher resolution screens, and more features - but the
fundamental user interface gets worse every time. We have an pretty
substantial literature on user interface design accumulated over the
past couple decades. Even some really lightweight usability testing
could have easily caught the really bad parts of the design.</p>
<p>The cellphone camera isn't going to get much use, as the user interface
is just too painful to use. (How can they get so many things <em>wrong</em> in
one application!??).</p>
<p>Don't know how to solve this problem.</p>
<p>Maybe we need regular Consumer Reports reviews of cellphones, with a
large weight given to ease-of-use (and assuming they can find someone
with a clue about user interface evaluation).</p>
<p>Maybe we need Apple to design a cellphone. Don't think Apple wants to
get into the business of manufacturing cellphones, but they do have have
a culture that puts out some well designed (and sometimes brilliant)
user interfaces. Perhaps they could license a common software basis for
manufacturers to incorporate in their phones.</p>
<p>Maybe we <strong>don't</strong> want Microsoft doing cellphone software. Reports from
friends and elsewhere describe too much in the way of unreliable
operation. Phones running Microsoft software that crash, have to be
rebooted, and need to have the software re-installed ... at first I
thought was just a bad anti-Microsoft joke. Turns out the trouble is
real. (I really do not understand this, as Microsoft has some really
sharp folks, and almost unlimited resources).</p>
<p>Looked through the downloadable BREW applications (offered by Verizon
under "GetItNow!"). These are mostly a joke - a handful of games to play
on your cellphone (no thanks), and a couple lame applications. Well,
maybe I could hack together something better by way of demonstration ...
nope, Qualcomm wants you to pay fees for everything related to BREW.</p>
<p>I didn't sign up for web access on this phone. With the prior two phones
I found trying to use the web pretty much a waste of time. Painfully
slow response times, and a lack of web applications usable from a cell
phone pretty much killed the idea.</p>
iChat AV2004-07-11T00:00:00Zhttps://bannister.us/weblog/2004/ichat-av
<p>Ever tried to video or voice conversations over the web with a PC? I
have never seen this work well, at least outside commercials.</p>
<p>Hangups include:</p>
<ul>
<li>Standards for video conferencing require a swath of open ports with
direct connections between all machines involved. This is a really
bad idea as all home users should be behind router/firewall box, and
manually configuring ports to specific machines is just too clunky.
Not sure why the standards call for so many open ports - seems that
one or two connections should be sufficient.</li>
<li>Lack of good integration - feedback from microphone to speakers
seems to be a common problem.</li>
<li>Opaque failures - sometimes things don't work, and the failure is
not clearly explained.</li>
</ul>
<p>The features in Apple's <a href="http://www.apple.com/macosx/tiger/ichat.html">Apple iChat
AV</a> make me wish I could
buy a Mac. Don't think there is anything as capable for Windows PCs.</p>
isapi_reward preview2004-07-05T00:00:00Zhttps://bannister.us/weblog/2004/isapi_reward-preview
<p>Something I started working on some time back with the aim of meeting a
particular goal.</p>
<ul>
<li>Allow easy deployment of pure-Java web applications in a Windows
environment.</li>
</ul>
<p>Easy deployment of Java applications means bundling a pure-Java web
server (like Jetty, Tomcat, or Geronimo) so the web application is
immediately able to run, without a existing web server.</p>
<p>Easy deployment also means simple first-class integration with IIS on
Windows. There are a number distinct advantages to routing requests
through IIS if you need Windows authentication, encryption, or
compression - especially given that many organisations have standardized
internally on Windows authentication as is built into IIS. If you are
deploying a web application on a company intranet - and the organization
is almost certainly using primarily Windows desktops - you really want
to use Windows authentication.</p>
<p>With Apache you get pretty much everything you need to rewrite and
forward requests in <strong>mod_rewrite</strong> and stock Apache. With IIS to get
the same function - you need some help. Eventually <strong>isapi_reward</strong> is
meant to meet that need, through a combination and URL rewrite and
transparent request forwarding (<strong>rew</strong>rite and for<strong>ward</strong>).</p>
<p><strong>Fair warning: Request forwarding is not implemented in this version!</strong></p>
<p>Routing all your requests through a single IIS server yields a number of
benefits.</p>
<ul>
<li>Efficient Windows authentication.</li>
<li>Efficient SSL encryption.</li>
<li>Efficient (gzip) compression responses.</li>
<li>Easy scalability through placing web applications on distinct
machines.</li>
<li>Outstanding stability for the main web server when web applications
run on other machines.</li>
</ul>
<p>(None of which applies at present).</p>
<p>Less running on the IIS box means more requests can be handled by IIS.
Microsoft has worked very hard to optimize IIS. It is not much of a
stretch to expect a box running <strong>only</strong> IIS to be capable of handling
requests from your <strong>entire</strong> organization. What is more, the
configuration of the IIS-only box need change very little as new web
applications are deployed - which translates into fewer compatibility
problems and greater stability.</p>
<p>Imagine what it would be like if all your organizations web applications
were available through a single (IIS) web server, and that web server
<strong>never</strong> went down! By placing web applications on separate servers,
you can upgrade individual applications without in any way disturbing
other applications or the main IIS server.</p>
<p>There is some danger of improving the Netcraft scores for IIS :).</p>
<p><strong>Again - request forwarding is not - YET - in this version of the
code!</strong></p>
<p>So why am I posting this when the original goal is as-yet unreached?</p>
<p>The reason for posting at this early stage because of a not quite
expected side effect. I find that installing <strong>isapi_reward</strong> makes it
easier to keep IIS tightly secured.</p>
<p>Turns out even with the just the basic URL-rewrite code working this is
pretty useful. As a developer I would <em>like</em> to leave in place the
default IIS installation with all the examples. At the same time I know
that some of those examples - if left active - may be terribly insecure.
By simply defining a request-routing map that blocks <em>everything</em> and
allows only explicitly permitted URLs, I can easily block access to
everything but the specific installed application I want to test. A
simple edit to <strong>isapi_reward.ini</strong> absolutely controls which web
applications are exposed, while leaving the IIS configuration completely
intact! This is much easier and less error-prone that mucking around in
the IIS configuration.</p>
<p>The <a href="http://bannister.us/preston.bannister/binaries/isapi-reward-0.8.0-build-54.exe">installation program for
isapi_reward</a>
sets up <strong>isapi_reward</strong> as both an ISAPI filter and extension, and
will stop/start IIS as needed. There is some basic documentation in the
install. This should be entirely safe to try, and should uninstall
cleanly.</p>
<p>Note this <em>is</em> early code. On the other hand with 25-odd years of
experience in software - much of the work focused on performance and
security - there is a better than average chance I got things right.</p>
User Registration Required2004-07-03T00:00:00Zhttps://bannister.us/weblog/2004/user-registration-required
<p>Had wondered about the effect on sites that require user registration to
view articles.</p>
<p>I probably <em>have</em> registered at most of the main sites that want
registration, but often forget the usename or password under which I had
registered. Add to this fact most sites seem to "forget" who I am, and
want me to login or register(!) again. Long ago I gave up - if a
registration page comes up at a news site, I just go and read elsewhere.</p>
<p><a href="http://www.acemakr.com/online/2004/06/user_registrati.html">Gary and the referenced
pages</a> have
this exactly right. Have to give him credit for taking a run at
enlightening the news folks. Oh well - their loss not mine, as there are
plenty of other sources for news.</p>
The Wretch, Pat Benatar, Iron & Wine2004-07-03T00:00:00Zhttps://bannister.us/weblog/2004/the-wretch-pat-benatar-iron-wine
<p>More new music off Magnatune. Cannot explain why I like this, but I
do...</p>
<p><a href="http://magnatune.com/artists/wretch">The Wretch: painful ambient industrial
noise.</a></p>
<p>Used the <a href="http://www.magnetbox.com/riaa/">RIAA Radar</a> site to find a new
<a href="http://www.amazon.com/exec/obidos/ASIN/B0000ALFZR/magnetbox/ref%3Dnosim/002-7011868-2960014">Pat Benatar
album</a>
from a non-RIAA member (I hope). Bought the <a href="http://www.amazon.com/exec/obidos/tg/detail/-/B0001ENX54/ref=m_art_li_1/002-7011868-2960014?v=glance&s=music">Iron &
Wine</a>
album after seeing the <a href="http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewAlbum?playlistId=5644896&selectedItemId=5644874">video on
iTunes</a>
and checking out the label.</p>
<p>Try and find a common thread through the above choices :).</p>
A Voltaire(ish) quote2004-07-03T00:00:00Zhttps://bannister.us/weblog/2004/sbf-glossary-vj-to-vqt
<blockquote>
<p>I disapprove of what you say, but I will defend to the death your
right to say it.</p>
</blockquote>
<p>The story behind a phrase oft-assigned to Voltaire (and one of my
favorite memes). From <a href="http://www.plexoft.com/SBF/V02.html">SBF Glossary: VJ to
VQT</a>:</p>
<p>The phrase is widely attributed to Voltaire, but cannot be found in his
writings. With good reason. The phrase was invented by a later author as
an epitome of his attitude.</p>
<p>It appeared in <em>The Friends of Voltaire</em> (1906), written by Evelyn
Beatrice Hall under the pseudonym S[tephen] G. Tallentyre. Chapter VII
is devoted to Helvétius (1715-1771), whom she depicts as a kindly,
generous person, with a hint of more talent to raise him above
mediocrity. He married and settled in the sticks, with a new wife who
was unfashionably old (32), and they were happy. This was ended by his
tragic aspiration, to earn some small glory for himself as a
philosopher.</p>
<p>In 1758, he published ``De l'Esprit,'' which Hall renders "On the
Mind.'' From the little Hall says of it directly, I take it that this
was a moral-relativist tract, adducing bad social conditions as the
cause of immoral behavior, regarding humans essentially as animals, and
skeptical of the validity of moral claims generally.</p>
<p>This was unpopular with everyone - secular philosophers, all of the
church, the government. It certainly got him noticed, but not by all at
once. Voltaire immediately regarded the work as a serious disappointment
from one who had been a somewhat promising protege. He was most insulted
to have been compared in it with lesser intellectual lights (Crébillon
and Fontenelle). It was widely criticized by other wits of their
enlightened social circle. For a few months, however, it escaped the
notice of the government.</p>
<p>Then the Dauphin read it.</p>
<p>The privilege to publish was revoked; the censor who approved its
publication was sacked. A rolling wave of official condemnation began,
culminating with the Pope (Jan. 31, 1759) and the Parliament of Paris
(Feb. 6) and public book-burning by the hangman (Feb. 10), an honor
shared with Voltaire's ``Natural Law.''</p>
<p>On the principle that anything so unpopular with the government must
<em>ipso facto</em> be pretty good, the official condemnation permanently
established Helvétius's philosophical repute among the fashionable salon
crowd, and rehabilitated him among the intellectual elite as well, to a
great extent. He became popular in Protestant Germany and England.</p>
<p>Hall wrote:</p>
<blockquote>
<p>...The men who had hated [the book], and had not particularly loved
Helvétius, flocked round him now. Voltaire forgave him all injuries,
intentional or unintentional. `What a fuss about an omelette!' he had
exclaimed when he heard of the burning. How abominably unjust to
persecute a man for such an airy trifle as that! `I disapprove of
what you say, but I will defend to the death your right to say it,'
<strong>was his attitude now</strong>. But he soon came, as a Voltaire would come,
to swearing that there was no more materialism in `On the Mind' than
in Locke, and a thousand more daring things in `The Spirit of Laws.'</p>
</blockquote>
<p>(Boldface added here for emphasis.) <em>Friends</em> is not a scholarly work,
but Hall is fairly scrupulous throughout the book to state within the
text whether she is quoting speech or text, and whether various reports
are first-person or likely hearsay. I believe it was reasonable of her
to expect that `I disapprove ... say it' would be recognized as her own
characterization of Voltaire's attitude. I think some readers were
confused because of the way she follows
this with paraphrases of his spoken criticisms.</p>
<p>In any case, the phrase was too eloquent, so it became quoted, and
famous names attach themselves to quotes, to the detriment of the less
well-known originators.</p>
<p>Hall herself claimed later that she had been paraphrasing Voltaire's
words in his <em>Essay on Tolerance</em>:</p>
<blockquote>
<p>Think for yourselves and let others enjoy the privilege to do so too.</p>
</blockquote>
<p>Hall died in 1919. In his <em>A Book of French Quotations</em> (1963), Norbert
Guterman suggested that the probable source for the quotation was a line
in a 6 February 1770 letter to M. le Riche:</p>
<blockquote>
<p>Monsieur l'abbé, I detest what you write, but I would give my life to
make it possible for you to continue to write.''</p>
</blockquote>
Sam Ruby - Knot Theory2004-07-03T00:00:00Zhttps://bannister.us/weblog/2004/sam-ruby-knot-theory
<p>OK - I have to ask, how does <a href="http://www.intertwingly.net/blog/2004/06/29/Knot-Theory">this
guy</a> get time
to work on so many interesting problems??</p>
Picture off a cellphone camera2004-07-03T00:00:00Zhttps://bannister.us/weblog/2004/picture-off-a-cellphone-camera
<p>Picture taken at sunset, on the east side of a hill, with a cell phone
camera. Not too bad considering.</p>
<p><img src="https://bannister.us/weblog/images/thistles.jpg" alt="Thistles" /></p>
<p>The picture is about two weeks old (the Verizon message is dated Jun 18,
2004 10:34:00 PM).
Should I admit this is the first picture I have successfully gotten off
the Verizon phone I bought at the beginning of the year?</p>
Really Sexy Sindication2004-07-03T00:00:00Zhttps://bannister.us/weblog/2004/alex-halavais-really-sexy-sindication
<p>Kind'a hope <a href="http://alex.halavais.net/news/index.php?p=743">this guy</a> is
wrong...</p>
Social engineering2004-06-27T00:00:00Zhttps://bannister.us/weblog/2004/social-engineering
<p>Slightly amusing.</p>
<p>An example of a "social engineering" attack. I received the following
with decoration from MailScanner that (naturally) tagged the message as
containing a virus. Note that "The Bannister.us team" would be me :).</p>
<blockquote>
<p><code>Dear user, the management of Bannister.us mailing system wants to let you know that,</code></p>
<p>Some of our clients complained about the spam (negative e-mail
content)
outgoing from your e-mail account. Probably, you have been infected
by
a proxy-relay trojan server. In order to keep your computer safe,
follow the instructions.</p>
<p>Pay attention on attached file.</p>
<p>In order to read the attach you have to use the following password:
62715.</p>
<p>Have a good day,
The Bannister.us team http://www.bannister.us</p>
<hr />
<h2>This is a message from the MailScanner E-Mail Virus Protection
Service</h2>
<p>The original e-mail attachment "Message.zip"
was believed to be infected by a virus and has been replaced by this
warning
message.</p>
<p></p>
If you wish to receive a copy of the \*infected\* attachment, please
e-mail helpdesk and include the whole of this message
in your request. Alternatively, you can call them, with
the contents of this message to hand when you call.
<p>At Sun Jun 27 09:57:13 2004 the virus scanner said:
Message.zip contains Worm.Bagle.Gen-zippwd
</p>
</blockquote>
Safer with Mozilla2004-06-27T00:00:00Zhttps://bannister.us/weblog/2004/safer-with-mozilla
<p>Ken Dunham, director of malicious code at <a href="http://www.idefense.com/">iDefense
Inc.(?)</a> cannot have made Microsoft happy.
Check the last paragraph in <a href="http://www.infoworld.com/article/04/06/25/HNmspushesxpbeta_1.html?source=rss&url=http://www.infoworld.com/article/04/06/25/HNmspushesxpbeta_1.html">MS issues warning on Web attacks, pushes XP
SP2
beta</a>.</p>
<p>I heartily agree, though mostly just because Mozilla is in fact a
<strong>better</strong> web browser.</p>
NPR - National Jewish Public Radio?2004-06-27T00:00:00Zhttps://bannister.us/weblog/2004/npr-national-jewish-public-radio
<p>First, let me be very clear that <a href="http://www.npr.org/">NPR</a> has since the
1980's been and remains one of my favorite sources of news (at least
when driving). One of the first things I do after buying a new car is
preset the radio for <a href="http://www.kcrw.org/">KCRW</a> (the local radio
station that carries NPR). At the same time I have no illusions - NPR is
bound to have a bias of one sort or another, just like every other form
of mass media.</p>
<p>Guess I'm a little slow, as only after years of listening did I notice
the coverage of the Middle East was <em>way</em> out of proportion.</p>
<p>In listening to NPR I have become <strong>very</strong> tired of hearing about
Israel. Based on their coverage you might think that somehow Israel was
the most important place on the planet. For example: <a href="http://www.npr.org/search.php?text=israel&sort=DREDATE%3Anumberdecreasing&aggId=0&prgId=0&topicId=0&how_long_ago=0">search NPR for
mention of
Israel</a>.</p>
<p>The results show an item almost every single day! Folks, there is just
not that much of significance happening there - it is pretty much the
same old tired dance for the last twenty years (or more). Once a week
coverage would be <em>more</em> than adequate.</p>
<p>Far too often they have coverage of nothing of importance. I heard a
classic example a few months back. They had a report where two voices
speculated about what <em>might</em> happen at a meeting that was going to
occur the next day between to minor figures - where <strong>nothing of
importance was expected to happen</strong>.</p>
<p>Um - <em>hello</em> - so just why did this merit national attention in the
United States?!?</p>
<p>Perhaps out of sheer listener fatigue, I have a hard time caring above
the future of Israel...</p>
<p>Searching on <a href="http://www.google.com/search?hl=en&lr=&ie=UTF-8&q=NPR+jewish+bias&btnG=Search">NPR jewish
bias</a>
turns up quite a sideshow.</p>
ACDK2004-06-26T00:00:00Zhttps://bannister.us/weblog/2004/acdk
<p><a href="http://acdk.sourceforge.net/">ACDK</a> is an interesting bit of work that
does not seem to have attracted a lot of notice.</p>
<p>Since I do a fair amount of cross-language coding, am looking to build
in support for scripting (for a Windows-based product), and am aiming to
migrate the product from Windows-only to something more portable - for
this entire collection of reasons ACDK is an interesting bit of work.</p>
Why open-source Java?2004-06-24T00:00:00Zhttps://bannister.us/weblog/2004/why-open-source-java
<p>A good argument for open-sourcing Java at: <a href="http://www.peakpeak.com/~tromey/blog/2004/05/04/#javalobby">The Cliffs of
Inanity</a>.</p>
<p>There are other arguments.</p>
Tax and spend ... er, Republicans?2004-06-24T00:00:00Zhttps://bannister.us/weblog/2004/tax-and-spend-er-republicans
<p>When I first started paying attention to politics the Democrats had
control of Congress, and had the Presidency at least half the time. I
heard Republicans blame the rising deficit and rising taxes on those
nasty "tax and spend" Democrats. Now I somehow doubted that Republicans
were entirely blameless, but given that control rested largely with the
Democrats the notion seemed to fit. I was looking forward to the day
when Republicans had greater control.</p>
<p>During the Reagan years we had a very strong Republican President
dealing with a weaker Democratic Congress. The huge deficits were rather
disturbing (still the Democrats??). Every time a tax cut was announced
it seemed like my taxes went up. Ok - so my tax situation was not the
same every year, but - did they have to go up <strong>every</strong> time?</p>
<p>Bush follows Reagan with ... more deficits and more taxes. Someone in
the Bush campaign chants "Four More Years!" and helps me decide to vote
for Clinton. I wasn't especially fond of Clinton, but I <em>knew</em> I did not
want "four more years" of Bush.</p>
<p>Clinton proves not nearly as bad as I feared - possibly moderated by a
Republican Congress. Aided by a healthy economy and (wishful thinking?)
a Republican Congress living up to it's promise, the deficit starts
shrinking. Watching an assortment of cheap and rather rabid attacks on
Clinton from some over-the-top Republicans is dismaying. Reagan and Bush
had some rather dubious episodes of far more serious character.</p>
<p>Dole comes up to compete against Clinton, starts to sound interesting,
then promises a big tax cut. Since Congress just went through a series
of huge battles trying to get closer to a balanced budget, this seems
unrealistic. In fact it sounds like pushing the deficit off on my
children. Voted for Clinton again - count this wanting Dole less rather
than fondness for Clinton.</p>
<p>Want to piss me off as a father and a voter? Spend money <strong>now</strong> that
children will have to pay off <strong>later</strong>.</p>
<p>I am not fond of taxes, but I would rather see the national debt paid
off <strong>first</strong>, and taxes reduced later. I just do not buy the dubious
economic theories that suggest small taxes and big spending is a good
combination. Staying out of debt and investing in the future - seems
this should be a good idea both for individuals and for the country.</p>
<p>Bush #2 comes along and to get elected raises a record amount of money
in a record short time. Somehow I doubt the big money is coming from
folks with interests similar to mine. The combination of Bush and a
Republican Congress in action lives up to my worst expectations. Now
this item comes along:</p>
<p><a href="http://www.capitolhillblue.com/artman/publish/article_4737.shtml">Capitol Hill Blue: Debt? What Debt? Oh, THAT
Debt...</a></p>
<p>Somehow I was still clinging to the belief that this sort of nonsense is
something to be expected of "tax and spend" Democrats ... not
Republicans! Outside the mass media and party mainline, the moderate
Republican voices are closest to my own point of view. I would like to
believe in the party, but damn - would you please stop spending my kids
money!!</p>
Mis-labeled by the RIAA?2004-06-24T00:00:00Zhttps://bannister.us/weblog/2004/mis-labeled-by-the-riaa
<p>Heard a <a href="http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewAlbum?playlistId=5644896&selectedItemId=5644874">bit of music on
iTunes</a>
that I would to buy - but wanted to check that I would not be buying
from an <a href="https://bannister.us/weblog/2004/mis-labeled-by-the-riaa">RIAA member</a>. Turns out the <a href="http://www.npr.org/rundowns/segment.php?wfId=1522790">not all the labels listed on the
RIAA site are
members</a>, so how
do I know who to avoid??</p>
<p>BTW - the video on iTunes associated with the above music is very, very
good. If a music video can be "Art" then this one qualifies. (Got the
link off another weblog - lost track of which).</p>
<p>Turns out there is a <a href="http://www.magnetbox.com/riaa/search.asp">search site for identifying RIAA tainted
music</a>, and in at least <a href="http://www.magnetbox.com/riaa/search.asp?searchtype=ArtistSearch&keyword=The+Crystal+Method">one
case</a>
I am a bit bummed, but can we trust the results not to give
false-positives?</p>
<p>At least <a href="http://www.magnetbox.com/riaa/search.asp?searchtype=ArtistSearch&keyword=Iron+%26+Wine">Iron &
Wine</a>
(the source of the music above) is apparently clean.</p>
Lisp and blurring the line between code and data.2004-06-24T00:00:00Zhttps://bannister.us/weblog/2004/lisp-and-blurring-the-line-between-code-and-data
<p>Seems
<a href="http://kbm.blogspot.com/2004/06/more-finding-lisp-i-find-myself.html">Keith</a>
found my prior reference too obscure. I was assuming that a someone
fluent would Lisp could draw the analogy without help, and folks
unfamiliar with Lisp probably could not follow the analogy without <em>way</em>
more writing than I have time to do.</p>
<p>On reflection, that left out the folks not yet fluent with Lisp, so
Keith's puzzlement is justified.</p>
<p>The Ada project at UCI took a brilliantly simple approach. A recursive
descent parser translated the Ada source text into a parse tree. The
parse tree was (naturally) a Lisp s-expression, and could be saved and
loaded using the usual Lisp save/load functions. The interpreter,
pretty-printer, and compiler methods were attached to the Ada parse tree
node identifiers as properties. This made for very small code fragments
that were very quick to write.</p>
<p>For example the calling the Ada interpreter was simply:
<code> (ada-interpreter parse-tree)</code>
and the code executed was like:</p>
<p><code> (ada-eval (getprop 'ada-interpreter (car parse-tree)) (cdr parse-tree))</code>
The code fragment to interpret an <strong>IF</strong> statement might look like:</p>
<p><code> (cond ((ada-eval (car statement)) (ada-eval (cadr statement))) (T (ada-eval (caddr statement))) )</code>
(I threw out my UCI Lisp manual years ago, so the above is only vaguely
correct).</p>
<p>The pretty-printer and compiler were similarly simple. The full-screen
Ada editor (hot stuff at the time) ran the Ada pretty-printer to format
the parse tree as the text to be edited, and on save ran the Ada parser
to generate a parse tree from the text (and parse errors put you back in
the editor).</p>
<p>The fact that the interpreter/editor/debugger were all components in the
Lisp environment and readily extensible was a <strong>huge</strong> advantage.</p>
<p>In the Java world we get many of the same advantages. The Java compiler
is simply Java code, and can be called by Java programs (though the
overhead is higher). If you are using any of the Java IDEs with
well-documented interfaces, it is possible to extend your programming
environment.</p>
<p>In the XML world you get arbitrary self-describing data structures - a
lot like data stored as Lisp s-expressions, only needing a bit more
storage for the same data. XML is cool in almost exactly the same way
that storing data is Lisp s-expressions was extremely useful. Walk an
XML tree with a hash table on the side, and you get the same result as
Lisp s-expressions with properties attached to identifiers in each node.</p>
<p>In a sense the Java + XML world is re-discovering some of the useful
notions readily available to Lisp programmers twenty-odd years ago.</p>
A crossroads in software development.2004-06-24T00:00:00Zhttps://bannister.us/weblog/2004/a-crossroads-in-software-development
<p>The article <a href="http://www.oreillynet.com/pub/wlg/5091">What The Perl Community Needs Is a Good
Enema</a> gives me hope things
might break loose in a useful way.</p>
<p>I really like Perl for some sorts of problems, and the CPAN library is
wonderful. I really like Java for other sorts of problems, and the
amount of available stuff in the Java world is amazing. Too bad these
two worlds are so isolated, as it would be even more effective if you
could call Perl directly from Java (and the reverse).</p>
<p>In fact with enough contortions it <strong>is</strong> possible to call between Perl
and Java - but I'd not use "easy", "graceful", or "elegant" to describe
the result.</p>
<p>The Microsoft folks really do have the right notion with the "Common
Language Runtime" (CLR).</p>
<p>The Perl folks are off inventing their own virtual machine ("Parrot").
Why invent another virtual machine? Isn't this just hubris? Why not use
a JVM? At least the notion of calling between Perl and Java should end
up easier.</p>
<p>OK, I know that Perl is open source and Java is not. Hopefully Sun will
get around this hangup someday.</p>
<p>I know that Java bytecodes might not be ideal for Perl, though better
JIT in JVM's from Sun and IBM may negate much of that theoretic
difference.</p>
<p>Virtual machines (today) and microcoded machines (in the past mainly)
have a great advantage in that you can tweak or add instructions to suit
your workload. At the time I was at Burroughs they realized that while
the Large Systems microcode was ideal for ALGOL, must of their customers
were running mainly COBOL code. After some benchmarks they had enough
information to go into and slightly re-work the microcode to greatly
enhance COBOL performance.</p>
<p>If both parties can get past the ego issues and work together, I believe
we could see slightly enhanced JVMs that do a good job with Perl code.</p>
Databases, object "prevalence", and OODBMS flavors2004-06-23T00:00:00Zhttps://bannister.us/weblog/2004/databases-object-prevalence-and-oodbms-flavors
<p>I am currently faced with a set of tasks that calls for the batch
manipulation of potentially tens of millions of records (more in future)
over a total pool of data that could approach or even exceed the total
addressable memory on a 32-bit machine. Clearly I want to do whatever I
can to provide good performance.</p>
<p>This is not a one-shot deal - the software will eventually end up at
hundreds or thousands of sites. I cannot call for significant hardware
upgrades just for this one task.</p>
<p>I have to assume that the total size of the problem may well be a few to
several times the available physical memory. This rules out solutions
that call for all of the data to reside in memory at one time. For
anything other than straight sequential processing, this calls for a
database of one form or another.</p>
<p>On the other hand only one program (written in Java) will need access to
the data. There are no cross-language conversion issues. There are
limited concurrency issues. There is limited need for transactions. This
means a lot of the overhead in a big-name database (Oracle, MS SQL), or
even a lightweight database (<a href="http://hsqldb.sourceforge.net/">HSQL</a>) is
not really needed.</p>
<p>Seems like I am caught in a middle ground.</p>
<p>Tools like <a href="http://www.prevayler.org/wiki.jsp?topic=Welcome">Prevayler</a>
offer one sort of approach to building an application database. This is
a terrific approach to solving <em>some</em> sorts of problems. Aside from the
need for memory, this would be a great solution to my current problem -
but data bigger than memory does pretty much completely rule out
Prevayler as an approach.</p>
<p>What is really disturbing is reading the discussion about Prevayler.
There are folks that somehow think the whole idea is evil. There are the
folks responsible for the code that seem unable to understand or
articulate the tradeoffs involved. The last is especially disturbing as
you have to wonder about this lack getting expressed in the
implementation.</p>
<p>Looked at <a href="http://www.ozone-db.org/">ozone</a>, which looks like a nice
piece of work, but seems to add more overhead than I need (especially in
comparison to Prevayler).</p>
<p>Guess I am also not convinced that Java serialization is a good idea in
the face of a need for upwards/downwards compatibility. Sometimes you
need to read data created by either an older <em>or newer</em> version than the
current software. Seems I could override the default implementation of
readObject() ... or it might be better to avoid the default
serialization framework altogether.</p>
<p>I am leaning towards a solution specific to this particular
application - a Prevayler-like solution for everything but one large
array (table), with the large array stored on disk and cached on
reference. This has me re-inventing yet another limited database
implementation (about which I am not enthused). Might yet punt, go with
a lightweight SQL database (like HSQL), and pay the price in
performance.</p>
Homosexual "marriage"2004-06-20T00:00:00Zhttps://bannister.us/weblog/2004/civilization-watch-february-15-2004-homosexual
<p>A rather long essay from Orson Scott Card on <a href="http://www.ornery.org/essays/warwatch/2004-02-15-1.html">Homosexual "Marriage" and
Civilization</a>
with which I largely - and on some points very strongly - agree.</p>
<p>Simply put I do not see homosexuality as an "alternate lifestyle" or
somehow an equivalent choice, rather I see homosexuality as a
malfunction. Now there are lots of folks with malfunctions of various
sorts that get along just fine in society. I am profoundly disinterested
in what people do in private, as long as they function reasonably well
in public. But homosexuality is still a malfunction.</p>
<p>I do strongly believe that otherwise civilized folks should not be
harrassed because they choose homosexuality in private. At the same time
I find the idea of homosexual "marriage" as costing more than it is
worth. We are human and as a part of being human, marriage is about
trying to raise children in the best possible manner. Labelling a
homosexual relationship as "marriage" dilutes the meaning of the word in
ways that are not in any way helpful.</p>
<p>We need to be clear on the meaning of marriage, and place certain value
on raising our children with care.</p>
<p>To some extent I am on dangerous ground here, as a father of three
children and divorced. I was married for 16 years and very much believed
in the "marriage is forever" meme and was very concerned that divorce
would harm my children. Out of concern for my children the marriage
endured several years longer - in retrospect - than it should.</p>
<p>In the end I came to understand the my marriage could not - and probably
should not - be saved. I am in fact content for Orson and other married
folk not to truly understand this notion, as some understanding comes at
too high a price.</p>
<p>Since the divorce I find that my children are doing well and almost
certainly better than before. The fact that I am very close to and spend
equal time with my children helps. The fact I have been able to work
from home the past several years helps. The fact I have kept (with some
difficulty) a home in the same community - so they could stay in the
same school and keep the same friends - this also helps.</p>
<p>The essay also touches on preserving and strengthening civilization. One
notion - or moral - that I have tried to teach my children is that
civilization does not exist as a "thing" separate from each of us.
Civilization is not a body of laws to which we grudgingly comply. Rather
civilization is in our minds, and in how one human being treats another.
To some small degree civilization is strengthened or weakened by our
individual actions. Civilization is found in how we choose to behave
when not otherwise compelled. To the greatest degree possible (the word
"ruthless" comes near to mind) I will teach my children to be
civilized - not out of habit, compulsion or convention, but rather out
of thought and understanding.</p>
<p>The fact that Orson is Mormon brings to mind an example. One day my son
came home and recounted a story about how the neighbor's son had to be
excluded from some activity because his family was Mormon. The group of
kids had mocked the boy for this, and he was visibly upset by this
treatment. In some sense this behavior by the group of young children
was innocent and simply human. In another sense this represents the
dividing line between civilized and uncivilized behavior. I explained
very carefully to my son that mocking good folk because of their beliefs
is thoughtless and harmful. I didn't berate him for making an innocent
mistake, but I did make it very clear that he should behave differently
in future, and should try to help his peers to behave better.</p>
<p>On a lighter note - it is one thing to talk about principles, but I do
not expect my children to absorb and internalize somewhat abstract
notions all at once. When they act in a civilized manner I am at once a
bit surprised and very proud (hey, they <em>are</em> my children :) ).</p>
(sub)Urban planning2004-06-19T00:00:00Zhttps://bannister.us/weblog/2004/suburban-planning
<p>From Philip Greenspun's weblog a bit about <a href="http://blogs.law.harvard.edu/philg/2004/06/19#a5169">Urban planning lessons from
southern Maine</a>.</p>
<p>The first example along a similar line that got my attention was the
social "liveliness" in college dorms. For some reason there were dorms
that were very "social" - where everyone in the dorm seemed to how
pretty much everyone else. Other dorms (including the one I was in the
first year) were relatively "dead". Now considering that the assignment
of incoming college students to dorms was essentially random, why the
difference?</p>
<p>Eventually I realised the difference between the "live" dorms and the
"dead" dorms was the layout of the building. The dorms generally had one
of two different layouts. In the "live" dorms there was one entry/exit
point that was the easiest to use, and the entrance opened on a public
room. In the "dead" dorms there were <em>seven</em> exits that were all equally
practical, and the main public room was isolated.</p>
<p>A simple difference in physical layout made the "community" a much
friendlier and nicer place to live.</p>
<p>At present I live in a newer more-or-less typical suburban community for
southern California. The entire
<a href="http://members.cox.net/foothillranch/foothill_ranch.html">community</a>
was built in tracts over a span of several years. The published <a href="http://www.livingchoices.com/community/communitymoredetails.aspx?refer=lycos%E2%88%A3=N122&print=Y&zip=92610&close=Y&dtype=tci">crime
rate</a>
is very low (this <a href="http://www.city-data.com/city/Foothill-Ranch-California.html">particular
area</a> is
just a bit out of the way). The public schools here are
<a href="http://api.cde.ca.gov/api2003/API/2003Base_sch.asp?SchCode=6112577">excellent</a>,
outranking even the nearby <em>private</em> schools (another topic). The people
that live here are largely <a href="http://www.metroestates.com/OrangeCounty/foothillranchmain.htm">upper-middle
class</a>
<a href="http://www.livingchoices.com/community/communitydetails.aspx?refer=lycos%E2%88%A3=N122&zip=92610">familes</a>
with kids in school. Folks are generally pleasant, but outside of our
kids, there is almost no interaction between neighbors.</p>
<p>Walking down the block and around the area you will see the pattern.
From the street what you mostly see is garage doors. The "living"areas
are at the back of the house and completely isolated from the street.
From the front you can see upper-floor bedroom windows (generally closed
and shuttered). A carefully landscaped walkway reaches to the front
door, usually with some small nearby window (also shuttered). Often the
front door is slightly offset or obscured by plants/landscaping so as to
be nearly invisible from the street.</p>
<p>Not exactly a formula for incidental social interaction.</p>
<p>Oddly enough this area is a bit better than some of the nearby
alternatives. Walking around the community is relatively nice, and you
occasionally (not often) run into people when out walking. There is a
trailhead into a local "wilderness area" within walking distance. Some
of the other areas on the market when I was looking were positively
unpleasant for walking. The notion of <em>driving</em> somewhere else to take a
walk did not hold any appeal.</p>
<p>To a small extent the same "single exit" effect applies. There is a
single intersection through which most of the traffic passes into the
community. There is a single supermarket off that intersection that is
simply the easiest to use. There is a <a href="http://www.foothillelementary.com/">single local elementary
school</a> which essentially all the
kids in the community
<a href="http://www.schools-data.com/schools/Foothill-Ranch-ES-Mission-Viejo.html">attend</a>.</p>
<p>A great place for kids to grow up, but not an especially interesting
community for a single adult.</p>
School of Management2004-06-19T00:00:00Zhttps://bannister.us/weblog/2004/school-of-management
<p>If your manager got involved in design, would you expect the result to
look like
<a href="http://weatherhead.case.edu/wsom/virtualtour/firstFloor.htm">this</a>?</p>
Massively scalable wikis2004-06-19T00:00:00Zhttps://bannister.us/weblog/2004/massively-scalable-wikis
<p>While out hiking yesterday had another inspiration as to how to make a
Wiki site extremely efficient.</p>
<p>The basic idea boils down to the web server returning three files for a
wiki page:</p>
<p>site.css
links.css
page.html</p>
<p>The first file and the rationale behind it is pretty standard. The
<strong>site.css</strong> is a static file containing all the common style elements
used by all wiki pages. With the usual browser-side caching this static
file will be fetched once for the first page viewed on the site, and
will not be fetched for subsequent pages. The usual argument for using a
seperate CSS file applies - by moving presentation information into the
CSS, the HTML files become smaller.</p>
<p>The second file was yesterday's inspiration. The <strong>links.css</strong> file
<em>just</em> contains CSS to style the wiki links, is usually the smallest of
the three files, and is the file most likely to change from request to
request. The usual convention in wikis is to vary the formatting of a
link based on whether the linked-to wiki page exists. The essential bit
here is that each unique wiki link gets a unique named CSS rule. So
while the contents of the wiki page only changes when the page is
edited, the link-formatting changes more often - when any of the
referenced pages are updated. Updating a very small CSS file will use
much less server-side CPU than updating an entire wiki page.</p>
<p>The third file represents another notion to dramatically improve
performance. The <strong>page.html</strong> is either a static file, or a static HTML
fragment pasted into a template with only very simple processing. The
basic idea here is to store wiki pages as HTML fragments. The usual
approach I have seen in wiki implementations is to store the exact text
typed in by the user into an edit box. When a request came in to display
the wiki page, the original text would be run through (very CPU
expensive) code to render the text to HTML. Typically a page is edited
once and viewed many times. A more efficient solution would be to render
the page once when the edited page was saved, and then do only very
simple processing when the page was viewed.</p>
<p>The notion of storing wiki pages as partially rendered HTML came to me a
couple years back, but I got hung up on how to efficiently the update
the links when other pages were edited. Seems to me that this last bit
of inspiration pretty much nails the problem.</p>
<p>There are of course other details related to making updates to the
<strong>links.css</strong> optimal, but there is nothing especially unusual about
cached database queries or in-memory inverse hash structures.</p>
<p>(sigh) Another interesting problem I don't have time to work on....</p>
Hide that Elephant2004-06-18T00:00:00Zhttps://bannister.us/weblog/2004/hide-that-elephant
<p>From a pretty much run of the mill <a href="http://www.pbs.org/cringely/pulpit/pulpit20040617.html">missive about Microsoft's
behaviour</a>, with
a second-hand story at the end.</p>
<blockquote>
<p>That we can all get things so wrong was brought to mind for me
recently when a friend sent me story about his experience in the
original energy crisis of the 1970s. Read it and think how easy it can
be, sometimes, to hide that elephant in a room.</p>
<p>"During the summer of 1973 I worked on a tow boat on the Mississippi
River. Every 10 to 14 days, we'd load our barges on the Gulf Coast and
deliver petroleum products to some place in the Midwest. That was the
summer of the big gasoline shortages. As we would travel up and down
the Mississippi, we'd pass an Exxon tow. It would have eight barges (a
double unit) fully loaded, or about 10 million gallons of gasoline.
The tow wouldn't be moving, it would be tied up in a quiet spot on the
river. Each trip we find more tows tied up. Shell, Texaco, Exxon,
Amoco were all doing it. One day they announced in the news how much
gasoline would be used in the USA in a single day. I made some quick
calculations and realized we had passed a month's supply on our last
trip."</p>
<p>Things are hardly ever as they seem.</p>
</blockquote>
My Yahoo! RSS Beta Launched (Jeremy Zawodny's blog)2004-06-16T00:00:00Zhttps://bannister.us/weblog/2004/my-yahoo-rss-beta-launched-jeremy-zawodnys-blog
<p><a href="http://jeremy.zawodny.com/blog/archives/001474.html">My Yahoo! RSS Beta Launched (Jeremy Zawodny's
blog)</a> -- This
would be pretty neat news if Yahoo was still usable.</p>
<p>I have mixed feelings about this. Yahoo has done some pretty nice work
in the past, but the present problems with the Yahoo redirect(?) servers
make Yahoo something to avoid. For months Yahoo has had an sporatic
problem with steadily more frequent timeouts going through rd.yahoo.com,
us.rd.yahoo.com, and (today) us.ard.yahoo.com.</p>
<p>What is worse, Yahoo may not know this as the feedback pages have the
same problem.</p>
Microsoft is betting the company on the rich client.2004-06-16T00:00:00Zhttps://bannister.us/weblog/2004/microsoft-is-betting-the-company-on-the-rich-client
<p>A rather long article with which I largely agree: <a href="http://www.joelonsoftware.com/articles/APIWar.html">Joel on Software -
How Microsoft Lost the API
War</a></p>
<p>This quote is a zinger - if true somehow I had missed this entirely:</p>
<blockquote>
<p>The big meme at Microsoft these days is: <em>"Microsoft is betting the
company on the rich client."</em></p>
</blockquote>
<p>If true this does explain a number of Microsoft's recent actions that
are otherwise puzzling. If true this could indeed be Microsoft's first
cosmic-scale misstep.</p>
Hackers and Painters2004-06-13T00:00:00Zhttps://bannister.us/weblog/2004/hackers-and-painters
<p>Great quote from <a href="http://www.paulgraham.com/hp.html">Hackers and
Painters</a>:</p>
<blockquote>
<p>I've never liked the term "computer science." The main reason I don't
like it is that there's no such thing. Computer science is a grab bag
of tenuously related areas thrown together by an accident of history,
like Yugoslavia.</p>
</blockquote>
CVS, Windows, and timezone confusion2004-06-12T00:00:00Zhttps://bannister.us/weblog/2004/cvs-windows-and-timezones
<p>OK - I admit I am confused. There is something clearly something funky
about how Windows handles timezones and file timestamps, as is well
explained in <a href="http://www.codeproject.com/datetime/dstbugs.asp">Beating the Daylight Savings Time bug and getting correct
file modification
times</a>.</p>
<p>Beyond this there are some differences in behavior between different CVS
clients. Between the <a href="http://www.cvshome.org/">original CVS</a>, the
enhanced <a href="http://www.cvsnt.org/">CVSNT</a>, and the built-in
<a href="http://www.eclipse.org/">Eclipse</a> CVS client there are ... differences.
Reading about the <a href="http://www.cvsnt.org/pipermail/cvsnt/2004-January/010134.html">[cvsnt] CVS Time Zone
Bug</a> did
not exactly help. Tested with Eclipse 3.0 rc2, CVSNT 2.0.41a, and CVS
1.11.17.</p>
<p>Beware: Cygwin "ls" returns different file times than the Windows "dir"
command - so it is not just the CVS clients that are confused! The times
reported by Windows are listed here. Did not try the Cygwin port of
"cvs". File times were recorded when the current time was DST.</p>
<p>Picking an older file with a non-DST file timestamp:</p>
<p><code> file timestamp CVS/Entries ============== ============== 12-21-02 17:55 12-22-02 00:55 (Eclipse checkout anytime) 12-21-02 17:55 12-22-02 00:55 (CVSNT checkout anytime) 12-21-02 17:55 12-22-02 00:55 (CVS checkout when not DST) 12-21-02 16:55 12-21-02 23:55 (CVS checkout when DST)</code></p>
<p>Picking a newer file with a DST timestamp:</p>
<p><code> file timestamp CVS/Entries ============== ============== 05-05-04 09:22 05-05-04 16:22 (Eclipse checkout anytime) 05-05-04 09:22 05-05-04 16:22 (CVSNT checkout anytime) 05-05-04 10:22 05-05-04 16:22 (CVS checkout when not DST) 05-05-04 09:22 05-05-04 15:22 (CVS checkout when DST)</code></p>
<p>Looks like CVSNT and Eclipse are consistent with each other and across a
DST change. The original CVS is not consistent across DST changes.</p>
<p>Now the question is if I can somehow make
<a href="http://bannister.us/preston.bannister/activecvs/">ActiveCVS</a> somehow
account for these differences.</p>
<p>... think I am going to punt for now...</p>
Movement to better web browsers2004-06-10T00:00:00Zhttps://bannister.us/weblog/2004/movement-to-better-web-browsers
<p>A interesting bit of dialog with which I happen to agree:</p>
<p><a href="http://www.tbray.org/ongoing/When/200x/2003/07/17/BrowserDream">ongoing: The Door Is
Ajar</a></p>
<p>What <strong>really</strong> got my attention was <em>"the proportion of IE users here
at ongoing recently crossed the 60% line, heading down"</em>. Given the Tim
Bray's readers are largely early adopters of new technology, it is not
much of a stretch to imagine that this represents the beginning of a
tidal wave of change.</p>
<p>If you look closely at "Web Browsers Used to Access Google" in the
<a href="http://www.google.com/press/zeitgeist.html">Google Zeitgeist</a> there
looks like an interesting blip in the non-Microsoft browser numbers.
Could this be the beginning of a larger change?</p>
ActiveCVS2004-06-10T00:00:00Zhttps://bannister.us/weblog/2004/activecvs
<p>Some small progress with the
<a href="http://www.bannister.us/preston.bannister/activecvs/index.html">ActiveCVS</a>
code (an implementation of the Microsoft SCC API). I took a run at
getting this to work quite a while ago, but was never able to get the
interaction with MSVC to work reliably.</p>
<p>With a small bit of inspiration and another rewrite (this is at least
the fourth), yields a much better result. Finally a solid base on which
to build...</p>
Weblogs, Wikis and too many constraints2004-06-06T00:00:00Zhttps://bannister.us/weblog/2004/weblogs-and-wikis-still-trying-to-sort-all-this-out
<p>As this page is evidence, I chose WordPress for my weblog a little ways
back. In truth I was really looking for more of a wiki/weblog
combination. I'd really like to find something suitable, and add to it,
but it seems I am trying to apply too many constraints.</p>
<p><strong>Licence</strong></p>
<p>The software should preferrably <strong>not</strong> be GPL (Gnu Public License).
Personally I find the GPL too coercive for my taste, and have felt this
way ever since first reading the GPL off a USENET posting in the
mid-1980's. It is somewhat darkly ironic that the GPL seeks to replace
one form of coercion with another.</p>
<p>Commercial use cannot be disallowed. I want the freedom of re-using
anything to which I contribute in my paid work.</p>
<p><strong>Implementation language, database use, and web hosting</strong></p>
<p>This is a bit more of a hash. My current web hosting providor supports
PHP (via mod_php), MySQL, and PostgreSQL. Perl support is via CGI. Java
is not supported.</p>
<p>Java would be my first choice for anything of substance, but short of
renting a co-located server (a bit more than I want to spend) this may
not be practical. I am a bit dubious about running a single JVM for many
users on a shared system, and JVMs are a bit fat to have active for
every user. For the limited amounts I want to spend for personal web
hosting, Java may not be practical.</p>
<p>Perl is terrific for writing small to mid-sized scripts - especially
those that do hideously clever transformations on text in a small amount
of code. I am not keen on writing larger sources in Perl.</p>
<p>PHP is good for writing quick-and-dirty web applications. PHP is very
well supported for modestly-priced web hosting. PHP borrows a lot from
Perl, is a shade cleaner as a language, and as such is probably more
suitable for mid-sized applications. On the other hand, the
implementation of many open-source PHP applications is - ugly (and I've
looked at a lot lately). Not really code I'd want to work on.
(<em>Might be a lesson in there somewhere about too-low an entry
barrier?</em>)</p>
<p><strong>Performance</strong></p>
<p>Admittedly I am a bit of a performance freak. Almost everything I have
done involved pushing software performance to the limits of the
hardware, and I have a knack for doing this well. When looking at Wikis
I naturally started with <a href="http:://c2.com/">c2</a> and loaded a variant onto a test
system (an older box) ... then watched it churn through nearly a billion
instructions(!) just to render just the text for the FrontPage. Now I'm
all for burning CPU to offer function - but this was obscene! Many of
the wiki implementations seem to have similar problems.
(<em>What really bugs me about this, is that the problem is solvable - but
I don't have enough free time to do an implementation. A topic for
another day...</em>)</p>
<p><strong>Portability</strong></p>
<p>Again, I'd like the ability to re-use work I'd contributed to in my paid
work. That means the software needs to be usable on Microsoft Windows.</p>
Source code control and precluding errors2004-06-04T00:00:00Zhttps://bannister.us/weblog/2004/precluding-errors-with-source-code-control
<p>If Martin Fowler feels this is worth an article, then perhaps the
subject needs elaboration.</p>
<p><a href="http://martinfowler.com/bliki/DiffDebugging.html">MF Bliki:
DiffDebugging</a></p>
<p>I long-ago adopted the habit of reviewing my changes <strong>before</strong> a
checkin.</p>
<p>First, any code into which I have put a significant amount of work goes
into CVS.</p>
<p>Once I reach the point where I am making changes to nominally stable
software, before I checkin my changes I always review my changes by
running:
<code>cvs diff | less</code>
Why? The usual problem is a bit of debugging code left in I had
intended to remove. Less often I find an unintended change or deletion.
In any case reviewing the <strong>diff</strong> takes little time, does catch
errors - and in the case described in the article, would most likely
have caught the error early.</p>
<p>Must admit that I am a bit bemused by the need to checkout two complete
source trees to compare two versions. When I have a similar need the
following command does the trick:
<code>cvs diff -rtag1 -rtag2</code>
Surely the esteemed Martin Fowler cannot be using something less
capable?</p>
<p>Oh - about tags - anytime I generate a build to give someone (anyone)
else, I run a script that bumps the compiled-in build number, and tags
the source in CVS with that same build number. This guarantees I
<strong>always</strong> can pull out the exact sources for an executable.</p>
<p>None of this is by any means unique, or in any way my invention...</p>
OpenOffice and XML2004-06-04T00:00:00Zhttps://bannister.us/weblog/2004/openoffice-and-xml
<p>Tim Bray talks about the use of XML and XSLT in OpenOffice. Of
particular interest is the notion of editing weblogs using
<a href="http://www.openoffice.org/">OpenOffice</a> and some sort of XML transform.</p>
<p><a href="http://tbray.org/ongoing/When/200x/2004/03/26/OpenOffice">Tim Bray on
OpenOffice</a></p>
<p>Seems there are three sets of similar tasks that should all admit to
similar solutions.</p>
<ol>
<li>Editing weblog text.</li>
<li>Editing wiki text.</li>
<li>Editing structured documents.</li>
</ol>
<p>Each starts with a different "logical" form and "renders" to specific
representations. Wish I had time to hack around with OpenOffice and XML
transforms...</p>
Genx - portable XML generation in "C"2004-06-04T00:00:00Zhttps://bannister.us/weblog/2004/genx-portable-xml-generation-in-c
<p>An open-source XML generation library from Tim Bray - will have a need
for this a bit later.</p>
<p><a href="http://www.tbray.org/ongoing/When/200x/2004/02/20/GenxStatus">Genx
Status</a></p>
<p>Small dissappointment - it is written in "C" rather than "C++". I
suspect a carefully written C++ class could give better performance (we
<em>are</em> talking about mashing a lot of bytes around).</p>
<p>Big upside - this looks like very clean code. Hey - a guy that uses
opaque pointers in "C" probably has a clue. Also this is not his first
time through a similar exercise, so you can expect the ideas expressed
in the code to be more clearly thought out.</p>
<p>Good stuff.</p>
Doug Engelbart 1968 Demo2004-06-04T00:00:00Zhttps://bannister.us/weblog/2004/doug-engelbart-1968-demo
<p>A bit of computer history I'd run across some time ago, but forgotten
the link.</p>
<p><a href="http://sloan.stanford.edu/MouseSite/1968Demo.html">Doug Engelbart 1968
Demo</a></p>
<p>First, this is interesting as history - the bare beginnings in the
1960's of technologies that only became widely used in the 1990's. No
point in elaborating this oft-visited topic.</p>
<p>Second, this is interesting as illuminating a path not taken - an
alternate future - in technology. Note the use a shared computer with
<em>video</em> piped to the desktop. This is a pretty clever notion, and is
potentially more cost-effective that legions of desktop computers.</p>
<p>There was a thread on USENET a long time back about the merits of shared
versus desktop machines. The upshot was that <em>in theory</em> got you more
bang for the buck with shared machines, but <em>in practice</em> shared systems
are almost always mismanaged. With a shared system there is always the
temptation for management to delay upgrades, so shared systems tended to
become under-configured, and performance would degrade with time. With
desktop machines - once acquired - you had a fixed resource over which
you had complete control.</p>
Labels to dampen CD burning? | CNET News.com2004-06-02T00:00:00Zhttps://bannister.us/weblog/2004/labels-to-dampen-cd-burning-cnet-newscom
<p>One more reason to buy music, but not music CDs from a major label.</p>
<p><a href="http://news.com.com/Labels%20to%20dampen%20CD%20burning%3F/2100-1027_3-5224090.html?tag=nefd.lede">Labels to dampen CD burning? | CNET
News.com</a></p>
<p>You can't do what they are attempting to do - control copying - without
degrading the information (music) on the disk. I don't like to idea of
buying a music CD with <em>deliberately</em> bad data.</p>
<p>Idiots.</p>
Hiking, again2004-06-01T00:00:00Zhttps://bannister.us/weblog/2004/hiking-again
<p>Went hiking through Whiting Ranch this evening. I hurt my knee over a
year ago, and am just starting to feel I might be up for some limited
hiking. Will see if I can walk tomorrow.</p>
<p>Ran into the
<a href="http://www.thomasregister.com/CompanyProfile.aspx?az=05400452">Astronic</a>
"Express" on the way in. Have seen this group many times over the past
several years. This is one very consistent, reliable group of hikers.
Guess it makes sense they seem to be a manufacturing outfit.</p>
<p>Weather was relatively nice - clear and warm, if a bit hazy. This is not
the nicest part of the year as much of the vegetation is dead, brown,
and dust-dry. Fly, gnats and other similar pests are more abundant than
other times of the year. Still it was nice to get out hiking again.</p>
Yahoo commits suicide!2004-05-31T00:00:00Zhttps://bannister.us/weblog/2004/yahoo-commits-suicide
<p>Someone has <strong>got</strong> to find a way to get feedback to Yahoo. For the past
few weeks Yahoo has become nearly unusable. Yahoo runs a lot of their
links through rd.yahoo.com or us.rd.yahoo.com, and almost every single
time the link (redirection?) fails. I might have to stop using Yahoo
(bummer).</p>
<p>What is even worse is that the "help" links have the same exact problem.
It is entirely possible Yahoo does not even know of the problem, because
no one can find a feedback path that works!</p>
<p>Argh.</p>
Memorial Day ... and beer?2004-05-31T00:00:00Zhttps://bannister.us/weblog/2004/memorial-day-and-beer
<p>Kids went back to their mother's yesterday, so the house is quiet if
something of a disaster.</p>
<p>Today started warm and sunny. Thought about heading down to Laguna Beach
for a walk in the morning, but good weather and a holiday weekend means
too many people. Spent the morning and most of the afternoon making the
clean spot in the house bigger, and the pile of dirty laundry smaller.</p>
<p>Made and finished a pot to good coffee, read another chapter out of
<a href="http://www.amazon.com/exec/obidos/tg/detail/-/0201699699/002-7011868-2960014">Agile Software Development</a>
(good book - but about a chapter a day is the most I can read), and
finished off a few bottles of "Coastal Light".</p>
<p>Don't know why, but I really like this "Coastal Light" beer Trader Joe's
sells. Before I mostly drank German dark beers (served cool not cold).
Sometimes the beer tasted good, and other times it didn't. Probably
averaged at most a dozen bottles a month (often much less). But this
"Coastal Light" hits my palate just right - a hint of yeast, a bit of a
bite, a hint of roasted grain, and a mild after-taste. I can drink this
stuff all day (is this a good thing?).</p>
<p>Their <a href="http://www.firestonebeer.com/">brewery</a> is in Paseo Robles. Maybe
an excuse for a drive up the coast.</p>
<p>Drove down to Laguna late in the afternoon. Traffic was only a bit
thick, and found a spot a half-block from the beach on Forrest (a nice
street to wander down with all the shops). Spent a couple hours
wandering around Laguna Beach. Lots families winding down their
picnic-outing. Lots of folks not speaking English (asian,
middle-eastern, hispanic in order of apparent numbers). Headed back just
before sundown.</p>
<p>The pile of laundry is now clean. The kitchen is spotless. The bemused
dog with muddy feet is in the backyard - and wants in.</p>
Human Response - melodic electronica2004-05-28T00:00:00Zhttps://bannister.us/weblog/2004/human-response-melodic-electronica
<p><a href="http://www.magnatune.com/artists/human_response">Human Response: melodic
electronica</a> - more new
music from <a href="http://www.magnatune.com/">Magnatune</a>.</p>
<p>Same deal - listened to the entire set (more than once) and found this a
keeper. Bought her piano music too, though I'm not generally keen on
piano music.</p>
Vintage - software?2004-05-27T00:00:00Zhttps://bannister.us/weblog/2004/vintage-software
<p>Got email a few days ago from Eric Smith who was trying to find
something out about the old Western Digital Microengine. My first job
out of college was working at WD on the Microengine (1981-1982).</p>
<p>One of my tasks while there was to write software for the new hard disk
controller for the Microengine. The hard disk controller used the WD1000
chipset (the first ancestor to today's IDE/ATA interfaces).</p>
<p>When I first got the driver working, my manager got excited and we
marched around the building announcing this fact to lots of people I
didn't know. At the time I had no idea why he did this. This <em>was</em> my
first job out of college. On reflection, this might have been one of the
first proofs that the WD1000 chipset really worked.</p>
<p>I spent considerable time optimizing the code. The numbers are still
burned into my brain:</p>
<ul>
<li>3200 rpm disk rotation, or 53.3 per second</li>
<li>16 sectors per track (actually 17, one spare to allow for bad
blocks).</li>
<li>512 bytes per sector (optimal combination for the then-current
disks).</li>
</ul>
<p>This meant there was 16*512*53.3 = 436906 bytes passing under the head
every second. Once the hard disk controller had read a single sector
into it's buffer, the buffer had to be emptied before the next sector
could be read. The time needed by the DMA controller was equivalent to
just over 2 sectors passing under the head. Once DMA finished the
software needed to reprogram both the hard disk and DMA controllers for
the next sector. With all that I was pretty happy to get the interleave
down to 5:1 (stable), and 4:1 (marginal). At the 4:1 interleave any sort
of interruption would cause us to miss the sector and have to catch it
on the next revolution, so we backed to 5:1 for consistent performance.</p>
<p>To get this level of performance I used a bit of a trick. While one
sector was being read by the hardware, the software precomputed all the
controller parameters for the next sector, and assembled the results
into a record that could be block-assigned into the controller
registers.</p>
<p>At 5:1 we are talking about ~87KB read/write per second. As long as the
disk didn't have to seek, we could swap half the 128KB memory to disk in
less than a second. This lead to musing about swapping entire running
applications to disk (~3 seconds to swap the entire memory).</p>
<p>When the hard disk controller came out for the IBM XT, it used a later
WD chipset. By my standards (at the time) this was dream hardware. The
controller did multi-sector IO! The DMA and CPU were faster! With that
hardware I figured they might easily get a 2:1 or 3:1 interleave! I was
shocked to find that the IBM XT shipped with a far worse interleave
(9:1?) than I got with less capable hardware.</p>
<p>Right. Not that any of this is remotely relevant any more...</p>
Stargarden - huge ambient compositions.2004-05-21T00:00:00Zhttps://bannister.us/weblog/2004/stargarden-huge-ambient-compositions
<p><a href="http://www.magnatune.com/artists/stargarden">Stargarden</a> - more new
music from <a href="http://www.magnatune.com/">Magnatune</a>.</p>
<p>After listening to the entire set (more than once - hope the bandwidth
doesn't cost them too much) found this a keeper. For some reason this
went well with testing an LPD capture service (don't ask).</p>
Finding Lisp2004-05-14T00:00:00Zhttps://bannister.us/weblog/2004/finding-lisp
<p>Back in college (in the late 1970's) I signed up for a couple of
undergraduate research projects. One was to build a small (?) natural
language interpreter. The second was to build a prototype Ada
programming environment (remember when Ada was a hot/new language?).</p>
<p>Both were written using UCI Lisp.</p>
<p>The folks in the Ada programming environment project generated an Ada
parser, interpreter, compiler, and integrated editor for a subset of Ada
in a remarkably small amount of time. This was only possible by
leveraging off the Lisp environment.</p>
<p>Lisp had a pretty steep learning curve, but once you "got" the ideas in
Lisp programming, you could get far more done in less time than in any
other language. Since the full Lisp programming environment had a
tendency to turn a "big" computer into a single-user machine, Lisp was
widely viewed as impractical. We're talking about when "big" was a one
MIPS machine with a megabyte of memory. With today's computers ... well,
I could probably host the entire Lisp research community of that time on
my current PC.</p>
<p>When XML came out I had a distinct "been there" feeling. XML is
basically another (more expensive) way of presenting Lisp
s-expressions - and is a great idea for pretty much the same reasons.</p>
<p>Ran across someone visiting the same meme - <a href="http://www.findinglisp.com/blog/2004/05/back-to-future-with-lisp.html">Finding
Lisp</a>.</p>
<p>Not that I think going back to Lisp is really practical at this point.
In fact the combination of Java and XML covers much the same ground, and
"critical mass" is important.</p>
Long Bets - Passing the Turing test by 20292004-05-08T00:00:00Zhttps://bannister.us/weblog/2004/long-bets-passing-the-turing-test-by-2029
<p><a href="http://www.longbets.org/1">Long Bets [ 1: By 2029 no computer - or "machine intelligence" - will
have passed the Turing Test. ]</a></p>
<p>Interesting bet... and I think we could build the software to pass the
test <strong>today</strong>!</p>
<p>Back when I was in college I took an interest in Artificial Intelligence
(AI). The then-current body of knowledge that went under the label "AI"
was clearly a very log way from simulating intelligence. In thinking
about the problem I came up to three main obstacles:</p>
<ol>
<li>The amount of compute power needed.</li>
<li>The amount of storage needed.</li>
<li>The amount of accessible information needed for learning.</li>
</ol>
<p>First we can estimate (very roughly) the amount of compute power needed
to achieve "intelligence" simply by looking at the human brain. The
estimate has a high side, and a low side (with a very large range
between). The low side goes something like:</p>
<ul>
<li>There are ~1 billion effective neurons (there are ~10 billion
neurons, but most look like wiring).</li>
<li>Each neuron has an effective "fan out" of ~10 connections (there
can be thousands of connections, but given the connections were made
almost by chance, as a guess most are not useful).</li>
<li>Each neuron can in effect make ~10 "decisions" per second (a neuron
can fire up to something like a thousand times per second, but given
the neuron is an analog device, you need a fair number of pulses to
add up to a "decision").</li>
<li>The human mind is really nature's first try at intelligence. It is
reasonably likely that the human mind is not built very efficently,
and intelligence could be achieved with perhaps 1/10 the processing
power of the human brain.</li>
</ul>
<p>Taken together the above gives a (very!) rough estimate of the minimum
compute needed for intelligence:</p>
<p>( 10 * 10 * 1 billion / 10 ) = 10 billion "decisions" per second</p>
<p>These "decisions" are essentially binary in nature, and are (very)
roughly equivalent to the bits flowing through a computer CPU. So the
equivalent rate for a CPU would be something like the number of bits in
a machine word multiplied by rate at which the CPU processes
instructions.</p>
<p>In the late 1970's the then-largest current machines were vastly slower
than the low-side estimate for needed processing power.</p>
<p>Storage was another problem. If each fan out from a neuron was roughly
equvalent to a bit of storage, then we needed a computer with perhaps 1
to 100 billion bits of storage.</p>
<p>In the late 1970's the then-current machines had vastly smaller storage.</p>
<p>Learning was another problem. Humans take decades to achieve full
intelligence, and during that time are exposed to quite a lot of
experiences. We don't want to take decades educating an experimental AI,
only to find that we got the design wrong and have to start over. We
need a huge amount of available information to feed to our AI for each
successive experiment.</p>
<p>In the late 1970's ... well, you get the picture. At this point I
dropped my interest in AI, figuring it would be decades before we would
have just the raw computing power needed.</p>
<p>A few years ago, I remembered this old exercise, and was slightly
shocked to realize that just the generic PCs in my study were near or
above that old estimate.</p>
<p>I strongly suspect that we already have what we need support AI. We have
multi-gigahertz CPUs and multi-gigabyte memories. We have a vast pool of
information accessible via the Internet.</p>
<p>Of course we don't have a clue about how to write the software....</p>
Silly Internet Game2004-05-02T00:00:00Zhttps://bannister.us/weblog/2004/silly-internet-game
<p>Hey, this wasn't <em>my</em> idea ... <a href="http://www.tbray.org/ongoing/When/200x/2004/04/24/FifthSentence">Silly Internet
Game</a>
... playing the "game", the following is from <a href="http://www.amazon.com/exec/obidos/tg/detail/-/0440500117/ref=ase_prestolbannis/002-7011868-2960014?v=glance&s=books">Save Your
Knees</a>
:</p>
<p>" And if a large piece wedges itself between the bones, the knee may
suddenly lock. "</p>
<p><strong>The game instructions:</strong> Grab the nearest book, open it to page 23,
find the 5th sentence, and post its text along with these instructions.
I would add to the instructions: point back to where you got the idea so
that we can follow the threads.</p>
<p>( And yes, the quoted sentence applies to me. I am <strong>not</strong> looking
forward to visiting the doctor. )</p>
Santa Barbara2004-04-18T00:00:00Zhttps://bannister.us/weblog/2004/santa-barbara
<p>Took the kids up to Santa Barbara for a couple days. Left a little too
late Friday afternoon and got caught in traffic going through Los
Angeles (not fun).</p>
<p>Spent a few hours at the <a href="http://www.santabarbarazoo.org/">Santa Barbara
Zoo</a> on Saturday. The Zoo is just off
the main beach area (you could walk there from the beach), is somewhat
small, but very well kept. A fair portion of the zoo was “under
construction” at this time. Well worth the time. One thing of note -
there are a number of picnic areas in the zoo, including one overlooking
the ocean.</p>
<p>Went up the coast a bit to a <a href="http://www.circlebarb.com/">“dude” ranch</a>
and took the kids horseback riding. My 7-year-old daughter has had
riding lessons and was quite sure of herself. Rode up into the hills
(typical California coastal scrub). Had a nice view of the Channel
Islands. The 1.5 hour trip was just about the right length, as by the
time you get back, there are tired muscles in unfamiliar places.</p>
<p>Spent the last part of the afternoon in a <a href="http://www.santabarbara.com/activities/parks/Alameda/default.asp">rather interesting
park</a>
(good place to lose your kids, for a little while). Headed back home
just after sunset.</p>
<p>Got very quiet in the car on the way back, with all three kids asleep for a time.</p>
Music2004-04-16T00:00:00Zhttps://bannister.us/weblog/2004/music
<p>Started buying music again.</p>
<ul>
<li><a href="http://magnatune.com/artists/emmas_mini">Emma’s Mini: electronic rock with a pop
edge.</a></li>
<li><a href="http://magnatune.com/artists/beth_quist">Beth Quist: electro-Balkan/Indian meets New
Age.</a></li>
</ul>
<p>I had pretty much stopped buying music at one point. All the old groups
I was familiar with were gone, KROQ was stuck in an 80’s flashback, and
I wasn’t hearing anything interesting.</p>
<p>When MP3s started floating around the Internet I heard some interesting
new music, and went out and bought the CDs (I own all the music I keep).
Added quite a lot to my collection for a while.</p>
<p>Now the RIAA is … well, a pain in the ass. Have not bought any music in
a while, as I’d stopped downloading MP3s and was not hearing any
interesting new music. Moreover at this point I’m so annoyed with the
RIAA and their tactics, I don’t want to buy anything from an RIAA
member.</p>
<p>Magnatune works for me. I usually end up listening to the entire set of
music, sometimes more than once, before deciding if I actually like an
artist’s work. The choices at Magnatune are a bit limited, but have
found some bits I like.</p>
Universal Calendars and Scheduling?2004-04-15T00:00:00Zhttps://bannister.us/weblog/2004/universal-calendars-and-scheduling
<p>How can you get Internet-based universal calendars/scheduling as good as
the Microsoft Exchange/Outlook combination or better?</p>
<p>I have been puzzling at this question for a while. Let’s start with the
basics:</p>
<ol>
<li>Most of the application logic (and extensions) should be on the
server.</li>
<li>Clients should require no or minimal additional installation.</li>
<li>Offline operation should be supported (for when your notebook is off
the network).</li>
<li>Use existing standards where possible (iCalendar, vCard).</li>
<li>Try to interoperate with other solutions (Exchange/Outlook) as best
you can.</li>
</ol>
<p>If you support disconnected operation, then you need automatic download
and caching of calendar items. This looks a whole lot like the semantics
of private and shared IMAP folders. Why re-invent the wheel? Heck, you
<strong>are</strong> going to check your email. Might as well synchronize your
calendar data at the same time over the same connection.</p>
<p>Using IMAP with the Mozilla email reader, you can mark folders for
off-line use. Mozilla will download and keep a local copy of all
messages when you go off-line. Outlook might have similar function.</p>
<p>IMAP is a better solution than POP - especially if any user has more
than one computer (say a desktop at work, a notebook, and a desktop at
home).</p>
<p>Teach the Mozilla Calendar plug-in to recognize messages containing
iCalendar data. Teach the server to translate (say) Exchange-style
meeting announcments into iCalendar format (say when setting up a
meeting with someone at a company using Exchange). Outlook can
(apparently) be taught to look for your free/busy information on the
Internet - especially if you send the right contact information in a
vCard.</p>
<p>It is pretty easy to put together an Exchange/Outlook ghetto that works
well. It is pretty easy to put together a my-group-only solution using
open-source or commercial software. The trick is to put together a
solution that can <em>interoperate</em> between organizations, when you have no
control over what the other organizations use.</p>
Google’s Gmail and privacy2004-04-13T00:00:00Zhttps://bannister.us/weblog/2004/googles-gmail-and-privacy
<p>I just don’t see that the furor over Gmail scanning email to place ads
as justified.</p>
<p><a href="http://arstechnica.com/news/posts/1081872343.html">Ars Technica: Google’s Gmail under threat in
California</a></p>
<p>First, Google is offering us something of value (free email, huge
storage) in return for the service. If you don’t want your email
scanned, then don’t use Gmail.</p>
<p>Second, Google has a track record of - well - trying to be a good
citizen. With a bit of care Google can make sure that the auto-placed
ads don’t automatically return too much information to marketers.</p>
<p>Third, who said email was private? As long as the FBI’s “Carnivore”
program exists, you should assume that <strong>all</strong> your email is scanned.</p>
Talk at UCI2004-01-31T00:00:00Zhttps://bannister.us/weblog/2004/talk-at-uci
<p>Went to another "distinguished speaker" talk at UCI on Friday. Just
finding a place to park was a bit of an adventure (they changed things -
again).</p>
<p><strong>Testing and Analysis of Next Generation Software</strong></p>
<p>Have to admit I was a bit underwhelmed with the talk. Nothing really
brain-stretching here, rather a straight-forward exploration of some
simple ideas not entirely thought out (and not worth repeating here).</p>
<p>Perhaps my expectations are too high. Perhaps in light of the Internet
the academic community loses meaning. Certainly none of the talks I have
gone to at UCI in the last few years were worth the time. I keep going
as some past talks were indeed very much worthwhile.</p>
<p>Come to think of it - seems practically all the interesting current work
is communicated through web pages, mailing lists. and (on occasion)
books. Could be the academic journals and the academic forums are now
nearly irrelevant, or at least in the old form. Bummer. The local forum
is nice, or would be if the presentations were a bit more worthwhile.</p>
<p>Noticed the guy sitting in front of me looked somewhat familiar. After
twenty-odd years almost didn't recognize Professor Standish - one of my
old instructors.
Saturday, January 31, 2004</p>
Web protocol library2004-01-29T00:00:00Zhttps://bannister.us/weblog/2004/web-protocol-library
<p>Lately started looking for a good C/C++ web protocol library. It would
be extremely useful for my C++ code to have easy access to web/internet
protocols as can be had from Java (or Perl for that matter).</p>
<p>Found libwww at w3.org (at rather suitable place). On the good side
libwww has been around for a while and seem substantial usage - so there
is a decent chance time has shaken out the bugs. On the other hand, it
looks like development stalled out a few years back. Took a crack at
building on Win32. The code by in large builds very cleanly (pretty
usual in portable code), though the build itself is not entirely right.
Could put in the time to update/contribute back the build files, but it
is worth the time?</p>
<p>Found libcurl as an occasionally recommended successor to libwww. Active
development is ongoing - a good sign.</p>
<p>Saw a reference to ACE. I've considered ACE interesting from it's very
beginning - though possibly overbuilt(?). Not sure ACE would be a good
fit to the sorts of applications I usually produce.</p>
Rain!2001-11-12T00:00:00Zhttps://bannister.us/weblog/2001/rain-2
<p>Started raining this evening! Should be enough for the hills to start
turning green again. Will make for a nice change when out hiking.</p>
Driving2001-11-02T00:00:00Zhttps://bannister.us/weblog/2001/driving
<p>Drove to Montrose, Colorado to meet Dad. Started at 1:30 AM and arrived
13 hours later. At about 840 miles this is the furthest I've driven in a
single day. The drive was much easier than I'd expected.</p>
Unexpected2001-10-31T00:00:00Zhttps://bannister.us/weblog/2001/unexpected
<p>Mom died of a heart attack today. This was completely unexpected. She
and Dad were on a trip in Colorado to buy their vacation/retirement
home.</p>
Saddleback (cooler)2001-10-07T00:00:00Zhttps://bannister.us/weblog/2001/saddleback-cooler
<p>Went up Saddleback Peak from the Holy Jim trailhead this last Sunday.
Rather a pleasant hike. What a difference a couple months makes! During
the summer the heat and insects were ferocious. The air temperature was
down 20-30 degrees from the summer, and the insect population is almost
entirely gone. About a dozen volunteers from a mountain bike club were
out doing trail maintenance, but otherwise very few people on the trail.
From Saddleback you could watch a very dramatic thundercloud building
over the mountains to the east. Didn't push at all hard and my time to
the top was 3 hours 13 minutes (of which a few minutes were spent
chatting with a trail worker). Seems my time to the top is always pretty
much the same. This is my fourth hike to the top this year.</p>
Saddleback (again)2001-06-16T00:00:00Zhttps://bannister.us/weblog/2001/saddleback-again
<p>Hiked up Saddleback mountain today. Waited until 9:27am for two maybes
to show and then headed up. Got to the top, collected the two SCARABs
flags from their last hike, and placed a cell phone call at 12:37. I
drank a liter before leaving home, a liter at the trail head, and took
two liters on the hike. It wasn't enough. The day was clear, warm and
sunny with almost no wind. Ran out of water on the way down, and after
the hike drank about four liters before I felt normal. Made it down to
the trail head about 3:50pm (I forgot to check the exact time). Took a
wide-brimmed hat, used Deet liberally, and the bugs mostly left me
alone. Forgot to bring sunblock, but with the sun near straight overhead
and the hat, got only slightly burned.</p>
Saddleback (first try)2001-06-03T00:00:00Zhttps://bannister.us/weblog/2001/saddleback-first-try
<p>I am bit tired and sore today. Took the dog for a walk to work off some
of the soreness (much to his delight). Met a couple at the park with two
dogs. Let Tiger loose to run around as for some reason the park was
empty (odd for a Sunday) aside from other people with dogs.</p>
<p>On Saturday I made my first attempt to climb Saddleback mountain. Just
getting to the trailhead was a bit of an adventure. Bouncing down the
dirt road leading to the trailhead in my old Honda Accord took the
better part of an hour. Lacking a map I spent two hours doing a warm-up
hike up Horse Thief trail (to just past the junction with Trabuco Creek
trail) before figuring I wasn't on the right path. Oh well... :).
Backtracked to the Holy Jim trailhead and started up again. Made it up
to the Main Divide road before running out of water. Went up the road a
bit before better judgement (and a few thousand gnats) convinced me to
head back down. Up and back took a bit under 4 hours (and a total of 6
hours hiking for the day).</p>
<p>Weight is down to about 197-203 so I'm still headed in the right
direction.</p>
Hike with Sierra Club2001-03-11T00:00:00Zhttps://bannister.us/weblog/2001/hike-with-sierra-club
<p>First day I have felt reasonably normal since coming down with a cold on
Thursday. So this morning I went with the Sierra Club "Sage" group on a
conditioning hike through Whiting Ranch. As this was the first time, I
wasn't sure what sort of trouble I was in for as they advertised this as
a "fast" hike and "not for beginners". By the time the group was exiting
Billy Goat Trail I was alone and far ahead at the top of Dreaded Hill.
Guess I'm not a beginner.</p>
<p>Ok, I'm slightly jazzed :). Weight is down to 205-210 (from about 235
last May) and I'm down to the last notch on my belt. Never had to buy a
smaller belt before. As or more important my fitness level has improved.
Got a ways to go, but headed in the right direction.</p>
Rain2001-03-09T00:00:00Zhttps://bannister.us/weblog/2001/rain
<p>It's raining again. Rain is unusual in southern California. Rain when it
comes is a treat, but this rain has come nearly every day for weeks. Now
rain is like a hoped for guest that stays just a bit too long. The image
outside my front door is a sort of suburban paradise. Shiny streets
reflecting the gleam of tastefully placed house and yard lights that in
turn illuminate trim yards surrounding immaculate homes.</p>
<p>This morning the rain was a bare mist. Instead of dropping my kids
behind the school I chose be over-protective and drive them to the
front. Naturally other parents made the same choice, and the line of
cars leading to the front of the school was quite long. I was feeling
just a shade out of place in my ten year old Honda followed by a new
white SUV with Cadillac spelled out in gold letters, passing shiny new
grey Mercedes sedans, and in turn following a massive Lincoln Navigator.</p>
<p>Has the neighborhood really changed? I like where I live, and the
neighbors are all decent folk. Two houses across the street just sold
for full asking price, and in little time. The neighbors once the
slightly adventurous sort that colonize newly built areas, are slowly
being replaced by people with fatter wallets. Does this make a
difference, and if so what? The divorce and the marriage that preceded
left me drained financially. I know time will solve this problem. For
now I feel a bit out of step.</p>
<p>The kids will be back Sunday afternoon, so the house is quiet and
waiting. The little weekly tasks are done, and the bigger jobs will have
to wait for better weather.</p>
<p>The weeks without the kids are quite different. Thoughts run longer and
deeper. Words build up until they can be put down on a page. When the
kids are home, a thousand little interruptions keep any but shorter and
more fragmented thoughts from forming.</p>
tag-list1999-01-01T00:00:00Zhttps://bannister.us/tags/
<h1>Tags</h1>
<ul>
<li><a href="https://bannister.us/tags/future">future</a>
</li><li><a href="https://bannister.us/tags/humor">humor</a>
</li><li><a href="https://bannister.us/tags/meme">meme</a>
</li><li><a href="https://bannister.us/tags/openstack">openstack</a>
</li><li><a href="https://bannister.us/tags/politics">politics</a>
</li><li><a href="https://bannister.us/tags/self">self</a>
</li><li><a href="https://bannister.us/tags/software">software</a>
</li><li><a href="https://bannister.us/tags/software%20cloud%20security">software cloud security</a>
</li></ul>
search1999-01-01T00:00:00Zhttps://bannister.us/weblog/search/
<div id="home-search" class="home">
<script>
(function() {
var cx = '012141019472458637193:no-gh5ichkm';
var gcse = document.createElement('script');
gcse.type = 'text/javascript';
gcse.async = true;
gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(gcse, s);
})();
</script>
<gcse:search queryParameterName="searchString"></gcse:search>
</div>
resume1999-01-01T00:00:00Zhttps://bannister.us/weblog/resume/
<p>I keep a current copy of my <a href="https://docs.google.com/document/d/1ckgmvDhCNEPxppdkd6d8_HCJZHCw4Bw0BfDG-X_HfYE/edit?usp=sharing">resume</a> in Google Docs.
Presumably you can download which ever format you need.
Pick "File" and "Download as" from the menu.</p>
random memes1999-01-01T00:00:00Zhttps://bannister.us/weblog/
<ul class="post-list">
<li>
<span class="post-date">2023-08-31</span>
<a class="post-link" href="https://bannister.us/weblog/2023/linux-distributions-and-airliners%20copy">Constitution as base</a>
</li>
<li>
<span class="post-date">2023-07-02</span>
<a class="post-link" href="https://bannister.us/weblog/2023/constitution">Linux distributions as airliners</a>
</li>
<li>
<span class="post-date">2023-06-23</span>
<a class="post-link" href="https://bannister.us/weblog/2023/slow-motion-train-wreck%20copy">Slow motion train wreck</a>
</li>
<li>
<span class="post-date">2023-06-15</span>
<a class="post-link" href="https://bannister.us/weblog/2023/cloud-is-fierce">Cloud is Fierce</a>
</li>
<li>
<span class="post-date">2023-05-18</span>
<a class="post-link" href="https://bannister.us/weblog/2023/predictions">Predictions</a>
</li>
<li>
<span class="post-date">2023-05-06</span>
<a class="post-link" href="https://bannister.us/weblog/2023/unexpected-job">Unexpected job</a>
</li>
<li>
<span class="post-date">2023-05-05</span>
<a class="post-link" href="https://bannister.us/weblog/2023/risky-business">Risky business</a>
</li>
<li>
<span class="post-date">2023-05-04</span>
<a class="post-link" href="https://bannister.us/weblog/2023/conversion-too">Converted to 11ty</a>
</li>
<li>
<span class="post-date">2017-02-01</span>
<a class="post-link" href="https://bannister.us/weblog/2017/minimum-wage">Minimum wage</a>
</li>
<li>
<span class="post-date">2016-09-17</span>
<a class="post-link" href="https://bannister.us/weblog/2016/nameless-beasts">Nameless beasts</a>
</li>
<li>
<span class="post-date">2016-08-29</span>
<a class="post-link" href="https://bannister.us/weblog/2016/private-cloud">Private clouds and the future</a>
</li>
<li>
<span class="post-date">2016-07-26</span>
<a class="post-link" href="https://bannister.us/weblog/2016/experiment-prelude">Prelude to an experiment, and down the rabbit-hole</a>
</li>
<li>
<span class="post-date">2016-07-21</span>
<a class="post-link" href="https://bannister.us/weblog/2016/explosive-deduplicated-storage">Explosive decompression of de-duplicated storage</a>
</li>
<li>
<span class="post-date">2016-07-14</span>
<a class="post-link" href="https://bannister.us/weblog/2016/vmware-is-doomed">VMware is doomed</a>
</li>
<li>
<span class="post-date">2016-07-13</span>
<a class="post-link" href="https://bannister.us/weblog/2016/rolling-hash">Measure of rolling hash</a>
</li>
<li>
<span class="post-date">2016-07-07</span>
<a class="post-link" href="https://bannister.us/weblog/2016/back-where-i-started">Back where I started</a>
</li>
<li>
<span class="post-date">2016-07-06</span>
<a class="post-link" href="https://bannister.us/weblog/2016/building-a-cloud-2">Building a Cloud - futures</a>
</li>
<li>
<span class="post-date">2016-07-05</span>
<a class="post-link" href="https://bannister.us/weblog/2016/building-a-cloud-1">Building a Cloud</a>
</li>
<li>
<span class="post-date">2016-07-03</span>
<a class="post-link" href="https://bannister.us/weblog/2016/catching-up">Catching up on web applications</a>
</li>
<li>
<span class="post-date">2016-06-30</span>
<a class="post-link" href="https://bannister.us/weblog/2016/converted-to-jekyll">Converted to Jekyll</a>
</li>
<li>
<span class="post-date">2016-06-30</span>
<a class="post-link" href="https://bannister.us/weblog/2016/backup-and-openstack">Backup and OpenStack</a>
</li>
<li>
<span class="post-date">2016-06-26</span>
<a class="post-link" href="https://bannister.us/weblog/2016/skein-nist">A measure of Skein</a>
</li>
<li>
<span class="post-date">2016-04-26</span>
<a class="post-link" href="https://bannister.us/weblog/2016/presented-at-openstack-conference">Presented at OpenStack conference</a>
</li>
<li>
<span class="post-date">2015-06-27</span>
<a class="post-link" href="https://bannister.us/weblog/2015/programming-myths">Programming Myths</a>
</li>
<li>
<span class="post-date">2015-04-15</span>
<a class="post-link" href="https://bannister.us/weblog/2015/sorting-music-house-and-techno">Sorting House music and Techo</a>
</li>
<li>
<span class="post-date">2015-03-22</span>
<a class="post-link" href="https://bannister.us/weblog/2015/coffin-corner">Coffin Corner</a>
</li>
<li>
<span class="post-date">2015-03-06</span>
<a class="post-link" href="https://bannister.us/weblog/2015/private-subnets-attempt">Private subnets - first attempt</a>
</li>
<li>
<span class="post-date">2015-03-05</span>
<a class="post-link" href="https://bannister.us/weblog/2015/private-subnets-basis">Private subnets and development</a>
</li>
<li>
<span class="post-date">2015-02-27</span>
<a class="post-link" href="https://bannister.us/weblog/2015/house-not-home">House not home</a>
</li>
<li>
<span class="post-date">2015-02-24</span>
<a class="post-link" href="https://bannister.us/weblog/2015/openflow-start">OpenFlow and SDN</a>
</li>
<li>
<span class="post-date">2015-02-15</span>
<a class="post-link" href="https://bannister.us/weblog/2015/analysis-paralysis">Analysis Paralysis</a>
</li>
<li>
<span class="post-date">2015-01-31</span>
<a class="post-link" href="https://bannister.us/weblog/2015/are-big-companies-odd">Are Big Companies Odd?</a>
</li>
<li>
<span class="post-date">2015-01-04</span>
<a class="post-link" href="https://bannister.us/weblog/2015/example-mersenne-twister">Example - Mersenne Twister random number generator</a>
</li>
<li>
<span class="post-date">2014-12-31</span>
<a class="post-link" href="https://bannister.us/weblog/2014/example-feed-workers">Example - feed-workers</a>
</li>
<li>
<span class="post-date">2014-12-29</span>
<a class="post-link" href="https://bannister.us/weblog/2014/examples-moving">Moving forward prior examples</a>
</li>
<li>
<span class="post-date">2014-12-03</span>
<a class="post-link" href="https://bannister.us/weblog/2014/security-in-numbers">Security in numbers</a>
</li>
<li>
<span class="post-date">2014-12-03</span>
<a class="post-link" href="https://bannister.us/weblog/2014/security-by-number">Security by number</a>
</li>
<li>
<span class="post-date">2014-12-03</span>
<a class="post-link" href="https://bannister.us/weblog/2014/security-and-time">Security and time</a>
</li>
<li>
<span class="post-date">2014-11-29</span>
<a class="post-link" href="https://bannister.us/weblog/2014/rain-inflection">Rain Inflection</a>
</li>
<li>
<span class="post-date">2014-11-26</span>
<a class="post-link" href="https://bannister.us/weblog/2014/family-thanksgiving-dinner">Family Thanksgiving Dinner</a>
</li>
<li>
<span class="post-date">2014-11-24</span>
<a class="post-link" href="https://bannister.us/weblog/2014/keep-up">Keep up</a>
</li>
<li>
<span class="post-date">2014-11-22</span>
<a class="post-link" href="https://bannister.us/weblog/2014/inflection-point">Inflection point</a>
</li>
<li>
<span class="post-date">2014-10-28</span>
<a class="post-link" href="https://bannister.us/weblog/2014/multiplier">Multiplier</a>
</li>
<li>
<span class="post-date">2014-10-26</span>
<a class="post-link" href="https://bannister.us/weblog/2014/conversion-of-weblog-to-pelican">Conversion</a>
</li>
<li>
<span class="post-date">2014-08-20</span>
<a class="post-link" href="https://bannister.us/weblog/2014/cloud-application-backup-and-openstack">Cloud application backup and OpenStack</a>
</li>
<li>
<span class="post-date">2014-08-19</span>
<a class="post-link" href="https://bannister.us/weblog/2014/coming-up-to-speed-with-openstack">Coming up to speed with OpenStack</a>
</li>
<li>
<span class="post-date">2014-06-27</span>
<a class="post-link" href="https://bannister.us/weblog/2014/david-keirsey-died">David Keirsey died</a>
</li>
<li>
<span class="post-date">2014-05-23</span>
<a class="post-link" href="https://bannister.us/weblog/2014/observation-delayed">Observation, delayed</a>
</li>
<li>
<span class="post-date">2014-04-07</span>
<a class="post-link" href="https://bannister.us/weblog/2014/great-love-debate-long-beach">Great Love Debate, Long Beach</a>
</li>
<li>
<span class="post-date">2014-03-15</span>
<a class="post-link" href="https://bannister.us/weblog/2014/social-mappingaccidents">Social mapping/accidents</a>
</li>
<li>
<span class="post-date">2014-01-29</span>
<a class="post-link" href="https://bannister.us/weblog/2014/gender-balance">Gender balance</a>
</li>
<li>
<span class="post-date">2013-12-23</span>
<a class="post-link" href="https://bannister.us/weblog/2013/vapors">Vapors</a>
</li>
<li>
<span class="post-date">2013-10-12</span>
<a class="post-link" href="https://bannister.us/weblog/2013/the-involved-father">The Involved Father</a>
</li>
<li>
<span class="post-date">2013-08-30</span>
<a class="post-link" href="https://bannister.us/weblog/2013/choosing-ordered-distinct-random-integers">Choosing ordered distinct random integers</a>
</li>
<li>
<span class="post-date">2013-08-10</span>
<a class="post-link" href="https://bannister.us/weblog/2013/the-tree-died">The tree died</a>
</li>
<li>
<span class="post-date">2013-07-25</span>
<a class="post-link" href="https://bannister.us/weblog/2013/no-nostalgia">No Nostalgia</a>
</li>
<li>
<span class="post-date">2013-07-25</span>
<a class="post-link" href="https://bannister.us/weblog/2013/new-buildings-and-old-sidewalks">New Buildings and Old Sidewalks</a>
</li>
<li>
<span class="post-date">2013-07-04</span>
<a class="post-link" href="https://bannister.us/weblog/2013/house-concert">House Concert</a>
</li>
<li>
<span class="post-date">2013-06-30</span>
<a class="post-link" href="https://bannister.us/weblog/2013/visions">Visions</a>
</li>
<li>
<span class="post-date">2013-02-28</span>
<a class="post-link" href="https://bannister.us/weblog/2013/puzzle-pieces-and-emotion">Puzzle pieces and emotion</a>
</li>
<li>
<span class="post-date">2012-03-17</span>
<a class="post-link" href="https://bannister.us/weblog/2012/another-lisp-flashback">Another Lisp flashback</a>
</li>
<li>
<span class="post-date">2012-03-13</span>
<a class="post-link" href="https://bannister.us/weblog/2012/predictable-ego-or-shotwell-is-a-piece-of-crap-and-priorities">Predictable ego - or "Shotwell" is a piece of crap - and priorities.</a>
</li>
<li>
<span class="post-date">2012-03-03</span>
<a class="post-link" href="https://bannister.us/weblog/2012/progress">Progress</a>
</li>
<li>
<span class="post-date">2012-02-01</span>
<a class="post-link" href="https://bannister.us/weblog/2012/mind-tricks">Mind tricks</a>
</li>
<li>
<span class="post-date">2011-10-25</span>
<a class="post-link" href="https://bannister.us/weblog/2011/when-in-doubt-confuse-the-innocent">When in doubt, confuse the innocent.</a>
</li>
<li>
<span class="post-date">2011-07-17</span>
<a class="post-link" href="https://bannister.us/weblog/2011/misplaced-music">Misplaced Music?</a>
</li>
<li>
<span class="post-date">2011-07-01</span>
<a class="post-link" href="https://bannister.us/weblog/2011/active-organizing-in-place-of-passive-participation">Active organizing in place of passive participation?</a>
</li>
<li>
<span class="post-date">2011-06-30</span>
<a class="post-link" href="https://bannister.us/weblog/2011/the-longevity-project">The Longevity Project</a>
</li>
<li>
<span class="post-date">2011-05-10</span>
<a class="post-link" href="https://bannister.us/weblog/2011/when-spending-time-with-doctors-and-hospitals-is-good-news">When spending time with doctors and hospitals is good news.</a>
</li>
<li>
<span class="post-date">2011-05-10</span>
<a class="post-link" href="https://bannister.us/weblog/2011/an-odd-insight-dyson-on-feynman">An odd insight - Dyson on Feynman</a>
</li>
<li>
<span class="post-date">2011-05-01</span>
<a class="post-link" href="https://bannister.us/weblog/2011/sex-is-cheap">Sex is cheap?</a>
</li>
<li>
<span class="post-date">2011-04-14</span>
<a class="post-link" href="https://bannister.us/weblog/2011/story-based-reasoning-and-interviews">Story based reasoning and interviews</a>
</li>
<li>
<span class="post-date">2011-04-14</span>
<a class="post-link" href="https://bannister.us/weblog/2011/segregation-partition-the-problem">Segregation - Partition the problem</a>
</li>
<li>
<span class="post-date">2011-04-14</span>
<a class="post-link" href="https://bannister.us/weblog/2011/firsts">Firsts</a>
</li>
<li>
<span class="post-date">2011-04-03</span>
<a class="post-link" href="https://bannister.us/weblog/2011/burning-man-isnt-anymore">Burning Man isn't - anymore</a>
</li>
<li>
<span class="post-date">2011-03-28</span>
<a class="post-link" href="https://bannister.us/weblog/2011/found-a-doctor-i-like-for-the-very-first-time">Found a doctor I like ... for the very first time</a>
</li>
<li>
<span class="post-date">2011-03-26</span>
<a class="post-link" href="https://bannister.us/weblog/2011/what-went-wrong-with-nuclear-power">What went wrong with nuclear power</a>
</li>
<li>
<span class="post-date">2011-03-18</span>
<a class="post-link" href="https://bannister.us/weblog/2011/very-pleased">Very pleased</a>
</li>
<li>
<span class="post-date">2011-02-05</span>
<a class="post-link" href="https://bannister.us/weblog/2011/what-is-an-efficient-free-market">What is an efficient "Free Market"?</a>
</li>
<li>
<span class="post-date">2011-02-04</span>
<a class="post-link" href="https://bannister.us/weblog/2011/not-correct-on-economics">That’s not correct (on economics)</a>
</li>
<li>
<span class="post-date">2011-02-02</span>
<a class="post-link" href="https://bannister.us/weblog/2011/the-end-of-the-world-and-we-do-not-care">The end of the world ... and we do not care.</a>
</li>
<li>
<span class="post-date">2011-02-01</span>
<a class="post-link" href="https://bannister.us/weblog/2011/example-of-certificate-creation-with-openssl">Example of certificate creation with OpenSSL</a>
</li>
<li>
<span class="post-date">2011-01-15</span>
<a class="post-link" href="https://bannister.us/weblog/2011/user-interface-fail-in-a-research-building">User interface fail - in a research building</a>
</li>
<li>
<span class="post-date">2011-01-15</span>
<a class="post-link" href="https://bannister.us/weblog/2011/scalable-democracy">Scalable democracy</a>
</li>
<li>
<span class="post-date">2010-12-31</span>
<a class="post-link" href="https://bannister.us/weblog/2010/corporate-rights">Corporate rights</a>
</li>
<li>
<span class="post-date">2010-12-06</span>
<a class="post-link" href="https://bannister.us/weblog/2010/how-to-make-a-perfect-omelet">How to make a perfect omelet</a>
</li>
<li>
<span class="post-date">2010-11-28</span>
<a class="post-link" href="https://bannister.us/weblog/2010/cable-companies-and-bad-software">Cable companies and bad software</a>
</li>
<li>
<span class="post-date">2010-11-26</span>
<a class="post-link" href="https://bannister.us/weblog/2010/practical-thermonuclear-power-at-small-scale">Practical thermonuclear power at small scale?</a>
</li>
<li>
<span class="post-date">2010-08-29</span>
<a class="post-link" href="https://bannister.us/weblog/2010/1867">Exciting!</a>
</li>
<li>
<span class="post-date">2010-08-14</span>
<a class="post-link" href="https://bannister.us/weblog/2010/strict-mode-for-javascript-continued">Strict mode for Javascript - continued</a>
</li>
<li>
<span class="post-date">2010-08-07</span>
<a class="post-link" href="https://bannister.us/weblog/2010/is-tivo-still-a-good-deal">Is Tivo still a good bet?</a>
</li>
<li>
<span class="post-date">2010-08-05</span>
<a class="post-link" href="https://bannister.us/weblog/2010/status-check">Status check</a>
</li>
<li>
<span class="post-date">2010-07-30</span>
<a class="post-link" href="https://bannister.us/weblog/2010/strict-mode-for-javascript">Strict mode for Javascript</a>
</li>
<li>
<span class="post-date">2010-07-29</span>
<a class="post-link" href="https://bannister.us/weblog/2010/perfect-pineapple-pizza">Perfect Pineapple Pizza</a>
</li>
<li>
<span class="post-date">2010-07-23</span>
<a class="post-link" href="https://bannister.us/weblog/2010/vodka-and-lime">Vodka and Lime</a>
</li>
<li>
<span class="post-date">2010-07-15</span>
<a class="post-link" href="https://bannister.us/weblog/2010/virtualbox-as-free-software">VirtualBox as free software</a>
</li>
<li>
<span class="post-date">2010-07-11</span>
<a class="post-link" href="https://bannister.us/weblog/2010/odds-and-ends-in-testing-with-active-directory">Odds and ends in testing with Active Directory</a>
</li>
<li>
<span class="post-date">2010-06-21</span>
<a class="post-link" href="https://bannister.us/weblog/2010/java-for-business-zinger-from-oracle">Java for Business = Zinger from Oracle</a>
</li>
<li>
<span class="post-date">2010-06-15</span>
<a class="post-link" href="https://bannister.us/weblog/2010/odd-fragment">Odd fragment</a>
</li>
<li>
<span class="post-date">2010-05-19</span>
<a class="post-link" href="https://bannister.us/weblog/2010/anachronisms-icon-for-save-is-a-floppy-hdtv-sized-in-inches">Anachronisms - Icon for "Save..." is a floppy, HDTV sized in inches</a>
</li>
<li>
<span class="post-date">2010-05-18</span>
<a class="post-link" href="https://bannister.us/weblog/2010/wordpress-hacked-again">WordPress hacked (again)</a>
</li>
<li>
<span class="post-date">2010-04-20</span>
<a class="post-link" href="https://bannister.us/weblog/2010/stepped-on-someones-gravy-train">Stepped on someone's gravy train?</a>
</li>
<li>
<span class="post-date">2010-04-17</span>
<a class="post-link" href="https://bannister.us/weblog/2010/odd-how-is-this-spam">Odd ... how is this spam?</a>
</li>
<li>
<span class="post-date">2010-04-15</span>
<a class="post-link" href="https://bannister.us/weblog/2010/rude-tax-time-gift-from-past-republicans">Rude tax-time gift from past Republicans</a>
</li>
<li>
<span class="post-date">2010-04-09</span>
<a class="post-link" href="https://bannister.us/weblog/2010/less-noise">Less noise</a>
</li>
<li>
<span class="post-date">2010-03-30</span>
<a class="post-link" href="https://bannister.us/weblog/2010/do-you-trust-oracle">Do you trust Oracle?</a>
</li>
<li>
<span class="post-date">2010-03-14</span>
<a class="post-link" href="https://bannister.us/weblog/2010/re-thinking-the-ide-a-starting-point">Re-thinking the IDE - a starting point</a>
</li>
<li>
<span class="post-date">2010-03-07</span>
<a class="post-link" href="https://bannister.us/weblog/2010/magnetic-propulsion">Magnetic propulsion?</a>
</li>
<li>
<span class="post-date">2010-03-03</span>
<a class="post-link" href="https://bannister.us/weblog/2010/using-gmail-for-mailto-links-in-ubuntu">Using GMail for mailto links in Ubuntu</a>
</li>
<li>
<span class="post-date">2010-02-23</span>
<a class="post-link" href="https://bannister.us/weblog/2010/between-marketing-and-engineering">Between Marketing and Engineering</a>
</li>
<li>
<span class="post-date">2010-01-30</span>
<a class="post-link" href="https://bannister.us/weblog/2010/multiplexed-fastcgi-connections">Multiplexed FastCGI connections?</a>
</li>
<li>
<span class="post-date">2010-01-16</span>
<a class="post-link" href="https://bannister.us/weblog/2010/giving-up-htmlw3c">Giving up HTML@W3C</a>
</li>
<li>
<span class="post-date">2010-01-15</span>
<a class="post-link" href="https://bannister.us/weblog/2010/efficient-utf-8-recoding-and-secure-processing">Efficient UTF-8 recoding and secure processing</a>
</li>
<li>
<span class="post-date">2010-01-11</span>
<a class="post-link" href="https://bannister.us/weblog/2010/utf8ucs-conversion-benchmark">UTF8/UCS conversion benchmark</a>
</li>
<li>
<span class="post-date">2010-01-07</span>
<a class="post-link" href="https://bannister.us/weblog/2010/musing-about-cumulative-impact">Musing about cumulative impact</a>
</li>
<li>
<span class="post-date">2009-12-30</span>
<a class="post-link" href="https://bannister.us/weblog/2009/status-as-invited-expert-in-html-working-group">... status as Invited Expert in HTML Working Group</a>
</li>
<li>
<span class="post-date">2009-12-29</span>
<a class="post-link" href="https://bannister.us/weblog/2009/almost-but-not-quite-server-side-javascript">Almost but not quite ... server-side JavaScript</a>
</li>
<li>
<span class="post-date">2009-12-23</span>
<a class="post-link" href="https://bannister.us/weblog/2009/wireless-network-and-linux">Wireless network and Linux</a>
</li>
<li>
<span class="post-date">2009-12-22</span>
<a class="post-link" href="https://bannister.us/weblog/2009/trie-in-java-revisited">Trie in Java - revisited</a>
</li>
<li>
<span class="post-date">2009-11-29</span>
<a class="post-link" href="https://bannister.us/weblog/2009/identifying-and-documenting-bugs-in-sun-java-printing">Identifying and documenting bugs in Sun Java Printing</a>
</li>
<li>
<span class="post-date">2009-11-19</span>
<a class="post-link" href="https://bannister.us/weblog/2009/apples-itunes-store-hacked">Apples iTunes store hacked?</a>
</li>
<li>
<span class="post-date">2009-11-09</span>
<a class="post-link" href="https://bannister.us/weblog/2009/shallow-or-deep">Shallow or deep?</a>
</li>
<li>
<span class="post-date">2009-11-07</span>
<a class="post-link" href="https://bannister.us/weblog/2009/gtk-bug-in-ubuntu-9-10">GTK bug in Ubuntu 9.10</a>
</li>
<li>
<span class="post-date">2009-10-27</span>
<a class="post-link" href="https://bannister.us/weblog/2009/moon-rocks-and-a-bit-of-math">Moon rocks and a bit of math</a>
</li>
<li>
<span class="post-date">2009-10-23</span>
<a class="post-link" href="https://bannister.us/weblog/2009/first-impressions-google-wave">First impressions - Google Wave</a>
</li>
<li>
<span class="post-date">2009-10-15</span>
<a class="post-link" href="https://bannister.us/weblog/2009/printerjob-pagedialog-in-java-is-broken">PrinterJob.pageDialog() in Java is broken?</a>
</li>
<li>
<span class="post-date">2009-10-04</span>
<a class="post-link" href="https://bannister.us/weblog/2009/example-general-purpose-trie-in-java">Example - general purpose Trie in Java</a>
</li>
<li>
<span class="post-date">2009-10-01</span>
<a class="post-link" href="https://bannister.us/weblog/2009/concurrency-and-threading-is-the-new-thing-again">Concurrency and threading is the new thing, again.</a>
</li>
<li>
<span class="post-date">2009-09-22</span>
<a class="post-link" href="https://bannister.us/weblog/2009/wall-street-journal-online">Wall Street Journal Online</a>
</li>
<li>
<span class="post-date">2009-09-22</span>
<a class="post-link" href="https://bannister.us/weblog/2009/businessweek-online">BusinessWeek Online</a>
</li>
<li>
<span class="post-date">2009-09-12</span>
<a class="post-link" href="https://bannister.us/weblog/2009/msnbc">MSNBC</a>
</li>
<li>
<span class="post-date">2009-09-02</span>
<a class="post-link" href="https://bannister.us/weblog/2009/when-hardware-guys-write-about-software">When hardware guys write about software</a>
</li>
<li>
<span class="post-date">2009-08-25</span>
<a class="post-link" href="https://bannister.us/weblog/2009/building-things">Building things</a>
</li>
<li>
<span class="post-date">2009-08-21</span>
<a class="post-link" href="https://bannister.us/weblog/2009/how-improve-both-oil-production-and-the-economy">How improve both oil production and the economy</a>
</li>
<li>
<span class="post-date">2009-08-17</span>
<a class="post-link" href="https://bannister.us/weblog/2009/extending-the-pearson-hash-function-to-larger-values">Extending the Pearson hash function to larger values</a>
</li>
<li>
<span class="post-date">2009-08-04</span>
<a class="post-link" href="https://bannister.us/weblog/2009/installing-pidgin-with-support-for-microsoft-im">Installing Pidgin with support for Microsoft IM</a>
</li>
<li>
<span class="post-date">2009-06-17</span>
<a class="post-link" href="https://bannister.us/weblog/2009/tigers-of-granularity">Tigers of Granularity</a>
</li>
<li>
<span class="post-date">2009-06-16</span>
<a class="post-link" href="https://bannister.us/weblog/2009/subversion-cvs-and-tags">Subversion, CVS, and tags</a>
</li>
<li>
<span class="post-date">2009-06-15</span>
<a class="post-link" href="https://bannister.us/weblog/2009/what-makes-for-global-competitiveness">What makes for "Global Competitiveness"?</a>
</li>
<li>
<span class="post-date">2009-05-21</span>
<a class="post-link" href="https://bannister.us/weblog/2009/video-from-our-local-registrar-of-voters">Video from our local Registrar of Voters</a>
</li>
<li>
<span class="post-date">2009-05-19</span>
<a class="post-link" href="https://bannister.us/weblog/2009/another-take-on-the-class-system">Another take on the class system</a>
</li>
<li>
<span class="post-date">2009-04-21</span>
<a class="post-link" href="https://bannister.us/weblog/2009/i-am-not-a-scientist">I am not a Scientist</a>
</li>
<li>
<span class="post-date">2009-04-17</span>
<a class="post-link" href="https://bannister.us/weblog/2009/kitchen-tips">kitchen tips</a>
</li>
<li>
<span class="post-date">2009-04-12</span>
<a class="post-link" href="https://bannister.us/weblog/2009/maybe-bill-gates-was-smarter-than-i-thought">Maybe Bill Gates was smarter than I thought?</a>
</li>
<li>
<span class="post-date">2009-04-10</span>
<a class="post-link" href="https://bannister.us/weblog/2009/sun-and-ibm">Sun and IBM</a>
</li>
<li>
<span class="post-date">2009-04-06</span>
<a class="post-link" href="https://bannister.us/weblog/2009/matrix-revisited">Matrix Revisited</a>
</li>
<li>
<span class="post-date">2009-04-05</span>
<a class="post-link" href="https://bannister.us/weblog/2009/where-does-capital-come-from">Where does "capital" come from?</a>
</li>
<li>
<span class="post-date">2009-03-30</span>
<a class="post-link" href="https://bannister.us/weblog/2009/lifelong-learners">Lifelong learners</a>
</li>
<li>
<span class="post-date">2009-03-29</span>
<a class="post-link" href="https://bannister.us/weblog/2009/rationalization-needed">Rationalization needed...</a>
</li>
<li>
<span class="post-date">2009-03-25</span>
<a class="post-link" href="https://bannister.us/weblog/2009/windows-2008-server">Windows 2008 Server</a>
</li>
<li>
<span class="post-date">2009-03-22</span>
<a class="post-link" href="https://bannister.us/weblog/2009/recovery-whiplash">Recovery whiplash?</a>
</li>
<li>
<span class="post-date">2009-03-21</span>
<a class="post-link" href="https://bannister.us/weblog/2009/hater">Hater</a>
</li>
<li>
<span class="post-date">2009-03-18</span>
<a class="post-link" href="https://bannister.us/weblog/2009/apple-netbook-or-not">Apple NetBook? Or not.</a>
</li>
<li>
<span class="post-date">2009-03-17</span>
<a class="post-link" href="https://bannister.us/weblog/2009/my-sister-and-spam">My sister and spam</a>
</li>
<li>
<span class="post-date">2009-03-16</span>
<a class="post-link" href="https://bannister.us/weblog/2009/xkcd-a-webcomic-students">Class nightmares</a>
</li>
<li>
<span class="post-date">2009-03-15</span>
<a class="post-link" href="https://bannister.us/weblog/2009/newspapers-obsolete">Newspapers = obsolete</a>
</li>
<li>
<span class="post-date">2009-03-14</span>
<a class="post-link" href="https://bannister.us/weblog/2009/better-living-through-chemistry">Better living through chemistry</a>
</li>
<li>
<span class="post-date">2009-03-08</span>
<a class="post-link" href="https://bannister.us/weblog/2009/trusting-trust">Trusting trust</a>
</li>
<li>
<span class="post-date">2009-03-08</span>
<a class="post-link" href="https://bannister.us/weblog/2009/subcutaneous-fat-and-global-resurgance">Subcutaneous fat, and global resurgance</a>
</li>
<li>
<span class="post-date">2009-03-08</span>
<a class="post-link" href="https://bannister.us/weblog/2009/my-google-android-phone">My Google Android phone</a>
</li>
<li>
<span class="post-date">2009-03-08</span>
<a class="post-link" href="https://bannister.us/weblog/2009/also-time-for-a-new-camera">Almost time for a new camera?</a>
</li>
<li>
<span class="post-date">2009-03-07</span>
<a class="post-link" href="https://bannister.us/weblog/2009/sound-troubles-on-ubuntu-810">Sound troubles on Ubuntu 8.10</a>
</li>
<li>
<span class="post-date">2009-03-04</span>
<a class="post-link" href="https://bannister.us/weblog/2009/sanity-check-too-much-talk-over-too-little-in-htmlw3c">Sanity check - too much talk over too little - in html@w3c</a>
</li>
<li>
<span class="post-date">2009-03-02</span>
<a class="post-link" href="https://bannister.us/weblog/2009/are-designers-stuck-in-a-rut">Are designers stuck in a rut?</a>
</li>
<li>
<span class="post-date">2009-03-01</span>
<a class="post-link" href="https://bannister.us/weblog/2009/professional-journalism-is-evil">Professional Journalism is Evil</a>
</li>
<li>
<span class="post-date">2009-02-27</span>
<a class="post-link" href="https://bannister.us/weblog/2009/can-a-modern-country-have-a-monarch">Can a modern country have a monarch?</a>
</li>
<li>
<span class="post-date">2009-02-27</span>
<a class="post-link" href="https://bannister.us/weblog/2009/absent-minded">Absent minded</a>
</li>
<li>
<span class="post-date">2009-02-22</span>
<a class="post-link" href="https://bannister.us/weblog/2009/guess-im-a-little-slow">Guess I'm a little slow...</a>
</li>
<li>
<span class="post-date">2009-02-21</span>
<a class="post-link" href="https://bannister.us/weblog/2009/how-to-get-started">How to get started?</a>
</li>
<li>
<span class="post-date">2009-02-16</span>
<a class="post-link" href="https://bannister.us/weblog/2009/making-pizza">Making pizza</a>
</li>
<li>
<span class="post-date">2009-02-16</span>
<a class="post-link" href="https://bannister.us/weblog/2009/disposable-appliances">Disposable appliances</a>
</li>
<li>
<span class="post-date">2009-02-12</span>
<a class="post-link" href="https://bannister.us/weblog/2009/questions-about-urban-architecture">Questions about urban architecture</a>
</li>
<li>
<span class="post-date">2009-02-10</span>
<a class="post-link" href="https://bannister.us/weblog/2009/dissonance">Dissonance</a>
</li>
<li>
<span class="post-date">2009-02-09</span>
<a class="post-link" href="https://bannister.us/weblog/2009/ten-years">Ten years</a>
</li>
<li>
<span class="post-date">2009-02-07</span>
<a class="post-link" href="https://bannister.us/weblog/2009/mathematics-is-metaphor">Mathematics is Metaphor</a>
</li>
<li>
<span class="post-date">2009-02-06</span>
<a class="post-link" href="https://bannister.us/weblog/2009/just-enough-security">Just enough "Security"</a>
</li>
<li>
<span class="post-date">2009-02-04</span>
<a class="post-link" href="https://bannister.us/weblog/2009/kcrw-jewish-public-radio">KCRW - Jewish Public Radio?</a>
</li>
<li>
<span class="post-date">2009-02-02</span>
<a class="post-link" href="https://bannister.us/weblog/2009/elegant-distributed-applications">Elegant distributed applications</a>
</li>
<li>
<span class="post-date">2009-02-01</span>
<a class="post-link" href="https://bannister.us/weblog/2009/long-term-compatible-protocols">Long-term compatible protocols</a>
</li>
<li>
<span class="post-date">2009-01-29</span>
<a class="post-link" href="https://bannister.us/weblog/2009/scripting-inspired-by-monad-for-unix">Scripting inspired by Monad - for Unix</a>
</li>
<li>
<span class="post-date">2009-01-25</span>
<a class="post-link" href="https://bannister.us/weblog/2009/rss-atom">RSS-Atom</a>
</li>
<li>
<span class="post-date">2009-01-16</span>
<a class="post-link" href="https://bannister.us/weblog/2009/sam-ruby-contributions-welcome">Sam Ruby - Contributions Welcome</a>
</li>
<li>
<span class="post-date">2009-01-15</span>
<a class="post-link" href="https://bannister.us/weblog/2009/malfunctioning-mindset-the-html5-working-group">Malfunctioning mindset - the HTML5 working group</a>
</li>
<li>
<span class="post-date">2009-01-03</span>
<a class="post-link" href="https://bannister.us/weblog/2009/vacation-200812">Vacation 2008.12</a>
</li>
<li>
<span class="post-date">2009-01-01</span>
<a class="post-link" href="https://bannister.us/weblog/2009/oops-tripping-over-a-math-problem">Oops? Tripping over a math problem.</a>
</li>
<li>
<span class="post-date">2008-12-29</span>
<a class="post-link" href="https://bannister.us/weblog/2008/mystery-houses-decrypted">Mystery houses decrypted!</a>
</li>
<li>
<span class="post-date">2008-12-28</span>
<a class="post-link" href="https://bannister.us/weblog/2008/gps-in-an-android-phone">GPS in an Android phone</a>
</li>
<li>
<span class="post-date">2008-12-20</span>
<a class="post-link" href="https://bannister.us/weblog/2008/performance-parsing-csv-data">Performance parsing CSV data</a>
</li>
<li>
<span class="post-date">2008-12-08</span>
<a class="post-link" href="https://bannister.us/weblog/2008/metaphors-and-reality">Metaphors and reality</a>
</li>
<li>
<span class="post-date">2008-12-05</span>
<a class="post-link" href="https://bannister.us/weblog/2008/the-other-tiger">The Other Tiger</a>
</li>
<li>
<span class="post-date">2008-12-02</span>
<a class="post-link" href="https://bannister.us/weblog/2008/isolating-the-ui-thread">Isolating the UI Thread</a>
</li>
<li>
<span class="post-date">2008-11-14</span>
<a class="post-link" href="https://bannister.us/weblog/2008/taxpayer-funded-bus-service-in-orange-county">Taxpayer-funded bus service in Orange County</a>
</li>
<li>
<span class="post-date">2008-11-14</span>
<a class="post-link" href="https://bannister.us/weblog/2008/microsoft-office-project-server">Microsoft Office Project Server</a>
</li>
<li>
<span class="post-date">2008-11-07</span>
<a class="post-link" href="https://bannister.us/weblog/2008/hosting-a-polling-place-in-orange-county-california">Hosting a polling place in Orange County, California</a>
</li>
<li>
<span class="post-date">2008-11-01</span>
<a class="post-link" href="https://bannister.us/weblog/2008/got-my-election-supplies-and-a-few-surprises">Got my election supplies, and a few surprises</a>
</li>
<li>
<span class="post-date">2008-10-28</span>
<a class="post-link" href="https://bannister.us/weblog/2008/hosting-the-local-polling-place">Hosting the local polling place</a>
</li>
<li>
<span class="post-date">2008-10-24</span>
<a class="post-link" href="https://bannister.us/weblog/2008/on-the-economy">On the Economy</a>
</li>
<li>
<span class="post-date">2008-10-15</span>
<a class="post-link" href="https://bannister.us/weblog/2008/filler">Filler</a>
</li>
<li>
<span class="post-date">2008-09-18</span>
<a class="post-link" href="https://bannister.us/weblog/2008/paper-size-and-user-interface-design">Paper size and user interface design</a>
</li>
<li>
<span class="post-date">2008-09-16</span>
<a class="post-link" href="https://bannister.us/weblog/2008/covering-a-use-case-for-many-screens">Covering a use-case for many screens</a>
</li>
<li>
<span class="post-date">2008-09-14</span>
<a class="post-link" href="https://bannister.us/weblog/2008/googles-chrome-bet-your-enterprise-on-it">Google's Chrome - Bet your enterprise on it</a>
</li>
<li>
<span class="post-date">2008-09-13</span>
<a class="post-link" href="https://bannister.us/weblog/2008/design-for-standard-screen-sizes">Design for standard screen sizes</a>
</li>
<li>
<span class="post-date">2008-08-28</span>
<a class="post-link" href="https://bannister.us/weblog/2008/jvm-invocation-the-sunjava-folk-screw-up-again">JVM invocation - the Sun/Java folk screw up again.</a>
</li>
<li>
<span class="post-date">2008-08-18</span>
<a class="post-link" href="https://bannister.us/weblog/2008/the-stock-file-open-dialog-is-wrong">The stock File Open dialog is wrong.</a>
</li>
<li>
<span class="post-date">2008-08-17</span>
<a class="post-link" href="https://bannister.us/weblog/2008/why-fileinputstream-is-slow-continued">Why FileInputStream is slow - continued</a>
</li>
<li>
<span class="post-date">2008-08-14</span>
<a class="post-link" href="https://bannister.us/weblog/2008/guilty-as-charged">Guilty as charged...</a>
</li>
<li>
<span class="post-date">2008-08-09</span>
<a class="post-link" href="https://bannister.us/weblog/2008/desktop-design-needs-a-kick-in-the-pants">Desktop design needs a kick in the pants</a>
</li>
<li>
<span class="post-date">2008-08-04</span>
<a class="post-link" href="https://bannister.us/weblog/2008/google-and-programming">Google and Programming</a>
</li>
<li>
<span class="post-date">2008-07-29</span>
<a class="post-link" href="https://bannister.us/weblog/2008/presidential-candidates-at-the-local-mega-church">Presidential candidates at the local mega-church</a>
</li>
<li>
<span class="post-date">2008-07-28</span>
<a class="post-link" href="https://bannister.us/weblog/2008/todays-surprise-applet-reload-does-not-sandbox">Today's surprise - applet reload does not sandbox</a>
</li>
<li>
<span class="post-date">2008-07-18</span>
<a class="post-link" href="https://bannister.us/weblog/2008/linus-is-a-bit-of-a-jerk">Linus is a bit of a jerk</a>
</li>
<li>
<span class="post-date">2008-07-15</span>
<a class="post-link" href="https://bannister.us/weblog/2008/swing-java-and-old-notions-not-yet-met">Swing, Java, and old notions not yet met</a>
</li>
<li>
<span class="post-date">2008-07-05</span>
<a class="post-link" href="https://bannister.us/weblog/2008/looking-for-a-good-breakfast-found-another-sysco-restaurant-instead">Looking for a good breakfast, found another Sysco restaurant instead.</a>
</li>
<li>
<span class="post-date">2008-06-21</span>
<a class="post-link" href="https://bannister.us/weblog/2008/why-fileinputstream-is-slow">Why FileInputStream is slow.</a>
</li>
<li>
<span class="post-date">2008-06-17</span>
<a class="post-link" href="https://bannister.us/weblog/2008/wide-finder-2-over-to-the-dark-side">Wide Finder 2 - over to the dark side</a>
</li>
<li>
<span class="post-date">2008-06-12</span>
<a class="post-link" href="https://bannister.us/weblog/2008/wrapping-up-wide-finder-2">Wrapping up Wide Finder 2</a>
</li>
<li>
<span class="post-date">2008-06-11</span>
<a class="post-link" href="https://bannister.us/weblog/2008/wide-finder-final-result">Wide finder - final result</a>
</li>
<li>
<span class="post-date">2008-06-11</span>
<a class="post-link" href="https://bannister.us/weblog/2008/wide-finder-combine-for-top-n">Wide finder - combine for top N</a>
</li>
<li>
<span class="post-date">2008-06-10</span>
<a class="post-link" href="https://bannister.us/weblog/2008/propertyimport-task-for-ant">property.import task for Ant</a>
</li>
<li>
<span class="post-date">2008-06-09</span>
<a class="post-link" href="https://bannister.us/weblog/2008/wide-finder-combine-and-sort">Wide finder - combine and sort</a>
</li>
<li>
<span class="post-date">2008-06-07</span>
<a class="post-link" href="https://bannister.us/weblog/2008/wide-finder-first-round">Wide finder - first round</a>
</li>
<li>
<span class="post-date">2008-06-06</span>
<a class="post-link" href="https://bannister.us/weblog/2008/sun-and-tools">Sun and tools</a>
</li>
<li>
<span class="post-date">2008-05-31</span>
<a class="post-link" href="https://bannister.us/weblog/2008/received-a-microsoft-office-xml-document">Received a Microsoft Office XML document...</a>
</li>
<li>
<span class="post-date">2008-05-31</span>
<a class="post-link" href="https://bannister.us/weblog/2008/reality-check">Reality check</a>
</li>
<li>
<span class="post-date">2008-05-31</span>
<a class="post-link" href="https://bannister.us/weblog/2008/breaking-the-cell-phone-deadlock">Breaking the cell-phone deadlock</a>
</li>
<li>
<span class="post-date">2008-05-31</span>
<a class="post-link" href="https://bannister.us/weblog/2008/another-reason-for-open-document-formats">Another reason for "open" document formats</a>
</li>
<li>
<span class="post-date">2008-05-31</span>
<a class="post-link" href="https://bannister.us/weblog/2008/accessibility-and-html">Accessibility and HTML</a>
</li>
<li>
<span class="post-date">2008-05-30</span>
<a class="post-link" href="https://bannister.us/weblog/2008/not-so-much-electromagnetic-noise">Not so much (electromagnetic) noise?</a>
</li>
<li>
<span class="post-date">2008-05-30</span>
<a class="post-link" href="https://bannister.us/weblog/2008/is-iis-still-as-relevant">Is IIS still (as) relevant?</a>
</li>
<li>
<span class="post-date">2008-05-30</span>
<a class="post-link" href="https://bannister.us/weblog/2008/altwaste">alt="waste"</a>
</li>
<li>
<span class="post-date">2008-04-28</span>
<a class="post-link" href="https://bannister.us/weblog/2008/autoconfig">Autoconfig</a>
</li>
<li>
<span class="post-date">2008-04-21</span>
<a class="post-link" href="https://bannister.us/weblog/2008/jfc-swing-and-software-entrophy">JFC Swing and software entrophy</a>
</li>
<li>
<span class="post-date">2008-04-12</span>
<a class="post-link" href="https://bannister.us/weblog/2008/a-bit-of-pre-historic-for-the-internet-history">A bit of pre-historic (for the Internet) history</a>
</li>
<li>
<span class="post-date">2008-03-21</span>
<a class="post-link" href="https://bannister.us/weblog/2008/one-guys-take-on-the-iphone-user-interface">One guy's take on the iPhone user interface</a>
</li>
<li>
<span class="post-date">2008-03-20</span>
<a class="post-link" href="https://bannister.us/weblog/2008/convert-at-the-edges">Convert at the edges</a>
</li>
<li>
<span class="post-date">2008-03-07</span>
<a class="post-link" href="https://bannister.us/weblog/2008/a-pleasant-surprise">A pleasant surprise</a>
</li>
<li>
<span class="post-date">2008-02-24</span>
<a class="post-link" href="https://bannister.us/weblog/2008/good-design-and-connecting-the-dots">Good design, and connecting the dots</a>
</li>
<li>
<span class="post-date">2008-02-23</span>
<a class="post-link" href="https://bannister.us/weblog/2008/good-places-to-eat-on-the-i-70-in-utah">Good places to eat on the I-70 in Utah</a>
</li>
<li>
<span class="post-date">2008-02-22</span>
<a class="post-link" href="https://bannister.us/weblog/2008/white-box-programming">White box programming</a>
</li>
<li>
<span class="post-date">2008-02-17</span>
<a class="post-link" href="https://bannister.us/weblog/2008/fun-with-iis-51-on-windows-xp">Fun with IIS 5.1 on Windows XP</a>
</li>
<li>
<span class="post-date">2008-02-04</span>
<a class="post-link" href="https://bannister.us/weblog/2008/the-republicans-are-in-deep-trouble">The Republicans are in deep trouble!</a>
</li>
<li>
<span class="post-date">2008-01-22</span>
<a class="post-link" href="https://bannister.us/weblog/2008/doctype-works">DOCTYPE works</a>
</li>
<li>
<span class="post-date">2008-01-17</span>
<a class="post-link" href="https://bannister.us/weblog/2008/xkcd-a-webcomic-of-romance-sarcasm-math-and-language-by-randall-munroe">Point of view</a>
</li>
<li>
<span class="post-date">2008-01-06</span>
<a class="post-link" href="https://bannister.us/weblog/2008/cache-valley-cheese">Cache Valley Cheese</a>
</li>
<li>
<span class="post-date">2008-01-02</span>
<a class="post-link" href="https://bannister.us/weblog/2008/this-is-still-bugging-me">This is still bugging me...</a>
</li>
<li>
<span class="post-date">2007-12-27</span>
<a class="post-link" href="https://bannister.us/weblog/2007/why-ie8-needs-html-402">Why IE8 needs HTML 4.02</a>
</li>
<li>
<span class="post-date">2007-12-25</span>
<a class="post-link" href="https://bannister.us/weblog/2007/in-future">In future...</a>
</li>
<li>
<span class="post-date">2007-12-05</span>
<a class="post-link" href="https://bannister.us/weblog/2007/from-my-daughters-last-soccer-game">From my daughter's last soccer game</a>
</li>
<li>
<span class="post-date">2007-11-29</span>
<a class="post-link" href="https://bannister.us/weblog/2007/wrapping-up-wide-finder">Wrapping up "Wide Finder"</a>
</li>
<li>
<span class="post-date">2007-11-21</span>
<a class="post-link" href="https://bannister.us/weblog/2007/what-you-need-for-a-wide-finder-and-no-more">What you need for a "Wide Finder", and no more.</a>
</li>
<li>
<span class="post-date">2007-11-20</span>
<a class="post-link" href="https://bannister.us/weblog/2007/sitemap-protocol">Sitemap Protocol</a>
</li>
<li>
<span class="post-date">2007-11-20</span>
<a class="post-link" href="https://bannister.us/weblog/2007/dumb-software-design-overloading-windows-startup">Dumb software design - overloading Windows Startup</a>
</li>
<li>
<span class="post-date">2007-11-13</span>
<a class="post-link" href="https://bannister.us/weblog/2007/netbeans-love-hate">Netbeans love-hate</a>
</li>
<li>
<span class="post-date">2007-11-13</span>
<a class="post-link" href="https://bannister.us/weblog/2007/i-want-my-itv">I Want My iTV</a>
</li>
<li>
<span class="post-date">2007-11-13</span>
<a class="post-link" href="https://bannister.us/weblog/2007/dumb-gui-design-a-micro-example">Dumb GUI example - menubars</a>
</li>
<li>
<span class="post-date">2007-11-11</span>
<a class="post-link" href="https://bannister.us/weblog/2007/the-wide-finder-project">The Wide Finder Project</a>
</li>
<li>
<span class="post-date">2007-10-31</span>
<a class="post-link" href="https://bannister.us/weblog/2007/using-eclipse-to-improve-netbeans">Using Eclipse to improve NetBeans</a>
</li>
<li>
<span class="post-date">2007-10-28</span>
<a class="post-link" href="https://bannister.us/weblog/2007/point-of-view">Point of view</a>
</li>
<li>
<span class="post-date">2007-10-28</span>
<a class="post-link" href="https://bannister.us/weblog/2007/eating-my-words">Eating my words</a>
</li>
<li>
<span class="post-date">2007-10-21</span>
<a class="post-link" href="https://bannister.us/weblog/2007/wildfires">Wildfires</a>
</li>
<li>
<span class="post-date">2007-10-19</span>
<a class="post-link" href="https://bannister.us/weblog/2007/trackerd-and-ubuntu-710">trackerd and Ubuntu 7.10</a>
</li>
<li>
<span class="post-date">2007-10-18</span>
<a class="post-link" href="https://bannister.us/weblog/2007/product-activation-corel-just-lost-a-customer">Product activation - Corel just lost a customer</a>
</li>
<li>
<span class="post-date">2007-10-11</span>
<a class="post-link" href="https://bannister.us/weblog/2007/css-gone-wrong-javanet">CSS gone wrong - java.net</a>
</li>
<li>
<span class="post-date">2007-10-07</span>
<a class="post-link" href="https://bannister.us/weblog/2007/why-some-schools-do-better-than-others">Why some schools do better than others</a>
</li>
<li>
<span class="post-date">2007-09-15</span>
<a class="post-link" href="https://bannister.us/weblog/2007/hot-memory">Hot memory</a>
</li>
<li>
<span class="post-date">2007-08-31</span>
<a class="post-link" href="https://bannister.us/weblog/2007/taxpayer-bailout-for-sub-prime-investors">Taxpayer bailout for sub-prime investors</a>
</li>
<li>
<span class="post-date">2007-08-28</span>
<a class="post-link" href="https://bannister.us/weblog/2007/where-the-wild-things-are">Where The Wild Things Are</a>
</li>
<li>
<span class="post-date">2007-08-28</span>
<a class="post-link" href="https://bannister.us/weblog/2007/not-the-definition-of-lean">Not the definition of "lean"</a>
</li>
<li>
<span class="post-date">2007-08-16</span>
<a class="post-link" href="https://bannister.us/weblog/2007/user-centered-social-networks">User centered social networks</a>
</li>
<li>
<span class="post-date">2007-08-07</span>
<a class="post-link" href="https://bannister.us/weblog/2007/tanzanian-tech-support">Tanzanian Tech Support</a>
</li>
<li>
<span class="post-date">2007-08-02</span>
<a class="post-link" href="https://bannister.us/weblog/2007/security-flaws-e-voting-and-reform">Security flaws, e-voting, and reform</a>
</li>
<li>
<span class="post-date">2007-08-02</span>
<a class="post-link" href="https://bannister.us/weblog/2007/java-fear-of-commitment">Java’s Fear of Commitment</a>
</li>
<li>
<span class="post-date">2007-07-27</span>
<a class="post-link" href="https://bannister.us/weblog/2007/trillion-dollar-man">Trillion Dollar Man</a>
</li>
<li>
<span class="post-date">2007-07-27</span>
<a class="post-link" href="https://bannister.us/weblog/2007/iphone-use-disappoints-apple-slides">iPhone Use Disappoints; Apple Slides</a>
</li>
<li>
<span class="post-date">2007-07-23</span>
<a class="post-link" href="https://bannister.us/weblog/2007/fewer-mediocre-journalists-is-good-news">Fewer mediocre "journalists" is good news</a>
</li>
<li>
<span class="post-date">2007-07-22</span>
<a class="post-link" href="https://bannister.us/weblog/2007/oc-sheriff-is-denied-use-of-law-enforcement-data">O.C. sheriff is denied use of law enforcement data</a>
</li>
<li>
<span class="post-date">2007-07-22</span>
<a class="post-link" href="https://bannister.us/weblog/2007/example-of-configuring-trac-and-subversion-on-ubuntu">Example of configuring Trac and Subversion on Ubuntu</a>
</li>
<li>
<span class="post-date">2007-07-10</span>
<a class="post-link" href="https://bannister.us/weblog/2007/80211g-netgear-flaked-out-80211n-netgear-not-better">802.11g (NetGear) flaked out, 802.11n (NetGear) not better.</a>
</li>
<li>
<span class="post-date">2007-06-30</span>
<a class="post-link" href="https://bannister.us/weblog/2007/what-to-make-of-this">What to make of this?</a>
</li>
<li>
<span class="post-date">2007-06-30</span>
<a class="post-link" href="https://bannister.us/weblog/2007/organized-violence">Organized violence</a>
</li>
<li>
<span class="post-date">2007-06-19</span>
<a class="post-link" href="https://bannister.us/weblog/2007/must-be-upgrade-time">Must be upgrade time...</a>
</li>
<li>
<span class="post-date">2007-06-16</span>
<a class="post-link" href="https://bannister.us/weblog/2007/hijacked">Hijacked?</a>
</li>
<li>
<span class="post-date">2007-06-14</span>
<a class="post-link" href="https://bannister.us/weblog/2007/caught-in-the-dreamhost-security-breach">Caught in the DreamHost(?) security breach</a>
</li>
<li>
<span class="post-date">2007-06-14</span>
<a class="post-link" href="https://bannister.us/weblog/2007/50-year-old-car-unburied">50-year-old car unburied</a>
</li>
<li>
<span class="post-date">2007-06-13</span>
<a class="post-link" href="https://bannister.us/weblog/2007/mapping-components-javascript">Mapping components - Javascript</a>
</li>
<li>
<span class="post-date">2007-06-13</span>
<a class="post-link" href="https://bannister.us/weblog/2007/examples">examples</a>
</li>
<li>
<span class="post-date">2007-06-13</span>
<a class="post-link" href="https://bannister.us/weblog/2007/auto-adjusting-sizer-javascript">Auto-adjusting sizer - Javascript</a>
</li>
<li>
<span class="post-date">2007-06-11</span>
<a class="post-link" href="https://bannister.us/weblog/2007/safari-on-windows">Safari on Windows!</a>
</li>
<li>
<span class="post-date">2007-06-09</span>
<a class="post-link" href="https://bannister.us/weblog/2007/bouncing-json-requests-javascript">Bouncing JSON requests - Javascript</a>
</li>
<li>
<span class="post-date">2007-06-08</span>
<a class="post-link" href="https://bannister.us/weblog/2007/simple-base64-encodedecode-javascript">Simple Base64 encode/decode - Javascript</a>
</li>
<li>
<span class="post-date">2007-06-08</span>
<a class="post-link" href="https://bannister.us/weblog/2007/reading-parameters-from-url-javascript">Reading parameters from URL - Javascript</a>
</li>
<li>
<span class="post-date">2007-06-08</span>
<a class="post-link" href="https://bannister.us/weblog/2007/reading-and-saving-cookies-javascript">Reading and saving cookies - Javascript</a>
</li>
<li>
<span class="post-date">2007-05-26</span>
<a class="post-link" href="https://bannister.us/weblog/2007/sister-brother">sister & brother</a>
</li>
<li>
<span class="post-date">2007-05-25</span>
<a class="post-link" href="https://bannister.us/weblog/2007/impostor-outwits-stanford">Impostor outwits Stanford</a>
</li>
<li>
<span class="post-date">2007-05-16</span>
<a class="post-link" href="https://bannister.us/weblog/2007/semantics-ai-and-the-web">Semantics, AI, and the Web</a>
</li>
<li>
<span class="post-date">2007-05-16</span>
<a class="post-link" href="https://bannister.us/weblog/2007/giuliani-on-freedom-and-authority">Giuliani on freedom and authority</a>
</li>
<li>
<span class="post-date">2007-05-13</span>
<a class="post-link" href="https://bannister.us/weblog/2007/microsofts-last-grasp">Microsoft's last grasp</a>
</li>
<li>
<span class="post-date">2007-05-11</span>
<a class="post-link" href="https://bannister.us/weblog/2007/are-political-parties-the-problem">Are political parties the problem?</a>
</li>
<li>
<span class="post-date">2007-05-04</span>
<a class="post-link" href="https://bannister.us/weblog/2007/programming-for-the-web-javascript">Programming for the web - Javascript</a>
</li>
<li>
<span class="post-date">2007-05-04</span>
<a class="post-link" href="https://bannister.us/weblog/2007/html-at-the-w3c">HTML at the W3C</a>
</li>
<li>
<span class="post-date">2007-05-03</span>
<a class="post-link" href="https://bannister.us/weblog/2007/code-talkers">Code Talkers</a>
</li>
<li>
<span class="post-date">2007-04-29</span>
<a class="post-link" href="https://bannister.us/weblog/2007/more-reliable-voting">More reliable voting</a>
</li>
<li>
<span class="post-date">2007-04-26</span>
<a class="post-link" href="https://bannister.us/weblog/2007/getting-the-issues-with-e-voting-completely-wrong">Getting the issues with "e-voting" completely wrong</a>
</li>
<li>
<span class="post-date">2007-04-20</span>
<a class="post-link" href="https://bannister.us/weblog/2007/either-a-comedy-or-a-tragedy">Either a comedy or a tragedy</a>
</li>
<li>
<span class="post-date">2007-04-17</span>
<a class="post-link" href="https://bannister.us/weblog/2007/spreadsheets-and-javascript">Spreadsheets and Javascript</a>
</li>
<li>
<span class="post-date">2007-04-16</span>
<a class="post-link" href="https://bannister.us/weblog/2007/point-of-view-and-w3c-html">Point of view and W3C HTML</a>
</li>
<li>
<span class="post-date">2007-04-07</span>
<a class="post-link" href="https://bannister.us/weblog/2007/on-selling-music">On Selling Music</a>
</li>
<li>
<span class="post-date">2007-04-06</span>
<a class="post-link" href="https://bannister.us/weblog/2007/yet-another-json-implementation-in-javascript">Yet another JSON implementation - Javascript</a>
</li>
<li>
<span class="post-date">2007-03-28</span>
<a class="post-link" href="https://bannister.us/weblog/2007/rest-should-not-be-uniform">REST should not be "uniform"</a>
</li>
<li>
<span class="post-date">2007-03-28</span>
<a class="post-link" href="https://bannister.us/weblog/2007/making-sense-of-social-capital">Making sense of "Social Capital"?</a>
</li>
<li>
<span class="post-date">2007-03-28</span>
<a class="post-link" href="https://bannister.us/weblog/2007/acm-is-sooo-twenty-years-old">ACM is sooo twenty years ago ...</a>
</li>
<li>
<span class="post-date">2007-03-27</span>
<a class="post-link" href="https://bannister.us/weblog/2007/spinning-a-story">Spinning a story</a>
</li>
<li>
<span class="post-date">2007-03-23</span>
<a class="post-link" href="https://bannister.us/weblog/2007/sun-is-cool">Sun is cool</a>
</li>
<li>
<span class="post-date">2007-03-19</span>
<a class="post-link" href="https://bannister.us/weblog/2007/fuzzy-worlds">Fuzzy worlds</a>
</li>
<li>
<span class="post-date">2007-03-14</span>
<a class="post-link" href="https://bannister.us/weblog/2007/clarifying-html">Clarifying HTML</a>
</li>
<li>
<span class="post-date">2007-03-10</span>
<a class="post-link" href="https://bannister.us/weblog/2007/abstraction">Abstraction</a>
</li>
<li>
<span class="post-date">2007-03-09</span>
<a class="post-link" href="https://bannister.us/weblog/2007/ghost-town">Ghost town</a>
</li>
<li>
<span class="post-date">2007-03-08</span>
<a class="post-link" href="https://bannister.us/weblog/2007/sudoku">Sudoku</a>
</li>
<li>
<span class="post-date">2007-03-07</span>
<a class="post-link" href="https://bannister.us/weblog/2007/power-failure">Power failure</a>
</li>
<li>
<span class="post-date">2007-03-06</span>
<a class="post-link" href="https://bannister.us/weblog/2007/publish-or-perish">Publish or Perish</a>
</li>
<li>
<span class="post-date">2007-03-06</span>
<a class="post-link" href="https://bannister.us/weblog/2007/connecting-the-dots-ubuntu-and-java">Connecting the dots - Ubuntu and Java</a>
</li>
<li>
<span class="post-date">2007-02-25</span>
<a class="post-link" href="https://bannister.us/weblog/2007/why-buy-new-server-versions-of-windows">Why buy new server versions of Windows?</a>
</li>
<li>
<span class="post-date">2007-02-23</span>
<a class="post-link" href="https://bannister.us/weblog/2007/structured-documents-dita-docbook-and-wikis">Structured documents, DITA, DocBook, and Wikis</a>
</li>
<li>
<span class="post-date">2007-02-22</span>
<a class="post-link" href="https://bannister.us/weblog/2007/openid-is-a-big-win">OpenID is a big win</a>
</li>
<li>
<span class="post-date">2007-02-21</span>
<a class="post-link" href="https://bannister.us/weblog/2007/groundswell-means-what">Groundswell - means what?</a>
</li>
<li>
<span class="post-date">2007-02-20</span>
<a class="post-link" href="https://bannister.us/weblog/2007/frustrated-with-wysiwyg-document-editors">Frustrated with WYSIWYG document editors</a>
</li>
<li>
<span class="post-date">2007-02-16</span>
<a class="post-link" href="https://bannister.us/weblog/2007/introducing-rdfa-or-re-implementing-lisp-kinda">Introducing RDFa - or re-implementing Lisp, kinda</a>
</li>
<li>
<span class="post-date">2007-02-16</span>
<a class="post-link" href="https://bannister.us/weblog/2007/benchmarking-and-fastcgi">Benchmarking and FastCGI</a>
</li>
<li>
<span class="post-date">2007-02-14</span>
<a class="post-link" href="https://bannister.us/weblog/2007/microformats-revisited">microformats revisited</a>
</li>
<li>
<span class="post-date">2007-02-14</span>
<a class="post-link" href="https://bannister.us/weblog/2007/bitfrost-for-olpc-the-revenge-of-microsoft-bob">Bitfrost for OLPC - The revenge of Microsoft Bob</a>
</li>
<li>
<span class="post-date">2007-02-09</span>
<a class="post-link" href="https://bannister.us/weblog/2007/orange-juice">A bit of insight into local politics</a>
</li>
<li>
<span class="post-date">2007-02-07</span>
<a class="post-link" href="https://bannister.us/weblog/2007/other-reasons-cost-overrun">Other reasons cost overrun</a>
</li>
<li>
<span class="post-date">2007-01-31</span>
<a class="post-link" href="https://bannister.us/weblog/2007/buildix-alternate-download">Buildix alternate download</a>
</li>
<li>
<span class="post-date">2007-01-24</span>
<a class="post-link" href="https://bannister.us/weblog/2007/wikipedia-gets-it-wrong-badly">Wikipedia gets it wrong (badly)</a>
</li>
<li>
<span class="post-date">2007-01-21</span>
<a class="post-link" href="https://bannister.us/weblog/2007/net-neutrality-put-simply">Net Neutrality - put simply</a>
</li>
<li>
<span class="post-date">2007-01-21</span>
<a class="post-link" href="https://bannister.us/weblog/2007/how-to-boost-the-birth-rate">How to boost the birth rate</a>
</li>
<li>
<span class="post-date">2007-01-21</span>
<a class="post-link" href="https://bannister.us/weblog/2007/first-impressions-visual-studio-2005">First impressions - Visual Studio 2005</a>
</li>
<li>
<span class="post-date">2007-01-20</span>
<a class="post-link" href="https://bannister.us/weblog/2007/not-the-intended-effect">Not the intended effect?</a>
</li>
<li>
<span class="post-date">2007-01-15</span>
<a class="post-link" href="https://bannister.us/weblog/2007/near-an-inflection-point-solid-state-disk">Near an inflection point - solid state disk</a>
</li>
<li>
<span class="post-date">2007-01-12</span>
<a class="post-link" href="https://bannister.us/weblog/2007/reading-your-mail">Reading your mail</a>
</li>
<li>
<span class="post-date">2007-01-12</span>
<a class="post-link" href="https://bannister.us/weblog/2007/asymmetric-warfare-and-how-to-boil-a-frog">Asymmetric warfare and how to boil a frog</a>
</li>
<li>
<span class="post-date">2007-01-12</span>
<a class="post-link" href="https://bannister.us/weblog/2007/2007-and-ending-needless-repetition">2007 and ending needless repetition</a>
</li>
<li>
<span class="post-date">2007-01-01</span>
<a class="post-link" href="https://bannister.us/weblog/2007/remove-before-flight">Remove before flight</a>
</li>
<li>
<span class="post-date">2007-01-01</span>
<a class="post-link" href="https://bannister.us/weblog/2007/mersenne-twister-random-number-generator">Mersenne twister - random number generator</a>
</li>
<li>
<span class="post-date">2007-01-01</span>
<a class="post-link" href="https://bannister.us/weblog/2007/how-not-to-introduce-your-project">How not to introduce your project</a>
</li>
<li>
<span class="post-date">2006-12-29</span>
<a class="post-link" href="https://bannister.us/weblog/2006/do-web-server-log-return-useful-information-anymore">Do web server logs return useful information, anymore?</a>
</li>
<li>
<span class="post-date">2006-12-29</span>
<a class="post-link" href="https://bannister.us/weblog/2006/department-of-homeland-insecurity">Department of Homeland (in)Security</a>
</li>
<li>
<span class="post-date">2006-12-28</span>
<a class="post-link" href="https://bannister.us/weblog/2006/whatwg-what-for">WHATWG - What for?</a>
</li>
<li>
<span class="post-date">2006-12-26</span>
<a class="post-link" href="https://bannister.us/weblog/2006/the-sheriffs-revenge">The Sheriff's Revenge</a>
</li>
<li>
<span class="post-date">2006-12-26</span>
<a class="post-link" href="https://bannister.us/weblog/2006/got-to-be-embarassing">Got to be embarassing...</a>
</li>
<li>
<span class="post-date">2006-12-26</span>
<a class="post-link" href="https://bannister.us/weblog/2006/clueless-congressmans-staffer-solicits-a-hacker">Clueless Congressman's staffer solicits a "Hacker"</a>
</li>
<li>
<span class="post-date">2006-12-22</span>
<a class="post-link" href="https://bannister.us/weblog/2006/another-fastcgi-install-script">Another FastCGI install script</a>
</li>
<li>
<span class="post-date">2006-12-18</span>
<a class="post-link" href="https://bannister.us/weblog/2006/revisiting-server-side-javascript">Revisiting server-side Javascript</a>
</li>
<li>
<span class="post-date">2006-12-17</span>
<a class="post-link" href="https://bannister.us/weblog/2006/hydraulic-clutch-google-patents">HYDRAULIC CLUTCH - Google Patents</a>
</li>
<li>
<span class="post-date">2006-12-12</span>
<a class="post-link" href="https://bannister.us/weblog/2006/what-are-xforms">What Are XForms?</a>
</li>
<li>
<span class="post-date">2006-12-09</span>
<a class="post-link" href="https://bannister.us/weblog/2006/688">Weddings</a>
</li>
<li>
<span class="post-date">2006-12-06</span>
<a class="post-link" href="https://bannister.us/weblog/2006/prelude-to-internal-passports">Prelude to internal passports?</a>
</li>
<li>
<span class="post-date">2006-12-04</span>
<a class="post-link" href="https://bannister.us/weblog/2006/your-cell-phone-can-be-a-remotely-controlled-microphone">Your cell phone can be a remotely controlled microphone...</a>
</li>
<li>
<span class="post-date">2006-12-02</span>
<a class="post-link" href="https://bannister.us/weblog/2006/ten-mens-fashion-essentials">Ten Men's Fashion Essentials</a>
</li>
<li>
<span class="post-date">2006-12-02</span>
<a class="post-link" href="https://bannister.us/weblog/2006/in-class-warfare-guess-which-class-is-winning">In Class Warfare, Guess Which Class Is Winning</a>
</li>
<li>
<span class="post-date">2006-12-02</span>
<a class="post-link" href="https://bannister.us/weblog/2006/a-small-item">A small item</a>
</li>
<li>
<span class="post-date">2006-12-01</span>
<a class="post-link" href="https://bannister.us/weblog/2006/traces">Traces</a>
</li>
<li>
<span class="post-date">2006-11-23</span>
<a class="post-link" href="https://bannister.us/weblog/2006/insecurity-on-911-no-surprise">Insecurity on 9/11 no surprise</a>
</li>
<li>
<span class="post-date">2006-11-19</span>
<a class="post-link" href="https://bannister.us/weblog/2006/more-about-how-votes-are-collected">More about how votes are collected</a>
</li>
<li>
<span class="post-date">2006-11-18</span>
<a class="post-link" href="https://bannister.us/weblog/2006/making-politics-more-local">Making politics more local?</a>
</li>
<li>
<span class="post-date">2006-11-16</span>
<a class="post-link" href="https://bannister.us/weblog/2006/get-out-of-washington-use-the-internet">Get out of Washington - use the Internet</a>
</li>
<li>
<span class="post-date">2006-11-16</span>
<a class="post-link" href="https://bannister.us/weblog/2006/bush-in-vietnam">Bush in Vietnam</a>
</li>
<li>
<span class="post-date">2006-11-14</span>
<a class="post-link" href="https://bannister.us/weblog/2006/lip-syncing-to-romanian-disco">Lip-syncing to Romanian disco</a>
</li>
<li>
<span class="post-date">2006-11-12</span>
<a class="post-link" href="https://bannister.us/weblog/2006/missing-absentee-ballots-error-or-malice">Missing absentee ballots - error or malice?</a>
</li>
<li>
<span class="post-date">2006-11-10</span>
<a class="post-link" href="https://bannister.us/weblog/2006/server-side-parsing-of-html-to-dom">Server-side parsing of HTML to DOM</a>
</li>
<li>
<span class="post-date">2006-11-10</span>
<a class="post-link" href="https://bannister.us/weblog/2006/diet-and-nutrition">Diet and Nutrition</a>
</li>
<li>
<span class="post-date">2006-11-08</span>
<a class="post-link" href="https://bannister.us/weblog/2006/adobe-mozilla-and-tamarin">Adobe, Mozilla, and Tamarin</a>
</li>
<li>
<span class="post-date">2006-11-06</span>
<a class="post-link" href="https://bannister.us/weblog/2006/election-day-lots-on-the-ballot">Election day - lots on the ballot</a>
</li>
<li>
<span class="post-date">2006-11-03</span>
<a class="post-link" href="https://bannister.us/weblog/2006/wrong-and-right-fats-over-thinking-the-problem">Wrong and Right fats - over-thinking the problem?</a>
</li>
<li>
<span class="post-date">2006-10-31</span>
<a class="post-link" href="https://bannister.us/weblog/2006/slightly-broken-weblog-and-inspiration">Slightly broken weblog ... and inspiration</a>
</li>
<li>
<span class="post-date">2006-10-28</span>
<a class="post-link" href="https://bannister.us/weblog/2006/two-for-one">Two for one</a>
</li>
<li>
<span class="post-date">2006-10-28</span>
<a class="post-link" href="https://bannister.us/weblog/2006/pity-the-average-user">Pity the "average" user</a>
</li>
<li>
<span class="post-date">2006-10-26</span>
<a class="post-link" href="https://bannister.us/weblog/2006/if-drugs-were-legal-google-video">If Drugs Were Legal - Google Video</a>
</li>
<li>
<span class="post-date">2006-10-26</span>
<a class="post-link" href="https://bannister.us/weblog/2006/i-hate-cell-phone-companies">I hate cell phone companies.</a>
</li>
<li>
<span class="post-date">2006-10-26</span>
<a class="post-link" href="https://bannister.us/weblog/2006/better-schools-make-sure-of-what-you-measure">Better schools - make sure of what you measure</a>
</li>
<li>
<span class="post-date">2006-10-15</span>
<a class="post-link" href="https://bannister.us/weblog/2006/ucsd-students-fear">UCSD Students Fear</a>
</li>
<li>
<span class="post-date">2006-10-15</span>
<a class="post-link" href="https://bannister.us/weblog/2006/terrorist-threat-not-from-a-14-year-old-girl">Terrorist threat (not) from a 14-year-old girl</a>
</li>
<li>
<span class="post-date">2006-10-15</span>
<a class="post-link" href="https://bannister.us/weblog/2006/political-revenge-and-the-orange-county-sheriff">Political revenge and the Orange County Sheriff</a>
</li>
<li>
<span class="post-date">2006-10-10</span>
<a class="post-link" href="https://bannister.us/weblog/2006/wholesale-not-retail-vote-fraud">Wholesale - not retail - vote fraud</a>
</li>
<li>
<span class="post-date">2006-10-10</span>
<a class="post-link" href="https://bannister.us/weblog/2006/what-is-next">What is next?</a>
</li>
<li>
<span class="post-date">2006-10-10</span>
<a class="post-link" href="https://bannister.us/weblog/2006/impact-of-the-web-on-a-tailor">Impact of the web on a tailor</a>
</li>
<li>
<span class="post-date">2006-10-10</span>
<a class="post-link" href="https://bannister.us/weblog/2006/dreams-and-other-nonsense">Dreams, and other nonsense</a>
</li>
<li>
<span class="post-date">2006-10-10</span>
<a class="post-link" href="https://bannister.us/weblog/2006/654">Talent - better cheap and imported, or home-grown?</a>
</li>
<li>
<span class="post-date">2006-10-03</span>
<a class="post-link" href="https://bannister.us/weblog/2006/todays-handy-tip-lrf-replacement">Today's handy tip - LRF replacement</a>
</li>
<li>
<span class="post-date">2006-09-30</span>
<a class="post-link" href="https://bannister.us/weblog/2006/deflecting-the-blame">Deflecting the blame</a>
</li>
<li>
<span class="post-date">2006-09-29</span>
<a class="post-link" href="https://bannister.us/weblog/2006/this-is-a-laptop">This is a laptop.</a>
</li>
<li>
<span class="post-date">2006-09-29</span>
<a class="post-link" href="https://bannister.us/weblog/2006/calif-eliminates-city-by-city-cable-deals">Calif. eliminates city-by-city cable deals</a>
</li>
<li>
<span class="post-date">2006-09-29</span>
<a class="post-link" href="https://bannister.us/weblog/2006/avocados-proof-of-atlantis">Avocados - Proof of Atlantis</a>
</li>
<li>
<span class="post-date">2006-09-27</span>
<a class="post-link" href="https://bannister.us/weblog/2006/non-existant-shortage">Yet another puff-piece about a non-existant shortage</a>
</li>
<li>
<span class="post-date">2006-09-18</span>
<a class="post-link" href="https://bannister.us/weblog/2006/missing-backstory-for-spinach">Missing backstory for spinach?</a>
</li>
<li>
<span class="post-date">2006-09-09</span>
<a class="post-link" href="https://bannister.us/weblog/2006/is-t-mobile-to-go-ripping-off-customers">Is T-Mobile "To Go" ripping off customers?</a>
</li>
<li>
<span class="post-date">2006-09-04</span>
<a class="post-link" href="https://bannister.us/weblog/2006/ten-states-in-eight-days">Ten states in eight days</a>
</li>
<li>
<span class="post-date">2006-08-26</span>
<a class="post-link" href="https://bannister.us/weblog/2006/worth-repeating-what-al-gore-really-said-about-the-internet">Worth repeating - what Al Gore really said about the Internet</a>
</li>
<li>
<span class="post-date">2006-08-20</span>
<a class="post-link" href="https://bannister.us/weblog/2006/subtext-and-alternate-representations-of-program-structure">Subtext - and alternate representations of program structure</a>
</li>
<li>
<span class="post-date">2006-08-16</span>
<a class="post-link" href="https://bannister.us/weblog/2006/patriotic-girl-reporter">Patriotic Girl Reporter</a>
</li>
<li>
<span class="post-date">2006-08-16</span>
<a class="post-link" href="https://bannister.us/weblog/2006/mobile-phone-advertising-offered-as-journalism-in-wired-news">Mobile phone advertising offered as journalism in Wired News?</a>
</li>
<li>
<span class="post-date">2006-08-16</span>
<a class="post-link" href="https://bannister.us/weblog/2006/judge-halts-nsa-snooping-maybe">Judge Halts NSA Snooping (maybe)</a>
</li>
<li>
<span class="post-date">2006-08-07</span>
<a class="post-link" href="https://bannister.us/weblog/2006/why-bother">Why bother?</a>
</li>
<li>
<span class="post-date">2006-07-30</span>
<a class="post-link" href="https://bannister.us/weblog/2006/cost-of-living">Cost of living</a>
</li>
<li>
<span class="post-date">2006-07-28</span>
<a class="post-link" href="https://bannister.us/weblog/2006/training-wheels-for-motocycles">Training wheels for motocycles</a>
</li>
<li>
<span class="post-date">2006-07-23</span>
<a class="post-link" href="https://bannister.us/weblog/2006/killing-off-a-ghost">Killing off a ghost</a>
</li>
<li>
<span class="post-date">2006-07-20</span>
<a class="post-link" href="https://bannister.us/weblog/2006/giant-little-girl">Giant Little Girl</a>
</li>
<li>
<span class="post-date">2006-07-17</span>
<a class="post-link" href="https://bannister.us/weblog/2006/engineering-gap-fact-and-fiction">Engineering Gap? Fact and Fiction</a>
</li>
<li>
<span class="post-date">2006-07-15</span>
<a class="post-link" href="https://bannister.us/weblog/2006/wiretappers-secrets">Wiretapper's secrets?</a>
</li>
<li>
<span class="post-date">2006-07-15</span>
<a class="post-link" href="https://bannister.us/weblog/2006/new-friendster-message-from-shawnna-071606-0520-pm">New Friendster Message from Shawnna - 07/16/06 05:20 PM</a>
</li>
<li>
<span class="post-date">2006-07-15</span>
<a class="post-link" href="https://bannister.us/weblog/2006/googles-not-costly-rebellion">Google's (not) Costly Rebellion</a>
</li>
<li>
<span class="post-date">2006-07-11</span>
<a class="post-link" href="https://bannister.us/weblog/2006/what-makes-a-good-databox">What makes a good "Databox"?</a>
</li>
<li>
<span class="post-date">2006-07-06</span>
<a class="post-link" href="https://bannister.us/weblog/2006/always-always-always-run-memtest-on-new-memory">Always, always, ALWAYS run memtest on new memory!</a>
</li>
<li>
<span class="post-date">2006-06-30</span>
<a class="post-link" href="https://bannister.us/weblog/2006/27b-stroke-6">27B Stroke 6</a>
</li>
<li>
<span class="post-date">2006-06-25</span>
<a class="post-link" href="https://bannister.us/weblog/2006/say-what">Say what?</a>
</li>
<li>
<span class="post-date">2006-06-25</span>
<a class="post-link" href="https://bannister.us/weblog/2006/new-ubuntu-and-vmware-server-install">New Ubuntu and VMware Server install</a>
</li>
<li>
<span class="post-date">2006-06-22</span>
<a class="post-link" href="https://bannister.us/weblog/2006/your-data-isnt-yours-with-att">Your data isn't yours, with AT&T</a>
</li>
<li>
<span class="post-date">2006-06-14</span>
<a class="post-link" href="https://bannister.us/weblog/2006/kind-of-annoying-actually">Kind of annoying, actually</a>
</li>
<li>
<span class="post-date">2006-06-14</span>
<a class="post-link" href="https://bannister.us/weblog/2006/freedom-of-expression">Freedom of expression</a>
</li>
<li>
<span class="post-date">2006-06-14</span>
<a class="post-link" href="https://bannister.us/weblog/2006/breakage-or-misapplication">Breakage - or misapplication?</a>
</li>
<li>
<span class="post-date">2006-06-11</span>
<a class="post-link" href="https://bannister.us/weblog/2006/rest-notes">REST notes</a>
</li>
<li>
<span class="post-date">2006-06-10</span>
<a class="post-link" href="https://bannister.us/weblog/2006/impressed-with-ubuntu-upgrade">Impressed with Ubuntu Upgrade</a>
</li>
<li>
<span class="post-date">2006-06-08</span>
<a class="post-link" href="https://bannister.us/weblog/2006/schneier-on-security-diebold-doesnt-get-it">Schneier on Security - Diebold Doesn't Get It</a>
</li>
<li>
<span class="post-date">2006-06-08</span>
<a class="post-link" href="https://bannister.us/weblog/2006/mission-accomplished">Mission Accomplished!</a>
</li>
<li>
<span class="post-date">2006-06-08</span>
<a class="post-link" href="https://bannister.us/weblog/2006/java-and-gnome">Java and Gnome</a>
</li>
<li>
<span class="post-date">2006-06-08</span>
<a class="post-link" href="https://bannister.us/weblog/2006/evidence-from-att-whistle-blower">Evidence from AT&T Whistle-Blower</a>
</li>
<li>
<span class="post-date">2006-06-08</span>
<a class="post-link" href="https://bannister.us/weblog/2006/comments-for-27b-stroke-6">An interview with "Homeland Security"</a>
</li>
<li>
<span class="post-date">2006-06-03</span>
<a class="post-link" href="https://bannister.us/weblog/2006/javascript-on-the-server">Javascript on the server</a>
</li>
<li>
<span class="post-date">2006-05-31</span>
<a class="post-link" href="https://bannister.us/weblog/2006/understanding-raid-z">Understanding RAID-Z</a>
</li>
<li>
<span class="post-date">2006-05-30</span>
<a class="post-link" href="https://bannister.us/weblog/2006/chandanlog3c-the-story-of-opengrok-the-wicked-fast-source-browser">chandanlog(3C) - The Story of OpenGrok - the Wicked Fast Source Browser</a>
</li>
<li>
<span class="post-date">2006-05-18</span>
<a class="post-link" href="https://bannister.us/weblog/2006/the-value-of-privacy">The Value of Privacy</a>
</li>
<li>
<span class="post-date">2006-05-17</span>
<a class="post-link" href="https://bannister.us/weblog/2006/the-bad-guys-won">The bad guys won...</a>
</li>
<li>
<span class="post-date">2006-05-17</span>
<a class="post-link" href="https://bannister.us/weblog/2006/sure-to-spike-apple-sales">Sure to spike Apple sales</a>
</li>
<li>
<span class="post-date">2006-05-17</span>
<a class="post-link" href="https://bannister.us/weblog/2006/just-forget-you-ever-saw-this">Just forget you ever saw this...</a>
</li>
<li>
<span class="post-date">2006-05-16</span>
<a class="post-link" href="https://bannister.us/weblog/2006/old-oak">Old oak</a>
</li>
<li>
<span class="post-date">2006-05-12</span>
<a class="post-link" href="https://bannister.us/weblog/2006/why-is-a-family-values-organization-making-porn-harder-to-block">Why is a "family values" organization making porn harder to block?</a>
</li>
<li>
<span class="post-date">2006-05-12</span>
<a class="post-link" href="https://bannister.us/weblog/2006/nsa-on-mothers-day">NSA on Mothers Day</a>
</li>
<li>
<span class="post-date">2006-05-10</span>
<a class="post-link" href="https://bannister.us/weblog/2006/bob-hoover-flying-aerobatics-with-a-stopped-engine">Bob Hoover flying aerobatics with a stopped engine</a>
</li>
<li>
<span class="post-date">2006-05-07</span>
<a class="post-link" href="https://bannister.us/weblog/2006/bird-flu-hits-florida-trailer-park">BIRD FLU Hits Florida Trailer Park</a>
</li>
<li>
<span class="post-date">2006-04-24</span>
<a class="post-link" href="https://bannister.us/weblog/2006/rendezvous-video">Rendezvous - Video</a>
</li>
<li>
<span class="post-date">2006-04-24</span>
<a class="post-link" href="https://bannister.us/weblog/2006/paul-cornish">Paul Cornish</a>
</li>
<li>
<span class="post-date">2006-04-24</span>
<a class="post-link" href="https://bannister.us/weblog/2006/handy-hint">Handy hint</a>
</li>
<li>
<span class="post-date">2006-04-22</span>
<a class="post-link" href="https://bannister.us/weblog/2006/algorithm-find-greatest-sequence">Algorithm - Find Greatest Sequence</a>
</li>
<li>
<span class="post-date">2006-04-20</span>
<a class="post-link" href="https://bannister.us/weblog/2006/this-proves-what">This proves, what?</a>
</li>
<li>
<span class="post-date">2006-03-31</span>
<a class="post-link" href="https://bannister.us/weblog/2006/the-early-bird-specials">The Early Bird Specials</a>
</li>
<li>
<span class="post-date">2006-03-24</span>
<a class="post-link" href="https://bannister.us/weblog/2006/improbable">Improbable</a>
</li>
<li>
<span class="post-date">2006-03-19</span>
<a class="post-link" href="https://bannister.us/weblog/2006/sound-familiar">Sound familiar?</a>
</li>
<li>
<span class="post-date">2006-03-19</span>
<a class="post-link" href="https://bannister.us/weblog/2006/microsoft-ipod">Microsoft iPod</a>
</li>
<li>
<span class="post-date">2006-03-18</span>
<a class="post-link" href="https://bannister.us/weblog/2006/ubuntu-debian-and-java">Ubuntu, Debian, and Java</a>
</li>
<li>
<span class="post-date">2006-03-10</span>
<a class="post-link" href="https://bannister.us/weblog/2006/its-google-and-users-not-microsoft">It's Google and users, not Microsoft</a>
</li>
<li>
<span class="post-date">2006-03-07</span>
<a class="post-link" href="https://bannister.us/weblog/2006/nonexpert-advice-from-znet">(non)expert advice from ZNet</a>
</li>
<li>
<span class="post-date">2006-03-07</span>
<a class="post-link" href="https://bannister.us/weblog/2006/catapult">Catapult!</a>
</li>
<li>
<span class="post-date">2006-03-05</span>
<a class="post-link" href="https://bannister.us/weblog/2006/misplaced-concern-over-google-book-scans">Misplaced concern over Google book scans</a>
</li>
<li>
<span class="post-date">2006-02-25</span>
<a class="post-link" href="https://bannister.us/weblog/2006/argh-windows-re-installation-woes">Argh - Windows (re-)installation woes</a>
</li>
<li>
<span class="post-date">2006-02-17</span>
<a class="post-link" href="https://bannister.us/weblog/2006/if-the-quote-fits">If the quote fits...</a>
</li>
<li>
<span class="post-date">2006-02-16</span>
<a class="post-link" href="https://bannister.us/weblog/2006/senate-plans-no-probe-of-nsa-spy-program">Senate plans no probe of NSA spy program</a>
</li>
<li>
<span class="post-date">2006-02-15</span>
<a class="post-link" href="https://bannister.us/weblog/2006/the-coming-tug-of-war-over-the-internet">The Coming Tug of War Over the Internet</a>
</li>
<li>
<span class="post-date">2006-02-13</span>
<a class="post-link" href="https://bannister.us/weblog/2006/the-normal-family">The Normal Family</a>
</li>
<li>
<span class="post-date">2006-02-13</span>
<a class="post-link" href="https://bannister.us/weblog/2006/lighting-my-way-home">Lighting my way home</a>
</li>
<li>
<span class="post-date">2006-02-12</span>
<a class="post-link" href="https://bannister.us/weblog/2006/search-engine-traffic">Search Engine Traffic</a>
</li>
<li>
<span class="post-date">2006-02-09</span>
<a class="post-link" href="https://bannister.us/weblog/2006/a-reminder">A reminder</a>
</li>
<li>
<span class="post-date">2006-02-08</span>
<a class="post-link" href="https://bannister.us/weblog/2006/whered-it-go">Where'd it go?</a>
</li>
<li>
<span class="post-date">2006-02-01</span>
<a class="post-link" href="https://bannister.us/weblog/2006/missile-launch-at-sunset">Missile launch at sunset</a>
</li>
<li>
<span class="post-date">2006-02-01</span>
<a class="post-link" href="https://bannister.us/weblog/2006/cartoons-and-islam">Cartoons and Islam</a>
</li>
<li>
<span class="post-date">2006-01-31</span>
<a class="post-link" href="https://bannister.us/weblog/2006/imagine-a-past-traveller">Imagine a past traveller...</a>
</li>
<li>
<span class="post-date">2006-01-30</span>
<a class="post-link" href="https://bannister.us/weblog/2006/where-the-sidewalk-ends">Where the Sidewalk Ends</a>
</li>
<li>
<span class="post-date">2006-01-30</span>
<a class="post-link" href="https://bannister.us/weblog/2006/user-interface-goals">User Interface Goals</a>
</li>
<li>
<span class="post-date">2006-01-30</span>
<a class="post-link" href="https://bannister.us/weblog/2006/bill-gates-coke-commercial-coca-cola">Bill Gates - Coke Commercial (Coca-Cola)</a>
</li>
<li>
<span class="post-date">2006-01-28</span>
<a class="post-link" href="https://bannister.us/weblog/2006/philip-greenspuns-weblog">Would you buy this car?</a>
</li>
<li>
<span class="post-date">2006-01-27</span>
<a class="post-link" href="https://bannister.us/weblog/2006/measure-of-a-mindset-and-end-to-end-checks">Measure of a mindset and end-to-end checks</a>
</li>
<li>
<span class="post-date">2006-01-27</span>
<a class="post-link" href="https://bannister.us/weblog/2006/df20060116jpg-jpeg-image-640x480-pixels">RFID tagged</a>
</li>
<li>
<span class="post-date">2006-01-26</span>
<a class="post-link" href="https://bannister.us/weblog/2006/we-are-not-at-war">We are not at war</a>
</li>
<li>
<span class="post-date">2006-01-26</span>
<a class="post-link" href="https://bannister.us/weblog/2006/google-ads-hit-a-home-run">Google "Ads" hit a home run?</a>
</li>
<li>
<span class="post-date">2006-01-21</span>
<a class="post-link" href="https://bannister.us/weblog/2006/how-to-keep-the-carriers-from-flushing-the-net-down-the-tubes">How to Keep the Carriers from Flushing the Net Down the Tubes</a>
</li>
<li>
<span class="post-date">2006-01-18</span>
<a class="post-link" href="https://bannister.us/weblog/2006/iis-troubleshooting-and-vmware">IIS Troubleshooting and VMware</a>
</li>
<li>
<span class="post-date">2006-01-18</span>
<a class="post-link" href="https://bannister.us/weblog/2006/economics-of-myspace">Economics of MySpace</a>
</li>
<li>
<span class="post-date">2006-01-16</span>
<a class="post-link" href="https://bannister.us/weblog/2006/useless-spying">Useless spying</a>
</li>
<li>
<span class="post-date">2006-01-15</span>
<a class="post-link" href="https://bannister.us/weblog/2006/open-microsoft-formats">Open Microsoft Formats?</a>
</li>
<li>
<span class="post-date">2006-01-13</span>
<a class="post-link" href="https://bannister.us/weblog/2006/chills">Chills</a>
</li>
<li>
<span class="post-date">2006-01-11</span>
<a class="post-link" href="https://bannister.us/weblog/2006/scarcity-versus-abundance-of-talent">Scarcity versus abundance of talent</a>
</li>
<li>
<span class="post-date">2006-01-11</span>
<a class="post-link" href="https://bannister.us/weblog/2006/honey-im-home">Honey, I'm Home</a>
</li>
<li>
<span class="post-date">2006-01-10</span>
<a class="post-link" href="https://bannister.us/weblog/2006/how-not-to-teach-calculus">How not to teach Calculus</a>
</li>
<li>
<span class="post-date">2006-01-10</span>
<a class="post-link" href="https://bannister.us/weblog/2006/can-women-do-every-thing-google-video">Can women do every thing - Google Video</a>
</li>
<li>
<span class="post-date">2006-01-10</span>
<a class="post-link" href="https://bannister.us/weblog/2006/airplane-landing-on-the-highway-405-google-video">airplane landing on the highway 405 - Google Video</a>
</li>
<li>
<span class="post-date">2006-01-06</span>
<a class="post-link" href="https://bannister.us/weblog/2006/the-risk-of-hosting-with-microsoft-or-yahoo">The risk of hosting with Microsoft or Yahoo</a>
</li>
<li>
<span class="post-date">2006-01-06</span>
<a class="post-link" href="https://bannister.us/weblog/2006/apparently-bush-thinks-we-need-a-bigger-deficit-2">Pile on the debt!</a>
</li>
<li>
<span class="post-date">2005-12-31</span>
<a class="post-link" href="https://bannister.us/weblog/2005/remember-orwells-1984">Remember Orwell's "1984"?</a>
</li>
<li>
<span class="post-date">2005-12-31</span>
<a class="post-link" href="https://bannister.us/weblog/2005/non-working-security-tags">Non-working security tags</a>
</li>
<li>
<span class="post-date">2005-12-31</span>
<a class="post-link" href="https://bannister.us/weblog/2005/iis6-troubleshooting-advice">IIS6 troubleshooting advice</a>
</li>
<li>
<span class="post-date">2005-12-31</span>
<a class="post-link" href="https://bannister.us/weblog/2005/dirty-play-massachusetts-and-microsoft">Dirty play - Massachusetts and Microsoft</a>
</li>
<li>
<span class="post-date">2005-12-30</span>
<a class="post-link" href="https://bannister.us/weblog/2005/white-house-web-bugs">White House web bugs</a>
</li>
<li>
<span class="post-date">2005-12-30</span>
<a class="post-link" href="https://bannister.us/weblog/2005/weblogs-and-journalism">Weblogs and Journalism</a>
</li>
<li>
<span class="post-date">2005-12-30</span>
<a class="post-link" href="https://bannister.us/weblog/2005/royal-good-taste-honors-apple-designer">Royal good taste honors Apple designer</a>
</li>
<li>
<span class="post-date">2005-12-30</span>
<a class="post-link" href="https://bannister.us/weblog/2005/lawyers-guns-and-money">Lawyers, guns and money</a>
</li>
<li>
<span class="post-date">2005-12-30</span>
<a class="post-link" href="https://bannister.us/weblog/2005/keeping-what-little-freedom-we-have-left">Keeping what little freedom we have left.</a>
</li>
<li>
<span class="post-date">2005-12-30</span>
<a class="post-link" href="https://bannister.us/weblog/2005/how-to-make-a-rfid-blocking-wallet">How To Make A RFID Blocking Wallet</a>
</li>
<li>
<span class="post-date">2005-12-30</span>
<a class="post-link" href="https://bannister.us/weblog/2005/cookies-are-not-scary">Cookies are not scary</a>
</li>
<li>
<span class="post-date">2005-12-30</span>
<a class="post-link" href="https://bannister.us/weblog/2005/are-men-programmable">Are men programmable?</a>
</li>
<li>
<span class="post-date">2005-12-26</span>
<a class="post-link" href="https://bannister.us/weblog/2005/jspplugin-grief-contd">jsp:plugin grief (cont'd)</a>
</li>
<li>
<span class="post-date">2005-12-26</span>
<a class="post-link" href="https://bannister.us/weblog/2005/java-applets-that-just-work">Java Applets that "just work"</a>
</li>
<li>
<span class="post-date">2005-12-25</span>
<a class="post-link" href="https://bannister.us/weblog/2005/jspplugin-grief">jsp:plugin grief</a>
</li>
<li>
<span class="post-date">2005-12-17</span>
<a class="post-link" href="https://bannister.us/weblog/2005/as-if-this-were-ever-true">As if this were ever true...</a>
</li>
<li>
<span class="post-date">2005-12-10</span>
<a class="post-link" href="https://bannister.us/weblog/2005/the-nearly-perfect-camera">The (nearly) perfect camera?</a>
</li>
<li>
<span class="post-date">2005-12-09</span>
<a class="post-link" href="https://bannister.us/weblog/2005/under-construction">Under construction</a>
</li>
<li>
<span class="post-date">2005-12-08</span>
<a class="post-link" href="https://bannister.us/weblog/2005/sco-raises-new-funding">SCO Raises New Funding</a>
</li>
<li>
<span class="post-date">2005-12-07</span>
<a class="post-link" href="https://bannister.us/weblog/2005/watching-the-highways">Watching the Highways</a>
</li>
<li>
<span class="post-date">2005-12-06</span>
<a class="post-link" href="https://bannister.us/weblog/2005/what-old-people-do-for-fun">What Old People Do For Fun...</a>
</li>
<li>
<span class="post-date">2005-12-06</span>
<a class="post-link" href="https://bannister.us/weblog/2005/trance-n-roll">Trance N Roll</a>
</li>
<li>
<span class="post-date">2005-12-06</span>
<a class="post-link" href="https://bannister.us/weblog/2005/supersonic-flight">Supersonic flight</a>
</li>
<li>
<span class="post-date">2005-12-06</span>
<a class="post-link" href="https://bannister.us/weblog/2005/snake-oil-research">Snake-Oil Research</a>
</li>
<li>
<span class="post-date">2005-12-06</span>
<a class="post-link" href="https://bannister.us/weblog/2005/security-agency-broke-privacy-laws">Security agency broke privacy laws</a>
</li>
<li>
<span class="post-date">2005-12-06</span>
<a class="post-link" href="https://bannister.us/weblog/2005/secret-id-law">Secret ID Law</a>
</li>
<li>
<span class="post-date">2005-12-06</span>
<a class="post-link" href="https://bannister.us/weblog/2005/octopus-eats-shark">Octopus Eats Shark</a>
</li>
<li>
<span class="post-date">2005-12-06</span>
<a class="post-link" href="https://bannister.us/weblog/2005/dui-stop-google-video">DUI Stop</a>
</li>
<li>
<span class="post-date">2005-12-06</span>
<a class="post-link" href="https://bannister.us/weblog/2005/curry-n-rice-girl">Curry-N-Rice Girl</a>
</li>
<li>
<span class="post-date">2005-12-06</span>
<a class="post-link" href="https://bannister.us/weblog/2005/arab-technology-versus-german-engineering">Arab technology versus German engineering</a>
</li>
<li>
<span class="post-date">2005-12-05</span>
<a class="post-link" href="https://bannister.us/weblog/2005/ongoing-osi">Open source, and when not</a>
</li>
<li>
<span class="post-date">2005-12-04</span>
<a class="post-link" href="https://bannister.us/weblog/2005/candid-cactus">Candid Cactus</a>
</li>
<li>
<span class="post-date">2005-12-03</span>
<a class="post-link" href="https://bannister.us/weblog/2005/tom-yum-kung-where">Tom Yum Kung - Where??</a>
</li>
<li>
<span class="post-date">2005-12-02</span>
<a class="post-link" href="https://bannister.us/weblog/2005/two-points-worth-repeating">Two points worth repeating</a>
</li>
<li>
<span class="post-date">2005-12-02</span>
<a class="post-link" href="https://bannister.us/weblog/2005/setting-negative-expectations">Setting negative expectations</a>
</li>
<li>
<span class="post-date">2005-12-02</span>
<a class="post-link" href="https://bannister.us/weblog/2005/hp-system-customers-got-the-message">HP system customers got the message</a>
</li>
<li>
<span class="post-date">2005-11-30</span>
<a class="post-link" href="https://bannister.us/weblog/2005/schneier-on-security-airplane-security">Schneier on Security - Airplane Security</a>
</li>
<li>
<span class="post-date">2005-11-30</span>
<a class="post-link" href="https://bannister.us/weblog/2005/scary-cyclotron">Scary Cyclotron?</a>
</li>
<li>
<span class="post-date">2005-11-28</span>
<a class="post-link" href="https://bannister.us/weblog/2005/heidi-and-the-knife">Heidi and the Knife</a>
</li>
<li>
<span class="post-date">2005-11-28</span>
<a class="post-link" href="https://bannister.us/weblog/2005/hands-free-headset">Hands-Free Headset</a>
</li>
<li>
<span class="post-date">2005-11-26</span>
<a class="post-link" href="https://bannister.us/weblog/2005/sad-commentary-or-call-for-action">Sad Commentary - or call for action?</a>
</li>
<li>
<span class="post-date">2005-11-26</span>
<a class="post-link" href="https://bannister.us/weblog/2005/european-terrorism-law-and-music-downloaders">European Terrorism Law and Music Downloaders</a>
</li>
<li>
<span class="post-date">2005-11-22</span>
<a class="post-link" href="https://bannister.us/weblog/2005/help">Help?</a>
</li>
<li>
<span class="post-date">2005-11-21</span>
<a class="post-link" href="https://bannister.us/weblog/2005/trying-to-open-an-airliner-door-in-flight">Trying to open an airliner door in-flight</a>
</li>
<li>
<span class="post-date">2005-11-21</span>
<a class="post-link" href="https://bannister.us/weblog/2005/roomba-robot-vacuum-died-again-2">Roomba (robot vacuum) died AGAIN</a>
</li>
<li>
<span class="post-date">2005-11-20</span>
<a class="post-link" href="https://bannister.us/weblog/2005/what-is-this">What is this?</a>
</li>
<li>
<span class="post-date">2005-11-19</span>
<a class="post-link" href="https://bannister.us/weblog/2005/xen-java-and-web-hosting">Xen, Java and Web Hosting</a>
</li>
<li>
<span class="post-date">2005-11-18</span>
<a class="post-link" href="https://bannister.us/weblog/2005/what-dont-we-have-to-buy">What don't we have to buy?</a>
</li>
<li>
<span class="post-date">2005-11-18</span>
<a class="post-link" href="https://bannister.us/weblog/2005/leather-pants">Leather Pants</a>
</li>
<li>
<span class="post-date">2005-11-17</span>
<a class="post-link" href="https://bannister.us/weblog/2005/sun-and-zfs">Sun and ZFS</a>
</li>
<li>
<span class="post-date">2005-11-17</span>
<a class="post-link" href="https://bannister.us/weblog/2005/setting-up-ubuntu-vmware-and-windows">Setting up Ubuntu, VMware and Windows</a>
</li>
<li>
<span class="post-date">2005-11-13</span>
<a class="post-link" href="https://bannister.us/weblog/2005/what-is-she-thinking-or-is-she">What is she thinking (or is she)?</a>
</li>
<li>
<span class="post-date">2005-11-13</span>
<a class="post-link" href="https://bannister.us/weblog/2005/no-respect">No respect</a>
</li>
<li>
<span class="post-date">2005-11-11</span>
<a class="post-link" href="https://bannister.us/weblog/2005/winning-chip-battles">Winning Chip Battles?</a>
</li>
<li>
<span class="post-date">2005-11-11</span>
<a class="post-link" href="https://bannister.us/weblog/2005/military-silly-string">Military Silly String</a>
</li>
<li>
<span class="post-date">2005-11-09</span>
<a class="post-link" href="https://bannister.us/weblog/2005/jumping-to-conclusions">Jumping to conclusions</a>
</li>
<li>
<span class="post-date">2005-11-09</span>
<a class="post-link" href="https://bannister.us/weblog/2005/is-bandwidth-still-too-costly">Is bandwidth still too costly?</a>
</li>
<li>
<span class="post-date">2005-11-07</span>
<a class="post-link" href="https://bannister.us/weblog/2005/an-interesting-twist-real-estate-auctions">An interesting twist - Real Estate Auctions</a>
</li>
<li>
<span class="post-date">2005-11-06</span>
<a class="post-link" href="https://bannister.us/weblog/2005/on-torture-bush-vows-what">On torture Bush vows ... what?</a>
</li>
<li>
<span class="post-date">2005-11-04</span>
<a class="post-link" href="https://bannister.us/weblog/2005/postel-law-liberal-in-what-you-accept-conservative-in-what-you-generate">Postel’s Law - liberal in what you accept, conservative in what you generate</a>
</li>
<li>
<span class="post-date">2005-11-04</span>
<a class="post-link" href="https://bannister.us/weblog/2005/bathsheba-grossman-design">Bathsheba Grossman - Design</a>
</li>
<li>
<span class="post-date">2005-11-02</span>
<a class="post-link" href="https://bannister.us/weblog/2005/ongoing-boston-odf-day">ACT & Boston ODF Day</a>
</li>
<li>
<span class="post-date">2005-11-02</span>
<a class="post-link" href="https://bannister.us/weblog/2005/graphing-the-deficit">Graphing the Deficit</a>
</li>
<li>
<span class="post-date">2005-11-01</span>
<a class="post-link" href="https://bannister.us/weblog/2005/sony-clueless-about-software">Sony - clueless about software?</a>
</li>
<li>
<span class="post-date">2005-11-01</span>
<a class="post-link" href="https://bannister.us/weblog/2005/secret-cia-jails">Secret CIA jails</a>
</li>
<li>
<span class="post-date">2005-10-31</span>
<a class="post-link" href="https://bannister.us/weblog/2005/prejudice-spammers">Prejudice & spammers</a>
</li>
<li>
<span class="post-date">2005-10-31</span>
<a class="post-link" href="https://bannister.us/weblog/2005/population-of-europe">Population of Europe</a>
</li>
<li>
<span class="post-date">2005-10-30</span>
<a class="post-link" href="https://bannister.us/weblog/2005/california-spring">California Spring</a>
</li>
<li>
<span class="post-date">2005-10-29</span>
<a class="post-link" href="https://bannister.us/weblog/2005/insurance-inefficient-healthcare-the-elephant-in-the-closet">Insurance, inefficient healthcare -- the Elephant in the closet</a>
</li>
<li>
<span class="post-date">2005-10-24</span>
<a class="post-link" href="https://bannister.us/weblog/2005/watch-out-for-potholes">Watch out for potholes</a>
</li>
<li>
<span class="post-date">2005-10-24</span>
<a class="post-link" href="https://bannister.us/weblog/2005/schneier-on-security-fbi-abuses-of-the-usa-patriot-act">Schneier on Security - FBI Abuses of the USA Patriot Act</a>
</li>
<li>
<span class="post-date">2005-10-24</span>
<a class="post-link" href="https://bannister.us/weblog/2005/negotiating-for-torture">Negotiating for Torture</a>
</li>
<li>
<span class="post-date">2005-10-23</span>
<a class="post-link" href="https://bannister.us/weblog/2005/apple-faces-lawsuit-over-ipod">Apple faces lawsuit over iPod</a>
</li>
<li>
<span class="post-date">2005-10-21</span>
<a class="post-link" href="https://bannister.us/weblog/2005/study-reveals-pittsburgh-unprepared-for-full-scale-zombie-attack">Study Reveals Pittsburgh Unprepared For Full-Scale Zombie Attack</a>
</li>
<li>
<span class="post-date">2005-10-18</span>
<a class="post-link" href="https://bannister.us/weblog/2005/jini-and-xml">Jini and XML</a>
</li>
<li>
<span class="post-date">2005-10-17</span>
<a class="post-link" href="https://bannister.us/weblog/2005/speaking-up">Speaking up</a>
</li>
<li>
<span class="post-date">2005-10-17</span>
<a class="post-link" href="https://bannister.us/weblog/2005/flickr-photo-download-valentina-sm-2">Valentina</a>
</li>
<li>
<span class="post-date">2005-10-16</span>
<a class="post-link" href="https://bannister.us/weblog/2005/how-swing-components-are-displayed-tell-me-it-isnt-so">How Swing Components are displayed (Tell me it isn't so!)</a>
</li>
<li>
<span class="post-date">2005-10-15</span>
<a class="post-link" href="https://bannister.us/weblog/2005/passwords-on-the-web-as-a-security-risk">Passwords on the web as a security risk</a>
</li>
<li>
<span class="post-date">2005-10-15</span>
<a class="post-link" href="https://bannister.us/weblog/2005/maybe-after-all-the-good-guys-win">Maybe after all the good guys win?</a>
</li>
<li>
<span class="post-date">2005-10-15</span>
<a class="post-link" href="https://bannister.us/weblog/2005/fading-history">Fading history</a>
</li>
<li>
<span class="post-date">2005-10-15</span>
<a class="post-link" href="https://bannister.us/weblog/2005/eff-the-customer-is-always-wrong-a-users-guide-to-drm-in-online-music">Guide to DRM in Online Music</a>
</li>
<li>
<span class="post-date">2005-10-15</span>
<a class="post-link" href="https://bannister.us/weblog/2005/dramatic-light">Dramatic light</a>
</li>
<li>
<span class="post-date">2005-10-13</span>
<a class="post-link" href="https://bannister.us/weblog/2005/icelandic-horses">Icelandic horses</a>
</li>
<li>
<span class="post-date">2005-10-13</span>
<a class="post-link" href="https://bannister.us/weblog/2005/dog-hair-is-killing-my-roomba-again">Dog hair is killing my Roomba - again!</a>
</li>
<li>
<span class="post-date">2005-10-11</span>
<a class="post-link" href="https://bannister.us/weblog/2005/the-physics-of-extra-terrestrial-civilizations">The Physics of Extra-Terrestrial Civilizations</a>
</li>
<li>
<span class="post-date">2005-10-11</span>
<a class="post-link" href="https://bannister.us/weblog/2005/suspicious-behaviour-on-the-tube">Suspicious behaviour on the tube</a>
</li>
<li>
<span class="post-date">2005-10-11</span>
<a class="post-link" href="https://bannister.us/weblog/2005/never-ending-atom-feeds">Never ending Atom feeds</a>
</li>
<li>
<span class="post-date">2005-10-11</span>
<a class="post-link" href="https://bannister.us/weblog/2005/lauras-box-of-chocolates">Laura's Box of Chocolates</a>
</li>
<li>
<span class="post-date">2005-10-11</span>
<a class="post-link" href="https://bannister.us/weblog/2005/is-microsoft-becoming-burroughs">Is Microsoft becoming Burroughs?</a>
</li>
<li>
<span class="post-date">2005-10-11</span>
<a class="post-link" href="https://bannister.us/weblog/2005/how-to-make-your-neighbors-humvee-look-wimpy">How to make your neighbor's Humvee look wimpy</a>
</li>
<li>
<span class="post-date">2005-10-09</span>
<a class="post-link" href="https://bannister.us/weblog/2005/medieval-times">Medieval Times</a>
</li>
<li>
<span class="post-date">2005-10-01</span>
<a class="post-link" href="https://bannister.us/weblog/2005/getting-ready-for-election-day">Election day - replacing Chris Cox</a>
</li>
<li>
<span class="post-date">2005-09-29</span>
<a class="post-link" href="https://bannister.us/weblog/2005/all-we-need-is-music">... all we need is music ...</a>
</li>
<li>
<span class="post-date">2005-09-25</span>
<a class="post-link" href="https://bannister.us/weblog/2005/schneier-on-security-secure-flight-news">Secure Flight News</a>
</li>
<li>
<span class="post-date">2005-09-25</span>
<a class="post-link" href="https://bannister.us/weblog/2005/china-space-mission">China Space Mission</a>
</li>
<li>
<span class="post-date">2005-09-18</span>
<a class="post-link" href="https://bannister.us/weblog/2005/jetex-random-memory">Jetex - random memory</a>
</li>
<li>
<span class="post-date">2005-09-18</span>
<a class="post-link" href="https://bannister.us/weblog/2005/insecure-voting">Insecure voting</a>
</li>
<li>
<span class="post-date">2005-09-18</span>
<a class="post-link" href="https://bannister.us/weblog/2005/but-wait">... but wait ...</a>
</li>
<li>
<span class="post-date">2005-09-11</span>
<a class="post-link" href="https://bannister.us/weblog/2005/mouse-test">mouse test</a>
</li>
<li>
<span class="post-date">2005-09-11</span>
<a class="post-link" href="https://bannister.us/weblog/2005/betty-boop-in-color-google-video">Betty Boop in color</a>
</li>
<li>
<span class="post-date">2005-09-06</span>
<a class="post-link" href="https://bannister.us/weblog/2005/inequality-and-risk">Inequality and Risk</a>
</li>
<li>
<span class="post-date">2005-09-04</span>
<a class="post-link" href="https://bannister.us/weblog/2005/which-everybody">Which "everybody"?</a>
</li>
<li>
<span class="post-date">2005-09-03</span>
<a class="post-link" href="https://bannister.us/weblog/2005/lrf-replacements">LRF replacements</a>
</li>
<li>
<span class="post-date">2005-09-03</span>
<a class="post-link" href="https://bannister.us/weblog/2005/ancient-browser">Ancient browser</a>
</li>
<li>
<span class="post-date">2005-09-02</span>
<a class="post-link" href="https://bannister.us/weblog/2005/turing-test">Turing test</a>
</li>
<li>
<span class="post-date">2005-09-02</span>
<a class="post-link" href="https://bannister.us/weblog/2005/setting-up-a-newold-car">Setting up a new/old car</a>
</li>
<li>
<span class="post-date">2005-09-02</span>
<a class="post-link" href="https://bannister.us/weblog/2005/domino-theory-microsoft-and-standard-document-formats">Domino theory - Microsoft and standard document formats</a>
</li>
<li>
<span class="post-date">2005-08-30</span>
<a class="post-link" href="https://bannister.us/weblog/2005/questions-hurricane-katrina-and-new-orleans">Questions - Hurricane Katrina and New Orleans</a>
</li>
<li>
<span class="post-date">2005-08-29</span>
<a class="post-link" href="https://bannister.us/weblog/2005/semi-weekly-hike">Semi-weekly hike</a>
</li>
<li>
<span class="post-date">2005-08-29</span>
<a class="post-link" href="https://bannister.us/weblog/2005/oops-in-buffalo">Oops in Buffalo</a>
</li>
<li>
<span class="post-date">2005-08-28</span>
<a class="post-link" href="https://bannister.us/weblog/2005/moms-art">Mom's art</a>
</li>
<li>
<span class="post-date">2005-08-28</span>
<a class="post-link" href="https://bannister.us/weblog/2005/credit-where-due-to-microsoft">Credit where due - to Microsoft</a>
</li>
<li>
<span class="post-date">2005-08-28</span>
<a class="post-link" href="https://bannister.us/weblog/2005/apples">Apples</a>
</li>
<li>
<span class="post-date">2005-08-27</span>
<a class="post-link" href="https://bannister.us/weblog/2005/real-and-unreal-threats">Real and unreal threats</a>
</li>
<li>
<span class="post-date">2005-08-26</span>
<a class="post-link" href="https://bannister.us/weblog/2005/evangelical-scientists-refute-gravity-with-new-intelligent-falling-theory">Evangelical Scientists Refute Gravity With New 'Intelligent Falling' Theory</a>
</li>
<li>
<span class="post-date">2005-08-25</span>
<a class="post-link" href="https://bannister.us/weblog/2005/the-family-research-council-wants-to-make-porn-harder-to-block">The Family Research Council wants to make porn harder to block</a>
</li>
<li>
<span class="post-date">2005-08-23</span>
<a class="post-link" href="https://bannister.us/weblog/2005/the-kutztown-13">The Kutztown 13</a>
</li>
<li>
<span class="post-date">2005-08-20</span>
<a class="post-link" href="https://bannister.us/weblog/2005/inertia-in-markets">$$ Inertia in markets</a>
</li>
<li>
<span class="post-date">2005-08-19</span>
<a class="post-link" href="https://bannister.us/weblog/2005/the-aol-of-broadband">The "AOL of broadband"</a>
</li>
<li>
<span class="post-date">2005-08-18</span>
<a class="post-link" href="https://bannister.us/weblog/2005/follow-that-car-new-microsoft-patent">Follow that car! - new Microsoft Patent</a>
</li>
<li>
<span class="post-date">2005-08-18</span>
<a class="post-link" href="https://bannister.us/weblog/2005/385">Just a bit sideways...</a>
</li>
<li>
<span class="post-date">2005-08-16</span>
<a class="post-link" href="https://bannister.us/weblog/2005/missing-the-point-china-and-climate-change">Missing the point - China and Climate Change</a>
</li>
<li>
<span class="post-date">2005-08-14</span>
<a class="post-link" href="https://bannister.us/weblog/2005/slightly-scary-movie">Slightly scary movie...</a>
</li>
<li>
<span class="post-date">2005-08-13</span>
<a class="post-link" href="https://bannister.us/weblog/2005/schneier-on-security-uk-border-security">UK Border Security</a>
</li>
<li>
<span class="post-date">2005-08-13</span>
<a class="post-link" href="https://bannister.us/weblog/2005/nigerian-net-grifters">Nigerian Net Grifters</a>
</li>
<li>
<span class="post-date">2005-08-13</span>
<a class="post-link" href="https://bannister.us/weblog/2005/harm-reduction-and-the-war-on-drugs">Harm reduction and the "War on Drugs"</a>
</li>
<li>
<span class="post-date">2005-08-13</span>
<a class="post-link" href="https://bannister.us/weblog/2005/global-warming-for-a-change">Global Warming - for a Change</a>
</li>
<li>
<span class="post-date">2005-08-13</span>
<a class="post-link" href="https://bannister.us/weblog/2005/fingerprinting-paper">Fingerprinting Paper</a>
</li>
<li>
<span class="post-date">2005-08-13</span>
<a class="post-link" href="https://bannister.us/weblog/2005/arianna-huffington-at-rummys-bizarro-pentagon-torture-is-rewarded-while-sex-is-a-firing-offense-yahoo-news">A four-star scapegoat?</a>
</li>
<li>
<span class="post-date">2005-08-08</span>
<a class="post-link" href="https://bannister.us/weblog/2005/longhorn-and-rss">Longhorn and RSS</a>
</li>
<li>
<span class="post-date">2005-08-03</span>
<a class="post-link" href="https://bannister.us/weblog/2005/schneier-on-security-cisco-harasses-security-researcher">Cisco Harasses Security Researcher</a>
</li>
<li>
<span class="post-date">2005-08-03</span>
<a class="post-link" href="https://bannister.us/weblog/2005/automatic-surveillance-via-cell-phone">Automatic Surveillance Via Cell Phone</a>
</li>
<li>
<span class="post-date">2005-08-02</span>
<a class="post-link" href="https://bannister.us/weblog/2005/you-deserve-a-refund-for-fat-ceo-pay-csmonitorcom">fat CEO pay</a>
</li>
<li>
<span class="post-date">2005-08-02</span>
<a class="post-link" href="https://bannister.us/weblog/2005/usability-news-media-kafka-anti-bureaucracy-website-yields-streamline-government">Kafka anti-bureaucracy website</a>
</li>
<li>
<span class="post-date">2005-08-02</span>
<a class="post-link" href="https://bannister.us/weblog/2005/tacky-namespace-grab">Tacky namespace grab</a>
</li>
<li>
<span class="post-date">2005-08-02</span>
<a class="post-link" href="https://bannister.us/weblog/2005/hitting-the-high-notes">Hitting the High Notes</a>
</li>
<li>
<span class="post-date">2005-08-02</span>
<a class="post-link" href="https://bannister.us/weblog/2005/geeksopmlorg-dave-luebbert-on-instant-outlining-and-microsoft">Instant Outlining</a>
</li>
<li>
<span class="post-date">2005-08-02</span>
<a class="post-link" href="https://bannister.us/weblog/2005/brooke-ramel">Brooke Ramel</a>
</li>
<li>
<span class="post-date">2005-07-23</span>
<a class="post-link" href="https://bannister.us/weblog/2005/un-spinning-the-question-of-cover">Un-spinning the question of "cover"</a>
</li>
<li>
<span class="post-date">2005-07-23</span>
<a class="post-link" href="https://bannister.us/weblog/2005/roundabouts">Roundabouts</a>
</li>
<li>
<span class="post-date">2005-07-23</span>
<a class="post-link" href="https://bannister.us/weblog/2005/model-quality-introductions">Model Quality Introductions</a>
</li>
<li>
<span class="post-date">2005-07-15</span>
<a class="post-link" href="https://bannister.us/weblog/2005/usefulness-of-terrorist-watch-lists">Usefulness of Terrorist Watch Lists</a>
</li>
<li>
<span class="post-date">2005-07-13</span>
<a class="post-link" href="https://bannister.us/weblog/2005/santa-claus-arizona">Santa Claus, Arizona</a>
</li>
<li>
<span class="post-date">2005-07-12</span>
<a class="post-link" href="https://bannister.us/weblog/2005/mail-filtering">Mail Filtering</a>
</li>
<li>
<span class="post-date">2005-07-11</span>
<a class="post-link" href="https://bannister.us/weblog/2005/the-new-public-relations">The New Public Relations</a>
</li>
<li>
<span class="post-date">2005-07-09</span>
<a class="post-link" href="https://bannister.us/weblog/2005/slow-radio">Slow radio?</a>
</li>
<li>
<span class="post-date">2005-07-09</span>
<a class="post-link" href="https://bannister.us/weblog/2005/satellite-iamges-and-security">Satellite images and security</a>
</li>
<li>
<span class="post-date">2005-07-09</span>
<a class="post-link" href="https://bannister.us/weblog/2005/plame-fireworks-rove-under-suspicion-and-why-is-judith-miller-really-going-to-jail-needlenose">Rove under suspicion</a>
</li>
<li>
<span class="post-date">2005-07-09</span>
<a class="post-link" href="https://bannister.us/weblog/2005/iraq-as-flypaper">Iraq as flypaper</a>
</li>
<li>
<span class="post-date">2005-07-09</span>
<a class="post-link" href="https://bannister.us/weblog/2005/3d-star-maps-by-stellarium">3D star maps</a>
</li>
<li>
<span class="post-date">2005-07-06</span>
<a class="post-link" href="https://bannister.us/weblog/2005/reminder">Reminder</a>
</li>
<li>
<span class="post-date">2005-07-03</span>
<a class="post-link" href="https://bannister.us/weblog/2005/a-step-in-the-right-direction">A step in the right direction</a>
</li>
<li>
<span class="post-date">2005-06-27</span>
<a class="post-link" href="https://bannister.us/weblog/2005/attempted-identity-theft">Attempted identity theft?</a>
</li>
<li>
<span class="post-date">2005-06-25</span>
<a class="post-link" href="https://bannister.us/weblog/2005/overheated-honda">Overheated Honda</a>
</li>
<li>
<span class="post-date">2005-06-25</span>
<a class="post-link" href="https://bannister.us/weblog/2005/apple-going-to-intel-yet-another-speculation">Apple going to Intel - yet another speculation</a>
</li>
<li>
<span class="post-date">2005-06-24</span>
<a class="post-link" href="https://bannister.us/weblog/2005/unique-humor">unique humor</a>
</li>
<li>
<span class="post-date">2005-06-24</span>
<a class="post-link" href="https://bannister.us/weblog/2005/the-downing-street-memos-the-text">The Downing Street Memos</a>
</li>
<li>
<span class="post-date">2005-06-24</span>
<a class="post-link" href="https://bannister.us/weblog/2005/splendid-isolation">Splendid isolation</a>
</li>
<li>
<span class="post-date">2005-06-24</span>
<a class="post-link" href="https://bannister.us/weblog/2005/a-different-sense-of-distance">A different sense of distance</a>
</li>
<li>
<span class="post-date">2005-06-21</span>
<a class="post-link" href="https://bannister.us/weblog/2005/wonderful-twisty-scenic-roads">Wonderful twisty scenic roads</a>
</li>
<li>
<span class="post-date">2005-06-21</span>
<a class="post-link" href="https://bannister.us/weblog/2005/every-once-and-a-while">Every once and a while...</a>
</li>
<li>
<span class="post-date">2005-06-19</span>
<a class="post-link" href="https://bannister.us/weblog/2005/threads-and-whimsy">Threads and Whimsy</a>
</li>
<li>
<span class="post-date">2005-06-19</span>
<a class="post-link" href="https://bannister.us/weblog/2005/raise-the-bridge-or-lower-the-river">Raise the bridge or lower the river?</a>
</li>
<li>
<span class="post-date">2005-06-16</span>
<a class="post-link" href="https://bannister.us/weblog/2005/mythical-engineer-shortage">Mythical Engineer Shortage</a>
</li>
<li>
<span class="post-date">2005-06-14</span>
<a class="post-link" href="https://bannister.us/weblog/2005/web-based-command-line-interpreter">Web-based command-line interpreter</a>
</li>
<li>
<span class="post-date">2005-06-14</span>
<a class="post-link" href="https://bannister.us/weblog/2005/apple-going-to-intel-a-telling-question">Apple going to Intel - a telling question</a>
</li>
<li>
<span class="post-date">2005-06-14</span>
<a class="post-link" href="https://bannister.us/weblog/2005/another-beautiful-thing">Another beautiful thing</a>
</li>
<li>
<span class="post-date">2005-06-09</span>
<a class="post-link" href="https://bannister.us/weblog/2005/memorial-bench">Memorial bench</a>
</li>
<li>
<span class="post-date">2005-06-09</span>
<a class="post-link" href="https://bannister.us/weblog/2005/bogus-filtering">Bogus filtering</a>
</li>
<li>
<span class="post-date">2005-06-08</span>
<a class="post-link" href="https://bannister.us/weblog/2005/semi-secrets-and-the-white-house">Semi-secrets and the White House?</a>
</li>
<li>
<span class="post-date">2005-06-08</span>
<a class="post-link" href="https://bannister.us/weblog/2005/excluding-a-robot">Excluding a robot</a>
</li>
<li>
<span class="post-date">2005-06-07</span>
<a class="post-link" href="https://bannister.us/weblog/2005/04-04-01gif-gif-image-450x615-pixels">Board chow</a>
</li>
<li>
<span class="post-date">2005-06-06</span>
<a class="post-link" href="https://bannister.us/weblog/2005/ibm-really-blew-it-with-the-powerpc">IBM really blew it with the PowerPC</a>
</li>
<li>
<span class="post-date">2005-06-03</span>
<a class="post-link" href="https://bannister.us/weblog/2005/simple-cooking">Simple cooking</a>
</li>
<li>
<span class="post-date">2005-06-03</span>
<a class="post-link" href="https://bannister.us/weblog/2005/fishing">fishing</a>
</li>
<li>
<span class="post-date">2005-06-03</span>
<a class="post-link" href="https://bannister.us/weblog/2005/family-flying">family-flying</a>
</li>
<li>
<span class="post-date">2005-06-03</span>
<a class="post-link" href="https://bannister.us/weblog/2005/dog-days-1">Dog Days Criterium</a>
</li>
<li>
<span class="post-date">2005-06-01</span>
<a class="post-link" href="https://bannister.us/weblog/2005/motor-trends">Motor trends?</a>
</li>
<li>
<span class="post-date">2005-05-31</span>
<a class="post-link" href="https://bannister.us/weblog/2005/mission-creep">Mission creep</a>
</li>
<li>
<span class="post-date">2005-05-29</span>
<a class="post-link" href="https://bannister.us/weblog/2005/random-photo-story">Random photo story</a>
</li>
<li>
<span class="post-date">2005-05-27</span>
<a class="post-link" href="https://bannister.us/weblog/2005/hitchhikersgui">HitchhikersGUI</a>
</li>
<li>
<span class="post-date">2005-05-26</span>
<a class="post-link" href="https://bannister.us/weblog/2005/oasis-office-document-standards">OASIS Office Document Standards</a>
</li>
<li>
<span class="post-date">2005-05-26</span>
<a class="post-link" href="https://bannister.us/weblog/2005/astronic-super-hero">Astronic Super Hero!</a>
</li>
<li>
<span class="post-date">2005-05-23</span>
<a class="post-link" href="https://bannister.us/weblog/2005/the-astronic-express">The Astronic Express</a>
</li>
<li>
<span class="post-date">2005-05-23</span>
<a class="post-link" href="https://bannister.us/weblog/2005/intelligent-design">Intelligent Design</a>
</li>
<li>
<span class="post-date">2005-05-21</span>
<a class="post-link" href="https://bannister.us/weblog/2005/on-adults-and-responsibility">On adults and responsibility</a>
</li>
<li>
<span class="post-date">2005-05-17</span>
<a class="post-link" href="https://bannister.us/weblog/2005/java-harmony">Java Harmony</a>
</li>
<li>
<span class="post-date">2005-05-17</span>
<a class="post-link" href="https://bannister.us/weblog/2005/caseless-critic">Caseless critic</a>
</li>
<li>
<span class="post-date">2005-05-14</span>
<a class="post-link" href="https://bannister.us/weblog/2005/death-of-a-muslim-woman">Death of a Muslim Woman</a>
</li>
<li>
<span class="post-date">2005-05-13</span>
<a class="post-link" href="https://bannister.us/weblog/2005/dubious-sushi">Dubious Sushi</a>
</li>
<li>
<span class="post-date">2005-05-12</span>
<a class="post-link" href="https://bannister.us/weblog/2005/web-versus-desktop-a-personal-example">Web versus desktop - a personal example</a>
</li>
<li>
<span class="post-date">2005-05-10</span>
<a class="post-link" href="https://bannister.us/weblog/2005/what-every-dog-needs">What every dog needs</a>
</li>
<li>
<span class="post-date">2005-05-10</span>
<a class="post-link" href="https://bannister.us/weblog/2005/usability-in-the-news-mobile-web-initiative">Mobile Web Design</a>
</li>
<li>
<span class="post-date">2005-05-09</span>
<a class="post-link" href="https://bannister.us/weblog/2005/oops">Oops</a>
</li>
<li>
<span class="post-date">2005-05-09</span>
<a class="post-link" href="https://bannister.us/weblog/2005/layers">Layers</a>
</li>
<li>
<span class="post-date">2005-05-09</span>
<a class="post-link" href="https://bannister.us/weblog/2005/flickr">Flickr</a>
</li>
<li>
<span class="post-date">2005-05-06</span>
<a class="post-link" href="https://bannister.us/weblog/2005/hitmaps">HitMaps</a>
</li>
<li>
<span class="post-date">2005-05-06</span>
<a class="post-link" href="https://bannister.us/weblog/2005/google-web-accelerator-considered-useful">Google Web Accelerator considered useful</a>
</li>
<li>
<span class="post-date">2005-05-06</span>
<a class="post-link" href="https://bannister.us/weblog/2005/an-unfortunate-graphic">An unfortunate graphic</a>
</li>
<li>
<span class="post-date">2005-04-30</span>
<a class="post-link" href="https://bannister.us/weblog/2005/zarathustra">zarathustra</a>
</li>
<li>
<span class="post-date">2005-04-30</span>
<a class="post-link" href="https://bannister.us/weblog/2005/old-india">Old India</a>
</li>
<li>
<span class="post-date">2005-04-30</span>
<a class="post-link" href="https://bannister.us/weblog/2005/first-impressions">First impressions</a>
</li>
<li>
<span class="post-date">2005-04-27</span>
<a class="post-link" href="https://bannister.us/weblog/2005/flickr20photo20download3a20computer20chaos">Computer Chaos</a>
</li>
<li>
<span class="post-date">2005-04-23</span>
<a class="post-link" href="https://bannister.us/weblog/2005/amazoncom-books-the-prince">The Prince</a>
</li>
<li>
<span class="post-date">2005-04-22</span>
<a class="post-link" href="https://bannister.us/weblog/2005/real-or-not">real or not?</a>
</li>
<li>
<span class="post-date">2005-04-20</span>
<a class="post-link" href="https://bannister.us/weblog/2005/google-doom">Google Doom</a>
</li>
<li>
<span class="post-date">2005-04-18</span>
<a class="post-link" href="https://bannister.us/weblog/2005/healthcare-losses">Healthcare losses</a>
</li>
<li>
<span class="post-date">2005-04-17</span>
<a class="post-link" href="https://bannister.us/weblog/2005/tough-sell">Tough Sell</a>
</li>
<li>
<span class="post-date">2005-04-17</span>
<a class="post-link" href="https://bannister.us/weblog/2005/google-maps-opdyke-roadauburn-hills-mi">Auburn Hills, Michigan</a>
</li>
<li>
<span class="post-date">2005-04-15</span>
<a class="post-link" href="https://bannister.us/weblog/2005/cddl-suns-license-for-solaris">CDDL - Sun's license for Solaris</a>
</li>
<li>
<span class="post-date">2005-04-09</span>
<a class="post-link" href="https://bannister.us/weblog/2005/google-maps-cr-4225atlanta-tx-75551">Take this airplane - please</a>
</li>
<li>
<span class="post-date">2005-04-09</span>
<a class="post-link" href="https://bannister.us/weblog/2005/280">Popular images - why?</a>
</li>
<li>
<span class="post-date">2005-04-08</span>
<a class="post-link" href="https://bannister.us/weblog/2005/ubuntu-seems-to-be-it">Ubuntu - seems to be it</a>
</li>
<li>
<span class="post-date">2005-04-05</span>
<a class="post-link" href="https://bannister.us/weblog/2005/roomba-robot-vacuum-died-again">Roomba (robot vacuum) died again</a>
</li>
<li>
<span class="post-date">2005-04-05</span>
<a class="post-link" href="https://bannister.us/weblog/2005/playing-with-linuxsolaris-again">Playing with Linux/Solaris again</a>
</li>
<li>
<span class="post-date">2005-04-04</span>
<a class="post-link" href="https://bannister.us/weblog/2005/use-the-web-microsoft-windows-media">Use the web (Microsoft Windows Media)</a>
</li>
<li>
<span class="post-date">2005-04-04</span>
<a class="post-link" href="https://bannister.us/weblog/2005/uf007802gif-gif-image-720x274-pixels">Enticing EULA</a>
</li>
<li>
<span class="post-date">2005-04-04</span>
<a class="post-link" href="https://bannister.us/weblog/2005/toyota-sludge">Toyota sludge</a>
</li>
<li>
<span class="post-date">2005-04-04</span>
<a class="post-link" href="https://bannister.us/weblog/2005/no-software-patents-means-no-software-patents">No software patents means no software patents</a>
</li>
<li>
<span class="post-date">2005-04-02</span>
<a class="post-link" href="https://bannister.us/weblog/2005/knocking-on-the-door">Knocking on the door?</a>
</li>
<li>
<span class="post-date">2005-04-02</span>
<a class="post-link" href="https://bannister.us/weblog/2005/google-search-movie-showtimes">Google Search - movie showtimes</a>
</li>
<li>
<span class="post-date">2005-04-02</span>
<a class="post-link" href="https://bannister.us/weblog/2005/design-mistakes">Design mistakes</a>
</li>
<li>
<span class="post-date">2005-03-31</span>
<a class="post-link" href="https://bannister.us/weblog/2005/what-happened-to-yahoo">What happened to Yahoo!?</a>
</li>
<li>
<span class="post-date">2005-03-31</span>
<a class="post-link" href="https://bannister.us/weblog/2005/no-strings-attached">No strings attached</a>
</li>
<li>
<span class="post-date">2005-03-31</span>
<a class="post-link" href="https://bannister.us/weblog/2005/dubious-dvds">Dubious DVDs</a>
</li>
<li>
<span class="post-date">2005-03-31</span>
<a class="post-link" href="https://bannister.us/weblog/2005/drug-warrant">Drug WarRant</a>
</li>
<li>
<span class="post-date">2005-03-30</span>
<a class="post-link" href="https://bannister.us/weblog/2005/fedora-core">Fedora core</a>
</li>
<li>
<span class="post-date">2005-03-29</span>
<a class="post-link" href="https://bannister.us/weblog/2005/usability-references">Usability references</a>
</li>
<li>
<span class="post-date">2005-03-29</span>
<a class="post-link" href="https://bannister.us/weblog/2005/solaris-10-attempt">Solaris 10 attempt</a>
</li>
<li>
<span class="post-date">2005-03-29</span>
<a class="post-link" href="https://bannister.us/weblog/2005/debian-install-sorta">Debian install - sort'a</a>
</li>
<li>
<span class="post-date">2005-03-26</span>
<a class="post-link" href="https://bannister.us/weblog/2005/military-visitors">Military visitors</a>
</li>
<li>
<span class="post-date">2005-03-26</span>
<a class="post-link" href="https://bannister.us/weblog/2005/butterflies">Butterflies</a>
</li>
<li>
<span class="post-date">2005-03-25</span>
<a class="post-link" href="https://bannister.us/weblog/2005/the-past-is-rolling-up-behind-us">The past is rolling up behind us.</a>
</li>
<li>
<span class="post-date">2005-03-25</span>
<a class="post-link" href="https://bannister.us/weblog/2005/pac-man-nightmare">Pac-man nightmare</a>
</li>
<li>
<span class="post-date">2005-03-25</span>
<a class="post-link" href="https://bannister.us/weblog/2005/norman-borlaug-forgotten-benefactor-of-humanity-center-for-global-food-issues">Norman Borlaug - Forgotten Benefactor of Humanity -- Center for Global Food Issues</a>
</li>
<li>
<span class="post-date">2005-03-25</span>
<a class="post-link" href="https://bannister.us/weblog/2005/no-small-fonts-please">No small fonts, please</a>
</li>
<li>
<span class="post-date">2005-03-25</span>
<a class="post-link" href="https://bannister.us/weblog/2005/designing-a-better-cell-phone-user-interface">Designing a better cell phone user interface</a>
</li>
<li>
<span class="post-date">2005-03-24</span>
<a class="post-link" href="https://bannister.us/weblog/2005/upcomingcom">Upcoming.com</a>
</li>
<li>
<span class="post-date">2005-03-24</span>
<a class="post-link" href="https://bannister.us/weblog/2005/the-dirty-little-secret-of-myspace">The dirty little secret of MySpace</a>
</li>
<li>
<span class="post-date">2005-03-24</span>
<a class="post-link" href="https://bannister.us/weblog/2005/full-moon-out-tonight">Full moon out tonight</a>
</li>
<li>
<span class="post-date">2005-03-24</span>
<a class="post-link" href="https://bannister.us/weblog/2005/clintons-military-in-iraq">In Iraq</a>
</li>
<li>
<span class="post-date">2005-03-24</span>
<a class="post-link" href="https://bannister.us/weblog/2005/aol-at-144kb">AOL at 14.4Kb</a>
</li>
<li>
<span class="post-date">2005-03-20</span>
<a class="post-link" href="https://bannister.us/weblog/2005/newold-cell-phone">New/old cell phone</a>
</li>
<li>
<span class="post-date">2005-03-19</span>
<a class="post-link" href="https://bannister.us/weblog/2005/hot-points-a-blog-by-go-daddy-founder-and-president-bob-parsons">Free SSL certificates to open-source projects</a>
</li>
<li>
<span class="post-date">2005-03-19</span>
<a class="post-link" href="https://bannister.us/weblog/2005/a-good-use-for-the-tag">A good use for the <blink> tag</blink></a>
</li>
<li>
<span class="post-date">2005-03-17</span>
<a class="post-link" href="https://bannister.us/weblog/2005/the-assumption-behind-mail-in-rebates">The assumption behind mail-in rebates</a>
</li>
<li>
<span class="post-date">2005-03-12</span>
<a class="post-link" href="https://bannister.us/weblog/2005/time-to-leave">Time to leave?</a>
</li>
<li>
<span class="post-date">2005-03-12</span>
<a class="post-link" href="https://bannister.us/weblog/2005/self-checkout-technology">Self-Checkout Technology</a>
</li>
<li>
<span class="post-date">2005-03-12</span>
<a class="post-link" href="https://bannister.us/weblog/2005/cramped-airline-seating">Cramped airline seating</a>
</li>
<li>
<span class="post-date">2005-03-11</span>
<a class="post-link" href="https://bannister.us/weblog/2005/medical-students-and-residents">Medical students and residents</a>
</li>
<li>
<span class="post-date">2005-03-08</span>
<a class="post-link" href="https://bannister.us/weblog/2005/displaced-californian">Displaced Californian</a>
</li>
<li>
<span class="post-date">2005-03-04</span>
<a class="post-link" href="https://bannister.us/weblog/2005/carlys-way">Carly's Way</a>
</li>
<li>
<span class="post-date">2005-03-01</span>
<a class="post-link" href="https://bannister.us/weblog/2005/subscription-growth-in-techblogs">Subscription growth in techblogs?</a>
</li>
<li>
<span class="post-date">2005-02-28</span>
<a class="post-link" href="https://bannister.us/weblog/2005/wikipedia-database-download">Wikipedia database download</a>
</li>
<li>
<span class="post-date">2005-02-25</span>
<a class="post-link" href="https://bannister.us/weblog/2005/website-redesign-at-staplescom">Website redesign at Staples.com</a>
</li>
<li>
<span class="post-date">2005-02-24</span>
<a class="post-link" href="https://bannister.us/weblog/2005/things-you-love-in-your-house">Things You Love In Your House</a>
</li>
<li>
<span class="post-date">2005-02-23</span>
<a class="post-link" href="https://bannister.us/weblog/2005/its-alive">It's alive!</a>
</li>
<li>
<span class="post-date">2005-02-23</span>
<a class="post-link" href="https://bannister.us/weblog/2005/how-much-secrecy-do-we-want-to-allow-the-government">How much Secrecy do we want to allow the Government?</a>
</li>
<li>
<span class="post-date">2005-02-23</span>
<a class="post-link" href="https://bannister.us/weblog/2005/census-of-the-republican-party">CENSUS OF THE REPUBLICAN PARTY</a>
</li>
<li>
<span class="post-date">2005-02-23</span>
<a class="post-link" href="https://bannister.us/weblog/2005/cannot-think-of-anything-to-add-to-this-one">Relative Review</a>
</li>
<li>
<span class="post-date">2005-02-18</span>
<a class="post-link" href="https://bannister.us/weblog/2005/smiling-and-blinking">Smiling and blinking</a>
</li>
<li>
<span class="post-date">2005-02-18</span>
<a class="post-link" href="https://bannister.us/weblog/2005/ajax-a-new-approach-to-web-applications">ajax - a new approach to web applications</a>
</li>
<li>
<span class="post-date">2005-02-17</span>
<a class="post-link" href="https://bannister.us/weblog/2005/how-to-shoot-yourself-in-the-foot">How to shoot yourself in the foot</a>
</li>
<li>
<span class="post-date">2005-02-16</span>
<a class="post-link" href="https://bannister.us/weblog/2005/travel-to-cuba-by-us-citizens">Travel to Cuba by US Citizens</a>
</li>
<li>
<span class="post-date">2005-02-16</span>
<a class="post-link" href="https://bannister.us/weblog/2005/navigating-among-elephants">Navigating among Elephants</a>
</li>
<li>
<span class="post-date">2005-02-16</span>
<a class="post-link" href="https://bannister.us/weblog/2005/a-thing-of-beauty">A thing of beauty</a>
</li>
<li>
<span class="post-date">2005-02-15</span>
<a class="post-link" href="https://bannister.us/weblog/2005/is-ada-one-of-the-technology-losers">Is Ada one of the "Technology Losers"?</a>
</li>
<li>
<span class="post-date">2005-02-15</span>
<a class="post-link" href="https://bannister.us/weblog/2005/halleys-comment">Halley's Comment</a>
</li>
<li>
<span class="post-date">2005-02-15</span>
<a class="post-link" href="https://bannister.us/weblog/2005/groupware">Groupware?</a>
</li>
<li>
<span class="post-date">2005-02-14</span>
<a class="post-link" href="https://bannister.us/weblog/2005/strong-typing-vs-strong-testing">Strong Typing vs. Strong Testing</a>
</li>
<li>
<span class="post-date">2005-02-14</span>
<a class="post-link" href="https://bannister.us/weblog/2005/missile-defense-system-fails-another-test">Missile Defense System Fails Another Test</a>
</li>
<li>
<span class="post-date">2005-02-14</span>
<a class="post-link" href="https://bannister.us/weblog/2005/bandwidth">Bandwidth</a>
</li>
<li>
<span class="post-date">2005-02-13</span>
<a class="post-link" href="https://bannister.us/weblog/2005/english-cut">English Cut</a>
</li>
<li>
<span class="post-date">2005-02-13</span>
<a class="post-link" href="https://bannister.us/weblog/2005/banned-super-bowl-ad">Banned Super Bowl ad</a>
</li>
<li>
<span class="post-date">2005-02-11</span>
<a class="post-link" href="https://bannister.us/weblog/2005/global-warming-and-herd-behavior">Global warming and herd behavior</a>
</li>
<li>
<span class="post-date">2005-02-09</span>
<a class="post-link" href="https://bannister.us/weblog/2005/a-rule-of-thumb">A rule of thumb</a>
</li>
<li>
<span class="post-date">2005-02-06</span>
<a class="post-link" href="https://bannister.us/weblog/2005/photographer-seeks-resolution">Photographer Seeks Resolution</a>
</li>
<li>
<span class="post-date">2005-02-06</span>
<a class="post-link" href="https://bannister.us/weblog/2005/hidden-brilliance">Hidden brilliance</a>
</li>
<li>
<span class="post-date">2005-02-06</span>
<a class="post-link" href="https://bannister.us/weblog/2005/female-gis-flash-breasts-thong-in-mud-wrestling-contests">U.S. Guards Threw Mudwrestling Party</a>
</li>
<li>
<span class="post-date">2005-02-05</span>
<a class="post-link" href="https://bannister.us/weblog/2005/rent-your-music">Rent your music?</a>
</li>
<li>
<span class="post-date">2005-02-04</span>
<a class="post-link" href="https://bannister.us/weblog/2005/irobot-still-dead">iRobot still dead :(</a>
</li>
<li>
<span class="post-date">2005-02-01</span>
<a class="post-link" href="https://bannister.us/weblog/2005/welcome-to-solaris">Welcome to Solaris?</a>
</li>
<li>
<span class="post-date">2005-01-30</span>
<a class="post-link" href="https://bannister.us/weblog/2005/building-a-better-string-class">Building a better string class</a>
</li>
<li>
<span class="post-date">2005-01-29</span>
<a class="post-link" href="https://bannister.us/weblog/2005/building-a-better-string-class-what-advantage-in-copy-on-write-in-stdstring">Building a better string class - what advantage in copy-on-write for std::string?</a>
</li>
<li>
<span class="post-date">2005-01-29</span>
<a class="post-link" href="https://bannister.us/weblog/2005/building-a-better-string-class-sentinels-and-wrap-up">Building a better string class - sentinels and wrap up</a>
</li>
<li>
<span class="post-date">2005-01-29</span>
<a class="post-link" href="https://bannister.us/weblog/2005/building-a-better-string-class-comparing-class-implementations">Building a better string class - comparing class implementations</a>
</li>
<li>
<span class="post-date">2005-01-27</span>
<a class="post-link" href="https://bannister.us/weblog/2005/welcome-to-staples-rebate-center">Tax-time and Staples "Easy" Rebates</a>
</li>
<li>
<span class="post-date">2005-01-24</span>
<a class="post-link" href="https://bannister.us/weblog/2005/no-bugs">No Bugs?</a>
</li>
<li>
<span class="post-date">2005-01-23</span>
<a class="post-link" href="https://bannister.us/weblog/2005/199">The American SS?</a>
</li>
<li>
<span class="post-date">2005-01-22</span>
<a class="post-link" href="https://bannister.us/weblog/2005/speed-versus-complexity-in-user-interface-interaction">Speed versus complexity in User Interface interaction</a>
</li>
<li>
<span class="post-date">2005-01-22</span>
<a class="post-link" href="https://bannister.us/weblog/2005/nice-weather">Nice weather</a>
</li>
<li>
<span class="post-date">2005-01-21</span>
<a class="post-link" href="https://bannister.us/weblog/2005/american-influence">American influence</a>
</li>
<li>
<span class="post-date">2005-01-20</span>
<a class="post-link" href="https://bannister.us/weblog/2005/why-is-american-airlines-gathering-written-dossiers-on-fliers-friends">Why is American Airlines gathering written dossiers on fliers' friends?</a>
</li>
<li>
<span class="post-date">2005-01-20</span>
<a class="post-link" href="https://bannister.us/weblog/2005/sparkle-cleaning-service">Sparkle Cleaning Service</a>
</li>
<li>
<span class="post-date">2005-01-20</span>
<a class="post-link" href="https://bannister.us/weblog/2005/jonathan-and-ibm">Jonathan and IBM</a>
</li>
<li>
<span class="post-date">2005-01-18</span>
<a class="post-link" href="https://bannister.us/weblog/2005/structure-editors-ides-and-another-lisp-flashback">Structure editors, IDEs, and another Lisp flashback</a>
</li>
<li>
<span class="post-date">2005-01-17</span>
<a class="post-link" href="https://bannister.us/weblog/2005/in-the-name-of-science">In the name of science</a>
</li>
<li>
<span class="post-date">2005-01-17</span>
<a class="post-link" href="https://bannister.us/weblog/2005/a-diversion-into-hash-tables-and-binary-searches">A diversion into hash tables and binary searches</a>
</li>
<li>
<span class="post-date">2005-01-16</span>
<a class="post-link" href="https://bannister.us/weblog/2005/my-irobot-died">My iRobot died :(</a>
</li>
<li>
<span class="post-date">2005-01-16</span>
<a class="post-link" href="https://bannister.us/weblog/2005/how-to-build-a-better-string-class-and-a-surprise">How to build a better string class - and a surprise</a>
</li>
<li>
<span class="post-date">2005-01-16</span>
<a class="post-link" href="https://bannister.us/weblog/2005/google-dark-fiber-and-killer-web-applications">Google. 'dark fiber', and killer web applications</a>
</li>
<li>
<span class="post-date">2005-01-16</span>
<a class="post-link" href="https://bannister.us/weblog/2005/continued-building-a-better-string-class-assumptions-revised">Continued - building a better string class - assumptions revised</a>
</li>
<li>
<span class="post-date">2005-01-15</span>
<a class="post-link" href="https://bannister.us/weblog/2005/warlords">Warlords</a>
</li>
<li>
<span class="post-date">2005-01-14</span>
<a class="post-link" href="https://bannister.us/weblog/2005/what-to-wear-to-a-costume-party">What to wear to a costume party?</a>
</li>
<li>
<span class="post-date">2005-01-10</span>
<a class="post-link" href="https://bannister.us/weblog/2005/ongoing-how-many-percent">How Many Percent?</a>
</li>
<li>
<span class="post-date">2005-01-10</span>
<a class="post-link" href="https://bannister.us/weblog/2005/ibm-press-room-press-releases">IBM Press room - Press releases</a>
</li>
<li>
<span class="post-date">2005-01-07</span>
<a class="post-link" href="https://bannister.us/weblog/2005/legacy-of-dhrystone">Legacy of Dhrystone</a>
</li>
<li>
<span class="post-date">2005-01-05</span>
<a class="post-link" href="https://bannister.us/weblog/2005/hp-tech-support">HP Tech Support</a>
</li>
<li>
<span class="post-date">2005-01-04</span>
<a class="post-link" href="https://bannister.us/weblog/2005/screwed-by-microsoft">Screwed by Microsoft</a>
</li>
<li>
<span class="post-date">2005-01-01</span>
<a class="post-link" href="https://bannister.us/weblog/2005/what-do-we-really-need-from-a-database">What do we really need from a database?</a>
</li>
<li>
<span class="post-date">2004-12-30</span>
<a class="post-link" href="https://bannister.us/weblog/2004/robot-vacuum">Robot Vacuum</a>
</li>
<li>
<span class="post-date">2004-12-30</span>
<a class="post-link" href="https://bannister.us/weblog/2004/battling-the-antibodies">Battling the antibodies</a>
</li>
<li>
<span class="post-date">2004-12-29</span>
<a class="post-link" href="https://bannister.us/weblog/2004/the-tyranny-of-resturant-cooking">The Tyranny of Resturant Cooking</a>
</li>
<li>
<span class="post-date">2004-12-29</span>
<a class="post-link" href="https://bannister.us/weblog/2004/reverse-proxies-and-the-location-or-content-location-headers">Reverse Proxies and the "Location" or "Content-Location" headers.</a>
</li>
<li>
<span class="post-date">2004-12-29</span>
<a class="post-link" href="https://bannister.us/weblog/2004/retirement-math-social-security-wins">Retirement math - Social Security wins</a>
</li>
<li>
<span class="post-date">2004-12-29</span>
<a class="post-link" href="https://bannister.us/weblog/2004/one-ide-to-rule-them-all">One IDE to Rule Them All?</a>
</li>
<li>
<span class="post-date">2004-12-27</span>
<a class="post-link" href="https://bannister.us/weblog/2004/comments-off">Comments off</a>
</li>
<li>
<span class="post-date">2004-12-25</span>
<a class="post-link" href="https://bannister.us/weblog/2004/isapi_reward-restart">isapi_reward restart</a>
</li>
<li>
<span class="post-date">2004-12-19</span>
<a class="post-link" href="https://bannister.us/weblog/2004/promised-deficits">Promised Deficits</a>
</li>
<li>
<span class="post-date">2004-12-19</span>
<a class="post-link" href="https://bannister.us/weblog/2004/can-leds-emit-polarized-light">Can LEDs emit polarized light?</a>
</li>
<li>
<span class="post-date">2004-12-18</span>
<a class="post-link" href="https://bannister.us/weblog/2004/welcome-to-jim-taggarts-cocktail-party">Welcome to Jim Taggart's cocktail party</a>
</li>
<li>
<span class="post-date">2004-12-16</span>
<a class="post-link" href="https://bannister.us/weblog/2004/shallow-bush">Shallow Bush</a>
</li>
<li>
<span class="post-date">2004-12-04</span>
<a class="post-link" href="https://bannister.us/weblog/2004/optimal-code">Optimal code</a>
</li>
<li>
<span class="post-date">2004-12-03</span>
<a class="post-link" href="https://bannister.us/weblog/2004/persimmons">Persimmons</a>
</li>
<li>
<span class="post-date">2004-11-30</span>
<a class="post-link" href="https://bannister.us/weblog/2004/indeed">Indeed</a>
</li>
<li>
<span class="post-date">2004-11-28</span>
<a class="post-link" href="https://bannister.us/weblog/2004/secret-law">Secret Law</a>
</li>
<li>
<span class="post-date">2004-11-27</span>
<a class="post-link" href="https://bannister.us/weblog/2004/remember-south-africa">Remember South Africa?</a>
</li>
<li>
<span class="post-date">2004-11-24</span>
<a class="post-link" href="https://bannister.us/weblog/2004/yikes">Yikes!</a>
</li>
<li>
<span class="post-date">2004-11-24</span>
<a class="post-link" href="https://bannister.us/weblog/2004/thanksgiving">Thanksgiving</a>
</li>
<li>
<span class="post-date">2004-11-24</span>
<a class="post-link" href="https://bannister.us/weblog/2004/relative-noise">Relative noise</a>
</li>
<li>
<span class="post-date">2004-11-18</span>
<a class="post-link" href="https://bannister.us/weblog/2004/if-a-picture-is-worth-a-thousand-words">If a picture is worth a thousand words...</a>
</li>
<li>
<span class="post-date">2004-11-14</span>
<a class="post-link" href="https://bannister.us/weblog/2004/can-we-please-bury-the-netscape-metaphor">Can We Please Bury the Netscape Metaphor?</a>
</li>
<li>
<span class="post-date">2004-11-14</span>
<a class="post-link" href="https://bannister.us/weblog/2004/after-the-rain">After the rain</a>
</li>
<li>
<span class="post-date">2004-11-13</span>
<a class="post-link" href="https://bannister.us/weblog/2004/good-stuff-kittens-spaminator">Good stuff - Kitten's Spaminator</a>
</li>
<li>
<span class="post-date">2004-11-09</span>
<a class="post-link" href="https://bannister.us/weblog/2004/islands-in-the-distance">Islands in the distance</a>
</li>
<li>
<span class="post-date">2004-11-06</span>
<a class="post-link" href="https://bannister.us/weblog/2004/puzzled">Puzzled</a>
</li>
<li>
<span class="post-date">2004-11-06</span>
<a class="post-link" href="https://bannister.us/weblog/2004/elizas-shady-sisters">Eliza's shady sisters?</a>
</li>
<li>
<span class="post-date">2004-11-01</span>
<a class="post-link" href="https://bannister.us/weblog/2004/working-the-polls">Working the polls</a>
</li>
<li>
<span class="post-date">2004-10-31</span>
<a class="post-link" href="https://bannister.us/weblog/2004/at-the-intersection-of-politics-technology-and-economics">At the intersection of politics, technology and economics</a>
</li>
<li>
<span class="post-date">2004-10-27</span>
<a class="post-link" href="https://bannister.us/weblog/2004/mobility-and-dancing-bears">Mobility and dancing bears</a>
</li>
<li>
<span class="post-date">2004-10-24</span>
<a class="post-link" href="https://bannister.us/weblog/2004/doctors-are-doing-just-fine">Doctors are doing just fine...</a>
</li>
<li>
<span class="post-date">2004-10-22</span>
<a class="post-link" href="https://bannister.us/weblog/2004/this-still-bothers-me">This still bothers me...</a>
</li>
<li>
<span class="post-date">2004-10-17</span>
<a class="post-link" href="https://bannister.us/weblog/2004/wildfire">Wildfire</a>
</li>
<li>
<span class="post-date">2004-10-15</span>
<a class="post-link" href="https://bannister.us/weblog/2004/web-criminals-whack-a-mole">Web criminals & Whack-a-mole</a>
</li>
<li>
<span class="post-date">2004-10-11</span>
<a class="post-link" href="https://bannister.us/weblog/2004/oil-wars">Oil wars?</a>
</li>
<li>
<span class="post-date">2004-10-11</span>
<a class="post-link" href="https://bannister.us/weblog/2004/escapable-logic-war-in-vietnam">A viewpoint - War in Vietnam</a>
</li>
<li>
<span class="post-date">2004-10-08</span>
<a class="post-link" href="https://bannister.us/weblog/2004/what-happened-to-microsoft">What happened to Microsoft?</a>
</li>
<li>
<span class="post-date">2004-10-08</span>
<a class="post-link" href="https://bannister.us/weblog/2004/verified-voting-campaign-to-demand-verifiable-election-results">Verified Voting - Campaign To Demand Verifiable Election Results</a>
</li>
<li>
<span class="post-date">2004-10-08</span>
<a class="post-link" href="https://bannister.us/weblog/2004/my-politics">My Politics</a>
</li>
<li>
<span class="post-date">2004-10-08</span>
<a class="post-link" href="https://bannister.us/weblog/2004/mblog-greg-wilkins">Server-side Java performance</a>
</li>
<li>
<span class="post-date">2004-09-05</span>
<a class="post-link" href="https://bannister.us/weblog/2004/attack-of-the-repo-men">Attack of the Repo Men</a>
</li>
<li>
<span class="post-date">2004-09-05</span>
<a class="post-link" href="https://bannister.us/weblog/2004/apple-imac-g5">Apple - iMac G5</a>
</li>
<li>
<span class="post-date">2004-08-30</span>
<a class="post-link" href="https://bannister.us/weblog/2004/incogblogonet-comments-on-cheer-bear">No bull?</a>
</li>
<li>
<span class="post-date">2004-08-21</span>
<a class="post-link" href="https://bannister.us/weblog/2004/ongoing-patents-and-linux">Patents and Linux</a>
</li>
<li>
<span class="post-date">2004-08-21</span>
<a class="post-link" href="https://bannister.us/weblog/2004/mollycom-doctypes-not-relevant">Maybe using XHTML is not such a good idea</a>
</li>
<li>
<span class="post-date">2004-08-21</span>
<a class="post-link" href="https://bannister.us/weblog/2004/litmus-tests-for-java">Litmus tests for Java</a>
</li>
<li>
<span class="post-date">2004-08-19</span>
<a class="post-link" href="https://bannister.us/weblog/2004/sun-was-cool">Sun was cool</a>
</li>
<li>
<span class="post-date">2004-08-05</span>
<a class="post-link" href="https://bannister.us/weblog/2004/upgraded-my-wireless-network">Upgraded my wireless network</a>
</li>
<li>
<span class="post-date">2004-08-01</span>
<a class="post-link" href="https://bannister.us/weblog/2004/ibm-and-linux">IBM and Linux</a>
</li>
<li>
<span class="post-date">2004-07-31</span>
<a class="post-link" href="https://bannister.us/weblog/2004/backyard-needs-work">Backyard needs work...</a>
</li>
<li>
<span class="post-date">2004-07-26</span>
<a class="post-link" href="https://bannister.us/weblog/2004/mozilla-trumps-ie-again">Mozilla trumps IE - again</a>
</li>
<li>
<span class="post-date">2004-07-26</span>
<a class="post-link" href="https://bannister.us/weblog/2004/display-envy">Display envy</a>
</li>
<li>
<span class="post-date">2004-07-26</span>
<a class="post-link" href="https://bannister.us/weblog/2004/compilers-back-to-basics">Compilers - back to basics</a>
</li>
<li>
<span class="post-date">2004-07-13</span>
<a class="post-link" href="https://bannister.us/weblog/2004/books-read">Books read recently</a>
</li>
<li>
<span class="post-date">2004-07-10</span>
<a class="post-link" href="https://bannister.us/weblog/2004/klunky-user-interfaces">Klunky user interfaces</a>
</li>
<li>
<span class="post-date">2004-07-10</span>
<a class="post-link" href="https://bannister.us/weblog/2004/ichat-av">iChat AV</a>
</li>
<li>
<span class="post-date">2004-07-04</span>
<a class="post-link" href="https://bannister.us/weblog/2004/isapi_reward-preview">isapi_reward preview</a>
</li>
<li>
<span class="post-date">2004-07-02</span>
<a class="post-link" href="https://bannister.us/weblog/2004/user-registration-required">User Registration Required</a>
</li>
<li>
<span class="post-date">2004-07-02</span>
<a class="post-link" href="https://bannister.us/weblog/2004/the-wretch-pat-benatar-iron-wine">The Wretch, Pat Benatar, Iron & Wine</a>
</li>
<li>
<span class="post-date">2004-07-02</span>
<a class="post-link" href="https://bannister.us/weblog/2004/sbf-glossary-vj-to-vqt">A Voltaire(ish) quote</a>
</li>
<li>
<span class="post-date">2004-07-02</span>
<a class="post-link" href="https://bannister.us/weblog/2004/sam-ruby-knot-theory">Sam Ruby - Knot Theory</a>
</li>
<li>
<span class="post-date">2004-07-02</span>
<a class="post-link" href="https://bannister.us/weblog/2004/picture-off-a-cellphone-camera">Picture off a cellphone camera</a>
</li>
<li>
<span class="post-date">2004-07-02</span>
<a class="post-link" href="https://bannister.us/weblog/2004/alex-halavais-really-sexy-sindication">Really Sexy Sindication</a>
</li>
<li>
<span class="post-date">2004-06-26</span>
<a class="post-link" href="https://bannister.us/weblog/2004/social-engineering">Social engineering</a>
</li>
<li>
<span class="post-date">2004-06-26</span>
<a class="post-link" href="https://bannister.us/weblog/2004/safer-with-mozilla">Safer with Mozilla</a>
</li>
<li>
<span class="post-date">2004-06-26</span>
<a class="post-link" href="https://bannister.us/weblog/2004/npr-national-jewish-public-radio">NPR - National Jewish Public Radio?</a>
</li>
<li>
<span class="post-date">2004-06-25</span>
<a class="post-link" href="https://bannister.us/weblog/2004/acdk">ACDK</a>
</li>
<li>
<span class="post-date">2004-06-23</span>
<a class="post-link" href="https://bannister.us/weblog/2004/why-open-source-java">Why open-source Java?</a>
</li>
<li>
<span class="post-date">2004-06-23</span>
<a class="post-link" href="https://bannister.us/weblog/2004/tax-and-spend-er-republicans">Tax and spend ... er, Republicans?</a>
</li>
<li>
<span class="post-date">2004-06-23</span>
<a class="post-link" href="https://bannister.us/weblog/2004/mis-labeled-by-the-riaa">Mis-labeled by the RIAA?</a>
</li>
<li>
<span class="post-date">2004-06-23</span>
<a class="post-link" href="https://bannister.us/weblog/2004/lisp-and-blurring-the-line-between-code-and-data">Lisp and blurring the line between code and data.</a>
</li>
<li>
<span class="post-date">2004-06-23</span>
<a class="post-link" href="https://bannister.us/weblog/2004/a-crossroads-in-software-development">A crossroads in software development.</a>
</li>
<li>
<span class="post-date">2004-06-22</span>
<a class="post-link" href="https://bannister.us/weblog/2004/databases-object-prevalence-and-oodbms-flavors">Databases, object "prevalence", and OODBMS flavors</a>
</li>
<li>
<span class="post-date">2004-06-19</span>
<a class="post-link" href="https://bannister.us/weblog/2004/civilization-watch-february-15-2004-homosexual">Homosexual "marriage"</a>
</li>
<li>
<span class="post-date">2004-06-18</span>
<a class="post-link" href="https://bannister.us/weblog/2004/suburban-planning">(sub)Urban planning</a>
</li>
<li>
<span class="post-date">2004-06-18</span>
<a class="post-link" href="https://bannister.us/weblog/2004/school-of-management">School of Management</a>
</li>
<li>
<span class="post-date">2004-06-18</span>
<a class="post-link" href="https://bannister.us/weblog/2004/massively-scalable-wikis">Massively scalable wikis</a>
</li>
<li>
<span class="post-date">2004-06-17</span>
<a class="post-link" href="https://bannister.us/weblog/2004/hide-that-elephant">Hide that Elephant</a>
</li>
<li>
<span class="post-date">2004-06-15</span>
<a class="post-link" href="https://bannister.us/weblog/2004/my-yahoo-rss-beta-launched-jeremy-zawodnys-blog">My Yahoo! RSS Beta Launched (Jeremy Zawodny's blog)</a>
</li>
<li>
<span class="post-date">2004-06-15</span>
<a class="post-link" href="https://bannister.us/weblog/2004/microsoft-is-betting-the-company-on-the-rich-client">Microsoft is betting the company on the rich client.</a>
</li>
<li>
<span class="post-date">2004-06-12</span>
<a class="post-link" href="https://bannister.us/weblog/2004/hackers-and-painters">Hackers and Painters</a>
</li>
<li>
<span class="post-date">2004-06-11</span>
<a class="post-link" href="https://bannister.us/weblog/2004/cvs-windows-and-timezones">CVS, Windows, and timezone confusion</a>
</li>
<li>
<span class="post-date">2004-06-09</span>
<a class="post-link" href="https://bannister.us/weblog/2004/movement-to-better-web-browsers">Movement to better web browsers</a>
</li>
<li>
<span class="post-date">2004-06-09</span>
<a class="post-link" href="https://bannister.us/weblog/2004/activecvs">ActiveCVS</a>
</li>
<li>
<span class="post-date">2004-06-05</span>
<a class="post-link" href="https://bannister.us/weblog/2004/weblogs-and-wikis-still-trying-to-sort-all-this-out">Weblogs, Wikis and too many constraints</a>
</li>
<li>
<span class="post-date">2004-06-03</span>
<a class="post-link" href="https://bannister.us/weblog/2004/precluding-errors-with-source-code-control">Source code control and precluding errors</a>
</li>
<li>
<span class="post-date">2004-06-03</span>
<a class="post-link" href="https://bannister.us/weblog/2004/openoffice-and-xml">OpenOffice and XML</a>
</li>
<li>
<span class="post-date">2004-06-03</span>
<a class="post-link" href="https://bannister.us/weblog/2004/genx-portable-xml-generation-in-c">Genx - portable XML generation in "C"</a>
</li>
<li>
<span class="post-date">2004-06-03</span>
<a class="post-link" href="https://bannister.us/weblog/2004/doug-engelbart-1968-demo">Doug Engelbart 1968 Demo</a>
</li>
<li>
<span class="post-date">2004-06-01</span>
<a class="post-link" href="https://bannister.us/weblog/2004/labels-to-dampen-cd-burning-cnet-newscom">Labels to dampen CD burning? | CNET News.com</a>
</li>
<li>
<span class="post-date">2004-05-31</span>
<a class="post-link" href="https://bannister.us/weblog/2004/hiking-again">Hiking, again</a>
</li>
<li>
<span class="post-date">2004-05-30</span>
<a class="post-link" href="https://bannister.us/weblog/2004/yahoo-commits-suicide">Yahoo commits suicide!</a>
</li>
<li>
<span class="post-date">2004-05-30</span>
<a class="post-link" href="https://bannister.us/weblog/2004/memorial-day-and-beer">Memorial Day ... and beer?</a>
</li>
<li>
<span class="post-date">2004-05-27</span>
<a class="post-link" href="https://bannister.us/weblog/2004/human-response-melodic-electronica">Human Response - melodic electronica</a>
</li>
<li>
<span class="post-date">2004-05-26</span>
<a class="post-link" href="https://bannister.us/weblog/2004/vintage-software">Vintage - software?</a>
</li>
<li>
<span class="post-date">2004-05-20</span>
<a class="post-link" href="https://bannister.us/weblog/2004/stargarden-huge-ambient-compositions">Stargarden - huge ambient compositions.</a>
</li>
<li>
<span class="post-date">2004-05-13</span>
<a class="post-link" href="https://bannister.us/weblog/2004/finding-lisp">Finding Lisp</a>
</li>
<li>
<span class="post-date">2004-05-07</span>
<a class="post-link" href="https://bannister.us/weblog/2004/long-bets-passing-the-turing-test-by-2029">Long Bets - Passing the Turing test by 2029</a>
</li>
<li>
<span class="post-date">2004-05-01</span>
<a class="post-link" href="https://bannister.us/weblog/2004/silly-internet-game">Silly Internet Game</a>
</li>
<li>
<span class="post-date">2004-04-17</span>
<a class="post-link" href="https://bannister.us/weblog/2004/santa-barbara">Santa Barbara</a>
</li>
<li>
<span class="post-date">2004-04-15</span>
<a class="post-link" href="https://bannister.us/weblog/2004/music">Music</a>
</li>
<li>
<span class="post-date">2004-04-14</span>
<a class="post-link" href="https://bannister.us/weblog/2004/universal-calendars-and-scheduling">Universal Calendars and Scheduling?</a>
</li>
<li>
<span class="post-date">2004-04-12</span>
<a class="post-link" href="https://bannister.us/weblog/2004/googles-gmail-and-privacy">Google’s Gmail and privacy</a>
</li>
<li>
<span class="post-date">2004-01-30</span>
<a class="post-link" href="https://bannister.us/weblog/2004/talk-at-uci">Talk at UCI</a>
</li>
<li>
<span class="post-date">2004-01-28</span>
<a class="post-link" href="https://bannister.us/weblog/2004/web-protocol-library">Web protocol library</a>
</li>
<li>
<span class="post-date">2001-11-11</span>
<a class="post-link" href="https://bannister.us/weblog/2001/rain-2">Rain!</a>
</li>
<li>
<span class="post-date">2001-11-01</span>
<a class="post-link" href="https://bannister.us/weblog/2001/driving">Driving</a>
</li>
<li>
<span class="post-date">2001-10-30</span>
<a class="post-link" href="https://bannister.us/weblog/2001/unexpected">Unexpected</a>
</li>
<li>
<span class="post-date">2001-10-06</span>
<a class="post-link" href="https://bannister.us/weblog/2001/saddleback-cooler">Saddleback (cooler)</a>
</li>
<li>
<span class="post-date">2001-06-15</span>
<a class="post-link" href="https://bannister.us/weblog/2001/saddleback-again">Saddleback (again)</a>
</li>
<li>
<span class="post-date">2001-06-02</span>
<a class="post-link" href="https://bannister.us/weblog/2001/saddleback-first-try">Saddleback (first try)</a>
</li>
<li>
<span class="post-date">2001-03-10</span>
<a class="post-link" href="https://bannister.us/weblog/2001/hike-with-sierra-club">Hike with Sierra Club</a>
</li>
<li>
<span class="post-date">2001-03-08</span>
<a class="post-link" href="https://bannister.us/weblog/2001/rain">Rain</a>
</li>
<li>
<span class="post-date">1998-12-31</span>
<a class="post-link" href="https://bannister.us/tags/">tag-list</a>
</li>
<li>
<span class="post-date">1998-12-31</span>
<a class="post-link" href="https://bannister.us/weblog/search/">search</a>
</li>
<li>
<span class="post-date">1998-12-31</span>
<a class="post-link" href="https://bannister.us/weblog/resume/">resume</a>
</li>
<li>
<span class="post-date">1998-12-31</span>
<a class="post-link" href="https://bannister.us/weblog/">random memes</a>
</li>
<li>
<span class="post-date">1998-12-31</span>
<a class="post-link" href="https://bannister.us/weblog/categories/">categories</a>
</li>
<li>
<span class="post-date">1998-12-31</span>
<a class="post-link" href="https://bannister.us/weblog/about/">Preston L. Bannister</a>
</li>
</ul>
categories1999-01-01T00:00:00Zhttps://bannister.us/weblog/categories/
<h3>Categories</h3>
<ul>
<li><a href="https://bannister.us/weblog/">all</a></li>
<li><a href="https://bannister.us/weblog/categories/#all">all</a></li>
<li><a href="https://bannister.us/weblog/categories/#posts">posts</a></li>
<li><a href="https://bannister.us/weblog/categories/#meme">meme</a></li>
<li><a href="https://bannister.us/weblog/categories/#self">self</a></li>
<li><a href="https://bannister.us/weblog/categories/#software">software</a></li>
<li><a href="https://bannister.us/weblog/categories/#politics">politics</a></li>
<li><a href="https://bannister.us/weblog/categories/#humor">humor</a></li>
<li><a href="https://bannister.us/weblog/categories/#openstack">openstack</a></li>
<li><a href="https://bannister.us/weblog/categories/#future">future</a></li>
<li><a href="https://bannister.us/weblog/categories/#software%20cloud%20security">software cloud security</a></li>
</ul>
Preston L. Bannister1999-01-01T00:00:00Zhttps://bannister.us/weblog/about/
<p>This is the personal site of Preston L. Bannister.</p>
<p>I write software for a living.</p>
<p>You can also find me on:</p>
<ul>
<li><a href="https://github.com/pbannister">Github</a> ... for public work/examples.</li>
<li><a href="https://www.linkedin.com/in/prestonbannister">LinkedIn</a> ... when needed.</li>
<li><a href="https://www.flickr.com/photos/dreadedhill/">Flickr</a> ... since 2004 - when an early and important social site.</li>
<li><a href="https://www.quora.com/profile/Preston-L-Bannister">Quora</a> ... too much, at times.</li>
<li><a href="https://www.quora.com/profile/Preston-Bannister">Quora</a> ... yeh. Easy to end up with duplicate accounts. No way to merge.</li>
</ul>
<p>... and others that do not come to mind, at once.</p>
<p>Was once on Facebook and Twitter, but no longer.</p>