Stefan White, 1998-2013

Our oldest cat, Stefan, died this morning. It was sudden. Yesterday he was outside, lying in the grass, happy as can be. This morning, he woke us up at 4:30, yowling over and over. We got him to the emergency vet, and probably within five or ten minutes of us getting there, he was gone. The vet said it was probably a stroke.

We got him the second year we were married. The small company I was working for hit some rough times, and we had to move into a smaller apartment — but one that allowed cats. When we went to the shelter, they showed us the cats that were up for adoption, and told us they had one more in the playroom, drying off; he’d just had a bath. We asked to see him, and this little gray tabby jumped, soaking wet and purring up a storm, into Jennie’s arms. She called me over, and he walked out onto my outstretched arm, and perched there and purred. So it wasn’t like we had much choice; he picked us. He was about a year old then, lean and rangy enough to balance on my arm.

We couldn’t take him home that day (I don’t remember why), so they put him back in the playroom. The door was one of those with a tall, narrow window up high; and Stefan jumped up, hung by his claws from the bottom of the window, and meowed piteously. It was hard to leave him.

He was always a purr-motor. Scratch him behind the ears for a few seconds and he’d purr for five or ten minutes. Walk past him in the hallway and he’d start purring. And he would come and curl up with us and purr and purr and purr.

He used to play fetch. Jennie would throw her necklace, and he would tear off after it and bring it back. He’d have the chain in his mouth, dragging the necklace behind him. He would lay his ears down sideways as he dragged it, kind of like we might make a funny face if we were carrying something heavy. One time he jumped down off the second-floor landing to chase the necklace. He was fine, but we were a little more careful where we threw it after that.

That apartment had a shared laundry area, and we would let Stefan out to prowl the hallways when we did laundry. He loved to explore. More than once, he wandered into a neighbor’s apartment to make friends.

Later, we moved to a rental house with an unfinished basement — more of a cave, really; the ceiling was only about five feet high, so it was no good for anything except maybe storage. We used to let him prowl down there, and he’d come back with cobwebs in his whiskers and ears. One night he woke us up with a gift of half a dead mouse. We kept the basement shut after that.

We had a cable guy over one time, and he tried to put a tool back in his toolbelt, only to find that Stefan had curled up in that pouch. Stefan just looked up at him like, “What?”

One time a neighborhood cat got into our screened-in porch, and Stefan was very interested, curious, sniffing at this other cat. The other cat just hissed at him, but Stefan kept on sniffing and trying to be friends. That’s when I realized Stefan was lonely; Jennie and I were both working full-time, and Stefan missed our company. So we went to get him a little brother, and brought home a little orange puff-ball we named Tycho. But unlike the neighborhood cat, this time Stefan was having none of it. We had to keep one of them upstairs and one downstairs, and there was no door in the doorway to the second floor; we had to lean a mattress against the doorway to block it off. (Later they did warm to each other — they would curl up together to nap, or get into fights over who got to give who a bath.)

After we moved to Omaha, and Noel adopted us, Stefan and Noel did not get along; they would fight all the time. That is, until they were on top of the fridge (fighting) and both fell behind it, and were stuck there. This was our spare fridge in the spare bedroom (so at least they fell onto carpet) and we had to move some furniture around to get them out, which included moving books off bookshelves, so it took us a while. But evidently the time in close quarters did them some good; they got along much better after that.

The first time we took him to the vet in Omaha, when the vet came into the exam room, Stefan purred and hissed at the same time, while he twirled lovingly around her legs. She laughed and called him a twit.

After we bought a house, we started letting the cats out to enjoy the weather in the back yard. Stefan liked to eat grass, and then would usually come back inside and throw it back up (generally on the carpet, naturally). But he loved being outside; he would lie there, basking in the sun, or else sitting under the tree, listening to the birds, his nose twitching at everything there was to smell.

Jennie’s computer used to be on the floor of her office, and he would come and curl up on the floor between her and the keyboard, purring mightily. She would play music on the computer, and whenever “Who Will Shoe My Pretty Foot?” came on, she would sing along and tickle his feet, and he would grumble and pull his feet away and keep right on purring.

He went to the vet for a checkup last Thursday. He’s been overweight for years now, and he had bladder stones a few months ago, so they did an ultrasound on him to check on his heart and his bladder. They gave him a clean bill of health. They also removed some teeth that had been giving him trouble. Whatever anesthetic they gave him, it must have been good stuff, because after we got him home, he purred nonstop for the rest of the day.

