Thursday, October 29, 2009

Tool review: Microsoft Network Monitor 3.3

I have used Wireshark for packet sniffing and analysis for a number of years, starting back when it was called Ethereal. A little while ago I was using it to look at broadcast packets that our clients send out, and decided that it would be great if Wireshark could interpret our wire-level protocol and display meaningful information about the packets. After a bit of searching, I found that you can add plug-ins to Wireshark, allowing you to do whatever you want with the packet data. I found some detailed instructions on how to do this, beginning with:

  • Install a version of the Microsoft C/C++ compiler
  • Install a particular platform SDK
  • Install Cygwin
  • Install Python
  • Install Subversion
  • Get the Wireshark source
  • Configure the source
  • Build Wireshark

Once you're done all that, you can start looking at building your plug-in in C. I set up a Windows XP VM and spent a day or two doing all of this, but never got to the point of actually creating the plug-in. A few days later we had a team status meeting, during which I mentioned this project. A colleague, Peter, asked if I had looked at Microsoft NetMon, saying that he believed it allowed you to add your own parsers as well. I downloaded it and took a look. Thank you Peter, for saving me days, if not weeks of development time. In less time than it took me to set up the VM in preparation for writing a Wireshark protocol analyzer, I had analyzers written for the majority of both our UDP and our TCP protocols.

Writing parsers

As a packet sniffer, NetMon is not really much different from Wireshark, though I find the interface a little more intuitive. This might be because I'm running on Windows, and Wireshark has always looked to me like a Unix program that has been ported to Windows rather than an application written for Windows. They both support both capture and display filters. NetMon has colour filters as well – particular packets or conversations can be coloured based on the filter results. You can view packets as they are captured, save them to a file, and load them back in again later.

But writing a parser is orders of magnitude easier than writing a Wireshark plug-in. You simply tell it what ports your protocol uses and what the protocol looks like in a proprietary language (called NPL – Network Monitor Parser Language) that's vaguely C-like but very simple. Some properties of this language:

  • it handles bitfields, ASCII and Unicode text, and binary data, as well as various types of numeric values (8, 16, 32, or 64 bits, integer or floating-point, signed or unsigned, big- or little-endian)
  • you can define your own data types
  • there are a number of special data types built-in; if your packet contains a 32-bit IP address, for example, you can just specify it as IPv4Address and it will get interpreted and displayed as expected
  • you can make structs which group pieces of the data together, and arrays which hold collections of the same type of data
  • you use while loops and switch statements to modify behaviour. For example, your protocol might have a byte that indicates the type of packet, and then the structure of the packet depends on the value of that byte. No problem.
  • you can indicate both storage format and display format, so if you have a byte that's 0 for a request and 1 for a response, you can display the words "request" and "response" rather than just 0 or 1. The rest of the code can reference this value by name and get 0 or 1. The display string can be as complicated as you want, even referencing other pieces of the packet by name.
  • it supports conversations, and there are variables that have global, conversation, packet, or local scope

The help file installed with the app describes each of the language features, and I found a document that describes an example protocol in great detail.

Drawbacks

The biggest drawback of this tool is the parser editor. It's not very powerful – it makes notepad look feature-rich. I use Ctrl-Backspace (delete previous word) and Ctrl-Del (delete next word) a lot, since it's supported in Windows Live Writer, Word, and emacs, but support is spotty – sometimes it works, sometimes it deletes the wrong word.

The main feature it's missing is undo. It doesn't even have a single-level undo. If you hit backspace one too many times, you'd better remember what that last character was because it's gone. An editor that doesn't support undo is pretty much unacceptable in this day and age, and I lost data more than once because of it. Once you realize that you can't undo mistakes, you end up clicking Save a lot more often, and do things like copy the file to a backup file before you make big changes. I checked my files into source control and started checking them in periodically, which is a good idea anyway, but if the parser stuff wasn't so damn cool, the lack of an undo feature might be a showstopper. Emacs supports Ctrl-A and Ctrl-E to get to the beginning and end of the current line respectively, and sometimes I instinctively use those keystrokes in editors where they're not supported, like this one. Unfortunately, Ctrl-A here means "select all", so doing that and then typing something is disastrous because there's no undo, so you just lost your entire file. You need to quit the file (do not save!) and then reload it, losing whatever changes you had made. Even a single-level undo would save you from that.

