Goodbye spammers

A blog is like a house in some ways. If you go away for a while and leave it uninhabited, when you come back you’ll find it full of dust, cobwebs, and nasty cockroaches under the furniture. The cockroaches, in this case, are spammers. For the past year, they’ve been using the comments section of my old posts to advertise designer clothing, drugs of questionable origin, and other such junk.

Well, I’ve had enough. I’ve just swept out all the spam comments, and installed a reCAPTCHA plugin on my comments page. From now on, anyone who leaves a comment on my blog will have to solve a reCAPTCHA challenge first. Which will not only stop automated spambots, but it will also help convert old books to digital form!

Huh? How does that work, you ask? Here’s how reCAPTCHA works. Clever, isn’t it?

So please leave comments — because you’ll be helping archive old newpapers, books, and radio programs in the process!

UPDATE: Trusting in reCAPTCHA alone is not going to work: the spammers are still getting through. I’m going to close comments entirely, because only spammers are commenting on a blog this old anyway. If you are the rare exception and want to comment on something I’ve written, send me an email. What’s my email address? Well, you can find my name on the “About Me” page. Take my first name and last name, put a period between them, and you have my Gmail address.

So goodbye spammers, this time for good.


Three days after the Deepwater Horizon spill, the Dutch government offered to send oil skimmers to help scoop the oil off the surface of the ocean, well before it reached the coast. But the Obama administration turned them down. And now we find out why: because of a nitpicky detail in EPA regulations.

The skimmers work by pumping in water mixed with oil, separating the oil out from the water in large tanks, then pumping the clean water back into the ocean. However, because the water pumped back into the ocean would still contain trace amounts of oil, this fell afoul of an EPA regulation that forbids oil-contaminated water from being pumped into the ocean. Under normal circumstances, this is a good thing — but in this circumstance, following this rule to the letter would be asinine. But that’s exactly what an EPA bureaucrat did. And neither President Obama nor anyone else in his administration saw fit to overturn this idiotic decision.

There’s more. In Louisiana, someone had the bright idea of loading a bunch of vacuums onto barges and floating them out onto the oil-laden water to start sucking the oil off the surface. Essentially, they built the world’s largest wet vac. But the Coast Guard stopped them because “[t]he Coast Guard needed to confirm that there were fire extinguishers and life vests on board, and then it had trouble contacting the people who built the barges.” Again, an idiotic decision made by a low-level bureaucrat not looking at the big picture, that wasn’t overturned by his superiors.

Now, it’s not the federal government’s job to hold your hand and wipe your nose for you, and the most effective response to a disaster is usually the local response. But the least the feds can do is avoid getting in the way!

If Obama wants to persuade the American people to hand over our healthcare to the tender mercies of government bureaucrats, he’s got to get them to do a better job than this.

UPDATE: Same song, third verse.

It takes an “intellectual” to be this stupid

Apparently, a history degree from Harvard doesn’t protect you from making absolutely boneheaded mistakes. Frank Rich’s latest column in the New York Times contains the following gem (link in the original):

It’s also mistaken, it seems, for anyone to posit that race might be animating anti-Obama hotheads like those who packed assault weapons at presidential town hall meetings on health care last summer.

Why do I make a point of the fact that the link was in the original? Because Frank Rich obviously never read the link. If he had, he would have seen this photo:

From CNN: Black man carrying assault rifle outside Obama town hall meeting

From CNN: Black man carrying assault rifle outside Obama town hall meeting

I ask you: is this man animated by racial prejudice when he criticizes Obama?

Now, I’m not saying that black people can’t be racist; that would be a ridiculous claim. There are black people who are anti-Semitic racists, or anti-white racists, or anti-Asian racists, just as there are white people who are anti-black or anti-Semitic or anti-Asian. But how many white people are anti-white racists? How many black people are anti-black racists?

I hate to have to explain this to you, Mr. Rich, but the entire point of your “anti-Obama protestors are racist” column is that President Obama is black, and that the racism allegedly directed against him is supposedly reminiscent of racism during the Civil Rights era. And the very article your column links to disproves this point with a single photo.

Perhaps Frank Rich didn’t insert that link himself, but it was inserted after his column was written by the Web editor(s) at the New York Times. In which case Mr. Rich’s failure is not one of reading comprehension, but one of failure to do the research. Even so, it doesn’t give me much faith in Harvard’s American History program: research into sources is a fundamental part of doing history right. As C.S. Lewis so memorably put it in The Lion, the Witch, and the Wardrobe, “What do they teach them at these schools?”

