Monday, December 13, 2010

Catfight

We've been in the new house for about a week. It's going well. Jackson loves chasing squeaky balls in his big new yard. He's starting to pee and poop there without too much pleading on our parts. He seems to like Gus, the pit mix next door. And the sidewalks of Bellevue are filled with dog walkers, so he, and we, enjoy the walks.

A couple of nights ago, I took Jackson into the yard late at night, for a bedtime pee. Suddenly he stiffened up. I pointed my flashlight where he was looking - a cat! A big tabby, in our yard, frozen in place.

Jackson was maybe 50 feet from the cat. I was at the halfway point between them. I should have gone to Jackson and brought him back into the house. Instead, I rushed the cat, figuring it would flee. It did. But as soon as it started moving, Jackson took off like Wile E. Coyote out of a cannon.

There's a wooden wall around the trash cans in the back of our yard. The cat ran to it and jumped up on the cans. Jackson got there a half-second later. The cat hissed. Jackson lunged at it.

No harm, no foul. I figured the cat would jump down behind the trash cans, ending up safely outside the yard. Instead, it decided to run all the way across the yard to the front gate. Jackson flew after it. I called him, but it had no effect, like trying to reason with a Glenn Beck fan. The cat escaped under the gate a step ahead of Jackson.

I'm hoping the cat decides our yard is now off-limits. I figure that, given more tries, Jackson will only get better at this. And, down the line, when we get the second dog...oy. Not a good place to be a cat.

Tuesday, November 16, 2010

City Life

Media_http3bpblogspot_tbsja

As Yogi said, it gets late early out there. About six o' clock this evening, Jackson and I were walking down a dark street alongside the highway. As we neared the corner, I saw a couple of young guys across the street doing something at the back of a van. Maybe something sketchy. My internal alarms starting ringing. I had a few seconds to decide whether I should cross normally, turn the corner and avoid them, or maybe even grab my phone and report a vehicle break-in.

I decided they were unpacking the van, nothing more, nothing wrong. We crossed over to them. I said hi as we passed. They said hi back. A few seconds later, one of them said "Cool dog." I said thanks as we walked away.

We were maybe 50 feet away when one of them yelled, "You want some dog food?" He explained that he and his friend worked in an organic dogfood factory, that they got all kinds of free samples, that they would be happy to give us some.

By this time, we were all standing together, and they were loving Jackson up. From his reaction, they were good with dogs, and that dogfood factory smell probably didn't hurt.

I passed on the dogfood, because Jackson can react badly to changes in diet. But we got a consolation prize. One guy went into his house and came back out with a remarkable goodie box: kangaroo chews, shark cartilage (outdoors only, because it makes a mess), cow bones stuffed with sweet potato, and some sweet potato chips. Jackson scored a little chip right away in return for his one trick, a sit. The walk home was a more-or-less continuous clumsy dance as I tried to keep him away from the rest of the box.

These generous guys work for Best Bully's Bully Sticks. Go spend all your money there ASAP.

Saturday, November 13, 2010

Doghouse Update

We closed on the new house about a week ago. Renovations underway: we're taking out bushes to open up more space in the yard, and putting up a serious fence.

We've been taking Jackson to the new house for a few hours here and there, and walking him in the new neighborhood (very dog-friendly). Two days ago, in our backyard, Jackson met Gus, the pit mix next door. Pals at first sniff. They played from opposite sides of the chain link fence, bowing and running. Jackson was as excited as we've ever seen him with another dog. Yesterday, Jackson got his first taste of "Chase The Squeaky Ball" - his favorite game - in the new yard. He loved it. Room to run!

Friday, October 8, 2010

Rage and Chips

Last night, around 9:30, I took Jackson out for his late walk. He started in the bushes alongside our front steps, sniffing around for a few seconds. While he was sniffing, I heard a couple of guys and a dog coming down the sidewalk towards us. I couldn't see them, but the dog's tags were shaking very quickly, too quickly for the usual walking pace. I thought maybe the dog was off leash.