The compiler has some problems as well – there were a number of times where I got compilation errors that were badly written or vague enough that I didn't know what the problem was. It would point to what looked like a valid statement and say that it was unrecognized or invalid, and it turned out to be because of a missing (or extra) semi-colon on a different line, or a language rule that wasn't obvious.

Once you've made the changes to your parser, you have to save it and then click "Reload Parsers", which reloads all 370+ parser files it knows about. Surely there could be a way to just reload the one that I changed? Now, there are dependencies between files, so changing one file might require that a different file be reloaded, so reloading them all is the safest but it's slow. Ideally, the tool should be able to figure out the dependency tree and only reload files that depend on the ones changed. And the tool should prompt me to save if I have an unsaved file and I click "Reload Parsers".

If anyone from the NetMon dev team reads this, here's a bug report: If I load a parser file, then paste some code into the file, it's not marked as "dirty" until I actually type something. Also, if I load a display or capture filter from a file, this generally means "replace what's in the textbox with the contents of the file", not "insert the contents of the file into the textbox at the current cursor position". I can see how that feature might be useful in combining filters, but it should not be the default.

As powerful as the NPL language is, there are things it simply can't do. In my case, some of our packets can be encrypted or compressed, but the NPL language can't decrypt or decompress them. It would be nice to be able to write a small plug-in that could do these types of things, but it's not supported. The Wireshark approach would work for that.

Experts

For those analysis needs that are not satisfied by parsers, NetMon supports things called "experts", which are external programs that can read the data from a capture file and analyze it in whatever way it wants. It sounds similar to a parser except that it's written in C or C++ (or C#, I think) and has the limitation that it only works on saved files, so you can't look at the results in real-time as you can with a parser. I've stared to write one of these to solve the decompression/decryption problem I mentioned above. There doesn't seem to be a way to decrypt the data and write it out into a new capture file, but I can at least decrypt, parse, and display the data. I can reuse the parser code I've already written, since the program is dealing with pre-parsed information, but I have to grab each field individually and display it, so I essentially have to rewrite all the display code in C.

Summary

Overall, this is a very cool utility and has replaced Wireshark as my packet sniffer of choice. The documentation is pretty thorough and it includes some good examples. If all else fails, the parser code for all the other supported protocols is right there. There is a help forum to which I've posted a couple of questions and gotten quick and helpful responses. I wrote a while ago about how cool Windows Live Writer is, so kudos to Microsoft for yet another cool utility.

Amazing stats of the day

Before their win over Anaheim on Monday, i.e. over the first eight games of the season, covering almost 485 minutes, the Toronto Maple Leafs had played with a lead for a grand total of six minutes.


The last time Mariano Rivera gave up runs in different innings in the same game was June 1999, and he has never done it in the post-season (ref: Ed Price). His career postseason stats are unbelievable:

Division Series: 34 games, 51.1 IP, 0.35 ERA, 0.58 WHIP
League Championship Series: 30 games, 45.2 IP, 0.99 ERA, 0.83 WHIP
World Series: 20 games, 31 IP, 1.16 ERA, 0.97 WHIP.

Sure, he gets worse as the post-season goes on, but his "bad" is everyone else's "amazing". It's people like him, Andy Pettitte, and Derek Jeter that make it harder and harder to hate the Yankees. But I'm doing my best.

Tuesday, October 20, 2009

PMH 5K Run 2009

Last year, I participated in my first 5k run, and almost killed myself doing it. This year, I decided not to let that happen again, so I've been training since July. As a result, not only did I feel fine the day of and the day after the race, but I beat my time from last year by almost five minutes. I finished 5km in 27 minutes 18.5 seconds, a pace of 5'50"/km. I was the 458th person (out of 2552) to cross the finish line, though that's misleading because some people that finished ahead of me may have had a slower overall time. Unfortunately, that's the way they order the finishers, so in terms of absolute time, I don't know where I placed. I was 284th out of 930 men. They originally listed me as "Male under 24", so my ranking there is meaningless as well, but doing the math myself, 25 out of 87 men in the 40-45 group finished with faster times than mine (one beat me by over ten minutes). These numbers assume that most people are listed in the right groups, though Nicky and both of my parents were also in the wrong groups, so who knows.Me and the boys with our medals (staring into the sun) I've emailed the people who do the stats, and they have already replied saying they can fix them, so I'll check again before I post this and see if it's been updated. Update from next morning: They've moved me over to the right group, but some other things must have changed too, because now I'm ranked 30th out of 88 men 40-45. Whatever.

