Chouser's Home

Chouser's Blog

Terrorism Alert Level

Current Terror Alert Level

Table of Contents

Formats of this page

HTML
RSS 2.0 XML
SD

Building a fence.

Tue 12 Jul 2005

With this entry I narrowly escape leaving my blog dorment for an entire year. My wife took this picture as we began building a fence around our back yard. We're pretty much done now, but I haven't taken any more photos yet.

Fence posts

Not really worth waiting a year for this, was it?

The Grid

Thu 22 Jul 2004

A conversation near the beginning of TNT's new TV series The Grid sparked a debate at my house. The conversation was between Maren, the head of a new anti-terrorist task-force, and Raza, one of her hand-picked staff members.

Raza: Why me?

Maren: You speak Arabic, and you're the CIA's best mid-east analyst. I've read your reports, and although I don't agree with some of your assessments, I always find your analysis compelling.

Raza: But you disagree; enlighten me.

Maren: You write that Islam is the religion of the oppressed. I say it appeals to oppressed men because it sanctions the oppression of women. To me, Islam is one thing: fear. And until the clerics can stand up and say that killing people is the work of the devil, and that it is a woman's God-given right to eat, sleep, walk, do, say whatever she wants, I'm dumb, deaf, and blind to what they're selling.

Raza: Have you ever bothered to ask a Muslim woman if she feels oppressed? [Maren looks like she hadn't thought of that.] Islam is the faith of over a billion people. Are you then saying all one-billion are criminal? I find it inexcusable that a woman with your standing could judge an entire religion by the actions of a fundamentalist faction. How would you feel if I judged all Christians by the actions of the KKK? Islam inspired a humane civilization and made some of the greatest contributions to the culture of the world, but because of some narrow thinking by governments like ours and people like... you, we're judged by our worst example. Certainly you as an ambitions woman can sympathize.

...emotional appeal by a third character and other unimportant details...

Maren: All right... Raza, I want you to educate me on who we're up against. When I'm wrong I expect you to set me right.

Soon after this conversation, my wife started commenting on the show's politically correct agenda. She thought that Maren was backing down from her original point of view and caving to Raza's more leftist opinion. I disagreed, and explained that the show wouldn't let their dynamic lead woman be pushed around so easily, and certainly not by arguments that are as old as the debate itself.

A quick look at his points shows why Maren couldn't not have been convinced. She disagrees with Raza's opinion that "Islam is the religion of the oppressed," but I'm not sure what group of people he could be referring to; certainly not Muslims in the West where freedom of religion is guaranteed and fewer have been killed by religious oppression than by car accidents. Presumably he's not referring to countries run by Muslim clerics, where Islam is also the religion of any oppressors that might be around.

Raza counters her assertion with a truly silly idea: that Muslim women might not feel oppressed. Maren, as the head of an anti-terrorism group at a anti-terrorism meeting, is speaking of terrorism, and Raza knows it. Of course there are Muslim women who are living in countries with religious freedom who are not oppressed, because if they felt oppressed by Islam they would have the freedom to escape it. These are not the women Maren is talking about, and it's rather hard to ask a woman if she feels oppressed after she's been the victim of an "honor" killing.

The next rhetorical question from Raza compares Islamic terrorism to the KKK. I've heard this argument before, and it continues to baffle me. Would any of the defenders of modern Islam be willing to defend countries that taught the racist underpinnings of the KKK in their schools, gave money to the families of KKK members involved in violent attacks, and allowed the High Priests of the KKK to dictate the policies of their government?

Then Raza drives his argument home by finally placing blame on specific people and institutions. The only entities that he specifically criticizes in his entire speech are... the United States and his boss.

So it was obvious to me that Maren was not giving in to such a ridiculous opinion. I figured it was more likely that she wanted to encourage her employee to continue being open with her, even though she disagreed with him. She probably hired him because of his different perspective, and didn't want him to back down either.

By the end of the show, Maren had proven herself to be uncertain, easily shaken, and a pushover. This leaves only one possibility: my wife was right, and I was wrong. The silly little show had set up what I thought was a bit of a straw-man argument for the politically correct opinion... and then let the straw-man win.

Mozilla Hack

Tue 22 Jun 2004

The Mozilla Firefox Extensions page is now listing my own Flat Bookmark Editing extension. It makes modifying bookmarks more convenient (as inspired by Galeon and encouraged by Aron). Try it out with Firefox 0.9 and see if you like it.

Petals around the Rose

Tue 22 Jun 2004

Here's a fun little puzzle. Just start making guesses and see if you can figure it out. Reading the source is considered cheating, if you were wondering. Oh, and it only works in Mozilla and friends right now. I may fix that eventually.

Update: It now works in IE. Get 6 in a row correct, and get what reward you can from a handful of JavaScript.

Targeting Lower Manhattan

Mon 12 Apr 2004

The Washington Post summarized the recently declassified PDB (Presidential Daily Briefing), in part, this way:

The 2001 memo declassified late Saturday reported that the FBI had information that al Qaeda operatives had been in the United States for years, that they might be planning a hijacking in the United States and targeting a building in Lower Manhattan...

Al Qaeda targeting a building on Lower Manhattan of course sounds ominously like a reference to the World Trade Center attack of September 11. But if you read the PDB itself, even the copy the Washington Post put online, you will find no reference to Manhattan. The only New York buildings mentioned in the PDB are "federal buildings", which can be found all over New York. Notably, none of these were attacked on September 11.

The other items most frequently named by opponents of Bush as clear warnings in the PDB of Sept. 11 are the title "Bin Ladin Determined To Strike in US", members of Al-Qa'ida living in the US, and a phone call to a US Embassy warning a Bin Ladin supporter was in the US planning attacks. I highly recommend reading the actual document to see the details and contexts of these items.

The title is primarily supported in the PDB by the first paragraph, where it says "Bin Ladin since 1997 has wanted to conduct terrorist attacks in the US". The sources sited for this assertion include "media reports" and "US television interviews." Anyone who had been watching TV shows about Bin Ladin would find this PDB's title unsurprising.

I was surprised that the FBI knew there were Al-Qa'ida members in the US, but that's because I hadn't been following the Embassy bombings. If I had, I would have known that two of the Al-Qa'ida members found guilty of those bombings were US citizens -- another example of the historical and publicly available nature of the information in the PDB.

Finally, the US Embassy in the United Arab Emirates got a phone call in May of 2001 warning of Bin Ladin supporters planning attacks in the US. However, according to the PDB the call claimed this attack would be carried out with explosives. As far as I know, there have been no terrorist bomb attacks in the US since May of 2001. Another red herring.

In fact, if you read through the PDB yourself, I think you'll find Dr. Rice's characterization to be fairly accurate: most of the information is historical and none of it correctly warns of what happened on Sept. 11. If the attacks could have been prevented, it would not have been because of any information contained in this PDB.

Stupid Mozilla Tricks

Fri 05 Mar 2004

Mozilla has apparently had a cool bookmark keyword feature I didn't know about until Aron mentioned it to me this week. If you edit any of your bookmarks in a Mozilla browser, you should see a keyword field which is normally blank. If you fill it in, you can simply type that keyword where you'd normally type a URL in the browser window, and it'll take you to your bookmark location instead.

You can geek it up another notch by using a "%s" in your bookmarks Location field, like this:

Now you can type into your browser Location field "gl mars rover" and be taken to Google's "I'm Feeling Lucky" results.

Of course Aron knew all that already. What he wanted was something even more clever. He wanted a bookmark that would run queries on the Gentoo Bugzilla database the same way bugs.gentoo.org does. That is, you can type a bug number, a word to be found among currently open bugs, or "ALL" and a word to be found in any bug. As it turns out, applying a little JavaScript is all that's needed. To use my solution just paste this line into your bookmarks.txt. Then try typing "bug 1234", "bug pop3d", or "bug ALL pop3d" into your Location field to see it in action.

Monster Alert Level

Thu 22 Jan 2004

I can never remember what the terrorism alert level colors are, what order they come in, or what they mean. Maybe this will help me keep track. Well, maybe not, but at least it's funny.

TiVo vs. MythTV

Thu 04 Dec 2003

I think I would really enjoy TiVo or some other PVR/DVR solution. I've been thinking and talking about putting together my own solution (buy hardware components, write or customize software, etc.) for years now. I started with just trying to get a decent MP3/Ogg player that my wife was comfortable using. I failed. Not completely, but pretty badly. The problem is I don't have the time to do it all myself, and am too cheap to buy easier solutions.

I found out today that I could buy a TiVo for around $200. That's a lot cheaper than what it would cost for me to build my own solution, and it's all done already. I was so excited I called my wife from work (rare). Then I started looking into the details; the basic box is $200. Then you need a monthly subscription of around $13. If I like this as much as I think I will, I'll still be using it 2 years from now -- $13 * 12 months * 2 years > $300. TiVo provides a lifetime subscription for $300, so let's just add that to the price: $500.

But what about playing music? I almost had a working solution... Well, TiVo can solve that too, just add the Home Media option for $100, and it'll integrate nicely with my Windows desktop: $600. But wait, I don't have a Windows machine at home all the time. I could probably whip up my own server for Linux... reverse engineer the network protocol...

Oh, and there's no DVD player built into the basic box. You can get one with DVD for an extra $100 or so, but there's no easy way to add it later: $700.

And TiVo doesn't have any clean way to skip ads. You can hack it, but maybe not if you buy the newer Series 2 TiVos (which are the ones with the music option). And if you want to add another harddrive, you probably have to hack it. Man that sounds like a lot of work... what was the point? Oh yeah, TiVo was going to be less work and cheaper. $700.

Well, I could buy a pretty decent PC for $700 and hook it up to my TV. The problem then would just be the software, and I know I don't have time to write that kind of thing. Fortunately, someone already did, and it's called MythTV. Out of the box, it has every feature I mentioned above, plus "automatic" commercial detection and skipping, a frontend for emulation Nintendo (NES) and Super-Nintendo (SNES) machines, a weather forecast module, and an RSS feed reader. And it looks pretty.

Doesn't look like a very difficult decision after all. I already have some of the hardware I'll need, but not all. I'll let you know how it goes.

Litestep

Mon 24 Nov 2003

I need to add to my list of tools required to make Windows less painful. Litestep is a Windows "shell" replacement, and not a new one. It must be one of the oldest programs meant to replace the normal Start menu and taskbar generally found at the bottom of the Windows desktop, and it is now GPL. It is highly customizable (through an arcane maze of textfiles), and having spent the weekend poking at it, I'm quite happy with the results.

My customized litestep GUI

This small tray sits in the lower-right corner of my screen and gives me all the information I need -- systray icons, CPU meter, and the current time and date. In the far right corner is also my current virtual desktop number; more on that in a minute. That's all that stays on my screen -- no start menu button, no desktop icons, no annoying list of open windows -- nothing but this small clean tray.

Litestep provides fully customizable menus, including a nice root-menu so I can get to the normal list of programs by right-clicking anywhere on the desktop. It also lets me bind keystrokes so I can get to everything I need from the keyboard, without even reaching for the mouse. It's all very nice.

I do need to mention the virtual desktops, though. Litestep can provide virtual desktops via one of several plugins, any they provide the very pretty feature of drawing miniature representations of all your desktops. However, I chose not to use these for a couple of reasons. The main reason is that they all seem to hide the windows not on the current desktop by moving them beyond the border of the screen. This as two negative consequences: one is that all the windows on all the desktops show up in my alt-tab list simultaneously; the other is that they get very confused when my desktop changes size so that I end up with pieces of windows hanging off the sides of my screen. The other reason is the process-blocking issue I mentioned before; if the same process provides all my menus and my virtual desktops, I could become pretty badly stuck.

So I continue to use the excellent Windows PowerPro for my virtual desktops, and it is actually what is drawing the desktop number in the lower-right corner of my screen. I think it is evidence of the quality of both Litestep and PowerPro that they work so well together.

That is called a theme.

Mon 10 Nov 2003

With a strong sense of history, George W. Bush last week made the case for "a forward strategy" of idealism in American foreign policy... "From the Fourteen Points to the Four Freedoms, to the Speech at Westminster, America has put our power at the service of principle," Bush said. "The advance of freedom is the calling of our time."

That is called a theme...

Most people did not have the chance to catch the whole speech on cable, and found only snippets on broadcast TV; the longest excerpt of the half-hour address ran less than four minutes on prime-time network news...

[N]ot even The Times gave readers the chance to study the full text in the paper. (It's on the Times Web site...)

This speech clearly articulated the policy this Bush will be remembered for. If you are interested in knowing where he wants to take this country and why, you will find it worth reading all the way through. Reading summaries and excerpts and critiques lets editors and analysts do the thinking for you. Film snippets of applause lines won't help you grasp the import, which you should have even if you want to disagree knowledgeably.

--William Safire, The Age of Liberty

Tools to make Windows livable.

Fri 31 Oct 2003

Several months ago I accepted a new position where I work almost exclusively in Windows. I've made peace with this and settled in, at least until I can start helping with a Linux port. Here are the tools that make living in Microsoft's world possible:

Vim

An extremely comfortable interface to text in all its forms.

putty

This is a very solid terminal emulator with telnet and ssh built right in. Besides being wholly functional, it has the little extras that make me feel at home, like select-to-copy and right-click-to-paste.

CygWin

All the little tools that every OS should provide, but Microsoft left out. You know: grep, tail, xargs, ... gcc.

Perl

Because sometimes a batch file just won't cut it. I'd be happy to list Python or Ruby here, but as it turns out even the non-unixy people around here already have Perl installed.

Firebird

For now, it's The web browser. Eventually it may just be the editor, terminal emulator, and development environment too.

I'll post my favorite extensions later.

Windows PowerPro

Once upon a time, I had three 21-inch Trinitrons on my desk, and I used virtual desktops on each. Now I have a single 17-inch, so to be stuck on one desktop would mean constant pain.

Windows PowerPro to the rescue: it provides solid virtual desktops with a highly configurable interface. And I don't mean skinnable, although it may be that too; what I mean is I can set keyboard shortcuts and have it otherwise just stay out of my way. It also has tons of extra little features I'm barely using.

ShideWin

Of course something as powerful as virtual desktops couldn't be possible in Windows without some kind of complication. As it turns out, there appears to be no way to show or hide a window without going through it's application's event loop. Trash X-Windows if you want to, but it sure got this one right.

Anyway, this means that if an app is "not responding" (perhaps because you're debugging it and at a breakpoint), the desktop-switcher thread blocks waiting for the stuck app to respond.

ShideWin is the handy little program I use to get myself un-stuck in the situations. It's sad that I need it at all, and worse that I use it almost every day, but it's just the natural consequence of the "design" decisions embodied in Windows.

Without these I could still do my job, I just wouldn't want to.

PS. Until I get trackback figured out, I'll have to link to related posts manually. Like this.

Treason

Mon 29 Sep 2003

I didn't know that Senator Joe McCarthy's claims about Communists in the State Department have turned out to be true. I didn't know that many of those he accused not only had Communist beliefs but were actually being paid by the USSR for information and influence. I hadn't realized how many people believed that the best we could hope for against Communist Russia was stalemate, and never heard President Reagan's plans to crush Communism described as a cohesive strategy.

But now I know, because I have been informed -- I just finished reading Ann Coulter's latest book, Treason. If any of these statements have surprised you, you should definitely read this book. It's easy to follow, but is copiously footnoted which make continuing research on your own much easier.

If you aren't familiar with Coulter's writing or are not already persuaded by conservative ideas, you may have her style a bit abrasive. She unfortunately attempts to use name calling and exaggeration for humor. If these jokes bother you, just ignore them; her arguments do not rely on ad hominem attacks.

Most of the book is about critical moments in the last 100 years of American history, updated with recent findings and discussed in the light of current events. You really ought to read it.

Nuclear option

Sun 28 Sep 2003

Since Miguel Estrada withdrew his name from consideration for the US Court of Appeals (a few weeks ago now), you may have heard more mention of the "Nuclear option." Most media outlets seem to treat this kind of thing as if it's too difficult for us to understand the actual details, so they talk in metaphor and hyperbole. I decided to see if I could figure out what's really going on.

Estrada is one of the judicial nominations made by President Bush that the Senate Democrats have been keeping from getting a vote on the Senate floor. When they had the majority in the Senate, the Democrats didn't let the nominations out of committee. Now that they no longer control the committees, they're using the threat of filibuster to prevent the vote from happenning.

Time is set aside before most votes to give the Senators a chance to debate that vote. A filibuster is just taking advantage of this time to talk endlessly and prevent any other business from getting done, including the vote itself. A cloture motion is a way to force an end to the debate and move on to the vote itself. All of this is laid out in the Senate rules which are agreed upon by the Senators themselves. Senate Rule XXII (that's Rule 22 for the us non-Romans) deals with cloture:

[T]he Presiding Officer shall, without debate, submit to the Senate by a yea-and-nay vote the question: "Is it the sense of the Senate that the debate shall be brought to a close?" And if that question shall be decided in the affirmative by three-fifths of the Senators duly chosen and sworn -- except on a measure or motion to amend the Senate rules, in which case the necessary affirmative vote shall be two-thirds of the Senators present and voting -- then said measure, motion, or other matter pending before the Senate, or the unfinished business, shall be the unfinished business to the exclusion of all other business until disposed of.

Thereafter no Senator shall be entitled to speak in all more than one hour on the measure...

-- from Senate Rule XXII

This "two-thirds" is the infamous "super-majority" that the Senate Republicans do not have, which means the Democrats can block any motion they decide is worth filibustering. Naturally, the Senate Republicans are looking for ways to get these nominees past a filibuster. I was surprised to find that they actually have a couple different options here. I guess I didn't realize the Constitution doesn't directly address this level of detail. Senate Rules still have to answer to a higher law.

[Some] Members of the majority [are] saying they are going to have this rule changed regardless of what the Rules Committee does; that if it does not work out in the Rules Committee, they are going to come here and have the Presiding Officer just say what we have been doing is unconstitutional.

-- Senator Reid

Well that's an option, but it may not work. And if it does work, would there be other consequences? Senate Minority Whip Harry Reid continued...

[T]o say suddenly that you cannot have a filibuster because it is unconstitutional, creates many different problems. Does that mean if 11 members of the Judiciary--a majority--holds up a judicial nominee, that that is unconstitutional and it can come immediately to the floor? I think not.

This is what's being described as the "nuclear option". So maybe we should set that option aside -- I very much doubt the Republican leadership would go for it, anyway.

But there's another little loophole in Rule XXII. A motion to amend the Rules only requires "two-thirds of the Senators present and voting." So the Republicans could propose an amendment to Rule XXII which would make it easier to break a judicial nomination filibuster. Even if the Democrats hated it badly enough to filibuster the amendment, perhaps the Republicans could schedule a cloture vote when fewer Democrats were around, in which case it might pass.

Feels like hacking, doesn't it?

But this is actually what Senate Majority Leader Bill Frist has begun doing. Using concepts and language from amendments proposed in the past by Democrats, Frist proposed his own amendment to Rule XXII:

My proposal is similar to [one] by my distinguished Democratic colleague from Georgia, Senator ZELL MILLER, [and to one] offered in 1995 by the distinguished Democratic Senators from Iowa and Connecticut, TOM HARKIN and JOE LIEBERMAN...

My resolution... is more narrowly tailored [and] applies only to nominations. It leaves the rest of rule XXII unamended. It addresses the very specific defect that needs repair.

Although some news reports are erroneously describing this option as being "nuclear" as well, Senator Reid (D) disagrees:

Now, I do say to the leader [Mr. Frist] that I think this is being approached in a proper fashion. I think that to go to seek a rules change is the way it should be done. If you don't like what is going on here, try to change a rule.

-- Senator Reid

It'll be interesting to see where this ends up.

PS. Sorry for the long gap in blog updates. There are many reasons for this, but none of them serious or commendable. Of course I was afraid from the beginning that I would drop the ball, but hopefully this post is the beginning of regular updates again.

Blog reloaded

Thu 04 Sep 2003

Ok, the auto-reload system I described earlier is back on line. The design is fundamentally the same, but the code now checks for a couple of common situations that had been causing significant failures previously. For example if either the XML version-number file or the blog page itself was "stuck" in the browser's cache, my code would reload the blog wildly and repeatedly.

Anyway, this and other problems should now be fixed. Let me know if you see any more problems.

Auto-reload problems

Fri 29 Aug 2003

A couple of readers have seen problems with this blog's auto-reload feature; either it's not reloading at all (hi Aaron), or it reloads constantly (hi Amby). This obviously won't do, so I'm turning the feature off until I can kill these bugs.

Sorry for any trouble.

Mozilla goodies

Fri 29 Aug 2003

I've wondered for a long time how to log my own custom messages into Mozilla's JavaScript Console. Searching the web, I was only able to find others asking similar questions, but no answers. So I dug around; with the help of the Mozilla cross-referenced source and some experimentation, here is a solution. Unfortunately, you need to enable higher privileges, and I have no way of knowing if this is the easiest way. It's not as simple as I'd hoped, but it works:

var PM = netscape.security.PrivilegeManager;
PM.enablePrivilege( 'UniversalXPConnect' );
var logString = Components.classes[
    '@mozilla.org/consoleservice;1'
  ].getService(
    Components.interfaces.nsIConsoleService
  ).logStringMessage;

That enables the privileges you need and grabs a reference to the function you'll want to use. Now you can just call logString:

logString( 'Hello World!' );

By the way, I had forgotten this about JavaScript, but it's important: Variables in JavaScript are global, even when first used inside a function, unless you specifically declare them using var.

While digging around for information about Mozilla and Firebird, I stumbled across the about:cache and about:config URLs. To try one out, just type it into Mozilla's address box. Using about:config I was able to discovered Mozilla's strict JavaScript mode. Very cool:

user_pref(
  "javascript.options.showInConsole", true );
user_pref(
  "javascript.options.strict", true );

Also cool are all these tips for making Firebird even more enjoyable than it already was.

Mothra the Blogmonster

Thu 28 Aug 2003

One problem from Monday was that setting the XML document's onload handler only worked once. Subsequent loads weren't handled at all, until I switched to using addEventListener instead. I think the only other problems that caused the behavior I saw on Monday were all related to not enabling UniversalBrowserRead privileges everywhere that I should have.

So now it's working! It places blog entry guids in your browser history to keep track of which ones you've read, and it uses a single cookie to store your own personal list of subscriptions. I still haven't figured out how to sign it, so if you want to use it you need to restart your browser with the following line added to your prefs.js:

user_pref(
  "signed.applets.codebase_principal_support",
  true);

Once you've done that, you can give it a try. Use <space> to page down or advance to the next unread entry. There is currently no automatic refresh at all, so you'll have to do a page reload while holding down <shift> to refresh all the feeds.

Don't get too carried away adding subscriptions, because the URL to Mothra may change, and your cookie may not match once that happens. If you really want to, you can download both mtb.html and mtb.js and run them from your local machine. Then you can upgrade manually in the future without losing your subscription list, and you won't have to "trust" anything else from my site.

As an interesting puzzle to solve, Mothra is a success. You'll have to let me know whether you think it's a success as a useful application. Also, look for more details on code signing once I figure out how to do it.

PS. Thanks to Aaron for help on the name.

Mozilla meets RSS

Mon 25 Aug 2003

So after playing around with loading XML files from within JavaScript for my auto-refresh system, I was inspired. Why not load full RSS feeds this same way? I could build a full RSS blog reader right in mozilla!

I'm not exactly sure why I'm doing this. Perhaps it's just the fun of solving an interesting puzzle. It's not like there's too few blog readers out there.

Anyway, if I can get this working, it will be cross-platform (pure mozilla -- JavaScript, CSS, etc.), highly "skinnable", use the beautiful gecko engine for rendering content, and "installing" it will be a matter of adding a link to your bookmarks.

The basics were surprisingly easy, and I've got a screenshot to prove it. But I'm now bogged down in mozilla security model issues. I can't figure out how to get the privileges I need to load an XML RSS feed from any ol' URL on the web.

This page got me started, and I'm using codebase principal until I can get everything else working. To do this I had to add a line to my prefs.js:

user_pref(
  "signed.applets.codebase_principal_support",
  true);

I then believe I need to enable some privilege from within my JavaScript, like this:

netscape.security.PrivilegeManager.enablePrivilege(
  "UniversalBrowserRead");

Doing this makes the security errors go away, but the XML document never gets loaded, or at least the onload handler never gets called. Until I figure out why that is, this is pretty much useless.

Bloggy sog.

Thu 21 Aug 2003

The HTML-based version of this blog now has an automatic refresh system. I hope it will keep your copy of my blog from getting old and soggy. The page uses JavaScript to periodically fetch an extremely small XML file. The XML is never displayed on the screen, but instead is used by the JavaScript to determine if a reload is necessary. This is my first attempt to use this kind of background data-fetch on a web page.

Periodically, an XML file named blogv.xml is fetched from the web server. It contains a number describing the latest version of this blog that has been uploaded. For example, it might contain:

<v>42</v>

One of the <meta> tags in the HTML file also contains a version number, like:

<meta name="version" content="42" />

When the XML file is reloaded, once every half-hour, its fresh number is checked against the version number in the older HTML file. If the numbers don't match, the HTML page currently in the browser must be out-of-date, so the page is re-loaded.

You can check to see if this is working for you by scrolling to the bottom of this page. The date and time marked as "Last auto-sync" is when your browser last fetched blogv.xml and confirmed that the page you're looking at is the latest version. If you see "none succeeded", it's probably because your browser doesn't support the XML features needed (ie. you're using IE or some other non-gecko browser), or perhaps you have JavaScript turned off.

Most of the work is done by reloader.js. In order to allow the same JavaScript to be used by multiple web pages, it gets all the information it needs from the HTML page header:

<meta name="version" content="42" />
<link rel="latestversion"
  href="http://bluweb.com/chouser/info/blog/blogv.xml" />
<script src="info/blog/reloader.js"
  type="text/javascript">
</script>

The web page also kicks off the sync timer from its <body> tag:

<body onload="startreloader()">

Finally, the date and time are included at the bottom using an element with id="checkdate":

Last refresh auto-check:
<span id="checkdate">
  none succeeded
</span>

This was all inspired by Aaron, who noted that a 50K page reloaded every hour generates at least 1.2MB of traffic per day. Instead, this system downloads less than 250 bytes per sync, including all the HTTP headers. Adding in one full 50K page per day for when I've actually posted something new, a whole month of traffic would come out to about 1.7MB. That's a pretty dramatic improvement. Thanks, Aaron!

A viscous cycle

Tue 19 Aug 2003

I just stumbled upon Common Errors in English, and I'm very much enjoying it, especially the list of errors and Non-Errors. It's full of useful, witty answers and careful detail. Of course, I would never hurl epitaphs at those who make silly mistakes, irregardless of the cause. In fact, I could care less. I don't think it's worth banging on a podium at those who are foundering with the language. Life is enough a veil of tears already.

Also fun:

private? static? unnamed?

Mon 18 Aug 2003

The first C++ project larger than a small class assignment that I ever worked on was for my senior project in Computer Science at Taylor. As I worked, I became frustrated with the consequences of some of my design decisions which had seemed obvious when I made them. In desperation I went went to a bookstore (Borders, I think) to some C++ book to help, but I was totally overwhelmed by the number of books available, most of which didn't look like they would help me.

After flipping through the first couple pages, Aron suggested Large-Scale C++ Software Design by John Lakos. I was under no illusions about my class project being truly "Large-Scale", so I didn't think the book would help me. I was so wrong. It answered every question I had at the time, and educated me on questions that I should have been asking, but wasn't. It educates me to this day.

private?

Here's a little gem. Hopefully most C++ programmers are already familier with this point, but I know I sure wasn't taught anything like this in school:

...all other things being equal, it is better to insulate a client from an implementation detail than not to do so--even if only to reduce the clutter in the physical interface...

Private member functions, although encapsulated logical implementation details of a class, are part of the physical interface of a component...

Sometimes functions are made private members not because they need private access but because the private section of the header file is a good place to store these factored helper functions. That is, some private helper functions can do all of their work using only the public interface of the class. In these cases, the transformation from private member to static free functions is easy and quickly accomplished...

[Lakos 6.3.3]

static?

I was struggling with this today because I thought that all free functions (i.e. global, not member functions) were static by default and that by default they are accessible to other object files when linked (i.e. have external linkage). In fact, my C++ reference says:

All global objects have storage class static. [Stroustrup 3.5]

So if a static free function is just a default global function, and by default global functions have external linkage, how does this accomplish the privacy Lakos thinks we should have?

Well, Stroustrup thought that might confuse me:

The word "static" has two basic meanings in C and C++. One is "allocated once at a fixed address" (as opposed to allocated on the stack once per function call); the other is "local" (as in local to a translation unit or "in class scope"). These two meanings interact and frequently cause confusion. [Stroustrup 7.1.1]

BTW, a "translation unit" is a basically a .c file and all of the files it #includes.

So now it starts to make sense. By default, functions have storage class static, but that's not the same as being "local". As it turns out, the rules for determining whether something will be local or global are not trivial:

A name of file scope that is explicitly declared static is local to its translation unit and can be used as a name for other objects, functions, and so on, in other translation units. Such names are said to have internal linkage. A name of file scope that is explicitly declared inline is local to its translation unit. A name of file scope that is explicitly declared const and not explicitly declared extern is local to its translation unit. So is the name of a class that has not been used in the declaration of an object function, or class that is not local to its translation unit and has no static members and no noninline member functions. Every declaration of a particular name of file scope that is not declared to have internal linkage in one of these ways in a multifile program refers to the same object, function, or class. Such names are said to be external or to have external linkage.

Typedef names, enumerators, and template names do not have external linkage.

Static class members have external linkage.

Noninline class member functions have external linkage. Inline class member functions must have exactly one definition in a program.

Local names explicitly declared extern have external linkage unless already declared static.

[Stroustrup 3.3]

Ok, well that's all a bit of a mess. The simple point is that although the storage class of all file-global declarations is static, those that are specifically declared static are private to that translation unit. Or as Stroustrup puts it:

A name specified static has internal linkage. [Stroustrup 7.1.1]

unnamed?

A final thought... Lakos does mention another way to write free functions for use within a single translation unit:

We will be able to achieve this same effect more elegantly using unnamed namespaces... once this relatively new language feature becomes more widely available. [Lakos 6.3.3]

In fact, global static functions are actually deprecated in C++:

Unnamed namespaces make global static redundant. For example:

namespace {
  void f(); // accessible from this
            // translation unit;
            // inaccessible from
            // other units
}

[Stroustrup 3.3.1.5]

What a punny name!

Sat 16 Aug 2003

Subversion is meant to be a successor to CVS, and I've just started using it. Another system competing to replace CVS is arch, which I have explored using in the past. So why have I chosen Subversion (at least for now) over arch?

Perhaps the most important reason is that there appears to be a good deal more momentum behind the development of Subversion than arch. Regardless of the reason for this, it has some important consequences including more frequent bug fixes, new features completed sooner, etc. Even if the current product is less mature or lacking in features (I'm not saying it is), these consequences may allow it to overcome any current shortcomings.

My other reasons are slightly more embarrassing. For one, Subversion has a less radical paradigm than arch. This isn't necessarily good, but it does mean it's easier for someone who is familiar with CVS to start using Subversion. Also, Subversion has better support for running on Windows, and I'm afraid that has enough of an impact on my reality right now that it also factored into my decision.

Subversion was easy to set up (with the help of this handy book) and is now successfully keeping my blog files synced up. Of course it's too soon to know how things will end up, but so far using Subversion has been a positive experience.

And the winner is...

Fri 15 Aug 2003

The shortest C sort function contest has concluded. We have a tie at 62 chars. Aaron gets top billing for a solution that even works with zero-length arrays:

S(a,c)int*a;{for(;c;*a>a[c]?*a^=a[c]^=*a^=a[c]:0)S(a+1,--c);}

Bob uses an independently engineered but identical test-and-swap clause, identical function definition syntax, and weighs in at the same 62 chars, but his loop doesn't like zero-length arrays:

S(a,n)int*a;{for(;--n;S(a+1,n))*a>a[1]?*a^=a[1]^=*a^=a[1]:0;}

Michael Sterrett (aka Mr. Bones) came in a close 3rd with 65 chars:

S(int*a,int c){for(;c--;S(a++,*a>a[c]?*a^=a[c]^=*a^=a[c],c:c));}

My solution came in a dismal 4th place at 66 chars, and still breaks for zero-length arrays:

S(int*a,int n){--n?S(a,n),S(a+1,n),n=a[1],n<*a?a[1]=*a,*a=n:0:0;}

Sterrett and I failed to discover the default parameter-type trick that Aaron and Bob used, but after seeing it we could both shorten our solutions to a very close 63 and 64 chars, respectively:

S(a,c)int*a;{for(;c--;S(a++,*a>a[c]?*a^=a[c]^=*a^=a[c],c:c));}
S(a,n)int*a;{--n?S(a,n),S(a+1,n),n=a[1],n<*a?a[1]=*a,*a=n:0:0;}

Aaron submitted some of his earlier attempts as well. Here's a 64 char solution using double-recursion (doesn't do 0-arrays):

S(a,c)int*a;{--c?S(a,c),S(++a,c),*a<(c=*--a)?*a=*++a,*a=c:0:0;}

When he added 0-array's to the above, he ended up with 66 chars:

S(a,c)int*a;{--c>0?S(a,c),S(++a,c),*a<(c=*--a)?*a=*++a,*a=c:0:0;}

While we're looking at non-winners, here's my 50 char solution that breaks key rules of the contest (uses a library and constrains the array to 99 entries:

S(int*a,int*b){return b>99?*a-*b:qsort(a,b,4,S);}

Slimy Donkeys

Thu 14 Aug 2003

Neither YAML nor RedCloth is working out for me, as I described yesterday. So I've attempted to create a solution that is good at describing both structure and document text and is also easy to edit in a text editor, especially vim. For now, I'm calling my new file format "SD".

Symbolic Data

An SD document represents an ordered hash (sorry Brett) which can be thought of as a list of key/value pairs (PairList). Each key is a string, and each value is either a string, or another PairList.

-title Chouser's
-item
  -id head
  -title Genesis
-item
  -id foot
  -title Apocalypse

In this example, the top-level PairList includes a pair whose key is title and value is Chouser's. It also includes two more pairs, both of which have keys of item. Each pair with a key of item has a value that is a PairList of length two.

This is quite similar to XML (except XML tags can have attributes). And like XML, there's a bit of ambiguity about whether the key is an object name or a type name. For example id and title both have values that are generic strings, so they're acting as object names. However, item shows up a couple times in the same PairList, so it can't really be an object name. Instead, each item value contains the same list of keys, so item is acting more like a type name. This is an ambiguity I'm willing to accept for the sake of brevity in the document itself. It doesn't seem to have hurt XML too badly (yet)...

Synthetic Document

So far, this is just sort of a weak YAML. So to help tip the balance toward document text, SD provides a special syntax for key/value pairs when the key is nil. The special syntax is to leave out the key:

-item
  -id head
  -title Genesis

  Value whose key is nil.

  A second value whose key is nil.
  This is still part of the second value.

  -pubDate today

This item has 5 pairs, and two of them (the 3rd and 4th) have nil keys. How the value of a nil-node is used is application-specific, just like how an item or title is used is application-specific. But it sure would be convenient for nil-nodes to be used for paragraphs of text.

Simple Delimiters

Another feature I wanted is inline markup for hyperlinks, bold, italic, etc. This is what RedCloth had been trying to do for me, before I gave up on it. SD provides a small set of punctuation that can be used for inline markup:

Structured Dashes

That's all there is to it. I've written a parser package in Ruby, along with some code that can generate HTML fragments from SD document fragments, and a vim syntax file. It tries to leave HTML tags alone and escape other punctuation, so that anything SD can't do for you, you can still do with some HTML of your own. I've also written Ruby programs that use the parser to generate the RSS and HTML formats of my blog from SD source. The parser API and the SD format are both extremely young; I really only started a couple days ago. I'll include links to the code below, but don't rely on any of this being stable or staying consistent. As always, comments are welcome. I'll post more details and updates as events warrant.

P.S. I didn't realize until nearly done with this post that I was unconciously copying my headline style from Charlie's EMACS page. Sorry for the Simple-minded Duplication, Charlie!

Like I need a hole in my head

Wed 13 Aug 2003

What the world needs now is another structured text file format. Our current options (SOX, YAML, Grutatxt, remark, Textile, EtText, HTML::TextToHTML, and oh-yeah XML) are entirely insufficient.

Of course I'm being a bit facetious, but I'm not entirely kidding. The "YAML with a shot of Textile" quip should have been a clue. Each of the packages I just listed leans rather heavily toward either data-structure representation (SOX, YAML) or document representation (all the others).

Unfortunately, my blog is a mixture of the two. As a whole, it is a data-structure -- a title, author, etc. and a list of entries each of which has a date, title, etc. However, the body of each entry is of course a sort of miniature document. This can be quite adequately represented in the more disciplined formats (XML, YAML, SOX), but it is not necessarily easy to edit in any of them. Someday there will be an XML editor that does this for us, but that's another story...

So I thought that YAML for structure and Textile for the text was a good plan. YAML allows an indented structure that vim is quite happy with, and Textile translates easy-to-type markers into HTML (like *bold* into bold). The fact that YAML and RedCloth (Textile for Ruby) seemed to work well together, I think, helped obscure the weaknesses of both.

It was RedCloth that cracked first. It's got some implementation issues, but once I started pulling that thread the whole thing unraveled. It's goals are a bit too lofty, and it's design is far too complex. It uses multiple passes through the text to apply all of it's various formatting rules, which means each pass can have undesired effects on the following passes. The code attempts to correct for these, but it quickly becomes a big hairy mess.

Since I really didn't need all of Textile's features, I looked around at the other options available. None of them seemed to be a really good fit, and my needs (I thought to myself) were quite modest. So I set about writing my own alternative. This is where YAML started to fall apart. Apparently it does some amount of processing on text blocks itself, merging paragraphs into long lines, deleting blank lines, and generally wreaking havoc. Trying to correctly process my text blocks was turning out to involve a whole lot of fighting to get back information YAML had lost or obscured for me.

What the world needs now is new structured text file format.

To be continued...

Contest: shortest C sort function

Tue 12 Aug 2003

Here's a fun little puzzle proposed by Aaron. What's the shortest C function you can write that sorts an array of int's? Your function should work when called as: S(int *array, int length)

You can't use any #includes or libraries in your function, and it must compile in gcc with no command-line flags, although warnings are ok. It can't assume anything about the array values; duplicates, zeros, negative numbers, etc. should all be handled correctly.

Give it a try; it's fun! At least a half-dozen of Aaron's friends are working on this, and I'll post the results here later this week. If you'd like to have your entry listed here, just send it to me. So far we've got three entries under 70 bytes long (that includes a newline at the end of the function definition).

Here's the program your function needs to work in -- you just write your own "sort.c":

#include <stdio.h>
#include "sort.c"
main() {
    int i, count=255, array[count];
    for( i=0; i<count; i++) {
        array[i]=count-i;
        printf("unsorted i[%d]=%d\n", i, array[i]);
    }
    S(array,count);
    for( i=0; i<count; i++)
        printf("sorted i[%d]=%d\n", i, array[i]);
}

Noonan's book on Hillary Clinton

Mon 04 Aug 2003

I've really enjoyed Peggy Noonan's column in the Wall Street Journal, so I had big expectations for her book, The Case Against Hillary Clinton. I was not disappointed by the form -- it was very pleasant to read and full of rich language.

I was, however, somewhat disappointed by the substance. It seemed to me almost half made-up. She spends one full chapter describing a scenario which she eventually admits was a dream. She spends most of another chapter imagining what Hillary must have been thinking during some hypothetical plane trip. It's a short book already, so to discover half of it was straight from Noonan's imagination was a bit of a let-down.

On the other hand, the other half the book does indeed contain some eye-opening evidence of Hillary's real views and the history of "Clintonism". Let me give you one short quote of the good stuff:

In 1977, Hillary wrote an essay called "Children's Rights: A Legal Perspective." ... She asserts that the decision of a minor "about motherhood and abortion, schooling, cosmetic surgery, treatment of venereal disease, or employment and others where the decision or lack of one will significantly affect the child's future should no be made unilaterally by parents. Children should have the right to be permitted to decide their own future if they are competent." She goes on to suggest that children might assert the rights to "grow up in a world at peace" under a United Nations declaration, and says that "children and adults might have special standing to question the proliferation of nuclear power or junk food..."

With appropriate expectations, the book may very well be worth reading.

Apocalypse and Exegesis 6 (part 2)

Sat 02 Aug 2003

There is a convention in C++ that input parameters are passed by copy or reference, and output parameters are passed by pointer.

void foo(const String &inparam,
         String *outparam) { ... }

Although passing by reference (inparam) and by pointer (outparam) do almost exactly the same thing, there are a couple of subtle differences. One difference is that we can declare the object of the reference as const, which means the compiler will warn us if we try to change any values in that object. This makes sense, because we shouldn't be messing around with an input parameter.

Another difference is that in order to pass the compiler's type checks, the caller ends up using syntax that reminds us which parameters are input and which are output. The caller often needs to use & to get a pointer to output objects, like this:

String a, b;
foo(a, &b);

Of course this is just a convention, and nothing prevents you from creating functions that take non-const references and then change their values, treating them like output parameters anyway.

Perl 6 will also have quite flexible parameter-passing choices:

is constant
This is the default, and is very much like the const String &inparam in C++. Perl will complain if you try to modify the value of a parameter passed like this, so it is input-only.
is rw
Still a pass by reference, this is non-const and so could be used for output parameters.
is ref
This is almost identical to rw, except for what Perl does if the actual argument passed is undefined. There may be other subtle differences I don't yet understand.
is copy
This is similar C++'s default. You can change the value if you want to, but it won't be reflected in the caller's copy, so this is an input-only parameter.

These choices allow Perl 6 to fully cover the range of functionality provided by C++ in parameter passing, and it does so in a much more readable way. However, there appears to be no way to encourage callers to reflect whether a particular parameter is input or output. This is unfortunate, because it opens a little window of ambiguity in the interface between caller and function, and interfaces are exactly where most bugs creep in.

sub foo(String $inparam is constant,
        String $outparam is rw) {...}

Just looking at the function call, it's impossible to tell that the function is planning on modifying $b.

One final comment--these last two entries on Perl 6 have been critical about specific features, but I in no way intend to suggest that my overall impression is negative. If fact, I'm very excited about Perl 6's real type system, emphasis on compile-time type checking, macros, and grammar-like regex's, all running on top of an independent bytecode.

Apocalypse and Exegesis 6

Fri 01 Aug 2003

I've been reading through the latest round of Perl 6 details the last couple of days (in Apocalypse 6 and Exegesis 6). I haven't finished the Apocalypse yet, but so far I've made a couple of observations.

First, any function in Perl 6 may have any of six different kinds of formal parameters, categorized by whether they're optional, named, etc.

  Required Optional Slurpy
Positional  $ ?$ *@
Named    + *%

I won't go into too much detail here -- Exegesis 6 explains all this rather gently. But what I noticed is that although you might expect a complete matrix of the six kinds of parameters, there is in fact (AFAICT) no way to define a Required Named parameter. This seems like a shortcoming.

Instead, the sixth kind of formal parameter in Perl 6 is called an invocant, and is actually a second, special kind of Required Positional parameter.

My second observation ... will have to wait until later, because I must go to bed.

The Maltese Camel

Thu 31 Jul 2003

As soon as she walked through my door I knew her type: she was an argument waiting to happen. I wondered if the argument was required... or merely optional? Guess I'd know the parameters soon enough.

"I'm Star At Data," she offered.

She made it sound like a pass. But was the pass by name? Or by position?

"I think someone's trying to execute me. Some caller."

"Okay, I'll see what I can find out. Meanwhile, we're gonna have to limit the scope of your accessibility."

"I'd prefer not to be bound like that," she replied.

"I see you know my methods," I shot back.

She just stared at me, like I was a block. Suddenly I wasn't surprised someone wanted to dispatch her.

"I'll return later," she purred. "Meanwhile, I'm counting on you to give me some closure."

It was gonna be another routine investigation.

-- Dashiell Hammett, "The Maltese Camel"

I found this very funny. It's actually from a piece about Perl 6, Exegesis 6.

New blog format (again)

Wed 30 Jul 2003

When I first posted this blog on the web, I was quite proud that I was using the RSS blog standard as my source format, editing it happily in vim, and generating the HTML web page with industry-standard XSLT.

But my pride came before a fall. My dear friend Charlie immediately pointed out that I was not, after all, following the RSS standard, and that it made a real difference. By his suggestion, I pointed a variety of blog reader programs (straw, Syndirella) at my RSS file, and they all choked. Upon further investigation, it turns out that RSS is only barely XML, and using XSLT to transform it and vim to edit it would be quite painful. So I began searching for a new source format that would make it easy to generate RSS and HTML.

The correct answer is... ok, that's pride again, so let's try: The current answer is... YAML with a shot of Textile. The latest version of Ruby includes YAML, and a Ruby implementation of Textile (RedCloth) is available.

So here I am, happily writing (nearly) plaintext in vim, generating good clean xhtml, and generally compliant RSS. There are still a few issues to work out over the next couple days, but hopefully this will work for everyone now!

Don't set a bad example

Thu 24 Jul 2003

Photos of the dead bodies of Saddam Hussein's sons, Uday and Qusay have now been released. I'm not extremely interested in whether releasing these photos was a good idea or not, but I do want to bring up an argument I heard against doing so.

I heard a pundit say we should not release these photos because we don't want to set an example or precedent for our enemies to do the same when they have the dead bodies of American soldiers. I've heard similar positions on a number of topics, including preemptive strikes on foreign powers. Regardless of where I stand on these issues, I think this is often a silly line of reasoning.

For example, in order to reach this conclusion regarding the Hussein photos, we would have to ignore that a "precedent" has already been "set"--US soldiers dragged through the streets in front of TV cameras in Mogadisu; photos of prisoners-of-war in various conflicts, etc. Then let's imagine a scenario where choosing to not release these photos has a positive example-setting effect. I suppose this would be some government or power, in some kind of military conflict with the US, which has just captured or killed a US soldier. They would have to be considering this same question -- should we release photos of these US soldiers, or not? They would recall that the US could have done that with the Hussein boys and chose not to, and say to themselves something along the lines of, "What a respectable decision the Great Satan made; we should do the same."

Do you believe that would ever happen?

So: if you're going to oppose a potential action of the US government please come up with a better reason, like it's immorral or unconstitutional or something, not that it would set a bad example for our military adversaries.

Clinton supports Bush on Iraq?

Wed 23 Jul 2003

I heard an interesting theory about the Clintons a few weeks ago (sorry, I don't remember where). According to the theory, the Clintons know there's almost no chance of Hillary winning the Presidency over Bush in 2004, so they've got their sites set on 2008. If a Democrat were to win in 2004, he would be basically guaranteed the Democrat nomination in 2008, locking Hillary out. Therefore, Bill and Hillary are working to keep Bush in the White House for one more term.

If this theory were true, you might expect the Clintons to do something during the early part of the 2004 campaign to distract U.S. voters from the Democrat candidates. Perhaps Hillary would write a "wildly hyped new memoir".

And now, with all the candidates piling criticism on Bush's mistake in his last State of the Union address, you might expect the Clintons to do something about it. Yesterday, President Clinton gave an interview on Larry King's show. He said, "I thought the White House did the right thing ... The thing we ought to be focused on is what is the right thing to do now."

Of course Mr. Clinton may have some other reason for supporting the President in the face of sharp criticism by Democrat Presidential candidates. It's probably a very good reason, and I'll think of it any second now...

Chouser's Blog now online

Tue 22 Jul 2003

My blog is finally up, and this is it. Thanks to Aron for the initial encouragement, and Charlie for the most recent inspiration.

I have no idea how regular this will be, but I've been doing okay for the last few weeks, so maybe I can keep it up. Wish me luck.

Spinning

Tue 22 Jul 2003

N.A.G. (Network Auralization for Gnutella) reminds me a bit of the snatches of sound you might hear while spinning a radio dial, but without the annoying static: mysterious hints of depth and meaning, but without any true depth or meaning. And for once, the screenshot isn't the best first clue about what it is.

Perhaps I like it for the same reasons or in the same way as I like They Might Be Giants: mysterious hints.

socat general network utility

Tue 15 Jul 2003

If you've ever used netcat or found yourself trying to pipe stuff to telnet, you've got to take a look at socat. From the README:

socat is a relay for bidirectional data transfer between two independent data channels. Each of these data channels may be a file, pipe, device (serial line etc. or a pseudo terminal), a socket (UNIX, IP4, IP6 - raw, UDP, TCP), an SSL socket, proxy CONNECT connection, a file descriptor (stdin etc.), the GNU line editor, a program, or a combination of two of these. These modes include generation of "listening" sockets, pipes and pseudo terminals.

socat can be used, e.g., as TCP port forwarder (one-shot or daemon), as an external socksifier, for attacking weak firewalls, as a shell interface to UNIX sockets, IP6 relay, for redirecting TCP oriented programs to a serial line, to logically connect serial lines on different computers, or to establish a relatively secure environment (su and chroot) for running client or server shell scripts with network connections.

Thanks to Aron for pointing this one out.

Drama in the Senate

Mon 14 Jul 2003

Sen. Thomas Daschle, leader of the Senate's Democratic minority, attempted an audacious coup Wednesday when he seized the majority leader's prerogative by calling up a stalled child tax credit bill.

Majority Leader Bill Frist, not alerted by Daschle, was off the floor when the minority leader made his move. Sen. Richard Lugar, managing the State Department reauthorization bill on the floor, stopped the proceedings by initiating a quorum call and summoning Frist. When he arrived, Frist made a non-debatable motion to kill the bill. All 51 Republican senators, told that this was a test of whether Frist or Daschle was going to be the real majority leader, defeated the proposal in a straight party-line roll call.

--Robert Novak

I find this sort of thing extremely interesting, and I don't know why it isn't reported more widely. For what it's worth, my impression is that this kind of rule exploitation is not particularly more common from one major party than the other.

The full text of what Novak described above is scattered among other Senate business on pages S9089 and S9094 of the Congressional Record for July 9th, and includes McCain's somewhat interesting position on the matter.

RSS (XML) for blogs

Fri 11 Jul 2003

Changed the format of my blog file to fit Dave Winer's suggestion regarding RSS

I don't have a dog

Fri 11 Jul 2003

Youth Culture Killed My Dog

PDF ad

Thu 10 Jul 2003

Have you seen the Television commercial for the PDF file format? I guess I'm used to seeing computer ads on TV these days, but this is the first file format I can remember seeing advertised in such a general forum. It strikes me as a small landmark in the inexorable march of computer technology into mainstream U.S. culture.

Liberalism

Fri 02 May 2003

"Liberalism is part of a religious disorder that demands a belief that life is controllable."

--Ann Coulter

The value of human life

Tue 15 Apr 2003

As modern history has progressed, the general willingness of our country's citizens to tolerate war casualties has dropped. I wonder if this at all tracks with our perception of the value of human life.

So what are the ways we could measure the perceived value of a human life at any particular point in time? Some vague ideas...

The medical cost of keeping someone alive another day
Infant mortality rate
Average life expectancy
This is less for men than for women, right? Is that part of why we're less willing to see women die in combat? Or is it more related to...
Potential for nurturing future life
Average income per day

Of course, since most of these factors have gotten better (more or less) consistently over the last several hundred years, it would probably be pretty hard to figure out which ones have the greatest impact. Also, it would be quite difficult to rate the casualties that we "tolerate" -- just because lots of our men died in Vietnam doesn't mean we were tolerating it, for example.

Re-instituting the draft

Thu 16 Jan 2003

NPR's Marketplace today had a segment entitled Return of the Draft:

Commentator Lionel Van Deerlin says to bring the reality of war home to all Americans, reinstate the draft: While war in Iraq seems distant and theoretical, Van Deerlin says we won't understand the ramifications of this war until we confront the socio-economic facts about who defends us: military volunteers are poor, giving their lives while the rest of us are free to enjoy our liberties. Reinstating the draft will enable all to defend the country.

After hearing the segment, I sent Marketplace this letter:

Marketplace,

Our county's modern military is not like that of the Civil War or of ancient Rome as Lionel Van Deerlin suggested in this evening's commentary. We have highly-skilled, highly-trained people building and using advanced weaponry and defensive systems that protect our soldier in the field. In fact our "underprivileged" may be safer in the military than if they were civilians. If you will allow me; let's do some numbers:

(Note that targeting the general population demographic to more closely match the military by restricting to males, minorities, or to include older age groups generally increases the death rate, making the argument more convincing.)

These are not the numbers you would expect if we in the "privileged classes" were taking advantage of the less fortunate by sending them to war in our stead. Our courageous and patriotic soldiers volunteered for their jobs, understanding the potential risks as well as the rewards, and considered it a fair trade. Someone drafted against their will gets to make no such value judgment.

A paid volunteer military, supported by advanced technology and a conscientious society, is just.

PS. Some notes on the statistics:

The military death rate was calculated by taking "Total Deaths" divided by "Active Duty", averaged over the years 1987 through 2001 from: "U.S. ACTIVE DUTY MILITARY DEATHS - 1980 through 2001"

The U.S. population death rate was calculated by taking the average of the rates for the groups "15-19" and "20-24" in the "All origins, Both Sexes" column of Table 4 in: "National Vital Statistics Reports, Vol 50 Num 15, Deaths: Final Data for 2000"