Sure enough, as soon as I could see them and yell, "Leash it!" the off-leash dog saw Jackson and came running. It was a young dog, and it wasn't attacking. But it ran right through my "No!" up onto our steps, and stopped right next to Jackson. By that time, the two guys had appeared. The owner said "Sorry" and got his dog down off the steps. He didn't leash it, though, and it went running off.

"Leash laws, please," I said. "Sure, man," the owner said as he walked away. He said it in that hipster/punk dialect where "sure" is a synonym for "fuck you," and he did nothing to leash his dog.

I snapped. I started walking towards him. In my finest Brooklyn gutturals, I said, "Hey, asshole, I'm talking to you." He immediately called his dog to him, leashed it, and crossed the street. (In my defense, I had been watching Sons of Anarchy before the walk. It gets me all revved up.)

Back home, around midnight, upstairs in my office, I heard a sound - something coming through our front-door mail slot. I went downstairs. There on the floor were four Pringles-style potato chips. It could be a coincidence, but Occam's Razor says reprisal. Or a peace offering for Jackson? Dogshit would have been a clear message, as would a dog biscuit. But four potato chips? The semiotics elude me.

Tuesday, September 21, 2010

In The Doghouse. Maybe.

We made an offer on a house. Good walking neighborhood, suitable for eventual one-story living, and a nice big yard. Plenty of room for a greyhound or three to keep busy.

To be continued...

Saturday, September 4, 2010

You Two Have So Much To Talk About

Occasionally, when Jackson is out for a walk, we cross paths with greyhounds we don't know. This triggers thirty seconds of joyous tail-wagging, butt-sniffing breed recognition: "You're like me!" "Yes, and you're like me!" "Yes, yes, and look, you're like me!" "I know, and you're just like me!"

Then, abruptly, the canine conversation stops. Whilst we owners chat about all things grey for a solid five minutes, both dogs stand like statues, staring off in opposite directions: an awkward silence, with nothing left to say.

Of course the same thing happens when two IT professionals meet at a party. Well, maybe a little less butt sniffing.

Thursday, July 29, 2010

pork dogs

Last night, I gave Jackson some pizza. Not the usual "pizza bones" crust he loves - this time, I gave him the real deal. I slid a slice's worth of cheese, meatballs, and sausage into his bowl, and he vacuumed it down.

Today, Stacy told a friend about it, and the friend was concerned. She said that any form of pork is extremely dangerous for dogs, and that Jackson could get really sick.

I was skeptical. After all, we've got a big bag of pig ear dog treats that come from, uh, pigs. Jackson loves them, and he's been working them for a few weeks now. So I asked Dr. Google about pork dogs. And the first hit explains it all: raw pork is dangerous for dogs, as it is for humans. Properly cooked, pork is fine for all of us.

And I'm so glad that the first hit under "pork dogs" is not a porn site.

Saturday, July 24, 2010

On the Scooping of Poop

We live in the city, and we have a small backyard. So we walk Jackson along the sidewalks and alleys of our neighborhood. Early and late, rain and shine, heatwave and blizzard, we're out there. Which is one of the reasons we're looking for a house with a big yard, where "walking the dog" means opening a door. And you can even pay people to come scoop the poop! What a great country.

But, until we find that house, we walk, and we scoop. Unfortunately, Jackson's poops are not particularly scoopable. Once in a great while, he drops a few turds that are hard and well-formed and would probably work as an alternative building material. But his normal output ranges from soft-and-shapely to puddle-of-pudding. On a long multi-poop walk, solidity goes down as distance goes up. The last poop often looks like he gave a good hard squeeze on a tube of cake frosting. [1]

Media_http4bpblogspot_ggcdd

The drop zones vary quite a bit, too. Sometimes he's at the base of a tree, and the ground is covered with mulch - good news. Sometimes he's on a patch of trimmed grass - okay. But sometimes he's squatting over foot-high, weedy grass where the poop vanishes like a Slurpee down a deep, deep well.

