XSL to get text from Apple Pages documents

Pages is the name of Apple’s basic word processor program that comes with their iWork suite of applications. It’s not a bad program, but a number of months ago I needed to switch up to MS Word for the Mac.

Well, this morning I was looking through some old files and found a text document I wanted to print that I had done using Pages. Unfortunately, I had removed iWork from my Mac, so I no longer had the software to open the Pages document.

After a cursory search on the Internet for a program that would let me open Pages docs without having the program itself, I came up empty-handed.

So, I inspected the Pages document and realized it was a package. (Right click on the document icon and Show Package Contents.) The package contained an index.xml.gz file, which I unzipped and found within the body of my document amidst a whole bunch of XML code.

I momentarily considered reconstructing the text in TextWrangler, but thought it might be fun to write an XSLT file to do the work.

Please note that this is a 1st draft meant to retrieve the text from my document. It will not handle anything fancy, just text. Plus, it will only try to make each chunk of text into a plain-text paragraph in HTML, suitable for copying and pasting out of a browser window. Use at your own risk. 🙂

Ok, here’s the textFromPages.xsl file.

Others may take this initial XSL file and do what they will with it. I hope that if you take this and make it better, you’ll comment on this post to let me (and others) know.

To have it be useful to you, you’ll need to know how to apply an XSL transformation to a source XML file (specifically the index.xml from Pages).

Hint: Firefox will do the transformation for you if you include the proper xml-stylesheet directive right after the XML prologue in the source XML file. It looks like this: <?xml-stylesheet href="textFromPages.xsl" type="text/xsl" ?>

Pistol match, Oct 20, 2009: the good and the bad

Last night after work I drove up to Bay City to Duncan’s Outdoors Shop to compete in a pistol league match. It’s the second one I’ve made it to, and shot some of my best…and worst scores.

National Match Course 1 Total
SF TF RF
95 91-2X 93-1X 279-3X
National Match Course 2 Total
SF TF RF
86 99-3X 92-2X 277-5X

Starting with a 95 was great. It’s been a long time since I’ve fired a 95 on a slow fire target. Maybe 10 years. There were 5 tens and 5 nines, which speaks to the consistency of the group.

As to what I did to bring about that score, all I can think of is that for each shot, I:

  • took some good deep breaths to counter a little match pressure I was feeling
  • closed my eyes, tipped my head up, and visualized what I wanted to see in the sight picture
  • during visualization, also mentally reminded myself on the grip (middle and ring fingers pushing towards me, thumb pushing towards target)

After that great target, I completely fell apart and shot a 91 in a timed fire! Yikes. I probably average a 97 in timed fires, and don’t have a record since I’ve been keeping track in June of shooting a timed fire target that low. Same story on the 92 rapid fire.

So why the low sustained fire scores? Lack of recent match experience. When I’ve been out to the range this past summer, my practices haven’t really included range commands with enforced 10 or 20 second strings.

Basically, I seem to have no confidence in my ability to know how much time I have for timed or rapid fires. I can’t think of a way to remedy this except to practice with enforced times.

So, I ordered a refurbished iPod shuffle and I’ll record range commands onto it (I already have them in iTunes) so I can play those commands to myself when I go out for practice.

Bing delivers surprising amount of traffic to rangelistings.com

One of my hobby sites is rangelistings.com, a site with the goal of providing a map of each state with the locations of shooting ranges on it. I keep an eye on the web traffic pretty regularly, and about 90% of the traffic it receives is from search engines.

Up till the last couple of weeks search engine generated traffic to the site has been 80 to 90 percent from Google’s search. Over the last month, overall traffic has increased from around 60 visits per day to around 90 per day. Where does it come from? Well, still search engines primarily, and traffic from Google has increased noticeably during this time.

However, to my surprise, Bing is also making a surprisingly strong showing. Click on the chart below to view the details.

