One Year of Posts

On December 12, 2013 I started this blog with the idea that I’d post something every day for a year.

Except for two days, October 31 and November 1, I did.

It was a fine experiment. Now it’s over. I’m not done with blogging, just with this blog. Thanks to everyone who followed along, even if just occasionally, and to all who left comments.

You can still find me at Unlike this blog, where I published something, anything, every day without much regard for whether it was really interesting or readable, I’ll spend a little more time on posts for the iCaspar blog. So, while it won’t be daily from here on, I hope it will be better material.

With thanks,

A Story that Probably Has No Point

Somehow, yesterday under two and a half feet of snow, the dog managed to sniff out the half-frozen carcase of some small animal that had died and partially rotted on the hill out back. He was supposed to be out taking a pee, but instead he ate most of whatever it was. He brought us back a bone, because we sometimes give him bones when we have ribs for dinner and he wanted, I’m sure, to return the favor.

By 4:30 he was starting to feel that tinge of regret in his stomach. You know, that tinge of regret you get later in the evening on Thanksgiving. That regret. He started whimpering to go out again.

We were reluctant to let him out. We didn’t want him to go back and eat more of whatever it was, like you sometimes do later in the evening on Thanksgiving. But he seemed very earnest about needing to go, so we let him.

Then I had to blow more snow out of the driveway. You can’t have a crazy-ass dog running around when you’re trying to snow-blow. You’d end up grinding up the dog and spraying him all over the neighbor’s yard. So we kept him in for about 45 minutes. It turned out to be too much. When I came back in, Brooke was mopping up diarrhea in the living room. All the windows were open to air out the smell. We started lighting candles with whatever fragrance we could find.

Then the power went out.

We got out the flashlights, lit more candles and continued to mop in the dark. We wondered if we ought to close the windows, but decided to keep them open.

The power came back on 20 minutes later. Eventually, the smell dissipated. For the rest of the evening we let him go out every half hour when he whined. Then every hour or so through the night. This morning he was still sick. At least three times.

There’s not really a point to writing this down and posting it for all to see. Except, you might draw from it a cautionary tale to remember when you’re thinking about getting a dog.

Snow Day

We got something over a foot of snow last night and it’s still coming down steady.

My alarm went off at 6 am simultaneously with the phone ringing. The phone was the school’s robo-caller announcing that school is closed and tonight’s winter concert is rescheduled for tomorrow night.

I thought about going back to bed, but the kid, who normally requires being dragged out of bed for school, had heard the phone ring and had gotten up. Also, the three cats and the dog did not understand that snow days are for sleeping in and wanted fed at their usual breakfast time.

Now that I’m up, the kid has gone back to bed.

Go figure.

Plan B

Our friend Regina had made plans to be with us today and tomorrow. She emailed this morning to say she wasn’t feeling well and couldn’t make it.

Naturally, we are disappointed. We always enjoy her visits, and since she keeps coming back we can only assume that she enjoys coming. We hope she feels better soon.

In lieu of company, I will instead start on my Christmas card list this afternoon. It will be the earliest I’ve ever started on a Christmas card list. Most years I start it on December 26, or even December 30.

Blocking Semalt from Behind a Shared Cache

I’ve written before about blocking and other referrer spam. In most ordinary cases, the couple lines added to the .htaccess file suggested in the previous post will do the trick. However, I’ve come across a situation where blocking sites like this using .htaccess doesn’t work. Specifically, it doesn’t work when you’re running certain kinds of caching.

Why? Because when you’re running behind a caching layer, pages are served from the cache instead of by the Apache webserver. Unless semalt happens to be the first thing to hit your index page after a cache purge, the cache just serves the page it has in memory. The .htaccess file is never consulted about any of this. But when the page loads, even from memory, semalt gets tagged as the referrer when your WordPress (or whatever) script loads. Tilt!

This isn’t really a problem if you’re running on your own VPS or dedicated server. You just move the referrer check from .htaccess out to the Varnish config. If you’re running your own VPS or dedicated server and have access to your etc/varnish/default.vcl file, there’s a pretty easy how-to for getting this done on Omninoggin.

But, if you happen to be in a shared hosting environment and don’t have access to the Varnish config, the tactic of last resort is to block the offending sites within WordPress itself. It’s less than ideal, because you’re actually having to process the spam requests within the PHP environment, and that takes more server resources than blocking it farther up the line. (But, if you’re in a shared hosting environment, you’ve already made the decision to trade off some of the ideal for cheaper hosting. Shared hosting with any site caching is about as primo as shared hosting gets, so you can’t complain too much.)

