Facebook shows you more than the trivia of your friends' lives. It also shows you their politics, and how they think about the world. This can be fascinating and unsettling.
For example, some people I like recently joined Petition To Remove Group "Soldiers Are Not Heroes", a group that's a petition to remove the Soldiers Are Not Heroes group.Leaving aside which group I agree with, the 'Petition To Remove' group scares the fuck out of me: their goal is to silence people who disagree with them. If you want to engage the "Soldiers Are Not Heroes" group in vigorous debate, argue with them, call them names, start a group called 'Members Of The "Soldiers Are Not Heroes" Group Are Clueless Ingrates' - fine. That's freedom in action. Let both sides make their cases.But remove them from Facebook because you don't like what they're saying? Shut them down to shut them up? What could be less free, less noble, less American, than that? That's not what our troops are fighting for. That's the kind of death-to-unbelievers intolerance they're fighting against."I disapprove of what you say, but I will defend to the death your right to say it." - Evelyn Beatrice HallSunday, December 27, 2009
Thursday, December 24, 2009
That Dog Is Money!
Wednesday, December 23, 2009
Guard Dog
Sunday, December 20, 2009
Bootie Call

Blizzard in Richmond this weekend. Jackson was born in Texas, and did his racing in Florida, so we figure this is probably his first encounter with a winter wonderland.Friday night, with a couple of inches of snow on the ground, Jackson wouldn't come down the porch steps for his late walk. He did wander around in the backyard a bit, and take a much-needed pee.Saturday morning, sixteen hours since his last poop, a full blast of snow on the ground, I dragged him down the porch steps. As soon as he started to walk, he cheered up. Yes, the world was different, but it wasn't bad. A whole lot better than rain. He got used to the step-and-sink rhythm, and set off in his determined fast-paced walk. We call it his "man on a mission" mode. And he realized pretty quickly that, when the whole world is soft, you can poop anywhere.So the Saturday walks were pretty easy. This morning, though, we were worried about Jackson's feet. There's salt out there, and chemical salt, and puddles of cold water under thin sheets of ice that break into sharp pieces. Fortunately, a couple of weeks back, we had ordered a pack of Pawz booties

Sunday, December 6, 2009
Colonel Barfoot Should Take His Flagpole Down
Friday, November 20, 2009
The Asshole of Meadow Park
Monday, November 9, 2009
Caliente Brunch II
Friday, November 6, 2009
Facebook: The New Google?
For many years now, I've thought of Google as top dog in the software world. But Facebook is challenging that. Yes, the frequent UI changes are odd, but the back-end tech is innovative and impressive. Talk about scaling: hundreds of millions of users. Daily number of writes is probably at least that. Daily number of reads is probably a couple of orders of magnitude higher. Hell, just getting all those email alerts out is impressive.
They're pragmatic: they use everything from PHP to C++ to Erlang (the billion-msg-a-day chat server), and they open-source a lot of stuff.Freedom to choose the right tool instead of the popular one: priceless.Monday, November 2, 2009
Who's A Widdle Widdle Pirate?


Sunday, November 1, 2009
The Graduate
Saturday, October 31, 2009
I Went to a Greyhound Party

We went to the GPA/Richmond picnic last Sunday. It was fun to hang out with 50 or so similarly-obsessed people and their dogs.That's Jackson (we think) running at full tilt boogie in the time trial, chasing down the infamous sonic crack game call. The radar gun clocked him at 28 mph, which actually isn't very fast for a greyhound. Jackson has lost some quicks over the last few months. He doesn't get much chance to run these days - lots of long walks, but no sprints. So we're going to move to another house, with a big backyard. And we'll set up a training run, and let Jackson chase the game call. Seriously. We're going to buy a house to make our dog happy. I don't know what to say. What the hell is happening to me?Anyway, the highpoint of the picnic for us was probably when I let Jackson get loose. He was lying in my lap, and I got sloppy with the leash, and someone squawked the game call, and off he went. Straight to the game call, a hundred yards away, where Stacy caught up with him while two guys pried the game call out of his mouth.Finally, after everything was packed up, I had to walk Jackson around and through the time trial chute, to convince him that the source of that seductive noise was gone. We aficionados call that a "strong prey drive." Sounds much better than "wants to kill small furry animals."
Sunday, October 4, 2009
Osama bin Jackson

Update your watchlists - fashionista alert! Jackson is ready for winter and waterboarding in this sleek coat and snood combo from Coats 4 Greys. The chic advisory level is code black!
Friday, October 2, 2009
Choking The Chicken



Actually, we think it's a flamingo. Not a chicken, not a pelican. My apologies for any confusion this may have caused.
Sunday, September 27, 2009
Jackson Gets Teabagged

Sunday, September 13, 2009
Saturday, September 5, 2009
Sick As A Dog
Saturday, August 29, 2009
Wet Dog Walking
Friday, August 28, 2009
What's In A Server Name?
Sunday, August 23, 2009
Cash For Chuckleheads
Friday, August 21, 2009
Poop Aesthetics