(Click on the image to view a larger version.) Traffic to rangelistings.com from the search engine Bing is suddenly showing at almost 30%.
(Click on the image to view a larger version.) Chart of traffic sources for rangelistings.com from Oct 1 to Oct 16, 2009. The search engine Bing is suddenly showing at almost 30%.

A Walk in Ringwood Forest

Lila and Eva pausing for a photo on the way into Ringwood Forest, near St Charles, MI.
Lila and Eva pausing for a photo on the way into Ringwood Forest, near St Charles, MI.

We spent about 2 hours in Ringwood Forest yesterday.

Lila and Eva carried sticks to fight off the evil fairies and demons that inhabited the woods. You could tell they were attacking when the wind moaned through the treetops and yellow leaves swooped down to us.

Luckily, we made it back to the car.

How to aim with iron or open sights

A guy in his 50s a few benches to my right was thumbing .40 cal cartridges into a pistol magazine.

He had arrived when I was about to box up my gear and head home. But, I had seven rounds of .22 leftover, so instead of letting them roll around in my gun box, I loaded them into a magazine. I already had 10 shots in my paper target at 25 yards, so instead of causing problems with scoring that target, I decided to find something else to shoot at.

I rotated slightly to my right, raised my right arm, and lined up my iron sights on a 12-inch diameter steel disc about 125 yards away. It was painted yellow. As I steadied my breath, I raised my Ruger Mk II pistol a little to account for the bullet’s drop at this longer distance, and let off the first shot.

I was pleased to hear the distant ding of the hit against the steel plate. I released the remaining six shots and they each dinged off the plate. I was pleased, but, frankly, surprised. That was a fair dose of luck.

I packed up my guns, and let the the older man know that the line was safe for him to go down range.

I could tell he was curious where the dinging noises had come from. He was scanning the range right in front of us, but there was nothing metallic there.

“So, what were you shooting at just now?” he asked.

“See that yellow disc out there?” I pointed to the steel plate hanging at the 100 yard line.

He was incredulous, except that he had witnessed it. I felt fortunate that I was packing up and wouldn’t be pressured to repeat it, but, hey, why let on.

It turned out that he was a federal agent from downstate on vacation. I was pleased that a federal cop from downstate would have an appreciation for how a kid from the Upper Peninsula can handle a pistol. Strange vanities.

That was about twelve years ago, and while I don’t shoot as much now as I did then, I still appreciate the look of a good sight picture.

Aiming is one of the fundamentals of good shooting, right? But there is actually a lot of complexity to talking about it. There are many different kinds of sights, and some are electronic like red-dot scopes or laser sights. Those have the benefit of being completely obvious on how to use. Put the dot on the spot you want your shot to land. That’s all there is to it.

But for those without a dot, knowing your iron sights is pretty crucial.

I shot a dot-scope for a few years, but gave that up and went back to open sights on my pistols. I like them, and I like that it takes more practice and discipline to use them.

So, here’s what I know about shooting with iron sights.

The fundamentals are that you have a front sight, probably a block or a post, that makes an “I” shape and a notched rear sight that makes a “U” shape. You put the front sight right in the middle of the notch of the rear sight. The tops of the front and rear sights should line up perfectly, and the front sight should have the same amount of space within the rear sights to the left and right.

Proper sight alignment has the front sight in focus and rear sights slightly blurred.
Good sight alignment: Front sight in focus, rear sights slightly blurred. Focus on the front sight, not the target.

When you aim, you focus all your attention on the front sight, observing it’s alignment with the rear sight. The rear sight should be slightly blurred, but the front sight should be crystal clear. Study it. Meditate upon it. Let everything else vanish.

The front sight on my Clark .45 has a slight ding on the top right corner, and when the sun shines at a certain angle, it stands out to me. These are things that you only appreciate if you find yourself studying the geometry of a front sight for long enough. It’s a good thing.

Please note that I have not spoken about the target. If you find yourself looking at the target, you are probably not going to fire a good shot. This is the counter-intuitive part about aiming: in order to hit your target, you must not look at it. It is the front sight and its alignment with the rear sights that should have your attention.