It turns out that I wasn't training quite as thoroughly for this race as I thought I was. I used my Nike+ iPod and it decided that the route was 5.49 km. Since I finished in 27'18", that gave me a pace of 4'58". I'm assuming the route was actually 5 km even, so I guess my iPod measures a bit long. It looks like those runs I did that were reported as 5.2 km weren't even five and the 4.4's were probably about four. The iPod reported after the race (with a message from Lance Armstrong!) that this was my longest workout to date, which means that none of the runs I did in practice was as long as the real race. Apparently the iPod gives you the ability to recalibrate it, so right after the race I should have selected "Calibrate" and then told it that I had just run 5.0 km, but it's too late now. Sometime in the near future, I'll have to drive around the block and measure exactly how long it is, and then run it and do the recalibration. Regardless, it was close enough that it didn't really matter. I wasn't in pain at the end of the race – I even had enough left in the tank to increase my pace (not quite sprint, but I definitely ran faster) over the last 50 metres or so.

This year Ryan and Nicky joined in the fun as well (Gail was away at a scrapbooking weekend). They walked the course with my parents and finished in about an hour. They seemed pretty excited about being part of the team, and having special t-shirts, and the sensor on their shoe, and especially getting a medal at the end (Nicky said that the 5K on the medal means that it was 5 karat gold).

To all of those who sponsored me, a huge Thank You! I raised over $300 myself, and our team raised over $3000 for gynecological cancer research at PMH.

Monday, October 19, 2009

I Believe in Our Saviour, The Brian

So the Leafs haven't started the season so hot. In fact, they can't really be any colder than they have been. Every part of the team is having troubles, and word on the street is that this is the worst team in the league, which means that the Leafs might have sent Boston a first overall draft pick in exchange for Phil Kessel. There's been a lot of talk about some of Burkie's deals, and the fact that he is so obviously building a team full of fighters and tough guys. But surely there's a method to his madness: his teams in the past have always had tough guys protecting his skilled players and allowing them to do their job. Nobody was going to run Teemu Selanne because they knew Chris Pronger or Brad May or someone would be on top of him in a second. This gave Selanne a little extra space, which he used to his advantage. That's the strategy that Burke is using in Toronto as well – get a bunch of tough guys to protect the skilled players. Of course the problem is that there are no skilled players to protect. That's why Colton Orr is only averaging 7 minutes a game – he's got nothing to do, so he's always hanging around Phil Kessel's house.

But if you are planning on purchasing a fifty-karat diamond, wouldn't you get the state-of-the-art security system installed first? You're not going to buy the diamond and then leave it on the kitchen table until the security system gets installed a week from Tuesday. You make sure that the security system is in place and working flawlessly before you go pick up the diamond. So when Phil Kessel returns and Burkie trades Lee Stempniak, Jason Blake, and a third round pick to Washington for Alex Ovechkin, he's already got the protection in place.

Of course, that trade isn't going to be quite that easy. Might have to bump the draft pick to a second-rounder.

Please note that this article might be one of the only ones written this season about the Leafs and Brian Burke that didn't use the word truculence once. Go me.

Saturday, October 17, 2009

Top Ten Rock Cover Songs