Which means that the amount of poop we're able to scoop also varies. I'd say that we average about 90%. On mulch or gravel, we can get it all, irrespective of poop consistency. And if the turds are tight, we can get all the bricks, even in weeds. But in the worst-case combo, poop pudding in tall grass, really thorough clean-up would require garden shears and a hazmat suit. So we do the best we can with a couple of plastic bags, and we watch those real estate listings.


[1] Speaking of poop and cake frosting: many years ago, I worked in a Baskin Robbins in NYC. One day, a customer came in to order an ice cream cake. She spoke to Mary, our cake decorator. The customer said:

I want it to say "Happy Birthday Joe", and in that chocolate shit.

But what Mary heard was:

I want it to say "Happy Birthday Joe", and in that chocolate, "Shit".

Couple of days later, after work, crowded store, the customer came in to pick up her cake. Of course we showed it to her, to make sure everything was perfect. And she started screaming, "There's 'Shit' on my cake! There's 'Shit' on my cake!" One of my fondest workplace memories.

Tuesday, June 15, 2010

Ice Cream Koan

Yesterday, on Jackson's evening walk, we stopped by Meadow Park. An excellent local surf-rock band, 3rd Wave, was giving a free concert. And there was free ice cream.

I sat down on a bench and hoisted Jackson onto my lap. He tolerates that, especially when's he tired - yesterday was a classic Southern scorcher, mid-90's all day. Stacy went to get an ice cream cone. Vanilla, soft serve. She came back and took a few licks. Then she handed it to me and went off to Garnett's to pick up our dinner.

I took a few hits off the ice cream. Then I showed it to Jackson, putting it within licking distance. No chocolate, so no problem.

Still on my lap, he took a couple of licks. Then he stopped licking and started wriggling around. That's the put-me-down signal, and I complied immediately, because his thoughts were as clear as if he'd spoken them out loud: "Wow! Hey, this is important. I need to focus on this stuff I'm eating. Put me down!"

Back on terra firma, Jackson used his long tongue to good effect while I held the cone, and the ice cream vanished quickly. He was meticulous, though, about not biting the sugar cone, till I broke off a piece and gave it to him. That changed the cone from container to treat, and he absorbed it as well.

Tuesday, May 4, 2010

Ouch!

Media_http1bpblogspot_mqehh

I was out walking Jackson a little while ago. We heard and saw the neighbor lady, walking her two hyper chihuahuas, on leash. They were about 50 feet away from us.

Somehow one of the chihuahuas, Perry, got loose. He came charging at us like Jackson owed him money, barking and snarling. He was attacking.

When Perry got close, I leaned down and yelled "No!" He backed off, circled a little bit, and made another charge. I leaned down etc. Repeat three times, till Perry had circled us completely and was behind us. I seized the moment and led Jackson away. At that point, Perry lunged forward and bit me in the leg, a few inches above the ankle. Little bastard drew blood.

Fortunately, he had been to the vet for his rabies booster today - sounds unlikely, I know, but the neighbor lady had paperwork to prove it. One of those coincidences. Still, I'm inclined to report it. Perry won't get put down for the first bite, and it may make the neighbor lady more careful. I don't want the next victim to be Jackson or any other creature.

Thursday, April 8, 2010

Oy Vey

Media_http1bpblogspot_yfgwl

Richmond's Easter Parade is a big deal. Monument Avenue closes to traffic. Its grassy median turns into a street fair. Lots of people show up. When the weather is as perfect as it was last Sunday, 40,000 people come out for a stroll.

Many people wear bonnets. Many people parade their dogs. And, inevitably, some people parade their bonnet-wearing dogs.

So Stacy whipped up this little number for Jackson. Since we don't celebrate Easter, he's kicking it old school Hasid, complete with peyes.

Actually, that's the pirate hat repurposed. But don't tell Jackson - he thinks it's straight outta Brooklyn.

