This is part 6 of an 11-part series on a trip to Alaska, covering days 6 & 7 (Fri & Sat). Click for the prior or next entries.
Due to a bad weather forecast, we were stuck in Talkeetna for a couple of extra days, re-planning hotels & flights and making the best of things. In hindsight, the bad weather forecast for the weekend never actually arrived in Talkeetna, but King Salmon and Kodiak were socked in so we couldn’t get there.
We breakfasted at the hostel and had a nice conversation with Laxmi. Cancelled plans to visit Katmai Park and Kodiak Island (hotels & flights), due to weather. Given the unpredictable weather, we decided to head back early and made arrangements in Whitehorse. This time, we avoided the Westmark and instead arranged to stay at the Takhini hostel which is next to the hot pools. I walked into town for the zip-lining trip I signed up for the prior day. That was well-organized with interesting & fun folks in my group.
Dave and I lunched at the Bistro, which had a nice healthy dish of brown rice with veggies, and fresh draft beer. The people who run this place also own Sun Dog Kennel, which we visited a couple of days later. Bernd liked the Thai place and we met him there.
Dave and I walked to the river again, then back to town and met Bernd at the coffee place where Charlotte works. We bought fresh sourdough rye bread and farm eggs at the farmer’s market, then walked to the park to enjoy the free live music. We returned to the house and met Jin, a doctor visiting from Southern California.
The next day (Sat) we had a breakfast of fresh sourdough rye and eggs. Did some laundry then walked to the bike shop. It was way too expensive, like they were catering to cruise ship visitors. We googled bike rentals and found David, a former fireman who runs a trailer park S of town and rents good bicycles a lot cheaper. Recommended!
We rode to this place called Huskytown Kennel, about 6 miles S of town. We saw a flyer for it at the house. Turns out that kennel no longer exists. At least we got a good bike ride in on a nice day. On the way back to town, we stopped at the Squirrel Cafe for a fresh tasty light lunch.
Charlotte & Liz recommended the local Sun Dog Kennel, so we went to lunch at the Bistro again and while there, planned to visit the kennel the next day.
Dave and I walked to the river and around the N, toward the railroad bridge, then E and back to the hostel the back way.
When we got to the house we met ‘Sandro and Jin, and new guests Lance and Jack. Lance was a former photographer who had lost his sight a couple of years ago. Even so, he was hiking Alaska with Jack. They were great folks and we spent an enjoyable evening getting to know them.
This is Day 5 of a 14 day trip from Seattle to Alaska and back. Click here for the prior and next entries.
Today was Thursday. Over breakfast at the hostel, we checked the weather; clouds and rain were forecast Fri-Sun. On Sat, we wouldn’t be able to fly to King Salmon to visit Katmai Park and Brooks Camp as we planned. Time for a change in plans.
We called the hotel (Antlers Inn) and Float Plane to Katmai Park from King Salmon. Ideal would be push 2 days to Mon and visit Katmai Park on Tue. But the float plane was full all day Tue, couldn’t take us to the park until Wed. So we pushed it 3 days out, to depart Talkeetna on Tue.
The day was clear, but for a scattered to broken layer at 7,500′ obscuring Mt. Denali. We walked to the airport and took off for a 2 hour tour around Mt. Denali. This turned out to be the most scenic flight I’ve ever done. As we flew NW toward the E side of Denali, the moment we popped up through the cloud layer the peaks of the entire range came into view.
Denali and the range it dominates is so huge the scale throws off one’s sense of distance. Check the photo album for all the pictures, but they cannot do justice to the awe it inspires. This was the most incredible 2 hours I have spent in my airplane, well worth the entire trip.
We flew toward the E side of the Denali range, turned L and approached Denali, flying high (12,000′) and slow. We made a big slow circle, then continued W close to the mountain. It was dead calm and clear; winds at 12,000′ were only 3 kts. In our final pass heading W, we turned S to follow the Kahiltna Glacier out.
During this flight, the Alaska Aviator Handbook came in handy, showing frequencies, reporting points and routes to minimize potential traffic.
When we returned to Talkeetna, we fueled up again at Sheldon’s and they gave us a tie-down spot on the asphalt right next to the fuel pumps. We burned 14 gallons in 1.9 hours, for 7.37 gph.
We walked to town for lunch at the Denali pub. Walked to the river, met some ladies from Oregon. On the way back I signed up to go zip-lining the next day.
At the hostel that evening, we met Danny and Laxmi, the other guests sharing the house.
This is Day 4 of a 14 day trip from Seattle to Alaska and back. Click here for the prior and next entries.
Whitehorse to Northway
We breakfasted at the Whitehorse Starbucks, which is pretty nice even though they didn’t have smoothies; it’s hard to find good coffee in Whitehorse. We checked out of the hotel, loaded the plane and departed Whitehorse at 11:00am for the 2.5 hour flight to Northway Alaska.
Note: I filed an international flight plan with Nav Canada. But I did not have or need a discrete squawk code. Normally, one would to cross an international border. But the AK-YT border is unique and does not require a discrete squawk code (it still requires EAPIS, Customs notification, a flight plan, and the usual documentation).
This is an incredibly scenic flight with mountains, Kluane Lake, some old abandoned airports, then exiting NW out of the mountains into the low lying grassy plains toward Beaver Creek (the Canadian airport just a few miles from the border), then Northway, which is in the middle of a big, flat wetland.
At one point we saw a tall, straight funnel or column sticking straight up from the river. What was that? Maybe it was a geothermal spot creating a column of steam. I don’t know!
Northway is the point of entry with Customs. We landed spot-on-time to our estimated 12:30 local time (2.5 hours, minus 1 hour since Alaska in summer is GMT-8, 1 hour behind Yukon which is GMT-7). First Alaska landing — check the box! The customs officer met us as soon as we taxied to a stop. He walked around the airplane with some kind of hand-held scanner. Then we de-boarded and declared our shotgun. He checked our passports and we had a brief conversation about living in CA, WA and AK. Then we were on our way.
Northway airport has no fuel. So after landing, we flew for 15-20 minutes up to Tok (pronounced: “Toke” – the “o” is long) to refuel. But before departing Northway we walked into the RCO and met Trek, who was manning the station. He had answered our radio calls as we approached Northway. Trek gave me the latest weather and flight briefing with some local flying advice and friendly conversation. He also told us that our flying acquaintance Paul had passed through just 20 minutes earlier. Then we departed for Tok to refuel.
Tok is a very small town with a full-service FBO, only 15-20 minutes flying from Northway.
They have a well-equipped aircraft maintenance shop and have computers and weather info. We refueled, used their computer room and phone to get a flight briefing and check the weather to Talkeetna. The pass between Tok and Gulkana looked OK, but the corridor between Gulkana and Anchorage looked marginal especially near Chickaloon pass and Sheep Mountain. We waited a while and checked the weather cams again. The trend was improving, so we took off. Worst case, we’d turn around and land at Gulkana or one of the several closer airports along our route.
We departed Tok flying through Mentasta pass, then SW over Gulkana, then entered the narrow pass toward Anchorage.
All the while, monitoring and announcing on the RCO frequencies from the Alaska Aviator Handbook. The Tahneta RCO said Chickaloon pass was IFR, but that was outdated and incorrect. After they said that, Paul chimed in on the radio, heading to Wasilla, and said he was flying it, and it was VFR.
It was indeed VFR, though MFR in a few spots. But the pass follows the river & the road, so you can’t get lost. We saw some incredible scenery.
We fueled up at Sheldon’s, then took a tie-down spot on the gravel. Dave from Sheldon’s drove up in a van to take us to the Talkeetna Hostel, where we were staying.
We recommend this hostel. Liz and Charlotte, who run it, were flexible and accommodated our plans which were made unpredictable by weather. Also, the house is a clean, warm, environment and we met different interesting young travelers every day.
We walked into town, bought some groceries, had a beer at one of the bars, and headed back. That evening we met fellow guests Kevin, Fred, Erin and Laura and had fun and interesting conversations.
We lunched at Whiskey Jack’s and met Dave, a local retired US Air Force who moved to Yukon decades ago.
Captain Ken took us out on his boat for a 3-hour tour of the Yukon river. We saw bald eagle, beaver, beaver dams and other sights.
We ate dinner at Klondike Rib & Salmon, a local joint with long lines but good food & service.
Next day, we hiked Fish Lake, which is a long drive on dirt roads out of town. We would not have found it except for the detailed directions from the visitor center.
We re-visited the Takhini Hot Springs and lunched again at Whiskey Jack’s. Dave and I had dinner again at Klondike Rib & Salmon and in the evening, I filed our EAPIS and called US Customs to arrive in Northway, AK the next day.
This is Day 1 of a 14 day trip from Seattle to Alaska and back. Click here for the prior and next entries.
Preparation
The Trench route is the quickest and quite scenic, and we had been tracking weather for the past 2 weeks. Our target date was July 8. We were ready to delay the entire trip if necessary, but it wasn’t: things looked good all the way from Seattle to Whitehorse. I filed the EAPIS, international flight plan from KBFI to CYXX, and called Canadian customs the prior night. We got to the airport at 6:30am for a planned 7:15 departure. We loaded the plane, weighing each item and distributing to maintain CG within limits. With the 3 of us, all our gear, and full fuel, our total weight was about 2,460 # which is 90 below GW. CG was around 46.8″, which is toward the rear end of the range, which means slightly better cruise efficiency.
Seattle to Abbotsford
We took off at 7:15 as planned. I requested flight following and was transferred to Seattle approach. I asked if they could activate my flight plan; he replied negative. I asked if he had the local RCO frequency handy, he said negative. So I switched to 122.2 for flight service. The controller activated my flight plan and gave me a discrete squawk code. When I switched back to Seattle approach, the controller said he couldn’t service me because I changed my squawk code. Since I was on an active flight plan and had my squawk code, I didn’t need to talk to him anymore so I cancelled service. Incidentally, that Seattle approach controller was the worst service I have received in the air in nearly 1,000 hours of flying, so I can’t complain too much.
50 minutes after takeoff we were over the Whatcom HUH VOR. Abbotsford was 10 miles away so I called them up (I already had their ATIS). They gave me L base for runway 25.
Days earlier, I had called the FBO on the W side of the field, which has self-service avgas pumps. They said I could land there and Customs would come out to meet me. But the controller said to taxi to the Shell FBO on the E side of the field, because that’s where Customs usually meets people. So that’s what I did. We were spot-on-time to our estimated arrival of 8:20am.
Flight time: H 59.7 – 60.8: 1.1 hours
Here are our flight tracks for this leg. Some get split due to Naviator (the app I was using) crashing during flight, and restarting.
I called customs and had a 15 minute wait before getting a person. He was just about to clear us over the phone, when I declared that we had a shotgun with us, and the accompanying Candian paperwork RCMP form 5589. He put me on hold for about 10 minutes. Normally, they have an agent meet you in person to process this, but apparently there was some kind of screw-up and despite my 2-day advance notice with this declaration, they didn’t have an agent at the airport. When the customs agent returned to the phone, he said he’d process the form over the phone by us manually reading off the fields to him. All in all, clearing customs was a 50 minute phone call.
Next, we walked to the FBO to fuel up the airplane. I could make it to Williams Lake without extra fuel, but I had not flown the route before and wanted to be extra cautious about fuel. After that, I called Nav Canada to file the flight plan from Abbotsford to Williams Lake, fetched latest ATIS, contacted ground, then tower, then took off for Williams Lake.
Abbotsford to Williams Lake
We headed NE toward Harrison Lake, over the Northern Rockies to the Fraser River Valley, keeping below Vancouver’s “C” shelf at 6,500′ until we got far enough NE. The clear weather allowed us to fly high and cut the corner, not having to fly E to Hope then N. It was a beautiful flight. Then we followed the river N to Williams Lake.
Williams Lake is not a towered airport, so as we approached I made US-style radio calls on their frequency. On my first call about 8 miles out, Williams Lake responded giving the airport wind and barometer setting, asking which runway I would use. This was my introduction to how Canada is a little different from the US. Their untowered class E fields usually have an active RCO with mandatory radio comms. It all went smoothly because they’re not that much different from the US. A commercial flight landed after we did, so we did our best to stay out of their way at the self-serve pumps as they were de-boarding passengers.
Next, I called Nav Canada to check weather up the trench. Prince George makes a good transition point between the trench and Al-Can routes. With good weather, we’d go to Mackenzie and up the trench to Watson Lake. Otherwise, we’d divert NE and cross the mountains to Ft. St. John, then along the Al-Can highway to Ft. Nelson. That is a longer route, but sometimes has good weather when the trench is socked in. Weather was good up the trench, so that was our plan.
Williams Lake to Mackenzie
This was a short leg and I ran it at high power (2600 RPM, 120 kts TAS). We flew right over the Prince George VOR, which is atop a hill just E of their towered airspace. Then N to Mackenzie, which has no nearby VORs or ADFs, so you need to find it the old-fashioned way, with the Mark VII eyeball using landmarks and paper charts. It’s about 8 miles up from the S end of the big lake, on the E side.
At Mackenzie we called the fuel phone number from the CFS because nobody was there. The same lady I spoke with a week earlier answered and remembered me calling. She drove out to the airport, helped us refuel, offered us (free!) ice cream cones and cookies, and local advice with very detailed charts of the trench on her wall.
I had noticed the plane was just a bit tail-low on short final during landing, so I readjusted our load, swapping a heavier backpack forward into the rear seat to bring the CG forward just a touch. And I moved the tent under the right side passenger seat, which not only brought the CG forward a touch, but also cleared a little more space in the airplane. We kept this loading for the rest of the trip.
This (Mackenzie to Watson Lake) would be the longest single leg of the trip: 346 nm. It’s well within my range, but I’d fly it a bit slower for better efficiency: around 2400 RPM which is about 10% more efficient than high speed 2600 RPM cruise.
Mackenzie to Watson Lake
This leg goes N up the trench. It starts with a long, narrow lake (actually, the Williston Reservoir) lying in a gorge that runs perfectly straight for about 1,000 miles. The lake runs for about 160 nm, with Tsay Keh Dene at the N end. This marks roughly the half-way point of the leg; from there, it’s about 180nm straight to Watson Lake.
We found this leg incredibly scenic, and remote, though we saw numerous private dirt runways along both shores of the lake. If the engine stopped chugging, any of them would make a good safe landing spot. We also saw several lakes with amazing shades of turquoise, looking like Caribbean reefs.
Finally, we emerged out of the mountains into the flatlands getting closer to Watson Lake. Here we encountered light turbulence and 10 kt headwinds.
Finally, we landed at Watson Lake. Flight time: H 63.5 – 66.9 = 3.4 hours. It took 26.5 gals to fill up, so we had 13.5 remaining and were burning 7.8 gph. Fueling at Watson Lake is a little different. First, go to the terminal to get “the card”. Take the card to the pump terminal and activate it, then fuel up. Then, go back to the pump terminal and print the receipt. Then, take the card & receipt to the terminal to pay for your gas.
At Watson Lake we met a fellow pilot named Paul flying a 1948 Aeronca. He was also en route to Whitehorse, but planned to camp at Watson Lake for the night. Flying a 172, one doesn’t often meet people who fly lower or slower, but the Aeronca is one of them. As we prepared to depart, Paul changed his mind and followed us west toward Whitehorse. This far north (above 60* latitude) in July, we’d have light until past midnight.
Watson Lake to Whitehorse
We departed into the wind to the W and followed the 261* radial of the Watson Lake VOR, which goes straight to Whitehorse. About 15 minutes after we took off, we heard Paul on the radio behind us. On this route, 8,500′ MSL is sufficient to clear terrain and fly straight, which saves you 30 minutes or more over following the twists and turns of the Al-Can highway, which you might have to do with low cloud ceilings. We had 10-15 kt headwinds but only scattered clouds and were in no rush. Perfect conditions, daylight and amazing scenery the entire way.
We flew direct to the Whitehorse VOR. Their ATIS reported winds 22 gusting 35 from 200 to 220. About 8 miles E of the VOR I called the tower. They gave me a L base to runway 19, which is only 1,800′ long. With that stiff headwind, this would be plenty! Whitehorse airport is on a big elevated plain, running N-S, west of town. As you approach from the E side to land on runway 19, with wind from the SW, one expects a down-draft as the wind follows the terrain drop-off. And that is what we got. Landing was a cinch. Came in at 60 kts on short final, pushed in some power for the down-draft, then back to idle over the numbers. We had a smooth landing using only half the runway.
Flight time: H 66.9 – 69.1 = 2.2 hours. We fueled up and it took 16.1 gallons to full, which is 7.3 gph. Total flight time for the day: 9.4 hours. Surprisingly, I still felt fresh while landing. I didn’t feel any fatigue until after we hit the town.
Our tie-downs were too short to reach the runway hard points, which were widely spaced. And in a windy place like Whitehorse, tie-down is a must. We walked over to the fire department and they gave us some extra rope. We tied them into large loops which we used as extenders. While we were finishing all this, we saw Paul land in his Aeronca, about 1 hour after we landed. We grabbed a taxi to the Westmark Hotel, walked to the Big Bear Donair (the only place still open) for a tasty midnight dinner of falafels and draft beer, then walked back and hit the sack. Over 9 hours of incredible flying through some of the most scenic country in the world made this one of the best days of my life.
In July 2017 I took a cruise to Alaska with family & friends. 1 week N on the ship, 1 week inland, then flew home from Fairbanks. It was a fun trip, but I told myself that one day I would fly my own plane up there to visit the real Alaska outside the corporate padded room of cruise ships, trains and buses. Later that winter I started planning what would become the Alaska trip of July 2018, described here. The planning in all its aspects would consume more than 6 months.
This is the first of 12 journal entries, each detailing part of the 14-day adventure: this introduction, one entry for each of the 7 flying days, plus one entry for each of the 4 blocks of days we stayed in each place. The next covers day 1.
Trip summary:
Day 1: fly KBFI-CYXY Whitehorse
Days 2-3: Whitehorse
Day 4: fly CYXY-PATK Talkeetna
Day 5: fly Denali
Day 6-7: Talkeetna
Day 8: fly PATK-PAGK Gulkana
Day 9: fly PAGK-CYXY Whitehorse
Days 10-11: Whitehorse
Day 12: fly CYXY-CYXJ Ft. St. John
Day 13: Ft. St. John
Day 14: fly CYXJ-KBFI Seattle
Planning
Flying a small plane (my 1980 Cessna 172 Superhawk) to Alaska requires some planning. I started with local advice from a guy who lives on Kodiak Island and had flown a 1952 Cessna 170 there from Los Angeles. Then used AOPA resources like their forums and videos. Also used sites like Skyvector, Weather Underground, and aviation apps like Naviator and Droid EFB. I tried to use Flight Plan Go, but it crashed so frequently it was unusable on all 4 of my Android devices (3 different tablets and my phone). Another essential resource was the Alaska Aviator Handbook. I also ordered a set of paper charts from Nav Canda (8 VFR sectional charts, the Vancouver terminal chart, and the Canada Flight Supplement), and measured & marked the routes the old fashioned way with pencil, highlighter, ruler & protractor. This became essential during the trip because Flight Plan Go is the only Android app with electronic Canadian charts, and it was an unusable steaming pile of bloat-ware.
Electronic Charts
My favorite flight app is Droid EFB for Android (formerly known as Avilution). But it is strictly US-only; it doesn’t have Canadian charts, airports, airspace or navaids (VORs & NDBs). Naviator is my next-favorite app; it works well but has sluggish response and drains the battery faster than Droid EFB. Naviator doesn’t have Canadian charts either, but it does have Canadian airports, airspace and navaids. And it also has high-res terrain for all of N America including Canada. Both work well with my Stratux, having ADS-B In with a WaaS GPS. So for this trip, I used Naviator alongside my Canadian paper charts and CFS for airport details. My navigation, both planning and in flight, was primarily by Mark VII eyeball and compass. But I mapped all my routes to follow VORs and NDBs where possible, and I had 2 navaid fixes for every airport we’d land at.
At the end of the day I had planned about 15 different flights, considering terrain, airspace, range between fuel stops, each with individual legs, headings, waypoints, timing, altitude, airspeed, fuel burn rates, etc. Printed them hardcopy so I could use during flight. For each of these, I also had a matching electronic flight plan in Naviator. This covered the 3 basic routes to Alaska: from W to E they are coast, trench, and Al-Can highway. It also covered transition points between these routes, and planned flights around points in Alaska like Fairbanks, Gulkana, Talkeetna, King Salmon and Kodiak Island.
Preparation
The Alaska Aviator Handbook is a great resource. Not only does it describe all the RCOs, special flight areas with their frequencies & rules (like Denali and the Anchorage corridor), but it also recommends survival equipment to carry on board for summer & winter. We carried everything recommended–and more–but kept it light. The survival gear included everything we’d need to camp for a week (tent, sleeping bags, fire starting gear, camp stove with fuel, etc.), plus extra Alaska-specific stuff like mosquito head nets, fishing kit, bear repellent, etc. Note: Mountain House makes a 5-day pack of dried rations that weighs just under 5 lbs. We got the total camping & survival gear for the 3 of us down to 50 lbs, including a 12 gauge shotgun with ammo (Brenneke 3″ mag slugs and 3″ mag #4s). This would enable us to camp comfortably for a week, if necessary. But we didn’t plan to camp at all.
Flying over thousands of miles of northern wilderness in a small plane, bear defense is a thing. We took a big can of bear spray and a 12 gauge shotgun with Brenneke Black Magic ammo (3″ mag, 602 grain slug, 1500 fps). A 12 gauge is about .73 caliber so imagine the hitting power of a supersonic “C” cell battery and you will not be too far off. This is what some of the rangers carry in Alaska and Canada. They are supposedly able to stop any animal in N America (including polar bears) with a single shot. That is quite a claim! We took it to the range to test the consistency and accuracy and were impressed. At 50 yards, fired from a Mossberg 500 pump, bench rested, we got a 5 slug group with holes that were nearly touching. It makes a stout blast that turns heads at the shooting range, but it’s quite controllable. Common sense (and US and Canadian law) requires that it be unloaded during flight and locked inside the airplane when unattended.
The Airplane
I had recently installed a new engine, the Penn Yan Superhawk O-360 upgrade. I flew it through the break-in protocol for 50 hours and measured its performance and efficiency over a variety of conditions. Just before the trip, the new engine had 62 hours and a fresh oil change to Philips 20w50 AD. We expected to fly about 40 hours on this trip, so it would not need an oil change. I brought 3 extra quarts of oil and ended up using 2 of them over about 35 total hours of flying, which makes an oil consumption rate of 17.5 hours per quart. This is normal and healthy for this model of engine.
International Customs
Flying a small plane to Alaska means crossing back and forth between Canada and the USA. Advance preparation for this includes the following. Some of these steps require several weeks, so get an early start!
Ensure your airplane has a radio station license, and the pilot has a radio operator license.
Ensure your airplane is insured to Canadian requirements, and bring written proof
If you are bringing a firearm
Ensure it’s legal in Canada (bolt/pump/lever action rifle or shotgun)
Ensure it’s sufficient protection from large bears (high caliber rifle or 12 gauge with slugs)
Get the RCMP form 5589: fill it out but don’t sign or submit it yet
for purpose: say “in transit” or “protection from wildlife”
Get the US Customs form 4457
After you’ve done the above advance prep, here’s what you do to cross the border:
At least 1 hour before the flight, file an EAPIS manifest describing your airplane, passengers, date, time and airports you’ll use to cross the border.
You will need passport #s and dates of birth for every passenger.
There is no advance time limit, so you can file a day or a week beforehand, if you want to.
Within 5-10 minutes you’ll receive the EAPIS email confirmation – keep it just in case.
Ensure your first landing in the country you’re entering, is an airport of entry.
Call Customs of the country you’re entering, 2-48 hours before you land there.
File an international flight plan with the country you’re departing.
After takeoff, before crossing the border, contact flight service or RCO to activate your flight plan and get a discrete squawk code.
Note: before flying across any international border you should be squawking a discrete code. The exception to this is Alaska. You can cross Alaska to Canada and vice versa while squawking 1200.
Canadian Flying
Canadian GA flight rules are similar to the US, but just different enough to trip you up. Here is a brief summary of the differences. Of course, these are not all the differences, just the main ones most relevant to VFR pilots:
VFR flight plan required for all flights > 25nm
Plan activates at filed start time – no need to activate after takeoff
Must call to close plan upon landing
Altitude: 10,000 – 13,000 limited to 30 mins without oxygen
VFR over the top is restricted
VFR night is restricted
MF: mandatory frequency; like CTAF
Class “E” airports (untowered) have mandatory reporting before entering their airspace
Monitor 126.7 continuously, en route. Also monitored by FSS.
Last but not least, we researched our activities — where to stay, what to do, in each spot. How to get around, etc. The stuff you’d do for any normal vacation. We did this for several spots, knowing that weather might prevent us from doing all of them. Hotel reservations get tricky when you can’t know exactly what day you might get there or how long you’ll stay (due to weather delays). Car reservations or ground transportation also gets tricky when flying around small, remote airports.
Co-Travelers
Choose carefully who to invite on a trip like this! You may have to make a forced landing and camp out. Or spend days holed up in remote locations with few or no services, waiting for weather to improve. Or fly through turbulent or marginal conditions, or severe terrain, that can make nervous passengers cringe. In situations like this, day after day, the social veneer wears thin revealing what people are really like. And on a trip like this, flying a small plane is not just a way to get there, it’s a big part of the trip and reason for coming. My good friend Bernd whom I’ve known for over 25 years, my father Dave, and myself constituted a perfect trio for such a trip. Everyone maintained a good natured optimism making the best of the situations and people that fate threw at us. Sharing the trip this way made it even more enjoyable.
LineageOS is the open source version of Android. Combined with OpenGApps, it has all the functionality of Android, without any of the bloat-ware, crapplets or customized skins that manufacturers and carriers add to Android. And, it’s supported by a community of developers so you can get the latest version of Android on your device long after the manufacturer abandons it to planned obsolescence.
The LineageOS home screen launcher is called Trebuchet. It is more configurable than most stock ROMs. There’s a particular setup I like that combines a dark background (which saves battery on OLED screens) with big icons. Setting this up is simple:
First, long-touch a blank spot on the home screen. The home setup screen appears. Your icons will be different from shown, but the bottom area will be the same with the WALLPAPERS, triple-dot button, and WIDGETS:
Touch WALLPAPERS in the lower left. A screen like below will appear asking you how you want to pick wallpaper. Pick the one circled in RED:
A screen like below appears asking which wallpaper you want. Pick the one shown below:
A screen appears asking where you want to use this wallpaper. I usually pick both home screen and lock screen:
Next, we’ll tell the home screen to use large icons. So go back to the home screen and long-touch a blank spot again to get the home setup screen. Then touch the triple-dot button:
The following menu will appear. You can set a bunch of stuff here; icon size is at the bottom:
Linux has built-in tools for programming the buttons on your mouse or trackball. You don’t need any drivers or proprietary software. Just a few simple tools you can install from the repos. I’m doing this on Ubuntu 16 and 18, but it should work on any recent Linux distro.
First, use xev to detect how your system is recognizing the mouse buttons. Start xev from a command prompt, then hover over its window, click each button, and look at the text in the command prompt window. This will tell you the # for each button. The first 3 buttons are always defined the same way: left-click is button 1, middle-click 2, right-click 3. Extra buttons are “non-standard” and can be defined in any way.
To change what a button does, use xbindkeys. Its control script is a file in your home directory called .xbindkeysrc. The app xte fabricates keystrokes and mouseclicks.
For example: here’s an .xbindkeysrc that does 2 things:
Single click of button 2 (middle button) causes double-click of button 1 (left)
Single click of button 9 causes Control-click of button 1.
# button 2 (scroll wheel) is double click
"/usr/bin/xte 'mouseclick 1' 'mouseclick 1'"
b:2 + release
# button 9 (upper left alternate) is control + left click
"/usr/bin/xte 'keydown Control_L' 'mouseclick 1' 'keyup Control_L'"
b:9 + release
This should work everywhere in all apps. It does work in some apps (like Thunar), but not in others (like Firefox). I wondered – why?
Limitation 1
After experimenting, I discovered that xte is too fast for some apps. I added a few strategically located brief (10 ms) delays and it worked everywhere.
Example: change the above to this:
# button 2 (scroll wheel) is double click
"/usr/bin/xte 'mouseclick 1' 'usleep 10000' 'mouseclick 1'"
b:2 + release
# button 9 (upper left alternate) is control + left click
"/usr/bin/xte 'keydown Control_L' 'mousedown 1' 'usleep 10000' 'mouseup 1' 'keyup Control_L'"
b:9 + release
The usleep param is in microseconds, so 10,000 is 10 milliseconds. This now works in all apps.
Limitation 2
Another limitation: it’s hard to make the same button duplicate itself from xbindkeys. If you do this, it can lead to infinite loops. For example: xbindkeys can easily make a single click of button 2, cause a double-click of button 1. But xbindkeys can’t make a single click of button 1, cause a double-click of the same button. This will fail or cause an infinite loop.
For that, use imwheel. Originally intended to adjust the sensitivity of the scroll wheel, it is also useful for other things. This is because internally, a scroll wheel is just 2 buttons: up and down. To make it more sensitive, imwheel duplicates each click of those buttons. But imwheel can do this with any buttons, not just the scroll wheel. Its config file is .imwheelrc, in your home directory.
Here’s an imwheel config that doubles the scroll wheel sensitivity:
# Apply to all apps (individual apps can be customized)
".*"
# Amplify scroll up/down
None, Up, Button4, 2
None, Down, Button5, 2
# Amplify scroll left/right
None, Left, Button6, 10
None, Right, Button7, 10
On my trackball, the scroll wheel is Button 4 and Button 5. The scroll wheel tilts L and R; these are buttons 6 and 7. Yours may be different; check it with xev.
My Logitech Trackman thumb trackball is so old it has a PS/2 plug. Its buttons are finally starting to fail and I needed to replace it. But Logitech doesn’t make wired trackballs anymore. I must have wired because (1) I use an IOGear GCS1102 KVM Switch, and (2) I prefer the instantaneous smoother response of wired devices.
I Googled around and discovered the Elecom M-XT3URBK, worth a try. At first it didn’t work. On a whim, I checked my GCS1102 (open a text editor, hit Ctrl-F12, press F4, and it prints its settings) and found it was in mouse emulation mode. I disabled mouse emulation mode (Ctrl-F12, press m) and the Elecom worked perfectly. Xev detected all buttons except the far right, which I don’t need anyway.
Good stuff:
Tracks at least as well (smooth, fast, accurate) as the Logitech Marble
Switch-adjustable DPI (low is still pretty high and works best)
Buttons
Standard L and R
Scroll wheel clicks like a button (without occasionally moving, like the Logitech did)
Scroll wheel clicks L and R to scroll horizontally
Two small buttons to the L of the L button
It’s comfortable to use
Elecom makes a mirror image left-handed version
Price: only $40 – half Logitech’s prices!
Bad stuff:
The cable is a bit on the short side, but still long enough I didn’t need an extension.
It’s a bit small for my large hands
So far, no problem. It works, scroll wheel and all buttons, without any drivers. Just plug and play. But there’s more…
SENSITIVITY and ADJUSTMENT
The Elecom is so much more sensitive than my old Logitech, I had to turn down the settings. But with the GCS1102’s mouse emulation disabled, every time I switch, each computer sees the mouse being un-plugged and re-plugged. When this happens, Ubuntu doesn’t restore the mouse settings. When I switch away and back, the mouse is back to its hyper-sensitive default setting.
I wrote a shell script /apps/bin/setMouse.sh that uses xinput to set the mouse:
#!/usr/bin/env bash
# The UI for setting mouse track speed in Ubuntu 18 is broken.
# Do it manually here
# NOTE: as of June 2018, the mouse was device 12.
# You can check this with: xinput --list --short
# To show device settings: xinput --list-props 12
echo "`date`, $USER, $DISPLAY, $XAUTHORITY" >> /apps/bin/mouse.log
if [ -z "$1" ]
then
a="0.1"
else
a="$1"
fi
if [ -z "$2" ]
then
m="0.4"
else
m="$2"
fi
if [ -z "$3" ]
then
d="`xinput | grep Mouse | grep pointer | cut -f 2 | cut -c4-5`"
else
d="$3"
fi
aprop=`xinput --list-props $d | grep 'Accel Speed (' | cut -f2 | cut -c23-25`
if ! [ -z "$aprop" ]
then
xinput set-prop $d $aprop "$a"
fi
mprop=`xinput --list-props $d | grep 'Coordinate Transform' | cut -f 2 | cut -c35-37`
if ! [ -z "$mprop" ]
then
xinput set-prop $d $mprop "$m", 0.0, 0.0, 0.0, "$m", 0.0, 0.0, 0.0, 1.0
fi
echo "`date` Mouse set up $a $m $d" >> /apps/bin/mouse.log
xinput --list-props "$d" >> /apps/bin/mouse.log
But I don’t want to have to run this script every time I switch the GCS1102. The Linux Udev system should do the job!
UDEV RULES
First, I needed a Udev rule to trigger my script. The rule must detect the USB device being plugged in, so I need its vendor and product IDs. To get these, run lsusb:
Bus 003 Device 122: ID 056e:00fb Elecom Co., Ltd
Now add a Udev rule. Mine was /etc/udev/rules.d/61-elecom-mouse.rules:
But it didn’t work. The script was running (I could see the log entry it creates). But the mouse sensitivity wasn’t being set.
DELAYED EXECUTION
My first thought was that the Udev event was firing before the device was registered and ready to be configured. So I added a sleep to the command. But, you can’t sleep while Udev is running your command. So I had Udev run a script that returns immediately, while sleeping a few seconds then running setMouse. A command like this:
(sleep 3 ; /apps/bin/setMouse.sh) &
But that didn’t work. It worked from the command line, but when run from Udev, the background was ignored and Udev waited for the entire time. That’s bad for 2 reasons: (1) hangs Udev for 3 seconds, (2) Udev is still waiting, so the sleep is pointless because the device won’t be ready until Udev is done.
In short, Udev is too smart by half. I needed a way to trick Udev into returning immediately, while my script pauses a few seconds then runs. I found this with the at command. First, install it:
This tells at to trigger the script to run immediately, but at returns to Udev immediately. The script doesn’t run under Udev but under at. The setMouseElecom.sh script looks like this:
#!/usr/bin/env sh
# Called by Udev when Elecom trackball is plugged in
sleep 2
/apps/bin/setMouse.sh 0.1 0.4
Note: at can only run sh scripts, not bash.
But, it still didn’t work. The script ran, but its xinput commands always failed.
XINPUT AND XSESSION
I guessed it might be that at, running as root, didn’t have permission for my X session. I had to somehow make it join my X session before the xinput commands would work. I made a script called joinXandRun.sh:
#!/usr/bin/env bash
# Get the number of the active terminal (requires root)
TTY=$((`fgconsole`-7))
# Set env vars needed to simulate the user
export DISPLAY=:${TTY}.0
USER=`who -s | grep "(:$TTY)" | cut -d' ' -f1`
export XAUTHORITY=/home/$USER/.Xauthority
echo "`date`, $USER, $DISPLAY, $XAUTHORITY: $1" >> /apps/bin/joinXandRun.log
sudo -H -u $USER bash -c "$1 $2 $3 $4 $5 $6 $7 $8 $9"
This script finds the active X console, and its user and display. Then it sets the critical DISPLAY and XAUTHORITY environment vars to “join” that X session. Then it runs another script passed into it, as the given user.
Then I made setMouseElecom.sh call this script:
#!/usr/bin/env sh
# Called by Udev when Elecom trackball is plugged in
sleep 2
/apps/bin/joinXandRun.sh /apps/bin/setMouse.sh 0.1 0.4
Guess what — this worked!
The really cool thing about this is that the Udev rule is device-specific, and setMouse.sh takes parameters. I could set this up to auto-detect and configure several different kinds of mice or trackballs. Each would have a different Udev rule, matching different vendor and device IDs, firing different scripts that pass different mouse setting params to setMouse.sh. This will be useful for my laptop, which uses the Elecom at work but another Logitech Trackman at home.
It turns out all the pieces are essential. Lessons learned:
When Udev triggers the add event, the device being added cannot yet be configured. So if your Udev script configures the device, it has to:
Return immediately to Udev, so Udev can finish its processing
Meanwhile, trigger its config processing to run after a few seconds
To configure devices that are part of the X session, you need to “join” the session. Otherwise, the X system won’t let your code configure the device.
PS: none of this is specific to Ubuntu 18. It should work on any recent Linux distro.
I’ve been a big reader since I was a kid, all kinds of books from many sources. I was an early Kindle adopter, but as Android tablets came out I found them better for reading:
Configurable: you can set a wider variety of fonts, sizes, margins, colors, layouts.
Open: you can install any number of reading apps for every eBook format available. You’re not locked into any single book ecosystem.
Graphics: books with pictures, diagrams, etc. are much better on a tablet. Even a large eInk reader lacks color and renders slower.
Due to the variety of books I read, no single ecosystem would do the job. Plus, I take a principled opposition to any company that tries to lock customers into its ecosystem. When I buy a book I don’t believe I’ve bought it to read on a particular device, in a particular format, to access whenever some corporation thinks I should be able to. I’ve bought the right to read it on any device, in any format, whenever I want to, forever. Just like a real book. Indeed, eBooks often cost as much as real books even though the marginal cost of the next eBook sold is zero. And, I run native Linux on all my computers.
All of this all led me to start using Calibre to manage my eBooks. Calibre is simply great – it meets all these needs and more. It’s a great organizer, supports all devices, all formats, can convert between them, and has many plugins with an active open source development community.
Without owning a Kindle, how does one buy books from Amazon, store them on your own computer and read them on any device in any format? Here’s how:
Even though I run Linux, I have a VM running Windows. I don’t use it for much, only those few apps that I can run natively on Linux or in a browser. Unfortunately, Amazon Kindle is one of those. In this VM I have the Kindle for PC app registered to my Amazon account.
I’ll assume you already have Calibre running and you’ve installed Apprentice Alf’s DeDRM plug-in.
Next, do a one-time configuration step: capture the Kindle key from your Windows PC and copy it to Calibre so it can DeDRM Kindle books.
On Windows
Install Python 2.7 and Pycrypto 2.6 for Python 2.7.
Unzip the Calibre DeDRM plug-in ZIP file
In this zip, find the file kindlekey.py.
This zip file has several directories and files in it. In DeDRM_6.6.0, this file is here: \DeDRM_Windows_Application\DeDRM_App\DeDRM_lib\lib
Open a command prompt and run this file: kindlekey.py
You’ll see something like this:
Using Library AlfCrypto DLL/DYLIB/SO
searching for kinfoFiles in C:\Users\USERNAME\AppData\Local
Found K4PC 1.9+ kinf2011 file: C:\Users\USERNAME\AppData\Local\Amazon\Kindle\storage\.kinf2011
Decrypted key file using IDString ‘406xxxxxxx’ and UserName ’63xxxxxx’
It creates a new file: kindlekey1.k4i
Copy this file to a directory your Linux Calibre app can see
On Linux
Run Calibre
Click Configure, Plugins, File type plugins, DeDRM
Click Customize plugin
Click Kindle for Mac/PC ebooks
Click Import Existing Keyfiles
In the file dialog that pops up, pick your kindlekey1.k4i file
You’re done: Calibre DeDRM is configured to be able to DeDRM ebooks you drop on it, so long as they come from your Kindle for PC reader.
After I buy a book on Amazon, I deliver it to my Kindle for PC device.
In Windows:
Open Kindle for PC, refresh your library. The book should appear.
Double-click it to download it.
After the book opens, close it and the Kindle for PC app.
Open folder Users\USERNAME\Documents\My Kindle Content
Your book will be one of these folders named B….._EBOK
Sort by date to put the most recent files on top
Open the folder and you’ll see an azw file having the same filename as the folder.
Copy this azw file to a directory that your Linux Calibre can see.
In Linux
Run Calibre and drag/drop the azw file on it.
Calibre will strip the DRMs and add it to your library
You now own the book. It’s stored on your own hard drive, you can read it on your PC, convert it to any format you want, copy it to any device or app you want to use to read it.