Just yesterday, he was lying out in the grass, happy as could be.

The vet this morning said there was nothing we could have done. It sucks that he had to be in pain and scared, but at least it wasn’t for long.

Goodbye, Stefan. We’ll miss you terribly.

Interesting times

I keep thinking I should blog about events in my life, so I can look back later and say, “When did that happen?” Maybe nobody but me will care, but the past couple of weeks were interesting enough that I’m going to blog about them anyway.

First, there was the hailstorm a week ago Thursday. Jennie and I were watching TV when we heard a weird thump overhead. It sounded like somebody had thrown a baseball at our roof. Then another, and another. I looked outside and it looked like someone had been throwing snowballs at our driveway. I later heard that it had been “softball-sized” or “three-inch” hail. It only lasted about two minutes, but it was crazy.

My car had been parked in the driveway, and the next morning, I found that its back window was basically gone. Maybe a third of its area was still intact; the rest was just not there anymore. There were tiny shards of glass everywhere, including the front seat of the car. This is the old car; we didn’t have comprehensive insurance on it, so I had to pay to repair it. It also hasn’t been able to start since last November, so we had to get it towed to the shop (it was either that, or have it get rained in). On the plus side, they got it running again, and they fixed the air conditioner too.

Then we found out our house’s roof took a beating in the storm, and we may have to get the whole roof replaced.The adjuster hasn’t been out to look at it yet, so we don’t know for sure, but we’re saving up to pay the deductible if they do decide it needs replacing.

Tycho has barely been eating for a while now, even if we offer him wet food, so Jennie took him to the vet. He’s lost a full pound, which doesn’t seem like a good sign, and the vet took X-rays (these are our cats — we’ve learned to take X-rays and do bloodwork if anything seems even a little out of the ordinary) and she found that he had several teeth whose roots were splitting. Doesn’t that sound like fun? She said he didn’t need them extracted right away, and gave him some pain medication. When he got home, he snarfed as much food as we could put in front of him. Since then, he’s been back to eating a few mouthfuls at each meal, even though the pain medication was supposed to last three days and we’ve given him even more pain meds since then. We’ll probably need to do something more about this soon.

And yesterday, I got scratched in the face by another cat — one with all four sets of claws, and one who was in a stressful situation and obviously far, far more freaked out than I realized. Also in a position to use all four sets of claws on my face at once, because I was stupid. Pulled my glasses right off. Didn’t get my eyes, thank goodness, but my eyebrows, both cheekbones, a couple of deep gashes in my chin, even clipped one ear and the back of my head. I went to urgent care and got five stitches in my chin. I looked like Frankenstein’s monster for most of the weekend, with all the dried blood from all the scratches. The blue thread of the stitches makes the red cut look like this huge scary purple gash, but when you look closer it’s not as frightening as it looks from a distance. The doc gave me a tetanus shot and some antibiotics, just in case, so now I’ve got a sore arm and chills (aftereffects of the tetanus shot) and a sore face (Advil helps). But I’ll be fine. I’m not one of those lawyer-happy freaks who would sue or something stupid like that — sometimes shit just happens! The cat has been removed from the stressful situation and should also be fine; this was hugely out of character and there’s no reason to think it’ll happen again — just one of those freak things. And on the plus side, with this cut on my chin, I may well end up with a Harrison Ford scar.

Oh, and between the vet bill, the car-repair bill, and one or two other things, Jennie and I had to sit down and redo the budget last Friday. We were afraid we would have to empty our emergency fund. It turns out we didn’t have to touch it. We reallocated a bunch of stuff, put other things off for another month or two, and found over a thousand dollars in this month’s budget. We had to make a few tough calls, but man. This is why we budget.

So there’s definitely some good stuff to go with all the excitement. But still, I think I’ll go do something very uninteresting now.

Intolerant cat

We’ve known for a long time that Noel (our princess kitty) is lactose-intolerant. She loves anything dairy, will stick her face right into your glass of milk if you’re not quick enough to block her, will steal cheese any time she gets the chance — but if she does manage to get anything dairy, she’ll throw it right back up (usually on the carpet) within five minutes. (I’ve tried to explain to her that, in this house, we throw up on the linoleum, but so far with little success.)

Tonight I made Mexican pizzas for supper, which involves browning a pound of ground beef. I slopped a little bit out of the skillet during the process, and even though I did remember to cover the skillet before I left the kitchen, I forgot to clean up the bit of spilled hamburger.