Of course, as you acquire your sight picture, you will probably need to glance at the target in order to line up the sights in the first place, but once you have that, forget it and focus on the front sight.

Focus on the front sight.

Update: May 3, 2010

Here’s a nice image of a variety of types of open sights with a legend. This image does not show the rear sights and target blurred like they would be to your eye, but it’s still a nice resource.

Update: January 10, 2014

The illustration and ideas in this blog post have been included, with permission, on page 59 in a recently published book by Andrew Smotzer, Guns for Personal and Home Protection. Thanks Andy, and congratulations on the new book!

Update: October 21, 2016

This 12-minute video from Chris Sajnog is perhaps the best thing you can watch to understand what it means to focus on the front sight.

Many stories in user experience

I just watched this TED talk, “Chimamanda Adichie: The danger of a single story.”

Please, take the 18 minutes to watch it, then continue to read.

Watching this talk brought to mind two thoughts related to user experience work.

First, in a recent edition of Interactions magazine there is an article “Stories that inspire action” by Gary Hirsch and Brad Robertson, that has planted the desire in me to uncover the stories of the company I work for, Covenant Eyes. There are so many ideas we have of ourselves, set by the expectations of management, employees, and so forth. But there are also stories of our customers, and by telling many of these stories, I suspect we will hear some stark contrasts that will cause us to reckon with ourselves.

Have we stereotyped our corporate self?

The second thought is in regards to personas. At Covenant Eyes, my colleague Jackie has taken the lead on creating a set of personas that we can use during our design and development work. This is a first for us. This week as we were reviewing the current set of about 16 personas, we were working on writing in various scenarios for each persona. I think the point of each scenario is to enrich the story of that persona.

But perhaps more important is that across the full set of personas, however large it may get, that we have properly balanced the stories that are represented by each persona. I think, at its root, that is part of why personas are valuable in the first place. To challenge the stereotype, the single story, that we might have in development about our “user.” These personas will be valuable if they can help us tell the many stories of our customers and users.

A Sad Tale of Pagination

I imagine some professional chefs are accused of over-analyzing a bowl of soup now and then. Like that, as a user experience designer, I get caught up in little pieces of user interface on a regular basis.

This particular story concerns a navigation system that utilizes pagination in what at first seems an obvious choice, but upon observation it is clear that this is a very poor approach.

Background: Company setting

Covenant Eyes, Inc., is an  8 year old software company in Michigan with about 50 employees. About a dozen are customer service representatives, some for enterprise customers and some for individual or family accounts. There are about 10 in the IT team, which includes myself.

Background: What service does our company provide? Internet accountability.

Take 2 actors, George and his friend Paul. George is addicted to online porn, but he really wants to beat his addiction because he feels it is wrong and could really mess up his life. To attack his problem, George installs our software on his computer. The software keeps tabs on George’s activity, and once a week sends a report of that activity over to Paul. Paul can then talk with George about George’s Internet activity. It seems simple, but removing the anonymity of his addiction is powerful.

The point, in a nutshell, is accountability. If George is trying to kick some bad online habits, his friend Paul now has information in these reports that he can use to hold George accountable.

The current design calls for pagination

These Accountability Reports are like executive summaries that include links over to what we call the “Detailed Logs.” This log is a full list of URLs that George visited.

Depending on the amount of activity, the log may have thousands of entries for Paul to navigate.

When these logs first became available, customers’ download speeds were more of an issue than they are today, so the developers knew that they could not simply put all the entries on a single page because the pages would take far too long to load.

Pagination to the rescue! The developers broke up the long list of URLs into pages, each page having 50 URLs. To help Paul navigate this long series of pages, numbered page links and “Previous” and “Next” links were placed at the top and bottom of each page.

So, let’s say Paul is looking at page 50. He would see something like the pagination navigation shown in Figure 1.