I had fun putting together the list of Top Ten Rock Instrumental Songs a little while ago, so I decided to do it again. This time, I'm listing artists that took a good song and did an great cover. Again, these are in no particular order.

  1. Manfred Mann's Earth Band: Blinded by the Light. The Springsteen song is all right, but Mann's cover blows it away. I wrote about this song a few years ago.
  2. Dream Theater: Funeral For A Friend / Love Lies Bleeding. I love the original Elton John version as well but Dream Theater's live version on "A Change Of Seasons" is excellent. They also do a great version of Deep Purple's Perfect Strangers.
  3. Aerosmith: Come Together. They didn't make vast changes to it, but they managed to make it sound like an Aerosmith song. If only we could forget the terrible movie it came from.
  4. The Ataris: The Boys of Summer. Make no mistake, the Don Henley original is one of my all-time favourite songs, but I really like this cover. Weird – a one-hit-wonder band, and the one hit wasn't even their song.
  5. Creedence Clearwater Revival: I Heard It Through The Grapevine. The original is a Motown classic, but the CCR version is a rock and roll classic – eleven minutes long with a number of guitar solos.
  6. Van Halen: You Really Got Me. I was a huge Van Halen fan back in the 80's, and now whenever I hear the Kinks original, I just think "how lame". Van Halen actually did a number of pretty good covers in the David Lee Roth days (i.e. back when they were good) – Where Have All The Good Times Gone (more Kinks), Dancing In The Streets, Happy Trails, Ice Cream Man, You're No Good, Big Bad Bill, Oh Pretty Woman.
  7. Metallica: Turn The Page. I'm a fan of Bob Seger, and this is one of his best songs, but Metallica's version kicks serious ass.
  8. The Tea Party: Paint It, Black. Of all the bands to take a song with a sitar in it and do a cover without one. They just made it a straight-ahead rock and roll song and did a great job.
  9. Queensrÿche: Scarborough Fair. Can a hard rock band take an acoustic Simon & Garfunkel song, add distorted electric guitars, and make it their own? Yup, turns out.
  10. Faith No More: War Pigs. I really prefer Faith No More's version of this song to the original, though admittedly I'm not a huge fan of Ozzy or Black Sabbath. Faith No More also did a cover of Easy by the Commodores, but rather than doing a Faith No More version, their version sounds like the original.

Runners-up: U2: All Along The Watchtower, John Mellencamp and Meshell Ndegeocello: Wild Night.

Honourable mention: Seether: Careless Whisper. Started off as a joke during a concert, but they did a good enough job of it that the fans loved it, so they actually recorded and released it. Cool song.

Monday, October 12, 2009

iPod Meme Redux

I originally did this a few months after getting my iPod. Revisiting two years later. Old values that have changed are stroked out. Shortest and longest songs, and first and last artist and album have not changed. I've added over 850 new songs.

Attention facebook readers: You might want to click the "View original post" link at the bottom of this note to see it as I originally wrote it. Facebook sometimes messes up the formatting.

 

How many total songs?
6919 songs, 20.9 days, 41.79 GB
7773 songs, 23.4 days, 46.55 GB

Sort by song title - first and last
First: A by Barenaked Ladies
Last: 99% Of Us Is Failure by Matthew Good
Last: 999,999 by Nine Inch Nails

Sort by time - shortest and longest
Shortest: You to Me (0:04) by Bystander
Longest: Octavarium (24:00) by Dream Theater

Sort by Album - first and last
First: "Abacab" by Genesis
Last: "90125" by Yes

Sort by Artist - first and last
First: AC/DC
Last: 54-40

Top five played songs:
1. Fake It by Seether - 18
2. Be Yourself by Audioslave - 17
3. Found Out About You by Gin Blossoms - 13
T4. Like A Stone by Audioslave - 12
T4. White Shadows by Coldplay - 12
T4. High Class in Borrowed Shoes by Max Webster - 12
T4. Elderly Woman Behind The Counter in a Small Town by Pearl Jam - 12
T4. Emotional Rescue by The Rolling Stones - 12

Find the following words. How many songs show up?
Sex: 6 21
Death: 4 59
Love: 239 327
You: 535 822
Home: 42 48
Boy: 34 56
Girl: 60 80

First five songs that come up on Party Shuffle
1. Cesaro Summability by Tool
2. White, Clean and Neat by Robert Plant
3. Local Hero by Bruce Springsteen
4. Resist [Live] by Rush
5. Gimme The Love by Junkhouse

It looks like I've added a lot of "death" songs, but most of them are actually album names - "Death Magnetic", "Live After Death", "Life, Death, Love, and Freedom" (and the corresponding live album "Life, Death, LIVE, and Freedom") , and "Viva La Vida or Death And All Of His Friends". There are only 6 actual songs with "death" in the title.

Similarly, 15 of the 21 "sex" songs are on "Blood Sugar Sex Magik" by the Red Hot Chili Peppers and don't have "sex" in the song title. There are only 6 songs with "sex" in the title, and two of them are "Sexy Sadie" by the Beatles (on different albums). I guess I'm just not that into sex. No wait, what I mean is... it's not that... um.... <blush>

