Having a Ball

I met my imaginary friend Bertie in the parking lot near the Bowie Regal Cinemas. You might remember that Bertie insists that he is in "the entertainment industry." He really does that thing with his fingers when he says it, too.

He's wearing baggy shorts and a pair of Chucks. His sweatband matches the red, white and blue basketball in his hands. Throughout the conversation he'll bounce that thing from hand to hand. That wouldn't be so annoying, but I know he's going to bounce it off his foot every so often and chase the ball between the minivans and SUVs.

"I have this great idea," he tells me, flipping the ball above his head and stepping backwards. The ball sails behind him and bounces off the side panel of an Expedition. The SUV starts honking and flashing its lights.

Everyone ignores it.

"Maybe we should do this somewhere else?" I suggest. "Or maybe put the ball away?"

"Nonsense," he says, after retrieving the ball from under a Hummer. The hood is about the same height as he is. "I like to have a prop when explaining my plans."

"What does a basketball have to do with barbeque joints?" I bite.

"What? Oh. You've already grown bored with that idea. I've moved on."

He tries to spin the ball on the tip of his finger, but when he slaps the ball to spin it, the ball smacks him in the face, knocking his glasses to the pavement. I grab the ball before it finds the Mini. Poor thing looks lost between two XUVs.

"I don't think you'll make a lot of money suing the movie theater for injuring yourself in their parking lot," I tell him and hand back the ball. He smiles disdainfully.

"I was listening to NPR yesterday," he says, a seeming non sequitur. This surprises me.

"You were? I thought you only listened to that UFO guy."

"He's only on in the middle of the night," Bertie replies. "You know, I can be as sophisticated as you. Besides," he looks around furtively, "that Sue Scott. Her voice makes me buzz."

I don't want to know about Bertie buzzing, so I ask what he heard on NPR. He displays the basketball.

"It's that tournament," he explains. "They said it grosses like a billion dollars. That a nice piece of change. I think I deserve my cut."

"You going to hawk peanuts?" I ask.

"You wound me, sir," he says in his fake British accent. "To think that I'd have so little ambition as that. No, I'm going to try out for one of the teams. I haven't decided between the Tennessee Terps and the Syracuse Cavaliers."

"Um, you're a wee bit old to be a student," I remind him.

"That's what I expect them to say."

I fail to see the value in that, and tell him so.

"It is common knowledge," he tells me in his best talking-to-a-four-year-old voice, "that the NCAA is not concerned about the academic achievement of its atheletes. If they were, they wouldn't be traveling all over the country during the school week. In my lawsuit, I'll press the case that the NCAA is a business entity that not only has discriminatory hiring practices (particularly with regard to height and age), it also illegally denies the workers the ability to organize a union."

"A union?"

"Yes. Who can deny that an enterprise that collects a billion dollars off the efforts of an unpaid workforce is not violating the law and several human rights conventions? I'll be rich."

"Well, as long as you have the best of motives," I say.

"Exactly."

"You're not worried that they might be able to suggest that you weren't hired because of your lack of skill?" I ask after he bounces the ball off his Chucks for the fifth time.

"Nah," he says. "I have a backup play, any way. I'll learn the violin, join an orchestra, and sue for my pay to be linked to the number of notes I play."

"That'll never work," I say. He flips the ball in the air and we watch in horror as it flies to the hood of a Mercedes. It bangs a dent into the hood and sets of the honking and flashing.

"Fly, you fools!" Bertie cries.

And we run.

More Punctuation

No Subtitle

I suppose that the misapplication of commas can be more confusing than mistakes with apostrophes.

ClearQuest Tic-Tac_Toe: Start

Irrational Use of Rational Tools

Last time, we looked at creating a game. When a game is in the state of created, we know that a game exists, but we're waiting for players to accept the challenge and actually start the game. The action of start will put our game into the state of XTURN; i.e., waiting for X to move.

In order to move to X's turn, we want to be sure that we have a player for X and a player for O, so we set these as mandatory fields for the state of XTURN. We still want all the spaces to be read only. Other than that, this action and state is pretty straightforward.

When we move on to X taking his/her turn, then we have to look at two things. First, we want to make sure that the person taking the X turn is the player identified by the Player X field. We'll look at that later because implementing this restriction makes it harder to test while we're developing.