Figure 1: Pagination
Figure 1: Pagination

This seems a good approach on two fronts.

  1. Paul won’t wait to download one page with over 8,000 URLs on it, but if we divide that time into, in this case, 165 separate downloads, each page will seem pretty quick.
  2. Pagination will work for Paul because he uses pagination on nearly every search engine results page. It’s nothing new to him.

Bingo. Problem solved. Right?

But why does it take so many clicks to find the right info?

I was standing next to Mike, one of our Customer Service Representatives, and asked him a seemingly simple question. “Mike, can you bring up that log and show me what was going on last Tuesday at 11:32 AM?”

I did not intend it to be a usability test, but it might as well have been. Mike helps people every day by walking them through reports and logs, so he is as expert as anyone gets at navigating these logs. Yet, the basic task of finding a page with a specific time on it was accomplished by a series of guesses, each slightly more informed than the previous guess. It took 8 tries before Mike got us to the right page.

Since then, I have seen people repeatedly click the “Next” button, flipping through each page to find the one page they want. With 165 or so pages in a log, this can take far more than 8 clicks.

If someone knows the date and time they want to view in a Detailed Log, shouldn’t they be able to get to that page without guessing on the first try?

20/20 hindsight: Why is it so hard to find the right page?

Pagination is a valid interface design pattern, and is perhaps most often seen on search engine result pages. Still, it does not work well here.

So, why doesn’t pagination work here? Thinking in information architecture terms can help answer the question.

Pagination is a metaphor from the print world

We’ve all grown up reading books and magazines, and so page numbers are a tool we take for granted. In print, they are used to keep track of where we left off so we can pick back up at the right point. They are also used as non-digital hypertext, like in a magazine where we see “continued on page 58.”

On the web, pagination has become something slightly different, but the metaphor carries over well enough to work for us. On search results pages, we now expect to see a pagination interface at the bottom of the search results to allow us to continue to the next page of 10 or 20 links. One difference on the web is that we expect those links on the first page to have higher relevancy than those on the following pages.

So, on the web pagination is an answer to a finding question, and is based on an underlying organizational system of quantity ordered by relevancy.

However, in this case, the list is ordered by time but paginated by quantity. In this case, people want to find by time, but quantity is not metered evenly against time. So, page 1 might have 50 entries that cover 5 seconds of activity, and page 2 might have 50 entries that cover 32 hours of activity. There is no predictability of how much time will be represented from page to page of results, and that is why people are left with so much guess-work.

Match the interface to the underlying information architecture and users’ information needs

In recent work, we’ve shifted to a time-based pagination (Figure 2) from a quantity-based pagination (Figure 1). We think this will go a long way towards helping people find what they want without having to guess.

Figure 2. Find-by-time instead of pagination.
Figure 2. Find-by-time instead of pagination.

I’ve observed a few users have their first contact with this revised interface, and it has worked well so far. We may have introduced other usability issues in the process, but this is a step in the right direction.

Moral of the story?

Before implementing a user interface design pattern, be sure you first understand the information architecture and users’ information needs. Otherwise you risk using the wrong pattern, hurting your users’ experiences, and missing out on an opportunity for innovation and good design.

UserVue review

UserVue is an application from TechSmith. At work we’ve used it recently to do remote user interviews, where we’ve had people who use our services talk us through some emailed reports they received from us.

It allows us to view and record a user’s screen, and save it as a WMV or Morae file. Additionally, it can record a phone call you have with the user. And, you can have colleagues at other computers observe the session and they can take part in an observer chat and submit notes along the way.

There’s that saying, “Hunger is the best sauce,” and I think the user experience design community has been very hungry for a tool like this. So, at the moment, I’m quite happy with UserVue.

It was quite easy to use, and it worked well.

Now, to save others some frustration, let me tell you about how it didn’t work well.