At my alma mater, Wheaton College, there was a standard joke that we were the “Harvard of the Midwest,” or sometimes, that Harvard was trying to be the “Wheaton of the East Coast”. I’m now thinking that we should have been joking about a better university, because Harvard’s education clearly isn’t up to snuff.

Photos from the Lone Star Tea Party

This year’s April 15th tea party in Grand Prairie, TX was very well attended. I’m terrible at guessing crowd sizes so I won’t even try, but I took pictures of every clever sign I saw and ended up with over a hundred photos — and the only reason I didn’t take at least twenty more is because my camera battery ran out.

The award for “best sign of the day” has to go to this one:

Sign: Air this MSNBC, I dare you

I’ll have more photos up later once I’ve finished sorting through them all to pick out the best ones.

UPDATE: A few minutes later, as I was discussing this sign with a member of the press, a woman behind me said in a tone of sarcastic surprise, “You mean there are black people at a Tea Party?” I turned around to see who had spoken, and saw this woman:

Black people at a Tea Party? Surely not!

These weren’t the only black people I saw there, but I didn’t take a picture of most of them because really, when you think about it, it shouldn’t matter what skin color someone has — it’s the content of their ideas that matters. (Dr. King would have been thrilled with the attitudes of the Tea Party attendees that I met yesterday). But since these two women had both made a point of their skin color, I snapped their photo.

Pardon me, your bias is showing…

Wow. I knew the media, including CNN, doesn’t like the Tea Party movement and doesn’t want to report favorably on it, but this is just mindboggling. Here’s an overhead view of the crowd at the March 27th speech by Sarah Palin at in Arizona:


How many people does that look like to you?

Now head over to and listen to the CNN reporter, standing in the middle of that crowd, describe the size of the crowd:

“Hundreds of people, at least dozens of people – we haven’t gotten a count of how many people turned out there…”

Don’t take my word for it; check out the video yourself. Read more at


Via Hot Air and Patterico comes these two articles from the Associated Press and the Columbus Dispatch, respectively.

The Obama administration has been claiming that the stimulus “created or saved” jobs. But there have been some significant factual problems in the numbers reported.

From the Columbus Dispatch article:

Of the 212.5 full-time equivalent jobs the district said were funded with part of the $64 million in stimulus it expects to receive, about 65 percent were “saved,” including 36 principals and assistant principals.

So was the district on the verge of laying off 36 school administrators?

“No,” Dannemiller said, explaining that the reporting choices were “created” and “saved.”

“They weren’t ‘created,’ obviously, so our only other choice was ‘saved.’ “

… So if these jobs weren’t in danger, what was the money used for? Apparently, raises and bonuses. From the AP article:

About two-thirds of the 14,506 jobs claimed to be saved under one federal office, the Administration for Children and Families at Health and Human Services, actually weren’t saved at all, according to a review of the latest data by The Associated Press. Instead, that figure includes more than 9,300 existing employees in hundreds of local agencies who received pay raises and benefits and whose jobs weren’t saved.

And further down in the AP article, there’s this spectacular demonstration of innumeracy:

At Southwest Georgia Community Action Council in Moultrie, Ga., director Myrtis Mulkey-Ndawula said she followed the guidelines the Obama administration provided. She said she multiplied the 508 employees by 1.84 — the percentage pay raise they received — and came up with 935 jobs saved.

The innumeracy on display by Ms. Mulkey-Ndawula is staggering. She multiplied by 1.84 when she should have multipled by 0.0184 — throwing her results off by a factor of a hundred. Leaving aside how ridiculous it is to claim that a raise is a “fraction of a job saved” (if the job was truly in danger, why would there be any raises?), that means that instead of reporting 9.35 jobs “saved” as a result of those raises, she reported 935 jobs “saved”.

Innumeracy. It’s a real problem, folks.

And while Ms. Mulkey-Ndawula’s innumeracy may not be widespread, the false reporting of raises and other uses of stimulus money as “saved jobs” is indeed widespread. Near the close of the AP article closes, we find:

More than 250 other community agencies in the U.S. similarly reported saving jobs when using the money to give pay raises, to pay for training and continuing education, to extend employee work hours or to buy equipment, according to their spending reports.

The next sentence tells us that “[o]ther agencies didn’t count the raises as jobs saved, reporting zero jobs,” but this fails to reassure, since we aren’t told how many. Since counting raises as partial “saved jobs” was done on direct instructions from the administration, I’m guessing most of the other agencies counted things this way as well. Which means there are some massive problems underlying the claim of X number of jobs saved by the stimulus.

