Personal

Been a while! Friday, June 30, 2006

Zabeth and I are off to Chicago for a friend’s wedding, which means Shirt Pocket support is going to be a bit slow until the 5th: sorry to all those who are waiting more than a few minutes for answers…

This is actually the first time in nearly two years that Z and I have been able to go anywhere together. Z’s Vet School obligations and my own business get in the way, of course, but—for the most part—our fuzzy family member Ketzl has been the constraint: taking care of her is just too much to ask of anyone.

Zabeth’s classmate Lee, though, was kind enough to take her for a few days while we’re gone, and since this isn’t an entirely frivolous trip, we’re off. Lee has really gone well beyond the call of duty here, and we’re truly grateful to her and her boyfriend for their willingness to help us out—if they’re reading this, thanks! I hope we can make it up to you somehow.

Wish us, Lee, and Ketzl luck! grin

Small World Friday, June 23, 2006

A few weeks ago, Zabeth and I were sitting with Ketzl the evening after her last physical therapy appointment.

The session at Sterling Impression hadn’t gone well. As Ketzl has declined, we’ve adjusted her exercises, switching from treadmill to pool, eliminating e-stim when it no longer proved beneficial, etc.

As I’ve mentioned before, her decline has accelerated in the past few weeks, and she’s lost nearly all movement in her front legs now (her rear legs have been gone for a year or more). Given the amount of muscle wasting, we’d tried to adjust her life jacket and buoyancy to keep her head above water, supporting her as she did her laps.

She usually attacks the pool with enthusiasm, but this time was different. I don’t know if it was the person in the pool with her, or the life jacket, or that she didn’t feel that she could swim at all. Whatever it was, she was terrified. Wild-eyed, in full panic, doing her best to let me know. We quickly took her out of the pool, made some adjustments and managed to finish her swim session, distracting her with cookies, trying to finish it on a happy note.

But it was clear that swimming was no longer fun: it had crossed from rewarding work to a threat. I can’t bear to put her through it again, to see her so afraid, and so that phase is over.

Z and I talked about that and the things that brought her joy. Swimming was one of her happiest activities, one of the few independent ones she had left. And now, even that has been taken from her.

Her world—once filled with wonder and delight, with swimming and running, rolling and digging, the sights and smells of her dog playmates and other people—has shrunk again.

And still she holds her head up, and meets my gaze with her deep brown eyes, a flicker of defiance lighting them from within.

When does her world become too small to contain her huge spirit?

Memory Sunday, May 28, 2006

Long term diseases—Ketzl, at 9, has had DM for 3 years, a third of her life—are tough on memory. Tough because now is so much more vivid than then. And when I remember Ketzl after her battle is finally over, I don’t want to forget the dog she was.

It’s been well over a year since Ketzl’s disease forced her into a wheelchair, and even that is coming to the end of its useful life. The progression seems to have reached a critical mass, and while just a month or so ago I mentioned Ketzl was having placement problems with her left front paw, the right has now succumbed as well.

But it wasn’t that long ago—just a few years—when Ketzl was a dog who loved—just loved—to run.

Ketzl and I would walk daily around town, sometimes at 80 Acres (Cat Rock Park), some conservation land a stone’s throw from my house, and sometimes around the Weston Reservoir.

As long as it wasn’t too hot, she’d attack the trail with enthusiasm, especially since she knew she’d get to wade in a pond, stream or pool somewhere along the way.

Half way around was always a good place to take a rest and dry off from the swim.

And, near the end, she’d race me to the end of the trail… and would always win.

Neither Ketzl nor I are good long-distance runners, but we loved sprinting together, dashing to the next interesting thing on the trail, or to the top of the next rise.

One of my very fondest memories of her comes after her second TPLO, near the end of 2001. Recovery complete, we finally were able to take our daily walks again. After the repair of a cruciate tear, you always wonder how much athletic function a dog will get back, so I was a bit nervous as we hit the trail and climbed our usual hill.