Thursday, August 20, 2009
Sunday, August 16, 2009
Road Trip
Sunday, August 9, 2009
Born To Run
Wednesday, August 5, 2009
Back On The Gravy Train
Tuesday, August 4, 2009
Jackson 1, Bob 0
Monday, August 3, 2009
Trouble In Paradise?
Sunday, August 2, 2009
Interviews 2.0
- Candidates google as they go, so feature questions like What's the difference between a HashMap and a HashTable? have almost no value. All you're testing is how quickly and quietly the candidate can type.
- Candidates have found a quasi-ethical way to embellish their resumes: describe a project in detail, but don't say which pieces you worked on. List every tool/technology used in the project, whether or not you were the one using it.Of course, this is pretty easy to blow apart. I've gotten some amusing explanations of Ajax from people who maybe used it once to clean a sink. Which brings us to...
- Don't just ask people to explain a technology. Ask them how they've used it on a project. Any candidate who answers with an accurate general description of the technology probably hasn't used it much. A candidate who can tell you what he's done with the technology, the problems he ran into, how he worked around them - he's telling you the truth. Bonus points if he gets animated while he's talking about it.
Home Alone
Saturday, August 1, 2009
The Big Brush-Off
It's A Small Greyhound World
Saturday, July 4, 2009
Another One Bites The Dust
Thursday, June 25, 2009
At Least We Knew Where Clinton Was
Friday, June 19, 2009
It's The Framework, Stupid
Sunday, March 29, 2009
Cleaner and Cleaner
{% if %}
statements in the template, I'm doing a simple list lookup in Python. Then I use one {% include d.template %}
to pull the results into the template. This Django stuff cleans up real nice.
Saturday, March 28, 2009
The Template Made Me Do It
datetime.date
objects in the context. The template for-looped through the list, and did things like
{% ifequal d.isoweekday 3 %}
All by itself, that's mildly evil - the hard-coded magic number, though I can probably remember that isoweekday() starts counting at Monday == 1. Then I started nesting the if-else tags, and things got messy quickly. The Wednesday case, the Friday case, the first-Wednesday case: frustration. I wanted Python at my fingertips, not this crippled template language. Which, of course, was the answer. I needed better abstractions for the template, and Python was the right place to create them. I subclassed
datetime.date
and added the methods I needed: is_wednesday(), is_first_wednesday(), is_friday(), is_special()
Which let me write reasonable template code like
{% if d.is_special %}
{% if d.is_first_wednesday %}
And then the surprise: I realized that fixing the messy template had also made my Python code cleaner. I ended up with a nice little app-specific date class, unit tests and everything. That was the right thing to do, but I hadn't bothered till I needed it for the template. The limitations of the template language drove the refactoring.And that makes me think that limiting the template language was a very good idea indeed.
Wednesday, March 25, 2009
The Company We Keep
Sunday, March 8, 2009
Actual Numbers Trump Vague Threats
Tuesday, March 3, 2009
Do Be Do Be Done
Friday, February 27, 2009
Republican Lies!
Tuesday, February 24, 2009
Make An Effort(s)
I wrote some simple code today: a batch job that counts the number of items in a queue, then emails the count to a couple of people. My first version sent a message like this:
There are 3 item(s) in the queue.
Then I smacked myself and dove back into the code. Now the message looks like:
There are 3 items in the queue.
or:
There is 1 item in the queue.
Maybe ten minutes to code and test, and I feel better. The item(s)
dodge is lazy, and looks so cheesy.
Friday, February 20, 2009
Lotus Domino - Sometimes Store And Forward Wins
- A customer request comes in through the web front end. (ELF handles about a dozen different kinds of requests);
- The web server stuffs the request into a Domino database;
- A batch job moves the request to a relational database.
- Web server running on one machine;
- Application server, a separate piece of software, running as a separate process on the same machine, or on another machine;
- Database server, a separate piece of software, almost certainly running on another machine.
Sunday, February 1, 2009
Clojure and MySQL, continued
I've been working through the Data Access section of the Clojure in the Wild chapter in Stuart Halloway's Programming Clojure. Here's a MySQL version of the last-created-id form:
(defn last-created-id "Extract the last created id. Must be called in a transaction that performed an insert. MySQL version." [] (:last_created_id (first (sql-query "select LAST_INSERT_ID() as last_created_id"))))
Thursday, January 29, 2009
Clojure and MySQL
Here's the magical connection incantation to get Clojure and MySQL talking:
(def *db* {:classname "com.mysql.jdbc.Driver" :subprotocol "mysql" :subname "//your-server/your-db" :user "your-user" :password "your-password"})
Assumptions - you're using
- Stephen C. Gilardi's clojure.contrib.sql library, and
- MySQL's Connector/J JDBC driver, with mysql-connector-java-5.1.7-bin.jar in your Clojure classpath.
Clojure is elegant. It's from the future, with features like support for software transactional memory. Meantime, it's a close personal friend of Java, so it plays well with more mundane tools. I get a buzz when that happens. I've flirted with lisps before, but this one feels like a keeper.
Incidentally, the Connector/J license defaults to GPL, so it may contaminate your application like ice-nine. Hail Bokonon!