Why I will no longer do business with Wachovia Bank

So yesterday I received a letter from Wachovia Bank. The envelope stated “It feels good to be PREFERRED…”, which warned me that this was another one of those pre-screened credit offers. When I opened it, the first thing I saw was:

$1,200.00 check from Wachovia bank - what's the catch?

$1,200.00 check from Wachovia bank - what's the catch?

Now, I wasn’t born yesterday. If banks handed out $1,200 to random people all the time, they’d soon go out of business. There must be a catch. So I looked at the accompanying letter, and saw this:

Header of the Wachovia letter

Header of the Wachovia letter

Sure enough, this wasn’t a gift, but a loan. And what were the finance terms? I turned the letter over and looked at the other side:

$600 interest on a $1,200 loan? Do they think I'm stupid?

$600 interest on a $1,200 loan? Do they think I'm stupid?

An APR of more than 50%? Almost $600 in interest… on a $1,200 loan? Do they think I’m stupid? Those are finance terms more commonly associated with loan sharks than with respectable financial institutions. I can only conclude that Wachovia Bank has decided they no longer want to be a respectable financial institution.

Furthermore, who do they think is going to fall for this? The answer, clearly, “people with more greed than sense.” And do they really believe such people are going to repay their loans? I mean, come on, this is the subprime mortgage fiasco all over again! It would seem that the Wachovia Bank lending people have not learned from history.

Finally, it’s my opinion that a bank that has so little respect for people as to offer loan-shark interest rates wouldn’t hesitate to take advantage of them in other ways as well. Therefore, I will avoid doing any business with Wachovia Bank, and would urge you to follow my example.

Recursively walking all a widget’s descendants in PyGTK

The other day, I had a need to walk through all the descendants of a dialog box in PyGTK, so that I could save the contents of each text-entry field to the appropriate database record. After a bit of poking around in the PyGTK manual and not finding the recursive get_children() function that I wanted, I decided to write my own.

def walk_descendants(root):
    Walk through a tree of this object's children, their own children,
    and so on, yielding each object in depth-first order.
    yield root
    if not hasattr(root, 'get_children'):
        return # No children, so we're done
    children = root.get_children()
    if not children:
        return # No children, so we're done
    for child in children:
        for widget in walk_descendants(child):
            yield widget

I use this function to build a dict listing all the widgets in my dialog box, keyed by their names. Then when I need to do something with the OK button, I can use something like self.widgets['button_OK'] and no matter where it is in the hierarchy, even nested inside several VBoxes and HBoxes, it’s easy to use.

In case others might find this useful, I hereby release this function into the public domain. Use it however you like.

Learning to create Debian/Ubuntu packages

I’m starting to learn to create .deb packages for Debian or Ubuntu. A quick breadcrumb trail for myself, to remind me of where I’ve found useful information:

Making SVN trust a new root CA certificate

If you’re using Subversion to connect to an HTTPS repository that’s signed by a non-standard root certificate — such as a certificate, for example — here’s how to do it on Linux or OS X. (Windows users: sorry, you’re out of luck. I haven’t developed on Windows since 1999, and I don’t ever want to go back. So the only way this post will ever be updated with Windows instructions is if someone else figures out how to do it and leaves a comment.)

  • First, download the certificate you’re interested in, e.g. “wget”. I suggest storing it in /etc/ssl/certs with an appropriate name, such as “cacert-root-ca.crt”. You’ll need to have root privileges (use “sudo”) to get write access to the /etc/ssl/certs directory.
  • Run “openssl md5 /etc/ssl/certs/cacert-root-ca.crt” and/or “openssl sha1 /etc/ssl/certs/cacert-root-ca.crt” and compare the results against the certificate fingerprint given on the website. The website you’re downloading this certificate from does give you its MD5 and/or SHA1 fingerprints, right? (If not, what the heck are you doing trusting a certificate you haven’t verified?!?)
  • Run “openssl x509 -text -in /etc/ssl/certs/cacert-root-ca.crt” to verify that the certificate’s data (company name and so on) looks correct.
  • If the above fails, add “-inform der” to the command above: maybe you accidentally downloaded the DER-encoded certificate instead of the PEM-encoded certificate.
  • If you have the DER version, you’ll need to convert it to PEM. Run “sudo openssl x509 -inform der -outform pem -in /etc/ssl/certs/cacert-root-ca.crt -out /etc/ssl/certs/cacert-root-ca.pem”. Note the “sudo” in front of that command: you’re writing to the /etc/ssl/certs directory, so you need to be root.
  • Now that you’ve got a certificate in PEM format and verified it, it’s time to edit your “~/.subversion/servers” file. In the “[globals]” section, add the line “ssl-authority-files = /etc/ssl/certs/cacert-root-ca.crt”. The “ssl-authority-files” option is a colon-delimited list, so if you already have something there and are adding the second certificate to it, use a colon to separate the two paths. If you’re adding a third certificate to the list, then you should already see the colon and be able to figure it out. :-)