Ketzl did great going up, and after the crest, as we came down the other side, she gave me “the look” (see picture #2 above) at one of the places we’d always sprint—the look that said “I am so going to kick your ass again”. Challenge met, we set off at top speed, avoiding roots and rocks, curling around trees, pretty much neck and neck.

The trail forked slightly and, to avoid a downed tree, I took our usual left branch. Ketzl, though, had other ideas. A burst of speed and then—Oh!—she leapt up, over, and broke into the clearing ahead. I was flabbergasted. I’d never seen her do anything that before, ever… and waiting there in the grass, she looked at me as if it was nothing.

And that’s how I want to remember her: not now, near the end, with her body failing her, but then—at the peak of her physical ability—in mid leap, stretched out and soaring over that tree, ears back, finally able to fly.

My Robots Monday, May 15, 2006

When I was a kid, I used a bunch of string, clothespins and pulleys to rig up a gizmo that was supposed to automatically make my bed for me. The idea—which I think I got out of a book (Thanks, Jake!)—was to attach the string to the top of the sheet and blanket, then use pulleys to run it to the edge of the headboard. You then route the string to the bottom of the bed, et voilá: pull the strings in the morning, and your bed’s made!

Except it didn’t really work out that way. Not only did I get tied up in the strings (quite lucky I didn’t strangle myself), but honking the strings didn’t really make my bed. It just sort of pulled the sheet up. Definitely not the hardest part of a properly made bed.

It was an interesting try, though, and a learning experience: automation isn’t easy. It’s relatively easy to get some crude part of the activity done, but the devil’s in the details.

I think a lot of my interest in this stuff was sparked by William Pene du Bois’ book The Twenty-One Balloons (or Roald Dahl’s Charlie and the Chocolate Factory/Charlie and the Great Glass Elevator—or maybe even that great story There Will Come Soft Rains by Ray Bradbury), but whatever it was I’m fascinated by the concept of “automatic houses”, and always wondered if I’d live to see the day when household chores would be done with the push of a button, a glass of scotch, and a comfy chair.

I was pretty excited when Roomba came out a few years ago: they were clearly onto something, were paying attention to price points, and had extensive experience making more expensive robots for commercial and military use. Many improvements were made to their later generations, too, and they’ve now introduced a mop replacement, Scooba.

In parallel—or even before—Sweden’s Electrolux was working on their own robotic vacuum, which they presented to the world back in 1997. They released their first version—the Trilobite—in 2002 or so, followed by a significantly updated US version (also the Trilobite) in 2004, and Trilobite 2.0 in Europe at around the same time. Unlike iRobot, Electrolux wasn’t trying to hit a low price point; for them, the Trilobite is a technology showcase—and an example at what can be done with a mass-produced consumer product at the high end. (Dyson was working on something similar called the DC06, but abandoned the product, at least publicly, for performance reasons; other models, such as the Karcher are out as well, but I have no direct experience with them.)

It’s important to note that none of the robotic vacuums are going to Rosie-up your house. You will still have to use a regular vacuum every so often to do a deeper cleaning; if you dump a box of Quisp on the floor, they’re not going to dash out of their hole, clean it up, and run back. Instead, they’re intended to be used on a regular basis, doing general cleaning in between the times when you use a larger vacuum.

With those expectations in mind, here’s a comparison of the two. (I think this one of the longest posts I’ve written for this blog: sorry if it’s kinda boring, but I’m interested in this stuff.)

Roomba Scheduler - General Description
The Roomba Scheduler is iRobot’s current top-of-the-line model, with a street price of about $300 new. It’s quite similar to their “Discovery” model (priced $50 less), but—as the name implies—it can be scheduled to run automatically as desired.

Both the Scheduler and Discovery come with a docking station that charges the unit, and both will return to the charger at the end of their cleaning cycle.

It’s probably inaccurate to call the iRobot models “vacuums”. While they do have a small vacuum motor in them, their cleaning process is clearly patterned on a “floor and carpet sweeper” such as the Hoky or—given the spinning edge bush—the Leifheit Rotaro S. (There’s a thin, rotating “edge brush” at the front right that sweeps edge dirt toward the main brushes, much like the Leifheit.)

The Scheduler comes with an easily replaced NiMH battery pack, charger, two “virtual walls”, and various spares.

Overall, you can definitely tell Roomba units have been extensively cost reduced. The plastics, rubber, buttons etc are of reasonable but definitely not “high” quality. In the time I’ve had a Roomba, I’ve had to replace it twice due to failure. One failure was within three days of receipt, the other within a few months. Clearly, Roombas are not built to last, but they do come with a one year warranty. It takes a few weeks to get a replacement robot, should you need one. And, if you use a Roomba, you’ll probably need one.

Electrolux Trilobite (US Version - EL520A) - General Description
The US Trilobite EL520A is the only Trilobite available in this country, and streets as low as $1300. It cannot be scheduled automatically, but once turned on, it calculates the size of a room, and varies its cleaning time depending on what it finds.

Like the Roomba Scheduler, the Trilobite comes with a docking station that is placed along a wall, and the vacuum will return to the charger as needed. Unlike the Roomba, if the Trilobite runs out of juice in the middle of a cleaning cycle it will return to the charger and resume cleaning once full.

As you’d expect from Electrolux, the Trilobite has a real, rather strong (90W) vacuum, and relies on that—along with a beater bar with rubberized fins—for its cleaning.

The Trilobite comes with two internal NiMH battery packs (it switches between them automatically during operation), spare filters, and magnetic strips that can be used to prevent the robot from crossing room boundaries.

As mentioned above, Electrolux has released a new Trilobite in Europe—Trilobite 2.0 [ZA2]. The US model seems to have many, but not all, of the changes incorporated in 2.0—it’s more like Trilobite 1.8. Most notably, it has the redesigned fan, improved sensors, beater bar and the like. However, it lacks automatic scheduling and does not adjust its cleaning time based on the number of obstacles it encounters during the cleaning process. There may be other significant differences as well - there are reportedly over 200 changes from 1.0 to 2.0. I’ve tried to get more information from Electrolux without much success.

The Electrolux unit itself is beautifully manufactured. The plastics are of high quality, the industrial design—which resembles a horseshoe crab crossed with a trilobite—is witty and elegant. I’ve experienced no failures with my unit so far.

Roomba Scheduler - Operation
The Scheduler’s UI simple and easy to use: a power button and three operation mode buttons. The modes are:

  • Spot - Spot cleaning moves around in a rough circle, and is designed to clean a dirt spot quickly
  • Clean - Clean spends about an hour traversing the room, then returns to the dock
  • Max - Max cleaning works like clean, but runs until the battery runs out
Any errors are communicated with flashing lights and “beep codes” that indicate the problem area. The unit also communicates effectively with “happy”, “sad” and “what have I gotten myself into” sounds that are witty and helpful.

Roomba primarily uses a front “bump” sensor to detect obstacles. On its right side, it has an infrared sensor that detects walls, and under the bump sensor’s lip it has a series of infrared sensors that detect stairs and other drops. Two wide, nubby, independently powered wheels with black rubber covers move the Discovery from place to place. A small vacuum is integrated into the rear dustbin

The Roomba seems to have a few basic behaviors: wall following, crossing the room diagonally, spiraling and various obstacle avoidance maneuvers. The robot usually starts with a spiral. When it encounters an obstacle (with its bump or stair sensors), it either “bounces” off diagonally, tries to go “around” it (if a chair leg or the like), or tracks it (a wall or corner).

In Clean and Max modes, the Roomba’s “dirt detector” notices when there’s over a certain amount of particulate matter passing some built-in sensors. When this occurs, the vacuum spends extra time circling that area.

These behaviors are mixed randomly. Due to the random element and careful basic behavior choices, most surfaces are covered during the cleaning period.

When it comes time to dock, the Roomba doesn’t seem to actively “seek” its dock. Instead, it continues its regular behavior until it intersects the IR beam emanating from the dock. When it finds that signal, it follows it until it reaches the charging base.

Electrolux Trilobite - Operation
The Trilobite has a small, graphical LCD screen that displays its UI. It also has four buttons: Power, Stop, a navigation button and a “Yes” button. It has three main cleaning modes:

  • Normal - Normal mode measures the room size and calculates the amount of time necessary to clean it
  • Quick - Quick skips the measurement phase and moves directly into a fixed-time cleaning mode
  • Spot - Spot cleans a 10x10 area centered around the initial location
Other menu entries allow the fixed cleaning time and display language to be set. Any errors are displayed in the selected language on the LCD. Overall status is also communicated with various tunes much like the Roomba.

A large dustbin with a substantial filter is easily accessed under the top cover, which is released by a button at the rear of the unit. There’s a bump sensor at the front, but the Trilobite primarily uses its eight ultrasonic sensors, four pointing at about a 45 degree angle up, and four pointing out, to sense its environment. There are three additional infrared sensors on the bottom bumper, and additional sensors under its front lip. Two independently powered, narrow but large diameter wheels with clear urethane covers move it from place to place.

Like the Roomba, the Trilobite has a number of basic behaviors it combines during the cleaning process. In normal mode, it first uses a counter-clockwise wall-following to determine the size of the room. Once it re-encounters its dock, it moves into a cleaning mode.

In cleaning mode, the Trilobite makes diagonal runs, avoiding obstacles and changing speed and behavior depending on what it detects in the room. For example, if it encounters something it considers to be living (like a dog), it quickly “leaps back” to avoid it. If it approaches a “hard” object, it slows as it approaches, stops a fraction of an inch from its surface, and goes around. Steps are detected and avoided as expected.

Interestingly, the upward-facing ultrasonic sensors are used to detect when the Trilobite is under an object, like a bed. The sensors detect the boundaries of the object, and the vacuum uses that to ensure sufficient time is spent cleaning under it.

As with the Roomba, the Trilobite doesn’t really know where it has and hasn’t been, and it relies on a certain amount of randomness and time to ensure it’s covered the surface to be cleaned.

Docking behavior uses the wall-following technique, and moves in a counter-clockwise direction around the room until it encounters the dock. If the battery is depleted during a cleaning cycle, the Trilobite will locate its dock, charge, undock and complete the cycle.

Cleaning and clean-up
Overall, the Roomba and Trilobite do a pretty similar job cleaning a room. Neither “deep cleans” like a powerful vacuum with a beater bar (although the Trilobite gives it a try), but both manage to tidy things up nicely, rarely leaving a “missed” area.

Edging Performance
The Roomba definitely does a better job cleaning edges than the Trilobite. Part of this is due to the Roomba’s “edge brush”, which sweeps fluff and the like into the main brush’s path. But it’s also due to the fact that the Roomba bashes into edges, and doesn’t attempt to avoid contact with them. Although this does allow it to get closer to the wall, it has its downsides: my Roomba’s bumper is often smudged with paint it’s scraped off a baseboard or wall bottom, and this tendency isn’t helped by the sharp mold line on the bumper that’s right at the primary contact point. Should a wall be followed on the Roomba’s left, rather than its right (where the IR sensor is), near constant contact is made along the entire length of the wall.

The Trilobite does a reasonable job with edges (it makes a full, “edging” pass of the entire room during the measurement phase), but does not get as close—there’s probably 1/2” at the very edge that’s not directly cleaned.

Room Preparation
With the Roomba, it’s absolutely critical that all cords and delicate objects be moved before the cleaning takes place. All Roomba units are hungry for string, electrical cords, speaker wire and carpet fringe. Unfortunately, these items just don’t agree with its sensitive digestion and quickly get sucked in and tangled around the edge brush, main brush or rubber roller. When this happens, it plays a sad, sad song to apologize for the appliance it pulled onto the floor. It didn’t mean to be bad—it was just made that way!

The Trilobite, on the other hand, deals with most items—cords, fringe, even small objects—with aplomb. You wouldn’t want to leave a pile of papers or a magazine on the ground—both units will “read” them into bits—but a generally tidy room is easily handled by the Trilobite without any special care.

Both units have a way of preventing the robot from leaving a given area. The Roomba comes with two “virtual walls” that broadcast an infrared beam that the device detects and won’t cross. The Trilobite comes with a magnetic strip that can be temporarily or permanently installed that accomplishes the same thing.

I’ve found it’s far more important to “block” the Roomba into a space than it is to do so with the Trilobite. If the Roomba leaves a single room area, it’s unlikely to make it back to its dock, and will not clean the space effectively. Not so with the Trilobite: in our open plan house, the Trilobite can be switched on and will clean our lower level in one go, including entering the kitchen area, living space, reading area and the like. It needs to charge at the midpoint or so, but it does accomplish the task.

After Cleaning - Robot Needs Help!
In an ideal world, a robot vacuum wouldn’t just automatically top up its power tank—it’d empty its dust bin and take out the trash. Alas, this task is left to you, and there’s a pretty significant difference between the two units, especially if you have a pet with long hair (example: Ketzl, our Bernese Mountain Dog).

Dust Bins
The “dust bins” of both units are easy to remove. Roomba’s rear-mounted bin is designed in a “floor sweeper” kind of way, and it’s hard to avoid dumping fine dust and dirt on the floor when removing it. Once done, it’s easy to shake out particulate matter: you then disassemble part of the lower area where lint gathers by the vacuum filter. The Roomba’s bin isn’t very large, and should be emptied on a regular basis—if you’ve scheduled it to vacuum daily, I’d suggest checking it every few days, depending on the environment.

Trilobite has a large (1.2 Qt) sealed, plastic bin. Dust does not escape from it when it’s disconnected from the main unit: a flap closes over the intake, and the other end is covered by a microfiber filter that’s held closed by a magnetic cover: once open, dirt, fluff, etc is easily shaken into the trash. The 1/2” thick filter traps fine dust and should be replaced when necessary (as with most normal vacuums). The Trilobite automatically signals when the bin is full.

Brushes
Roomba’s brush mechanism must be disassembled and cleaned on a regular basis, and—in the “dog” case—gets seriously bound up with hair. The hair wraps itself around the brush, bearings and rubber bar, and requires a significant amount of time to cut, pull and remove.

Although newer models are easily disassembled (early Roombas required a screwdriver), hair can—and does—tie itself around the bushing on one side of the brush and bar, and—when present in sufficient quantity it’ll literally cause the plastic bearing cover to melt, deform and destroy itself. No doubt this is a known problem: a spare brush is supplied with the unit, as is a Roomba “cleaning tool” that has a razor blade and probe that makes the cleaning process easier. Even with that, it can take 20 minutes to clean the Roomba after it’s spent an hour vacuuming a room.

The Trilobite—since it relies primarily on its vacuum, rather than a brush—doesn’t have the same hair problem. Its bar occasionally gets a small amount of hair around it, but it’s made of aluminum (with urethane-looking fins) and doesn’t self-destruct. It’s easily cleaned when it needs to be, which isn’t very often.

Summary
The Roomba and Trilobite achieve their design goals in a broad sense: they automatically vacuum a room, and do a pretty good job of it. But a closer look reveals design differences and compromises that seriously impact the long term “live-with-it” factor that one must deal with after the initial “cool!” factor wears off.

Both are fascinating to watch do their thing, the Trilobite more so due to the intelligent behaviors it exhibits and the mechanical grace it shows in its movements (watching it carefully pick its way out of a jam, climb up onto a rug, pay special attention to under a bed, dock or follow a complex perimiter really shows what a good job Electrolux’s programmers did). The Roomba feels far more brute force as it bashes its way around the room at full speed (despite the fact that both devices rely on random-walk base behavior), but does an good job despite its lack of finesse.

It’s hard to emphasize this kind of thing enough, though. The more elegant approach of the Trilobite is a big advantage i. With the Roomba, as you watch it, you’re amazed it managed to do what it does at all. With the Trilobite, you’re surprised how well, cleverly, and carefully it performs its task. (This has its downside, too—expectations are very high given the overall “quality” impression and high price: when the Trilobite screws up, it’s harder to understand/forgive its failing. Maybe it needs to play a sadder song.)

At $300 for the top of the line model, Roomba is much, much more affordable, and its scheduling capability is handy (though not as handy as it could be with a larger, less messy bin). In a small, easily-blocked off, cord-free room without fringed rugs or hair, and rugged surroundings that don’t mind extensive “bump” contact, it does a good job. If you stay on top of its maintenance challenges—a significant timesink if you have a long-haired pet—it’ll serve its purpose admirably, although I have serious concerns about its longer term durability.

For me, though, the Trilobite is the clear winner. Its “no contact” approach works much better in most areas in my house, and its general charging and cleaning behaviors are better suited to an open plan space. It’s “vacuum-based” operation requires far less setup and maintenance with a pet in residence, and in that—and its overall elegance—it proves to be something that can be “lived with”, long term, with minimal compromise.

Hoarse-ing around Thursday, May 04, 2006

Despite being down and mostly out with a cold/flu, I’ll be appearing on The Tech Night Owl LIVE tonight, May 4th, talking about SuperDuper!, netTunes, launchTunes, and desperately trying to not cough up a chunk of lung.

You can tune into the broadcast from 6:00 to 8:00 PM Pacific, 9:00 to 11:00 PM Eastern, at http://www.techbroadcasting.com. An archive of the show will be available for downloading and listening within four hours after the original broadcast.

You can also access the show’s Podcast feed, available at: http://www.techbroadcasting.com/nightowl.xml.

We all scream Sunday, April 30, 2006

And in that spring moment, after the long walk down the hill,

There was nothing but the cool, sweet ice cream

And the wonderful, gloriously crunchy cone.

Counterbalance Friday, April 21, 2006

Yesterday, Ketzl and I took the drive out to Shelburne Falls and visited the nice people at Eddie’s Wheels. And while it was good to say “Hi” to them, the main purpose was to get K’s cart retrofitted.

Her previous cart was a “neutral balance” cart—that is, when she’s in it, her front legs get the weight they’d usually get. But, as the disease has progressed over the winter, her front has become much weaker, and we’ve had to hold the cart’s “yoke”, pulling up to help take weight off. It’s hard to do, and none too comfortable for Ketzl.

The newly retrofitted cart is a fully counterbalanced cart with an “outrigger”—basically, front “training wheels” that let her take even more weight off, and also prevent her from collapsing, something that’s become more frequent. And, as of a few weeks ago, Ketzl started having placement problems with her front left paw—she’ll knuckle, put it down funny… basically, the disease has destroyed sufficient nerve tissue there that she doesn’t quite know where it is.

It was a beautiful day yesterday, sunny and clear. On the way back, driving along Mohawk Trail (Rt 2), I stopped and climbed the “Long View” tower to see what I could see. Rolling hills, roads crisscrossing, river valley, the French King bridge towering over the Connecticut River gorge below. The whole route before me, my next two hours clearly visible in the midday sun.

When I got back in the car and set off, I thought about Degenerative Myelopathy, and how—once diagnosed—the course is similarly visible: a high-level view of weakness, placement issues, paralysis, death. You navigate through it as best you can, take a detour or two along the way, but to get to where you’re going you have to go down the whole road.

Back on Route 2, up to speed after the rotaries and dropped lane diversions, I rolled down the windows. Ketzl’s ears flapped in the breeze and she panted happily. I poked my head out the driver’s side window and breathed in the spring air.

Ketzl on TV! Monday, April 17, 2006

This coming Saturday at 7:30 am on Boston’s Fox 25 (repeating on the 23rd at 8 am), Pet Keeping with Marc Morrone (check your local listings) is doing a piece on animal rehabilitation. I’ve been told that Ketzl is going to be featured during the segment, so—if you’re interesting in this kind of thing, this is the kind of thing you’d be interested in.

MCE Experience vs. Comcast DVR Saturday, March 18, 2006

I was reading Wil Shipley’s recent post about his horrible Comcast DVR experience, which has some kind of Microsoft DVR software on it, and it amazed me how lousy it was, compared to my Sony VGX-XL1 Media Center PC.

I know Microsoft is a big company, but it sounds like the DVR division (if, indeed, they provided the software he was using) not only hasn’t talked to the Media Center team, they haven’t even looked at Media Center. Because MCE doesn’t have any of these problems. (Which isn’t to say it’s perfect, but it’s positively shiny in comparison to what Wil describes.)

I’ve been avoiding anything but analog cable because of exactly this kind of issue—I just don’t want to be forced to take Comcast’s lousy box. The Vista version of MCE, with CableCard support, can’t come soon enough.

Unexpected birthday Thursday, March 16, 2006

Well, today—March 16th, 2006—is Ketzl’s 9th birthday.

It’s a milestone I really never thought Ketzl would reach, but I suppose I shouldn’t be so pessimistic: I didn’t think she’d make it through to last spring, nor this calendar year, but she keeps surprising me.


Surprise is one of those things dogs deal with a lot better than we do. Dogs who lose limbs wake from their amputation, try to stand, look mildly surprised and then adjust. Just like that.

When she first got her wheelchair, Ketzl was a little surprised, but delighted that she could walk again, on her own. Seconds later, no surprise at all. It’s just one of those things.

The first time she fell over because her back and front legs were too weak to keep her upright: surprised. Seconds later, she looked at me in a way that clearly said “C’mon, Dave. You saw I was going to fall. Get with it!”

Me, I’m surprised every day I wake and she’s still there with us. But mostly, I’m surprised by how deeply I care.

Page 7 of 10 pages « First  <  5 6 7 8 9 >  Last »