Saturday, March 27, 2010

Save Money! Lose Weight! Get A Dog.

We've owned our house for about three years now, and we've been through two real estate tax assessment cycles. For me, that means two assessment appeals - I'm that kind of guy.

The key to a successful appeal is good comps - recent sales of comparable houses in the area. The first year, I didn't have good comps and we lost the appeal. This year, I had solid comps, and we won. The assessment came down $25,000. That'll mean a savings of about $300 on our real estate taxes.

Why did I have better comps this year? Because of Jackson. I walk him around the neighborhood every day, so I see what's for sale. I keep track of the addresses, and, come assessment appeal time, I know where to start. Sure, you can get comps from sites like Zillow, but it's easier when you've previewed the comps yourself. Feet on the ground wins.

Which brings me to the weight loss and exercise benefits of dog ownership. I had been exercise walking for years without losing much weight. Now that I've added an hour of daily Jackson walking to the mix, the weight is coming off. It's a different kind of walking - slower, lots of stops - but it burns calories. I've dropped about 12 pounds in the nine months we've had Jackson, and I'm shaped somewhat less like a transcontinental zeppelin.

So get a dog and your life will be perfect. It's a scientific fact.

Wednesday, March 24, 2010

Using Extension Methods To Refine The SharePoint API

A .Net extension method is a method you add to a class from outside the class. The new method behaves just like an instance method of the class. The technique is different from inheritance - you don't create a subclass, you just add a method to the original class. You don't need the class source, and you can add an extension method to a sealed class. It's so smooth that your extension method shows up in Intellisense just like any other method. If this all sounds a little magical, here's the Microsoft info.
When you're working with someone else's API, extension methods are a powerful tool: hey presto, you have a seat at the table with the API designers. For example, I don't like this common SharePoint idiom for translating a list column display name to the internal name:
string internalName = lst.Fields[displayName].InternalName;
It's messy, and it punctures the list abstraction: I was working with a list, but now I have to deal with the SPFieldCollection within the list. Here's what I'd like instead:
string internalName = lst.InternalName(displayName);
And, with the right extension method, I have it:
static class SPListExt
{
    public static string InternalName(this SPList lst, string displayName)
    {
        return lst.Fields[displayName].InternalName;
    }
}
You can drop a class of extension methods right into a source file, and everything will work. But you're better off separating the class out as a class library. This involves a bunch of plumbing work. Here's a checklist:
  • One-time setup: find "gacutil.exe" on your development machine, and add its directory to your PATH environment variable. If you're in Visual Studio, exit/restart;
  • Sign the library. This makes it GAC-able. Properties » Signing. Check "Sign the assembly". For the strong name key file, use "classname.snk". Don't use a password. After the .snk file is created, drag it to the Properties folder;
  • Add a post-build event:
gacutil -i $(TargetPath)
copy $(TargetPath) "C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\PublicAssemblies"
This copies the library into the GAC, so that SharePoint can find it. (Caveat: development only! Not the right way for production deployment.) It also copies the library to PublicAssemblies, so that Visual Studio can find it when you add a reference. (If you have multiple Microsoft Visual Studio directories, try the highest-numbered one first.)
    Now you can use your extension methods class in a project like any other library. Fix that API!

    Monday, March 15, 2010

    Logging 101

    I think a decent logging infrastructure is a must-have for software development. So, when I started doing SharePoint work, I searched for the basics. The info's out there, but it's scattered. Here's what I've pulled together.

    Reading The Logs

    SharePoint 2007 writes its logs to the LOGS folder under the 12 Hive. The logs are text files in Unified Logging Service (ULS) format. The file names are servername-yyyymmdd-hhmm.log. The timestamp is the file creation time.

    The first time you look in the LOGS folder, you'll see a lot of logs - probably more than you want on a development machine. Fortunately, you can easily change that. Look at the "Throttle Logging" topic here. My log settings look like this:

    Media_http4bpblogspot_kiamy

    These settings tell SharePoint to give me as much detail as possible about the last hour, and split it across two log files.

    You can read the logs with a text editor, but that's painful. Instead, go to codeplex and search for sharepoint log viewer. You'll find all sorts of freebies. Some are stand-alone; some extend SharePoint's Central Administration site. I'm using the stand-alone SharePoint LogViewer.

    Writing To The Logs

    This works in MOSS 2007, but not in vanilla WSS: first, make sure your project has a reference to Microsoft.Office.Server - in the Add Reference dialog, browse to C:Program FilesCommon FilesMicrosoft SharedWeb Server Extensions12ISAPIMicrosoft.Office.Server.dll.

    Then you can use PortalLog.LogString() to write to the SharePoint logs:

    ...
    using Microsoft.Office.Server.Diagnostics;
    ...
    public override void ItemAdded(SPItemEventProperties properties)
    {
       string thisClass = this.GetType().Name;
       PortalLog.LogString(thisClass + ": this works");
       PortalLog.LogString("{0}: this works too", thisClass);
       PortalLog.LogString("{0}: and this {1} works",
           new string[] {thisClass, "also"});
    }
    ...
    

    You can use LogViewer to verify that the logging is working. Starting each message with the class name makes it easy to filter:


    Media_http4bpblogspot_ybdcj


    A couple of caveats:

    Officially, PortalLog.LogString() is Microsoft-internal and "not intended to be used directly from your code." This doesn't seem to be stopping anybody.

    In some cases, you may also want to write to the Windows Event Log, even if this means you're double-logging. Some organizations have automated monitoring software that scans the Event Log. If it notices your SharePoint application error message ASAP, that's a good thing.

    Monday, January 11, 2010

    Pack Politics

    This past weekend, our BFF Jim visited from NYC for a few days. The weekend was an enduro of food and drink: Jim came in Thursday evening and we had dinner at Garnett's. Friday, we met some other friends for a long debauched lunch at Can Can. Saturday, we had lunch at Sticky Rice. Saturday night, we saw another fine Bill Kirchen show at Shenanigans. Sunday, we did brunch at Caliente, then took Jim to the airport.

    And Jackson? He got all his walks, and lots of morning couch time with us, and treats whenever we went out. But we were certainly away from him more often than usual, and for longer stretches of time.

    Jim stayed in our guestroom, second floor back, a room that we're almost never in. As a result, Jackson is almost never in it, either. I don't think he's been in it a dozen times, and never for more than a few minutes.

    But he was in it this afternoon. When we came home from the airport, I took Jackson right out for a walk. Stacy headed upstairs to tidy up the guestroom.

    Where she found a poop! Jackson has never even peed in the house before, but there was a nice big poop in the guestroom, next to the bed. (We checked with Jim. He says it's not his, and we believe him.)

    Stacy was upset when she saw the poop. She thought it might signal the start of trouble - Jackson's been giving us some other minor difficulties lately. But when Jackson and I got home from the walk and Stacy told me, I started laughing. I think I understand Jackson's point of view, and it makes a lot of sense:

    A new pack member came walking into Jackson's nice, secure world. We started spending lots of time with this new guy, leaving Jackson behind while the rest of us went out. And, even when we were home, the new guy got special treatment, sitting at the table and eating with us. No kibble for him. And it wasn't temporary - the new guy was there every morning, every damn day.

    What the fuck? Jackson was ticked off. He needed to send a message, pronto, before the new guy settled in for good.

    So he shat in Jim's crate. Take that, new guy. And don't let the doggie door hit you in the ass on the way out.

    Given Jackson's limited vocabulary, I think he was remarkably eloquent. And, since he picked the afternoon of Jim's departure to nail the ninety-five feces, he's going to get incredibly strong reinforcement: Jackson poops, and Jim disappears.

    Stacy's feeling better now. We're optimistic that this was a one-off, not the start of a problem. And I'm still laughing. Hey, I love poop jokes, and Jackson really knows how to tell them.