Wednesday, October 07, 2009

European coaches in the NHL

Back in the 70's and 80's, there were only a handful of European-born or Russian-born players in the NHL, a few Americans, and a ton of Canadians. You had your Borje Salmings and your Peter Stastnys and your Jari Kurris but it wasn't until the late 80's and early 90's (after the breakup of the USSR) that you really started seeing a lot of Russians and Czechs and Slovakians and such in the NHL. So over the last twenty years, there have been hundreds of European-born players in the NHL, and many of them have had long playing careers. Some have even made the Hockey Hall of Fame.

So where are all the European coaches?

Former players moving on to coaching is commonplace: of the thirty current NHL head coaches, twenty of them played in the NHL at one point. (In case you're curious, the ten that have not are Paul Maurice, Ken Hitchcock, Peter DeBoer, Todd Richards, Jacques Martin, Barry Trotz, John Tortorella, Cory Clouston, Todd McLellan, and Andy Murray.) But not one of the thirty current NHL head coaches was born outside of Canada or the US.

Are Europeans simply not interested in coaching at the NHL level? Are they being discriminated against somehow? I don't have any insight or opinions as to why this is happening, but I think it's an interesting question.

Tuesday, October 06, 2009

Goodbye J.P.

J.P. Ricciardi was fired the other day as Blue Jays GM, which I am happy about. Ricciardi's reign as GM resulted in no World Series victories, no playoff games, heck, not even anything close to playoff contention. His time had come, and the Jays now need to rebuild and go in a different direction. But that's not to say that Ricciardi was a terrible GM. Here's a list of his best and worst moves, and I'll list my personal favourites (in both respects) below. Note for the record that I wrote well over 2/3 of this article before finding that link, so I'm not just summarizing it.

Ricciardi certainly made some bad moves. He negotiated an expensive contract for Alex Rios, then allowed Chicago to claim him on waivers, getting nothing back. He signed Reed Johnson to a contract and then released him a month later, only to replace him with Shannon Stewart, who got injured and released within a couple of months. He paid both B.J. Ryan and A.J. Burnett a ton of money – each had one great season and a couple of not-bad ones. He also released Ryan and Frank Thomas with a lot of money left on their contracts.

But he also made some good moves. Bringing in Overbay was a good move. He got Jeremy Accardo for Vinnie Chulk and the grumpy Shea Hillenbrand. He grabbed Matt Stairs, Joe Inglett, Scott Downs, and Rod Barajas off waivers. He traded two players I've never heard of for Marco Scutaro. Trading for Glaus was good, but then he wanted out. So Ricciardi turned him into Scott Rolen. Then Rolen wanted out, and he got a couple of young pitchers for him. He drafted Hill, Marcum, Litch, Lind, and Snider.

Some players didn't work out (Royce Clayton, Tomo Okha, Victor Zambrano), but they were cheap anyway. Just about every pitcher spent time on the DL, but that's not Ricciardi's fault. In fact, I'm surprised there wasn't an investigation of some sort into the Jays' pitching coaches at that time.

You might notice that I did not include the Vernon Wells deal in the list of bad moves. You can't deny that Wells hasn't earned his eleventy gazillion dollar contract since it was signed three years ago. OK, so he hasn't even come close to earning it. So from that point of view, this is a terrible deal. But nobody complained about the deal when it was made because Wells was coming off a couple of great seasons and looked poised for lots more. Three mediocre and injury-filled seasons later, it seems obvious that Wells is not the superstar we all thought he was at the time. He's simply a very good player that had a couple of great seasons. Should Ricciardi have seen that coming? Maybe, but nobody else did. If instead of signing Wells he had traded him or let him go, he would have been ridiculed endlessly (which he likely doesn't care about) and not taken seriously by other GMs (which he likely does). He had little choice but to sign Wells to the contract and hope that he wasn't a flash in the pan. Oh well.

Ricciardi was touted as the next Billy Beane, an expert in the whole Moneyball concept, and should therefore be able to bring a winning team to Toronto without increasing the payroll astronomically. This was key because the Jays play in the same division as the rich Yankees and Red Sox, who have no trouble outspending the rest of the league, and seem ready to sign any and all free agents regardless of the cost. But eight years later, what did Ricciardi whine about the most? "We can't win because we don't have the payroll of the Yankees and Red Sox. I don't have enough money to do what we need to do. We can't win in this division without increasing payroll." Um... isn't that why we hired you and not someone else?

I think Ricciardi's biggest problem was that he didn't know when to shut up. Every time there were trade rumours, Ricciardi was right there telling everyone who'd listen who he was offering, who other teams were offering, what deals didn't happen and why, and so on. He would talk to the media and tell them whether certain players were interested in re-signing after their contracts were up, even if the players hadn't come to a final decision yet. That's the kind of stuff that does not need to be published. He publicly questioned Adam Dunn's work ethic and passion for baseball. Even if he was right (and I have no reason to believe he was), you don't say stuff like that. When rumours started flying that he was shopping Roy Halladay at the trade deadline this year, Ricciardi didn't deflect attention and didn't refuse to comment – in fact, he talked on and on about it, and even gave a meaningless "deadline" before the real trade deadline. In so doing, turned the thing into a media circus. On the day of the deadline, the FAN was doing minute-by-minute reports on whether or not Halladay was still a Blue Jay. Then there was the thing with B.J. Ryan, where Ricciardi knew that Ryan required Tommy John surgery but told the media that the injury wasn't that bad. When the truth came out and he was called on it, he famously said "They're not lies if we know the truth", which simply told everyone that they couldn't trust anything he said.

Having said all that, Ricciardi wasn't the worst thing ever to happen to the Jays. No, they never made the playoffs during his time, but at least he didn't turn the team into a laughing stock (lookin' at you, John Ferguson Jr.). They only finished last in the East once, even made second place once, and finished above .500 for four of the eight seasons Ricciardi was here. He took a mediocre team and turned them into... a mediocre team. There were times over the past few years that the Jays had the best hitting team in baseball, and other times where they had the best pitching staff. Unfortunately those times never coincided. He didn't leave the team in total shambles – there are certainly some players that can figure prominently in the Jays future plans. They have some good young hitters, a really good bullpen, and if all the injured pitchers return next season (OK, that's a big "if"), they could have an excellent rotation (how does Halladay, McGowan, Marcum, Litch, and Romero sound?). As I said before, Ricciardi has proven that he's a pretty good baseball guy and I'm sure he'll land on his feet somewhere. In any division other than the AL East, he might even be successful.

Monday, October 05, 2009

Sarah's Story

SarahIn the four and a half years that I've had this blog, I've written over six hundred articles (and trust me, nobody is more stunned by that number than I am). Most are about sports, technology, music, movies, and my family, as well as the occasional article on things like religion and politics. None of them are as important as this one. If you are only a casual reader of this blog, regularly skipping articles about subjects that don't interest you, I implore you to read this one to the end.

I first met Cindy Marshall in 1994, when her sister Kerri married my friend (and best man at my wedding) Jeff. I don't know a lot of my friends' siblings, but Cindy and Kerri (and their parents) are very close, so you can't know one without knowing the other. Cindy had her first child, Sarah, in February 1997, and Kerri had hers, Rachel, in June. But the fact that both children were girls and both were born in the same year is just about the extent of the similarities. Rachel's most significant physical problem is that she needs glasses. Sarah, on the other hand, had surgery before she was born, has had a number of surgeries since then, and has been close to death more times than I care to remember. The fact that she is still alive has been called a miracle.

Part-way through Cindy's pregnancy, a routine ultrasound showed that the baby's bladder was enlarged. Upon further examination, doctors discovered that it wasn't draining properly, so she underwent two surgeries (called "bladder taps") in-utero. At this point the doctors thought there was an obstruction of some kind and believed that it was a relatively mild problem. Sarah was born five weeks early on Valentine's Day 1997, and weighed less than five pounds. She wasn't yet two days old when she had her first major surgery, an attempt to repair her twisted bowel. Immediately following the surgery, her appendix ruptured and had to be removed – the first of a number of organs to be removed from Sarah's tiny body.

After three more surgeries in two months looking for bowel obstructions, Sarah was diagnosed with "megacystis microcolon intestinal hypoperistalsis syndrome". In a nutshell, her bladder was enlarged, and her intestines were pretty much non-functional. Sarah spent the next five months at Sick Kids hospital in Toronto. She was started on TPN (Total Parenteral Nutrition), which means that she was fed completely intravenously. This is not a big deal for adults – many adults can live on TPN for years – but it's very hard on an infant's body. It kept Sarah alive, but at a price – within a couple of months, it destroyed both her liver and pancreas. She already needed a bowel transplant, but now she needed a new pancreas and liver as well. In May, Cindy was told that Sarah's only hope was a multiple-organ transplant and she was placed on the transplant list. At that time, no child as young as Sarah had ever survived such a transplant. I don't know if Cindy knew that then.

Rock climbingSarah's life expectancy during this time varied, but was usually measured in months or even weeks, and at times much less. I remember being at a gathering at Jeff and Kerri's house in Newmarket (for Jeff's birthday, I believe) when the phone rang. The call was from Cindy at the hospital, basically saying "You better get down here now", and Jeff and Kerri immediately grabbed their coats and left. I was standing right by the front door as they left, and as long as I live I will never forget the look on Kerri's face. The party broke up shortly after they left as we all contemplated what was likely to happen that night. Thankfully, Sarah made it through that night and a number of others like that before something both terrible and wonderful happened – another infant died.

I feel like a monster for even using the word "wonderful" in a sentence describing the most painful thing that could happen to a parent. But on what must have been the worst day of their lives, the parents of the child who lost his life (all Cindy knows about him is that he was a ten-pound baby boy) made a decision that saved Sarah's – they agreed to allow their child's organs to be harvested for transplant. Sarah was flown from Toronto to Children's Hospital at the University of Western Ontario in London and at the age of 5 months 24 days, she received a new stomach, pancreas, liver, and bowel. In addition, both her gall bladder and spleen were removed. The date of the operation was August 7, 1997, a day that Sarah and her family and friends still celebrate as "Life Day".

The transplant saved Sarah's life, but it hasn't all been roses since then. She spent the next five months in the hospital in London before finally coming home for the first time at the age of ten months, and to this day returns to the hospital regularly for treatment and checkups. Transplants are funny – the body can live with a transplanted organ for years, even decades, and then suddenly decide that it's a foreign body and needs to get rid of it. As a result, Sarah has to take several different kinds of medication every day to avoid rejection, and will for the rest of her life. The medication has serious side-effects as well. She never crawled as a baby because she simply didn't have the strength and needed help on stairs until the age of four or five. Sarah is a full foot shorter than her cousin Rachel (who is younger by four months), and despite being twelve years old, she weighs less than 60 pounds. She has very thin arms and legs with little muscle. She loves to dance and has been taking dance classes for years, partially because she enjoys it and partially to help her build up her strength.

Not only did the operation save Sarah's life, but it was special in a number of other ways as well – it was the first pediatric multi-organ transplant in Canada, and only the second ever with those four organs. Sarah became the youngest multi-organ transplant recipient in history, and has a certificate from the Guinness World Record people to prove it.

Sarah and her brother Austin Despite all the hardships she's had to deal with, the surgeries, the medication, the procedures she still has to have done every day, all the trips to the hospital in London (did I mention that she lives in Cobourg, about 300km away from London?), Sarah remains a happy, bubbly, delightful little girl. She doesn't have the physical strength to do things that other kids do, even some much younger than her, but I have never once heard her complain about it. Now don't get me wrong, she gets grumpy now and again like any other kid. And Cindy has probably heard her complain on numerous occasions, but note that I said "I've never heard her complain". Seriously though, Sarah is almost always smiling, she loves having her picture taken, she adores her baby brother Austin, and she's just always fun to be around. She's spoken at public events about her experiences, and has been interviewed for a number of magazines. You may remember a Wal-Mart TV commercial a couple of years ago, where a number of people said "I was one", "one" being a child whose life was saved at children's hospitals. The little girl at the end who whispered "I am one" was Sarah.

Like all of my friends who know Sarah, Gail and I have signed our organ donor cards and quite honestly, other than having religious beliefs prohibiting it, I cannot think of one compelling reason not to. If Sarah had not had her transplant, she would almost certainly have died within a year of her birth, and those of us who have gotten to know and love her over the last twelve years would have been deprived of that. I signed my donor card so that I might be able to help others have a similar experience. Please sign yours.