I mostly figured this out from the “SSL Certificate Management” section of the Subversion book. Which I highly recommend reading, BTW.

I hope this helps someone else spend a little less time on Google figuring out how to trust a new root CA.

Interesting ideas for human-computer interaction

There’s a research project at University of Toronto that’s exploring different ideas for how people interact with computers. Here‘s an interesting new way of looking at the “desktop” metaphor. There’s some rather clever ideas there.

A step-by-step SQLAlchemy tutorial

SQLAlchemy is a very useful database-access library for Python. It’s got excellent documentation; but what it was missing until recently was a tutorial. I wrote a step-by-step SQLAlchemy tutorial to fill in the gap. Of course, the day after I wrote it, SQLAlchemy’s author posted the tutorial that he’d been working on, so I just duplicated his efforts. :-)

Nevertheless, it might be useful to someone, so I put it up anyway.

He is risen!

Today is the day of Pascha, more commonly known in English as Easter. (At least in the Western tradition — the Eastern tradition will celebrate it one week later this year). It is, bar none, the most important celebration of the year for Christians, more important even than Christmas. Christmas is when we celebrate Christ’s birth, but Pascha is when we celebrate His resurrection! Christ’s birth was the beginning of His time on Earth, but His death and resurrection were culminating point of His ministry, the whole purpose of His coming.

This makes Christianity a very interesting thing indeed, because it’s a faith that could be utterly destroyed if one specific event was proven to have never taken place. If someone could prove beyond the shadow of a doubt that Jesus was not raised from the dead, if archaeologists found a two-thousand-year-old body in a tomb near Jerusalem that could somehow be proven to be Jesus’ body, then the foundation on which the entire edifice of Christian doctrine rests would be destroyed. Because if Jesus didn’t rise from the dead as He promised He would, then He cannot truly be God, and thus cannot save anyone from their sins. Even the Bible even says so — look at 1 Corinthians 15:12-19.

But Jesus Christ did rise from the dead, and therefore we do have a hope that does not deceive us (1 Corinthians 15:20-22). We do not simply follow the teachings of a great religious leader, passed on after his death. Rather, we worship the Lord Jesus, who is alive today and forever! He has promised never to leave us nor forsake us, and that He will be with us always, even to the end of time. (Matthew 28:18-20).

Halleluyah! He is risen!

If the ball hits the turtle, it’s still in play.

Life in Africa can be quite interesting sometimes.

Just down the street from where I work, there’s an American Recreation Center that, among other things, has a softball field, and hosts a weekly game of softball on Saturday afternoons. So on my first weekend here, I went down to the “Rec” to join in the game. Midway through the game, a large turtle stumped onto the field, heading for the grassy infield. When I called attention to it, someone said, “Oh, that’s just George. He shows up often enough that he’s been written into the field rules — if the ball hits the turtle, it’s still considered in play.”

Where else would you find a baseball field with a turtle (actually it’s a tortoise, but everyone here seems to call it a turtle) that pays a visit regularly enough to have a local rule devoted to him?

Picking up the keyboard again

This blog has been languishing on the vine lately. I’ve hardly updated it at all for months, and when I have updated it, it’s usually been with a “Hey, here’s some extremely geeky stuff that I may want to remember later but nobody else would be interested in.”

That’s not what I want this blog to be about. I want it to be a place where I can record my thoughts, write interesting tidbits about my life, and talk about what it’s like living one’s life for God.

So I’m picking up the keyboard again. I’ll be posting a lot more frequently now, and on a wider variety of subjects. I have a lot of good stories waiting to be written, so stay tuned.

PCI ID viewer for Windows

I often end up working on Windows machines that don’t have the right drivers installed for this or that piece of hardware. And since Windows makes it difficult to get at the actual PCI ID’s for its devices, all you have to go on is the “Unknown Device” entry in the Device Manager control panel. Thanks, Microsoft, that’s real helpful.