Not long thereafter, I heard Noel throwing up in the hallway. (Yes, of course on the carpet.) And after I had shut her in the bathroom and gone to get the paper towels, sure enough, I found a small bit of hamburger amidst the mess.

Apparently she’s not just lactose-intolerant, she’s cow-intolerant.

TechEd notes: 10 Ways To Improve Your Code

10 Ways To Improve Your Code
Neal Ford
Sr. Software Architect / Meme Wrangler

Where did this topic come from?
Book: “The Productive Programmer”, Neal Ford
Exists in two parts, “mechanics” and “practices”.
Mechanics: how to speed you up, learning keyboard shortcuts.
Today is more Practical (and philosophical).

“The unexamined life is not worth living.” — Socrates

“Unexamined code isn’t worth executing.” — Neal, stealing from Socrates

1. Test driven design.

When you’re really rigorous at test-driven development, it has effects on your design. You’re creating the first consumer of your code.

  • Consumption awareness. You’re aware of how the rest of the world will use the code, before they use it.
  • Mocking of dependent objects. If you’re really unit testing, you’re mocking out the dependencies, which forces you to think about the collaboration between these objects.
  • Introverted vs. extroverted objects:
    • If you do TDD, you’ll learn to avoid “extroverted objects” that reach out to create other objects, fire constructors, allocate resources, etc.
    • Instead, you’ll use “introverted objects” where all dependencies are injected via parameters, properties, etc. You tend to move object creation to a few simple places, and can use things like real dependency injection. Also called “shy objects”.

2. Metrics and static analysis.

Compilation is a really, really weak form of unit testing. You can compile any sort of trash. “It compiles” doesn’t tell you much.