When I first tried it, everything seemed to be going great. I conducted a 1 hour interview, and at the end it seemed to save the recording. Then, when I went to view the recording, I realized that the phone call was not included in the recording! The best part of that interview was, go figure, in what was said. I was distraught.

Why? UserVue only works on Windows. I was running Windows XP Pro in a virtual machine on my MacBook Pro laptop, using VMWare Fusion. Apparently, there is a problem with that configuration.

I tested UserVue on that same computer, but instead of in a virtual machine, I booted into Windows using BootCamp. UserVue worked fine that way, including recording the phone call.

Pistol practice, Aug 15, 2009 and notes on iron sights for Ruger Mk II

I went to the Saginaw Field & Stream pistol range this morning and fired a practice 900 bullseye course with my Ruker Mk II .22.

A couple months ago I upgraded the iron sights on the gun. Up till this point I’ve shot with the original Ruger sights, except for a couple years in the 90s when I shot a dot scope. I ordered Bo-Mar style rear sights for the Ruger from a company called Champion. The sights are very high quality and the sight picture is great—a big improvement over the stock sights. I brought the gun to Dick Williams Gun Shop near Saginaw, MI and he installed the rear sight for me.

Unfortunately, when I brought the gun out to the range to zero it in, it turned out that the front sight wasn’t the right height: I maxed out the elevation adjustment and it was still shooting about 5 inches too high at 25 yards.

So, after emailing and calling Ruger’s customer support with no great luck, I called Clark Custom Guns and they suggested I try a different size front sight from Ruger. Clark had an extra in their shop, and I purchased it from them. It did the trick, and the gun is zeroed in beautifully.

This is one of those upgrades that I should have done years ago. The little improvement in the sight picture makes a world of difference.

While my slow fire scores this morning weren’t outstanding, I do feel like I’m on the cusp of really getting the 50 yard line figured out. Slow fire has been the bane of my scorecards for as long as I’ve shot bullseye pistol. Now that I have a really clean sight picture, I’ve been able to trust my minimum arc of movement. Sure, it’s probably all in my head, but it makes a difference. That phrase has almost become my mantra for each slow fire shot: “Trust your minimum arc of movement.”

Here are the scores for this morning’s practice.

Slow Fire National Match Course Timed Fire Rapid Fire Total
SF1 SF2 SF TF RF TF1 TF2 RF1 RF2
87-2X 93-1X 90-1X 100-5X 95-2X 98-4X 99-5X 93-1X 97-2X 852-23X

RF2 I shot as a 14 shot alibi. I had a stovepipe and was looking for a reason to fire off an odd set of 5 rounds.

Vacation in the Keewenaw

For the past week I’ve had Lila and Eva with me up in Keewenaw in the Upper Peninsula of Michigan. I grew up here, and we’ve been staying at my parents’ house.

We’ve spent the last few days at our family’s cottage (we call it a “camp”) on Portage Lake. The photos of the ducks and the chipmunk are from there.

The girls swam at the camp, and we took two short trips to the beach at White City where they swam and played in the sand. The lighthouse photo is from there.

Click on the photos to view them larger.

We celebrated Eva’s birthday and the girls got snorkels and masks. Lila swam a lot in Lake Superior and Portage Lake, despite the cool lake temperatures. “It’s warm!” she declared. Lake Superior was 44 degrees, though we swam in more protected bays so they were probably a bit warmer.

Eva preferred to splash in the waves near the shore and play in the sand.

Oh, and on Friday at the camp I took the girls for a real sauna. The temperature was a soothing 145 degrees, and when I tossed a little water on the hot rocks, they gasped “I can’t breathe!” Funny. I showed them how to breathe through a moist washcloth, and they sighed in relief under their washcloth-masks. We took some more steam to draw out the sweat, scrubbed up and got all sudsy, and then went to rinse the soap off in the lake.

Now, back at my parents’ house, the girls are sitting here playing with legos. Tonight we’ll wash clothes and pack up the car. Tomorrow we drive back down to Saint Charles near Saginaw.