To minimize the resources used by these unwanted page requests, the trick is to recognize and deal with them as early as possible in the WordPress page-load cycle. With that in mind, I’ve written a quick and dirty plug-in, based on a couple lines of code provided to me by Ivan Yordanov, one of the tech support gurus at my awesome host, SiteGround.

It’s a “Must Use” plugin. That’s different than the usual WordPress plug-ins that you download from the plug-in repository on You have to install it manually. I’ve coded it this way because MU plugins load before any other plugins or theme files, and can be hooked earlier in the page-load cycle, before any other output happens and before WordPress starts building the page.

This is offered on a “use at your own risk/your mileage may vary” basis. To use it, copy it and save it in a file called referrer-blocker.php (or pick your own name, so long as it’s extension is .php). Save the file in your wp-content/mu-plugins/ directory. (You may have to make that directory, since it’s not part of the usual WordPress install.)


 * Referrer Blocker mu-plugin
 * @author Caspar Green <>
 * License: GNU 2.0 or later
 *          Creative Commons 4.0 Attribution-ShareAlike
 * Use at your own Risk. Your mileage may vary.
 * This plug-in is for use in special cases where WordPress is operating
 * behind a cache (such as Varnish or Google Pagespeed) in a shared hosting
 * environment, where pages are served from the cache rather than from Apache
 * and where the shared hosting environment restricts access to the cache configuration.
 * This plug-in is meant for use as a mu-plugin (see
 * It must be manually saved to the wp-content/mu-plugins/ folder. (Most users will need to
 * create this folder, since it isn't installed with a default WP install.) Once installed,
 * it cannot be deactivated or uninstalled from WordPress admin.
 * Hat-tip to Ivan Yordanov @SiteGround Hosting ( for pointing out this work-around.
 * The idea for how to use php to block referrers behind the cache is his;
 * I just turned it into a plugin.

add_action( 'muplugins_loaded', 'iC_referer_blocker' , 1 ); // We want this to run RIGHT NOW!

function iC_referer_blocker() {

    // Add the domain names of referrers you want to block here.
    // Remember, the longer the list the more time it takes to check!
    $bad_referrers = array(

    $ref = getenv( "HTTP_REFERER" );

    foreach ( $bad_referrers as $referer ) {
        if ( ( strpos( $ref, $referer ) ) !== false ) {
            header( 'Location: http://' . $ref ); // Send them back where they came from.
} // end iC_referer_blocker()

Up and Down

We’re putting up the Christmas tree today —

if it didn’t get moldy last summer when we had a leak in the basement and everything else in the basement got moldy.

Otherwise we’re going to Plattsburgh to get a new tree, and then we’re putting up the Christmas tree tomorrow afternoon.

Either way, 24 hours after it’s up, the cats will have taken down most of the ornaments.


Brooke got a word-of-the-day calendar last year for Christmas.

Today’s word is

Quadrennial \kwä-‘dre-ne-əl\ adj 1: consisting of or lasting for four years 2: occurring or being done every four years

I’d estimate that I already knew ¾ of the words that came up over the year. Of the remaining ¼ I can remember only a smattering. I suppose if I haven’t had any use for them up to now I’m not likely to need them.

The one new word I can recall a few months later is stridulate. It means (usually referring to insects like grasshoppers or locusts) to make a shrill sound by rubbing the legs, wings, or other parts of the body together. And indeed, it did come up when we were preparing to teach insect life cycles to kindergarteners last October.

I’m Losing My Job

Well, one of my jobs.

I’ve been keeping the financial records for the church for the last two years. Why I’m doing that is a long story. But I am.

Today, though, I’m beginning the transfer of the records to the new bookkeeper. The transition will take a few weeks. I’ll be on hand until the W-2s from 2014 are all mailed. But for regular record-keeping, I’ll be turning things over by mid-December. Then I’m done.

It’s one of those jobs I’ll be glad to be losing.

Premature Top 10s

It’s only December 3 and already I’m seeing top 10 lists for 2014.

I know people want to get out ahead of the crowd. And yet, December is 1/12 of the year. It seems likely that something rating in the top 10 of anything might happen in that last 1/12. Can a top 10 list for any given year really be accurate if it’s compiled before January 1 of the following year?