Second, we make the space fields available to use. We've made each of these fields a drop-down. To make it easy, we will restrict the values of the drop-down list to the first letter in the turn (X or O). We'll create a global script called ttt_AvailableChoice. This analyzes the action and supplies an appropriate letter (if it's a turn). This script is called by applying a script in the field table in the Choice List column with "choices.AddItem(ttt_AvailableChoice(GetActionName,fieldname))".

The global script could look like (in VB):

Function ttt_AvailableChoice(myActionName,myFieldName)
  • ' only Player_X can put an X
  • ' only Player_O can put an O
  • ' if a value is already there, then keep it!
  • ttt_AvailableChoice=GetFieldOriginalValue(myFieldName).GetValue()
  • ' Otherwise, let's go!
  • Dim myChoice
  • myChoice = left(myActionName,1)
  • if myChoice = "X" or myChoice = "O" Then
    • If GetFieldOriginalValue(myFieldName).GetValue() = "" Then
      • ttt_AvailableChoice=myChoice
    • End If
  • End if
End Function

When we play with this for a while, we see that we'll want the user to only be allowed to put down a single "X" or "O" each time, right? To do this, we can add a validation script to the xturn and oturn actions. This is placed in the Action table under validation. Validation scripts will stop the action and pop up an error message if the script returns a nonzero value. The script might look like:

Function tictacgame_Validation(actionname, actiontype)
  • ' Check to make sure that one and only one mark made
  • Dim mySpaceCount
  • mySpaceCount = ttt_NumberChangedSpaces()
  • if mySpaceCount < 1 Then
    • tictacgame_Validation = VbNewLine & "You have to make a move!"
  • Elseif mySpaceCount > 1 then
    • tictacgame_Validation = vbNewLine & "You can only make one move at a time!"
  • End If

Oh, the ttt_NumberChangedSpaces() script looks like this, because we only care how many fields on the actual board were changed. The names of these fields are all of the form Space__.

Function ttt_NumberChangedSpaces
  • ' Space fields start as "Space_"
  • Dim fieldList,fieldname,space_count
  • space_count = 0
  • fieldList = GetFieldsUpdatedThisAction
    • For each fieldname in fieldList
      • If left(fieldname.GetName,6) = "Space_" then
        • space_count=space_count+1
      • End If
    • Next
  • ttt_NumberChangedSpaces = space_count
End Function

If you haven't tested by now, this would be a great time to start walking through the actions to verify that everything works as expected and to start reviewing decisions we've made.

Gentle Ribbing

Must be BBQ week. We stopped by Laurel's Red, Hot and Blue joint this week for the first time since we returned to the States. One of the few food choices unavailable in Scotland was bar-b-que. RH&B didn't disappoint us with service: it remains the fastest sit-down restaurant I can think of. But the sauce was just not as good as we remembered.

Perhaps we've been stolen away by the choices at Tony Roma's. All four of Tony's sauces are delicious. This almost makes up for the fact that the chicken is not really cooked as well as at RH&B. Ah, well, we can't all be C King in his converted smoker truck on Route 1.

In Bowie, at least, we'll have another choice soon. Smokey Bones is moving into the old Don Pablos site. As the web site says:

For some reason that old smoker produced some of the best-tasting, most succulent, deep-smoked BBQ that anyone had ever eaten.
I'm sorry, how is that different from Tony Roma's, a restaurant that is no more than 25 feet away? What goes through these people's heads? The Brunette suggests that Bowie is trying to create an alternative to China Town: Rib World!

Not half a block from Chipotle in College Park, they've opened a California Burrito!

I guess it works for Burger King and McDonald's.

Maybe just one mouse click over, you'll find that new blog I've been hearing about "Trading Stories," or some such.

Aw, man, that's a boring post. Re-write later as a story with my imaginary friend Bertie.

Apostrophes

While other people might worry about commas, what has really been driving me insane lately has been the increasing misuse and abuse of apostrophes.

I can take a few typos turning its mistakenly into it's. And while it raises my hackles, the use of 1970's instead of 1970s has always been a troublesome issue. Lately, however, I've started to see the insertion of apostrophes in pluralized acronyms, like in WMD's or ICU's. This is wrong. I've heard that our language is dynamic and growing, but if we cannot agree to a common set of symbols with which to communicate, then we will be lost in misunderstanding.

And just this week, the Washington Post Express had an advertisement. Come on down and buy some "Town Car's" and other "Lincoln's". Arrrrrrrrrrrgh.

Breakfast at the New Deal Cafe

A Bike Trip: 12 mile loop

Broke out the bicycle and jaunted up to the New Deal for breakfast this morning. After breakfast, I hooked through Beltsville to stop by MOM to pick up groceries (pineapple rings, bread, lunch "meat"; they're out of apple rings). Overall, a nice ride. MOM to home was a breezy 5 miles or less, flat all the way.

Out: College Park, Lakes Artemisia & Greenbelt, Old Greenbelt

  • Rhode Island backstreets. The Rhode Island street "segments" are flat and it's a residential ride up to Paint Branch Parkway. Cross that and a trail links over to Lake Artemisia.
  • Lake Artemisia.
    • The Metro underpass was flooded, as were parts of the path around the south and east sides of the lake.
    • Quite a few soldiers with full camouflage and packs
  • More residential streets
    • I thought this packet east of Lake Artemisia was called College Park Woods, but I seem to be wrong about that.
    • Coming up from the lake along Vasser and Bryn Mawr involves a large hill.
    • Before having breakfast, the slopes of Edmonston are a bit much to take, too.
  • Kenilworth Avenue is nice and smooth. Some folks might not like the traffic, but the wide shoulders are worth the hassle. Watch out for the exits at 193 and 495.
  • Greenbelt Lake is lovely, but the path is fine gravel. I might stick to the roads next time
  • Old Greenbelt: For a town as environmental as Greenbelt, you'd think there'd be more parking spaces for bicycles. All I could find was a rack at the bank edge of the complex (and big signs saying bikers keep out of the rest of the area).
In: Old Greenbelt, Beltsville, College Park

  • Kenilworth Ave: Rode north into the agricultural research center. The shoulder quickly degrades and even disappears at one small bridge.
  • Sunnyside Ave: a short relatively newly-paved road over the railroad tracks
  • Rhode Island Avenue
  • College Park Trolley Trail: This is very nice. Broad and smooth.
  • Rhode Island backstreets: Although we have some bits of pavement along the old trolley right-of-way south of Paint Branch Parkway, they are not suitable for bicycle riding.
    • They are poorly maintained and not even as wide as a standard sidewalk.
    • Riding bicycles on this pathway is dangerous to pedestrians and dogs that frequent it and to riders who must constantly avoid telephone poles and low-hanging tree limbs.
    • Unfortunately, the quickest alternative is riding the wrong way on one-way streets.
    • I know there's a plan to extend the new Trolley Path down to Albion. It'd be realllllllllly nice if they also paved the goat trail from Albion down to the shops at Riverdale station.
I didn't realize that Greenbelt's Roosevelt Center was not owned by the City of Greenbelt until I read this pdf. The best suggestion is on page 18:
Kiosks playing classical music with signage and areas for advertising would be an added attraction for the Center. It would profide the customer with directions to various stores, an idea of other goods and services available, and the music selection might work to drive some of the less desirable loiterers away from the Center.
Emphasis added. Someday, this will be known as the Noriega Approach.

The Days Go By So Slow, But The Years Just Fly Right Past

As is usually the case when the Brunette is away, I lost the focus of life. I drifted from inaction to inaction and finally found myself hungry. Whenever I am hungry and unfocused, I forget not to go to Wendy's.

As I skipped up to the door to get my tasty double with cheese (gone are the days when I could scarf down a whole triple), I paused to smell for the fries. The smell isn't as intoxicating as from McDonald's, but since we're boycotting them, it would have to do.

Inside the door, I joined the line behind a rather elderly man leaning on a cane. The woman in front of him was leaning on the wall. Everyone in line was leaning on something. Perhaps they've been here some time, I thought to myself.

"Is Bush still president?" the gentleman asks me. I chuckle appreciatively at the joke. Wendy's was always slow. But he continues, "I don't like his chances against that Clinton guy."

"Madison! Madison!" yells the woman in front of him. "You get back in line this instant. Stop bothering people." I can't see the little girl around the wall. She apparently doesn't answer very well. The mother tried to reason with her daughter, but with no change in volume: "Madison! Don't you remember we discussed this before we came into the restaurant? Do you really want to be embarrassing your mother like this?"

I suspected that she did.

As the woman tapped her foot waiting for wee Madison to return to the line ("NOW, and I mean it!"), the man in front of her toppled to his left.

"Ohmigosh," I said. "Does anyone know CPR?"

"Shush," said the old man. "Can't you see this moves us up a bit?"

Finally, Madison returned to her mother. She was obviously at least 18, but still dressed (barely) in the remains of a ten-year-old's dress. I think it had a Care Bear on it.

I went back to my car, drove home, and made a sandwich.

Kristin Lavransdatter (Undset) & The Most of PG Wodehouse

"Well, that's a sad picture," I say, looking out the window.

"What is?" the Brunette asks.

"Young Jimmy from down the street is sitting on the stoop of our shed. I think he might be crying."

She joins me at the window. "I don't see anyone out there, honey."

"You never see wee Jeffrey," I say, and it's completely true. She never sees these shadows of my imagination. "I think he might catch cold in that rain."

"The sun is shining, dear," the Brunette says as she leaves the window. "Sometimes, I worry about you."

"Only sometimes?" I ask. I turn back to the window. "Maybe I should go out and talk to him."

"Don't forget your umbrella," she says, knowing full-well that two years of living in Scotland have hardened me to a little light rain. I walk over to where Tommy sits. He usually wears his orange and black baseball cap backwards, but he has turned it right-way-around, probably to keep the rain out of his eyes.

"You look sad there, lad," I say. "And I know exactly why."

"Oh, really?" he says, just on the edge of sarcasm. He's very nearly a teenager. He continues to stare at his shoes. (They're not quite as cool as my orange Chucks, but what can he do?)

"Of course. You're dealing with the ghosts of the past; I feel it, too." This gets him to look up. Sure enough, his eyes are glistening a bit, and I don't think it's from the rain (though Timmy won't be happy I'm telling you this). "You're thinking: if Joe Gibbs can come back for the Redskins, then why can't Earl Weaver come back to the Orioles?"

Jeb goes back to looking at his shoes. I start to pat his head, but think better of it. He does not need that kind of patronizing gesture.

"The thing is," I continue, "Earl Weaver tried to come back, and it just didn't take. I don't think these things often work, especially when you most want them to."

"It isn't that," Jeremy says. "I'm not even really sure who Earl Weaver is."

I have to sit down.

"It's these books I've been reading," he continues. "All these characters live in the middle ages and are guilty and sad and everybody dies."

"You've been reading that series by Sigrid Undset about Kristin Lavransdatter, haven't you?" I ask. (It's translated by Tiina Nunnally.)

He nods. "Just the first two, The Wreath and The Wife. Seems like nobody is happy."

"I think that just must be what the Nordic countries are like," I respond. "Why, when I went to Sweden once, the sun never even came up."

"It seems to me that Kristin could be happy if she could just get over her mistakes, you know?"

"Oh, certainly. And maybe if we read The Cross, the final book, we'll see that Sigrid was trying to get us to understand grace and our need to accept it."

"Seems like a pretty big risk, though," Joe says. "I think I might just give up on books altogether if I have to read another depressing saga like the first two."

"Oh, don't give up on books, yet," I say hurriedly. "Why don't you try something lighter like P.G. Wodehouse? I'll let you borrow my copy of The Most of P.G. Wodehouse, if you like. Much of it was written back in the 'teens and 'twenties, just like the Kristin Lavransdatter books."

"I don't know," he starts.

"Oh, sure, it's chock full of good things happening and people being happy. Like this:"

Ever since he had been trodden on by Mrs. Steptoe the Alsatian had been thinking things over and trying to fix the responsibility. It had now become plain to him that all the evidence pointed to the cat. He had never liked the cat. He had disapproved all along of admitting her to the library. But he had been prepared to tolerate her presence, provided she started no phonus-bolonus. This, by hypnotizing women into treading on his sore foot and smiling superciliously after it had occurred, she had done, and it was time, he felt, to act.

The cat, at the moment when he reached this decision, was still on top of Mr. Steptoe's head. It was consequently with something of a shock that the latter, whose attention had been riveted on his wife and Mrs. Chavender, became aware that a dog whom he had never liked was leaping up and scrabbling at his face...Nature had bestowed upon Howard Steptoe one gift of which he was modestly proud -- his right uppercut. In the days when he had battled among the pork-and-beaners he had too often been restricted in its use by the evasiveness of his opponetns; but now, at last, confronted by an antagonist who seemed willing to mix it, he was able to express himself. There was a dull, chunky sound, and the Alsatian, flying through the air, descended on an occasional table covered with china. Picking himself up, he sat surrounded by the debris, like Marius among the ruins of Carthage, and began licking himself. As far as the Alsatian was concerned the war was over.

"It's true that P.G. has his moments," he says. "But I have to say I can't really read too much of him at once."

"It's a bit like candy that way," I admit.

"And Kristin Lavransdatter is more like a real meal," Jack says slowly. "There's a lot of depth to what's happening with the characters. Some of them actually change, or at least learn something from their mistakes. And there's so much historical detail."

"True enough," I respond. "But they're not very funny."

"I think I'll read it anyway. Not everything needs to be funny," he tells me and stands up. I look up at him. Now I'm a bit sad.

"Really? Why not?" I ask.

"Come on now, don't be sad." He pats me on the head. "Don't worry, maybe the first baseman will come back."

"You've heard of Boog Powell?" I say.

"No, I meant Rafiel Palmeiro. Did Boog Powell play baseball before making ribs?" He runs off.

But he leaves the rain behind.

Help for Our Cities

Angels in the Attic

If it can work for a zoo, why can't we get some cute little tyke to suggest everyone send a dollar into DC to fix the water pipes?

ClearQuest Tic-Tac-Toe: First Action

Irrational Use of Rational Tools

OK! Two-for-one night!

Now that we have some fields and an initial action/state matrix, let's get started on the first action.

Actions have type. That is, some actions can be set to modify the data without changing the state. Other actions might be set to allow data to change and to modify the state. There is a special action type of "submit". This is the action that allows for the creation of a new instance of a record, in our case this means the creation of a new game.

When submitting a record, several things happen. First a number is reserved in the database. The submit action will also bring up (if it exists) the special submit form that you have designed. In addition, any field you set to have a default value will be set at this point. Sometimes, we create a field for capturing the record creation data and set a hook to the field's default to insert the current date. As far as defaults go, my thought was that a person might create a game, but not yet know who the players are, so the first step is just to create a game, the game could then be modified until somebody selected the "Start Game" action. We could make the X player default to the creator of the game, but that hardly seems fair, so no default values.

After deciding on default values, we have to think about whether we want fields to be writeable, readonly or required. This setting is associated with the state the record will be in when the action is done. Our first action puts us into the state we've called created, so all of our decisions about fields will be made on the "Behaviors" table in the created column.

We can't actually play the game yet. We don't want the game to start until the two players have been selected and the action of "Start Game" is selected. Therefore, all of the board's space fields must have their behaviour modified so that they are READONLY in the created state.

Until the game begins, the only real thing that can be done is modify player names. I want to make sure that some user doesn't come along and try to play both sides to up his status in the game, so let's require that Player X does not equal Player O. We'll do that with a validation hook on the two fields. The (VB) code might look like this:

Function player_x_Validation(fieldname) ' fieldname As String ' player_x_Validation As String ' record type name is TicTacGame ' field name is Player_X
  • Dim value1, value2
  • Set value1 = GetFieldValue(fieldname)
  • Set value2 = GetFieldValue("Player_O")
  • If Len(value1.GetValue()) > 0 AND value1.GetValue() = value2.GetValue() Then
    • player_x_Validation = "You cannot play yourself!"
  • End If
End Function
Returning anything in the variable that has the same name as the function (player_x_Validation) will cause the action to fail.

In fact, the validation hook only needs to be associated with one of the player fields! This is because when a field is changed, ClearQuest will run the validation hook associated with all the other fields. You don't want to do too many validation hooks, in other words, because your performance could suffer.

Next time: Starting the Game!

ClearQuest Tic-Tac-Toe: Forms

Irrational Use of Rational Tools

We continue our look into creating a tic-tac-toe game using ClearQuest. Hey, at least I'm not making a game based on some novel like The Name of the Rose.

Last time, we took an initial swipe at choosing fields to store the data. This week, we'll start our form for actually capturing the game (and data about the game).

ClearQuest allows you to create up to two forms for each record type. In our record type of TicTacToeGame, we'll start with only a single form. If you choose to create two forms, you must designate one as the "submit" form and one as the "base" form. This is useful for things like change requests because the record must start without all of the information that will eventually be gathered. For example, if we're reporting a defect, we generally won't know yet what date it was actually fixed. By limiting the amount of data on the submit form, you can have less that might visually confuse your submitter. The rest of the actions, though, take place using the base form. If you only create one form, then it will be used for submitting and for all other record data actions.

When the design settles down enough, we'll copy that base form to a submit form and remove any data that won't be necessary (or necessarily available) at game creation. One good example of that will be the game's board itself. When you're creating a game, you won't start playing until players are chosen, so no need for the board.

The on-screen form can have multiple tabs, so that the fields and text are divided into separate regions. We'll start with a two-tab display. This picture shows both tabs. We'll put the game board all on one tab. As you can see, the spaces are represented as drop-down lists. Normally, this would indicate that the fields were created as a REFERENCE type or with a list type chosen in the Choice List. However, we're going to do something fun here later and create a script to generate the selections. The other information on this page is the player names. We dragged over a static text control for each of these and linked it to the player fields. When a player is selected on the front tab, his or her name shows up here to indicate who's X and who's O.

On the front tab, we're putting all the player information. The player ids are drop-down lists because we're using the REFERENCE type here, linked to the record type of USER. The top two fields are static text controls associated with the game ID and the state. For this game, it is O's turn. This history box is the standard history field type that generally comes with ClearQuest. It shows when ClearQuest actions have been performed, whether they changed state, and who performed the actions. We might want to create our own style later for this, too.

Now that we've got a basic structure down, we'll want to logically walk through the state matrix and see what kinds of things we want to allow or to even force to happen. We'll set requirements on particular fields, develop the logic of the tic-tac-toe game, and write several hooks (scripts). No doubt, we'll also decide on extra fields we need and make changes to the form. As with all development, I think it's good to perform the steps iteratively. We'll build a little, test a little. In fact, keep in mind that rolling out any toolset should be done with proper planning and design, just like a software development process. When you start thinking about implementing ClearQuest or ClearCase (or almost any other support tool, for that matter), start with gathering stakeholder requirements (who wants the information?) and begin to design your process (how will they get the info? what will they do with it?). Process engineers who refuse to follow a process when implementing a process are setting a bad example in the process. Enough said.

Next time is where it gets interesting. Don't hesitate to offer suggestions or comments.

Marriage: A Bit of Election-Day Politics

Because it is election day here in Maryland, I'm going to let myself speak some politics. No, I'm not going to rail against the Democrats who want to beat Bush so much that they think they need to pick someone just like him to enter the ring.

Instead, I'm going to just suggest that it's time for the State to get out of church dealings. It's time for us to admit that marriage is a religious activity and should not be regulated by the State. It's time for the State to stop issuing marriage licenses. I realise this means we're gonna have to re-write an awful lot of law regarding inheritance and other rights, but we can do it. Just think: it'll keep the government so busy it won't have time to beat up on the rest of the world.

Catching a Train of Thought

  • Why does it drive me nuts that the drivers insist on pronouncing it "judicuary square"?
  • Why do bus transfers have to be grabbed at the source station? Since the machines for giving them out are inside the pay-gates, to get one even at the end station would mean I've paid Metro money, right?
  • I forgot to tell you this one: in early February, I was waiting on the College Park station platform. On a bench in one of the plexi-glass pavilions lay a neglected bouquet of flowers. They had been there some time; a few petals were browning and more had fallen to the ground. Touching. Did someone forget them? Did someone refuse them?
  • It's been awfully crowded, and Metro knows it! While other transport systems are denying they have a problem with overcrowding, our DC Metro system is embracing the problem. "If you think it's crowded now, just wait!" shouts the signage. Where's the "If you're a little worried about terrorism now, just wait!" sign?
Does this sound familiar? You leave the house for work in the morning. You walk to a bus stop and climb aboard a standing-room-only bus. At the Metro station, you wait on a crowded platform and squeeze into a packed train.

You know it’s bad. We know it’s bad. But it’s only going to get worse, unless we all do something about it.