Source Monitor (can do many languages including C# and Delphi). Lots of metrics, including cyclomatic complexity. Can set thresholds and have it show the outliers. Has both GUI and command line. Costs you virtually nothing, and will help you find problem spots.

Cyclomatic complexity (1978): measure the complexity of your code. Has to do with the number of paths through the code, though it’s not quite that simple; it’s based on number of branches and decisions. But higher cyclomatic complexity tends to correlate to more bugs.


3. Good Citizenship.

Cooperation with the rest of the world.

Properties != Encapsulation.

  • See too many devs who use a tool to spit out public read/write properties for every one of their fields, and then engage their brain.
  • “Knee-jerk propertiation.”
  • Much better off passing values to a setter method like SetAddress, which means you can’t be a bad citizen by e.g. setting City without setting State — your object should go atomically from one good state to another good state.
  • Objects are the keepers of state, and they should guard that jealously.
  • Only create properties when you need to call them from real code.


  • Specific contract for how to create valid objects.
  • How often is a valid object blank? (from a business standpoint) … Never!
  • Don’t provide default constructors for domain objects.
  • Push back on frameworks that try to require this
  • If you need a null object (and have a language that requires you to have a stateful object to say you have no state)…

Static methods

  • Should be a black box
  • You never worry, when you call the sqrt function, that the next time you call it it’s going to give you the cube root.
  • Statics should be non-stateful.
  • Where you get problems is when you mix statics with state.

Mixing static + state

  • The Evil Singleton Pattern
  • Bad because
    • Mixes responsibilities (doing stuff and maintaining its instance)
    • Untestable
    • Object version of global variables
  • Better: object and factory, where the factory handles the instantiation policing
    • Factory can even call object’s private constructor through reflection. Then you’re enforcing that nobody can instantiate the singleton accidentally.


Picture of gold-plated toilet

Discourage gold-plating.

  • Build simplest thing we need right now!
  • No speculative development. Speculative development:
    • Increases software entropy. The more code, the more complexity, even if you aren’t using it.
    • Only saves time if you can guarantee you won’t have to change it later
    • Leads to frameworks.
      • Frameworks are not inherently bad, but we have framework-itis.
      • Let’s face it, building a framework is cooler than what you should be doing right now.
      • Frameworks are written by people engaged in ivory-tower building.
      • The best frameworks are not created by somebody who wants to build a framework. The best are extracted from working code.

Changeability. Code with anticipatory design is larger and harder to refactor and maintain.

5. Shaving with Occam

Sir William of Occam: “Given multiple explanations, the simplest is best.”

Simplest is really hard to come by.

Dave Thomas was brought in to solve problem with volume of internal mail. Inter-office memos were constantly getting misrouted. So they brought in an OCR machine, and brought Dave in to write software for this thing. At one point, Dave said, “Couldn’t you solve this problem with colored envelopes?”

It’s really hard to understand the essence of the problem and address that.

We are drowning in complexity.

  • Essential complexity: We have a hard problem that we’re trying to solve.
  • Accidental complexity: We’ve made the problem hard.

The Goal

  • Simplify essential complexity
  • Kill accidental complexity

This also affects the kind of tools you use. E.g., “static” vs. “dynamic” languages. (I already noted this “ essence vs. ceremony“.) Something nasty and multithreaded would be better written in something like F#.

Interlude: the Top Ten Corporate Code Smells

  1. We invented our own web / persistence / messaging / caching / logging framework because none of the existing ones was good enough.
  2. We bought the entire tool suite (even though we only needed about 10% of it) because it was cheaper than buying the individual tools.
  3. We use BizTalk because… (I always stop listening at this point) Okay, it has some legitimate uses, but it’s been much abused.
  4. We can’t use any open source code because our lawyers say we can’t.
  5. We have an Architect (note the capital A) who reviews all code pre-checkin and decides whether or not to allow it into version control. (New feature in VSTS.)
  6. The only XmlDoc is the default message explaining how to change your default XmlDoc template.
  7. We keep all of our business logic in stored procedures… for performance reasons. There is some tortured logic at work here, but that ignores that dealing with stored procs will slow down your development. Let’s have a talk about premature optimization.
  8. We don’t have time to write unit tests — we’re spending too much time debugging.
  9. The initial estimate must be within 15% of the final cost, the post-analysis estimate must be within 10%, and the post-design estimate must be within 5%. (Punished for coming in too low as well as for coming in too high. The team will overestimate on purpose, get done early, not tell you about it, twiddle their thumbs until they hit the golden window, and then say, “Okay, all done!”)
  10. Blue Screen of Death.

Side note: Unless you work for NASA, your problem isn’t harder than everyone else’s. You’re just doing it wrong.

6. Question authority.

Dave Thomas’ story of angry monkeys. (The story of the stepladder, the bananas, and the ice water. “That’s the way we’ve always done it.”)

public void UpdateCacheAndVerifyThatItemExists()

Long camel-cased names are hard to read, and test names tend to be long. Neal’s suggestion: use underscores just for test names.

public void Update_cache_and_verify_that_item_exists()

Fluent interface:

ICar car = Car.describedAs()

instead of setting lots of properties, to make it more readable for non-programmers. Thing is, it violates the rules of properties, by making a property getter (Box) that mutates the object. But in the context, it makes for much clearer code.

Killing I

  • Interfaces define semantic intent
  • No implementation details…
  • …except in the name!
  • Don’t name interfaces with a leading “I”
  • Name concrete classes with a naming pattern
  • (I’m not sure that I would agree with Neal on this, but it’s worth thinking about)

What’s Bad About Standards?

  • Forces you to create default constructors
  • Property setters return void
  • Can’t use PONOs for fluent interfaces


  • Pair programming (seems like it would be 50% slower, but in reality, once you settle into it, you develop 15% slower, but have 50% fewer defects)

Read AntiPatterns.

  • GiveMeEstimatesNow. Presented with a problem, asked for an estimate out of the blue; you don’t know anything about it, but the boss asks for a guess. That becomes an ironclad contract.
  • StandingOnTheShouldersOfMidgets. Have a disastrous tool or framework that you’re required to use in every application, because it’s a corporate standard.

Anti-patterns are the lore of software. Take advantage of this prior art. Don’t think that the problems at your job are uniquely yours.

7. Composed Method.

“Smalltalk Best Practice Patterns” by Kent Beck. Smalltalk people were some of the first OO programmers, and came up with elegant solutions. (They’ve got a head start on the rest of us.)

  • Every public method consists of steps implemented as private methods.
  • You can tell something’s wrong with the existing code if there have to be comments.
  • Extract methods.
  • Find opportunities for code reuse. Some of those methods you extract might start to look like Template Methods, which opens up more opportunities.

8. Polyglot Programming

Leveraging existing platforms with languages targeted at specific problems and applications

We have lots of .NET languages. Why not take advantage of them, rather than thinking there’s a framework for everything that you can use from the One True Language?

Looming problems / opportunities

  • Massively parallel processing (multithreading)
    • Use a functional language: F#,
  • Schedule pressure
    • Use a dynamic language: IronPython, IronRuby
    • Use an alternate Web framework: Django, Ruby on Rails
  • New approaches
    • Domain-specific languages (DSLs)
    • Fluent Interfaces

Write your multithreaded logic in F#, your GUI in C# or VB.NET, your unit tests in IronPython or IronRuby, and use DSLs

  • Wouldn’t that add complexity?
  • In the past, language == platform
  • Now, language != platform

Ola’s Pyramid

  • Stable language at the bottom, e.g. C#. Static-typed, statically-verified. Maybe even stricter than C#, like a mathematical language.
  • Above that, a dynamic (non-ceremonial, e.g. F#) language that lets you write code quickly.
  • Above that, a DSL that gets you closer to the problem domain.

9. Learn Every Nuance

  • Reflection
  • Regexes
  • Dependency injection
  • Closures
  • Lambda expressions
  • Extension classes
  • And once you’ve learned it, teach it to your co-workers. E.g., regular expressions.
  • Can save you orders of magnitude of work.

10. Anti-objects

Comes from OOPSLA paper called “Collaborative Diffusion”.

“The metaphor of objects can go too far by making us try to create objects that are too much inspired by the real world.”

Figure vs. ground. Sometimes you need to see the problem a different way.

Pac-Man console had less memory than a 10-year-old cell phone. Problem to solve for the ghosts: What is the shortest distance between two moving objects in a maze? Solution: don’t model the ghost; model the maze. Intelligence was built into the maze itself. Each cell had state. Invented “Pac-Man smell”. A cell he just moved off of had “maximum smell – 1”, and it decayed quickly. Ghosts just had to smell Pac-Man. The ghosts wander randomly until they pick up the scent, and then they move into the cell with higher smell. So they will never cut him off at the pass (on purpose)… but it was a very simple and memory-efficient solution.

Healthy cats

All four cats are home. We got to bring Tycho home from the vet on Friday, and Goober yesterday. (Tycho was so ready to go home. I could almost hear him saying, “Give me the keys! I’ll drive!”)

All four cats’ values are back down to well within the normal range — even Goober’s, which started out so far off the charts, less than a week ago, that we had no idea whether he was going to survive. He is all better. (There may be long-term effects, five or ten or fifteen years down the road. But that’s no worse than some of the other health problems our cats have turned up with; in my mind, that’s as good as healthy.)

They all get re-checked on Wednesday, and then at progressively longer intervals thereafter.

Life is much better.

Well, mostly better. Now we’ve got to give them subcutaneous fluids every day. That means that we (not, repeat, not trained professionals) stick an IV needle into each cat’s back, and then try to get them to sit still and not flinch for five or ten minutes. (I used to donate plasma, and at the end of the process, they would run fluids back into the IV to replace what they took. That stuff was freaking cold. So I know how the cats feel. But it’s still gotta be done if we’re going to make sure they stay healthy.)

We try to remind them that it’s either five or ten minutes a day of something they don’t like, or twenty-four hours a day of being at the vet. They don’t seem convinced.

Ah well. Band-Aids are cheap.

Two cats home

Stefan and Noel got to come home today.

All four cats are doing really well. The intravenous fluids have been working very well on all of them. Hopefully the same will end up being true for everyone else’s cats who had been eating m/d and are now stuck in the hospital.

We’ll have to give Stefan and Noel subcutaneous fluids once a day for a while (the doctor wasn’t there when we visited, so we’ll have to wait till tomorrow to find out how long this arrangement will last). This basically amounts to attaching an IV needle to a bag of saline solution, sticking the needle in the scruff of their neck, and getting them to sit still for ten minutes or so. It’s not really as bad as it sounds. They showed us how to do it before we brought them home. Both cats put up with it a lot better than I thought they would; it didn’t seem to hurt them at all. They just didn’t want to sit still that long.

The other two cats will be at the vet a while longer. Tycho’s blood-test values were normal when they checked him today, but they’re keeping him another day or so just to make sure, since his values were high when we brought him in. Goober probably won’t be able to come home until Saturday at the absolute earliest, maybe Monday.

Jennie brought a milk ring along when we went to visit Goober this morning, and he was playing with it enthusiastically. He’s back to himself.

I’m not sure what to think about Tycho. He’s been friendly. To the lab techs. At the vet’s office. This is not like him. He even let one of the doctors scratch him on the nose, and he didn’t try to bite or anything. Jennie and I have started calling him “pod-cat”. It’s not that we mind him being nice at the vet’s office. Usually they have to sedate him to do anything to him at all, and they have to get out the metal-studded elbow-length heavy-duty leather gloves to be able to hold him long enough to sedate him. So it’s not that we mind not having to deal with that. It’s just that, well, to quote an old Garfield comic strip (which ended with Garfield in a straitjacket in a padded room), “People don’t want nice… people want consistency.”

Goober doesn’t seem to mind being at the vet’s office too much — he’s enough back to his usual autistic self that I’m not entirely convinced that he even notices where he is. But Tycho is desperate to come home. He’s being (unusually) nice and all, but sounded so pitiful when we left this evening. He just about smashed my fingers against the cage bars when he head-butted my hand.

I really hope everything looks good again tomorrow so he can come home. I guess I’m just a sucker for a sad yowl.

Cat recall

All four of our cats are in the hospital now.

Jennie took Stefan, Tycho, and Noel to the vet this afternoon to be checked, since they’ve all been eating the same (recalled) food. All of their blood tests came back with high levels of bad stuff. Nowhere near as high as Goober’s, and their kidneys didn’t appear to be swollen, but the levels still well above the upper bound of the “good” range. So they’re all on IV fluids for 48 hours to try to flush it out of their systems too.

It’s going to be weird being in a house with no cats. They’ll re-test Goober tomorrow night, but he’ll probably be in the hospital for a few more days after that.

On the plus side, he did pee a couple of times today, so his kidneys are pulling at least some of their weight. It’s too soon to know much more.

Goober and the cat-food recall

Until I took Goober to the vet tonight, I didn’t know that the pet-food recall had expanded to a second manufacturer.

Now I do. Hills Veterinary Diet m/d formula — the food that all four of our cats eat.

(Well, did eat. They sure as hell don’t anymore.)

Goober hadn’t been himself for a few days. He wasn’t interested in playing, and he had thrown up a few times, both of which are extremely unusual for him.

He’s still at the vet. His kidneys are enlarged, and a couple of the counts from his blood tests were about 10x what they should be (I’m not sure of details — I was in no frame of mind to be taking notes). They’re treating it as acute renal failure: they’re putting him on intravenous fluids, to flush the bad stuff out of his system.

He’ll be in the hospital for 48 hours (during which we can visit him as often as we like), and then they’ll do the blood tests again. All we can do is wait, and hope. And bring the other three cats in so we can get them checked too. And be glad that we hadn’t spent any of our tax refund yet. And pick up some different cat food in the morning — at a different vet’s office. Our vet’s office is sold out of the alternative they’re recommending.

(Apparently the vet’s office had called us to warn us of the recall, but they called Jennie’s cell phone, which I had taken out of town with me this weekend. Since I have no clue how to check her voicemail and I didn’t get back until today, we hadn’t gotten the news. Maybe this is a compelling reason to drop the land line, and finally get me a cell phone.)

Getting to sleep tonight will be an interesting challenge. So will focusing on work tomorrow. Wish me — and especially Goober — luck.

General preference: keep the cat dry

I was supposed to take Tycho to the vet this evening, for another re-check on his eye. But after driving home from work, I decided against it. It’s raining a bit (sarcasm), and I decided I didn’t really want to drive my crabbiest child to the vet, during a thunderstorm, through 84th Street Lake.

Our regular vet will be in Thursday morning; we’ll go then. (hastily checks weather forecast) Yeah, we’ll go then.

Anniversary gift: mostly healthy cat

Two very good things happened yesterday.

One: we took Tycho back to the vet for a re-check, and she said that his eye looked “90% better”. She doesn’t think we’re going to need to take him to a specialist at this point (which saves us a five-hour car trip — each way — with a yowling cat in tow), so that was a relief. If the thing in his eye had been a tumor, she told us, then we wouldn’t have seen this kind of improvement with the meds we had him on. (She called us after we got home, with the lab results from his first visit, and there were indeed no cancerous cells. Hooray!) Not only is his eye doing better, but now we only have to put ointment in his eye four times a day, instead of six — much more manageable, given our work schedules. He goes back in a week for another re-check.

Two: yesterday was our eight-year anniversary. (Our anniversary celebration consisted of taking Tycho to the vet. See, we still know how to party till it hurts.)