What I need is a tool to list the PCI ID’s for all devices, and one (preferably) that’s free. I found such a tool at Craig Hart has written a program called PCI32 (for Win2000, NT, XP, etc) and PCI (for Win 9x/ME) that can list the PCI ID’s of all your devices, along with the manufacturer name and model name. Very useful for grabbing exactly the right driver.

Some useful programming links

A few useful programming links gleaned from various sources:

Comment policy

I just deleted my first blogspam comment, so I think it’s time to write up a comment policy, before I actually start needing it. So, without further ado, here are The Rules:

1. This is my blog. Nothing obliges me to let you comment here. I do so because I’m interested in discussion, but commenting is a privilege, not a right. If you abuse that privilege, I may take it away, either with or without warning.

2. Civilized behavior only. That means no ad hominem attacks, no insults, no name-calling, no profanity, etc.

3. Any comments that break rule #2 will be removed and replaced with the text “This comment has been removed by the site administrator for (insert reason here).” I may, at my option, place such comments under this post instead of deleting them entirely, so that anyone can see why the post was removed. If I do so, I may also censor the post involved by editing out profanity or any other offensive content, replacing it with a marker such as ““.

4. I will summarily delete, without notice, any comment that is nothing but blogspam (e.g., lots of links to unrelated sites like online casinos and the like).

5. Having said all that, if you can keep your comments civil and your tone polite, I welcome disagreement with my ideas, or with other commenters’ ideas. I’m not interested in this blog becoming nothing but an “echo chamber” — go ahead and disagree with me. All I ask is that you behave like a reasonable adult.

Hawaii Supreme Court takes the logical next step

A woman, days away from giving birth, smokes crystal meth. It gets into her bloodstream and, naturally, into the bloodtream of her baby, who’s still in her womb. The baby is born alive, but with a lethal concentration of methamphetamine in his body; he dies two days later. The mother is prosecuted for manslaughter in the death of her baby, and is convicted. Her appeal goes to the Hawaii Supreme Court, which overturns the conviction on the grounds that — are you ready for this? — her baby “was not a person” at the time of the offense.

So even days before birth, a baby is not yet a person and therefore has no rights.

Pardon me while I throw up.

Just one question: what does this do to the question of prescription drugs taken during pregnancy? If you read the warning labels of the drugs you get from the pharmacy, you’ll see that many of them have warnings like “If you are pregnant, or think you might become pregnant, do not take this medication.” But if an unborn baby is not yet considered a person in the eyes of the law, and has no rights, then why would those warning labels be necessary?

If you take this out to its logical conclusion, as the court seems to have done, it goes in some really terrifying directions.

Update: After careful reading of the article, I have to say that the blame lies not with the Hawaii Supreme Court, but with the authors of the Hawaii Penal Code. The manslaughter law defines a person as “a human being who has been born and is alive,” according to the article’s summary of the court’s decision. So the court was properly interpreting a bad law, rather than pulling a judgment out of their hat.

Some light geekery for a change

The original Star Wars trilogy holds a special place in the heart of many geeks. It has grandiose space battles, a rip-roaring plot full of daring escapes and noble sacrifices, and memorable lines (C-3PO: “Sir, the possibility of successfully navigating an asteroid field is approximately 3,720 to 1!” Han: “Never tell me the odds.”) The movie is clearly not meant to be taken as realistic — after all, it’s got planets being blown up by lasers — but it can be great fun to take it at face value.

One article that does exactly that is “Endor Holocaust“, which asks, “What happens when you detonate a spherical metal honeycomb over five hundred miles wide just above the atmosphere of a habitable world? Regardless of specifics, the world won’t remain habitable for long.” The Rebels may have saved the galaxy, but it seems they doomed the Ewoks in the process.

Another such article is “On the Implausibility of the Death Star’s Trash Compactor“. What was that thing doing in the cell block, anyway?

Finally, there’s the ultimate in geekery: the article entitled “How Lightsabers Work“. Filled with handy safety tips (“NEVER point the blade emitter of a lightsaber toward your own body. NEVER look down the “barrel” of a lightsaber, even if you are “sure” it is in safe mode.”), this article also contains photos of other handy uses for a lightsaber, such as hedge trimming or slicing bagels (“The big advantage of using a lightsaber, of course, is that you can both cut and toast the bagel in one stroke.”) A must-read for anyone considering purchasing this handy device.

If you have a particular favorite Star Wars article that I didn’t mention, let me know and I’ll update this post.

Next Page »