Christmas Vacation At Last

Apologies in advance for the technical detail, but I’ve been trying to get the grandchildren interested in learning to code–if not as a career, just to make the world less magical and more driven by thoughtful application of disciplined skill, like driving a car or cooking a meal.  And, above all, it can be fun.  You know who you are.  The rest of of you, sit down, hang on, and share with the next generation.  The other lesson here is that it is never too late to learn something new, nor too early.

Regular readers may know that I became more or less “full time” retired this fall, with the ending of the latest in a 14-year sequence of contracts supporting the NIH Rocky Mountain Laboratories.  Oh, I have a few commercial web clients left, with the occasional rewrite, addition, or help request when a data entry goes awry, and a few pro bono web sites to manage, but, for the first time in 50 years, I actually have only a few minor updates in this last week of the year.

Typically, the systems support folk perform maintenance on systems when the majority of the staff has time off, which, in the United States, tends to occur only between Christmas and New Years Day.  In the pre-Unix days, this often meant traveling from coast to coast to work on U.S. Navy ships in port for the holiday.  In the past 20 years, it meant working late on days when the rest of the staff got early dismissal, or telecommuting on holidays.

So, having a bit of free time, I’ve decided to “play,” which, for the thoroughly addicted Unix Curmudgeon, means writing programs for fun and wiring up systems just to learn something new (or practice rusty skills).  The geek toy of the year, or maybe decade, is the Raspberry Pi computer, the $35 Linux board (more like $50-$100, depending on what accessories are needed to set up and run it–and, once they are set up, you can run them “headless,” without keyboard, monitor, or mouse, and access them from your PC, Mac, iPad, or phone, with the proper app).  Normally fairly frugal, I have somehow managed to acquire five of these little beasties, the last one because I thought one died, but it was the SD card (like the one in your camera) that serves as the primary “disk drive,” so I bought an extra SD card and have an extra box.  I also bought one to get my hands on the new B+ model, the one with a 40-pin I/O jack and four USB ports instead of the old-style with 34-pins and two USB jacks.  I did refrain from buying another protective case, instead choosing to bolt the “replacement” board to a piece of scrap hardwood so it won’t short out.

naked_pi20141230_160313
A “crustless” Pi, mounted on a scrap of lumber. This one is a database server, running PostgreSQL.

 

The purpose of the Raspberry Pi, as conceived by its British designers, is to promote learning and experimenting.  Thus, the I/O port, with a number of digital and analog inputs and outputs, and a special port for a miniature CCD camera board the size of a postage stamp.  Of course, I had to have one of those, too, along with a “daughterboard” for another that provides convenient digital input/output lines with screw terminals and a couple of tiny relays.

piface20141230_160324
This Raspberry Pi has a PiFace module plugged into the I/O jack, providing input/output terminals that can be connected to lights, other circuits, and switches. two relays are provided for switching incompatible voltage devices. When not wired to sensors, this unit is the head node of a compute cluster and a file server for a 1TB external disk drive.

 

The Raspberry Pi is, though small, a “real” Linux server, and can run almost any software.  Having been a Unix/Linux system administrator for the past 25 years, I find them  fun to play with and use to recreate small versions of big networks.  I have one that provides network information and internet name service to the local network, another that is a router and cluster head node, connecting two networks together and managing one of them, including disk sharing, one that is a gateway to the Internet (providing secure access into our network) and also a web server, one that is a print server, and another that is a database server.  And, of course, one that is a camera platform.  (In case you are counting, some do several things at once–that’s what Linux and Unix are good at, even in a small machine.)

Lacking interesting ideas, I merely pointed the camera out my office window, to provide a “window on the world,” for which I have started to experiment with different programming.  First, I simply put up a web site (using the Pi as the web server) that allows the user to take a picture of what the camera is looking at “right now.”  The Raspberry Pi promotes the use of the Python programming language (named by its author, Guido van Rossum, after the British comedy team, “Monte Python”), a language that I have heretofore avoided, since it uses “white space” as a block delimiter, and white space has been the bane of Unix shell programmers (of which I am one) since the beginning of the epoch (1/1/1970).  Nevertheless, it is a solid, well-constructed language, which is growing rapidly, in both academia as a beginning programming language and in industry and research as a powerful tool for rapid prototyping and robust permanent systems.  Python is, unlike most scripting languages, strongly typed (meaning variables are distinctly numbers, text, or other structures) and naturally object-oriented, which means data can inherit processing methods and structure, and details of structure can be hidden from other parts of the program, making programs easier to extend and debug, and making objects easily imported into other programs.

picam20141230_160209
The PiCam, pointed out at the driveway, mounted in a case and held by a “third hand” workbench tool. The ribbon cable attaches the camera to the web server, below.

 

So, with Python as a de facto system programming language, the libraries that operate the external ports and the camera are, of course, written in Python.  Using the devices requires Python programming skills, incentive enough to finally learn the language.

The web camera project quickly evolved into a combined weather station and surveillance system, and, not surprisingly, expanded my Javascript programming skills as well.  Javascript is at the core of most interactive web applications, as it mostly runs in the user’s browser, providing dynamic interaction with the server without the need to reload the current web page, and capable of performing automatic functions.  Since part of the project involves sewing a sequence of still images into a timelapse video, it also involved building a command-line video editor from source code and learning to manipulate video with it.


The web page:  All this code does is display a photo, then update the time and the photo every 15 seconds (the rate at which the camera takes pictures).  The python code runs on the server, the Javascript code runs in the user’s browser.  The image acquisition happens in another program, which follows.

 #!/usr/bin/env python

import cgi
import time
import os
import sys
import urllib2
import json

os.environ['TZ'] = "PST8PDT"

print "Content-type: text/html"
print

Now = time.localtime(time.time())
DST = time.tzname[Now.tm_isdst]
Date = time.asctime(Now)

print """
<html>
<head><title>Raspberry PiCam</title>
<body>
<h1>The view from Chaos Central <span id="nowTime">%s</span></h1>
""" % Date

f = urllib2.urlopen('http://api.wunderground.com/api/79be9651d0e9e9fc/geolookup/conditions/q/WA/Shelton.json')
json_string = f.read()
parsed_json = json.loads(json_string)
location = parsed_json['location']['city']
title = parsed_json['current_observation']['image']['title']
link = parsed_json['current_observation']['image']['link']
weather = parsed_json['current_observation']['weather']
temp_f = parsed_json['current_observation']['temp_f']
temp_c = parsed_json['current_observation']['temp_c']
wind = parsed_json['current_observation']['wind_string']
updated = parsed_json['current_observation']['observation_time']

print """
<img src="/images/current.png" id="currentImage"/>
<script language="Javascript">
setInterval(function() {
 var currentImageElement = document.getElementById('currentImage');
 currentImageElement.src = '/images/current.png?rand=' + Math.random();
 var now = new Date();
 var h = now.getHours();
 var m = now.getMinutes();
 var s = now.getSeconds();
 formatnum = function( num ) {
 if ( num < 10 ) { return '0' + num; }
 else { return '' + num; }
 }
 var time = formatnum(h) + ':' + formatnum(m) + ':' + formatnum(s);
 var nowTimeElement = document.getElementById("nowTime");
 nowTimeElement.innerHTML = time;
}, 15000);
</script>
"""
print "<p>The temperature in %s is: %s F / %s C<br />" % (location, temp_f, temp_c)
print "and the weather is %s<br />" % weather
print "Wind: %s<br /><br />" % wind
print "Weather Data %s<br />" % updated
print "Reload page to update weather: image updates automatically every 15 seconds<br />"
print "Weather data provided by <a href=\"%s\">%s</a><br />" % (link, title)
print "Image realized on a <a href=\"http://www.raspberrypi.org\">Raspberry Pi</a></p>"
f.close()

print """
</body>
</html>
"""

So, confused yet? Below is the code that actually runs the camera. It takes a picture every 15 seconds, numbering the pictures so that a third program can sew them together into a timelapse video.  The timezone hack in the shebang line (the first line of the script) powers the timing of the script.  This script is started each day by the system before the earliest sunrise, then waits until sunrise (obtained from the weather programming interface), and runs until sunset.  We start 30 minutes early and stop 30 minutes later to start/stop in twilight.

#!/usr/bin/env TZ=PST8PDT python

import time
import picamera
import os
import urllib2
import json

riset = urllib2.urlopen('http://api.wunderground.com/api/...(api key here).../astronomy/q/WA/Shelton.json')
json_string = riset.read()

parsed_json = json.loads(json_string)
sunriseh = int(parsed_json['sun_phase']['sunrise']['hour'])
sunrisem = int(parsed_json['sun_phase']['sunrise']['minute'])
if ( sunrisem <= 30 ):
 sunrisem += 30
 sunriseh = sunriseh - 1
else:
 sunrisem = sunrisem - 30

while (time.localtime().tm_hour < sunriseh):
 if ( time.localtime().tm_min < 30 ):
 time.sleep(1800)
 else:
 time.sleep((sunrisem * 60) + 1 )
 while (time.localtime().tm_min < sunrisem):
 time.sleep(60 * (sunrisem - time.localtime().tm_min + 1))

sunseth = int(parsed_json['sun_phase']['sunset']['hour'])
sunsetm = int(parsed_json['sun_phase']['sunset']['minute'])
if ( sunsetm >= 30 ):
 sunsetm = sunsetm - 30
 sunseth += 1
else:
 sunsetm += 30

print 'Sunrise: ' + str(sunriseh) + ':' + str(sunrisem) + ', Sunset: ' + str(sunseth) + ':' + str(sunsetm)

wday=time.localtime().tm_wday

logdir = '/mnt/TIMELAPSE/' + str(wday)

# remove last week's files.
import shutil
shutil.rmtree(logdir)
os.mkdir(logdir)

# grab camera and start recording
with picamera.PiCamera() as camera:
 camera.resolution = (320,240)
 camera.start_preview()
 time.sleep(2)
# loop: capture method grabs camera device for duration.
 for filename in camera.capture_continuous(logdir + '/img{counter:04d}.png'):
 shutil.copyfile(filename, '/var/www/images/current.png')
 print('Captured %s' % filename)
 time.sleep(interval)
 if ( time.localtime().tm_hour >= sunseth and time.localtime().tm_min <= sunsetm ):
 shutil.copyfile('/var/www/images/NoImage.png', '/var/www/images/current.png')
 exit()

So, there it is, a program that finds the hours of daylight, day after day, and records four photos a minute, which should catch at least of glimpse of anyone entering the property. Each picture is copied to the web site as “current.png” so that the Javascript in the web page can update it to anyone currently watching (or at least who has a tab open to the site).

The next evolution is to make a timelapse movie, which, at 8 frames per second, displays an hour of observation every 30 seconds. At faster display would make the movie shorter, but moving objects won’t appear long enough for the eye to recognise them, and slower internet connections/browsers may drop frames, missing data altogether.

big_iron20141230_160612
The Dell PowerEdge 110, configured as a virtual machine host. This currently looks like about nine different machines to the network. This provides our business with all of the various system configurations we support, including customer systems that may run on older software versions as well as the latest releases. One of the virtual machines assembles the timelapse videos for the PiCam system. Because it is very fast, and videos are hard work.

This code runs in a virtual server on our main virtual host, which contains system images for the various versions and releases of Linux, Windows, and FreeBSD that we support. This happens to run on CentOS7, the latest free Red Hat clone.  It could run on the Raspberry Pi, but requires a lot of time and processing power, so we chose to distribute parts of the process on a faster machine with more memory: the Pi has a 32-bit 700Mhz Atom processor and 512 MB of memory; the virtual host has a quad-core 64-bit 2.4Ghz  (3 times faster) Intel Xeon processor and 8GB  (16 times as much) memory.

#!/bin/bash

cd ~/TIMELAPSE
~/bin/ffmpeg -framerate 8 -i ./images/${1}/img%04d.png -r 30 -pix_fmt yuv420p surveil${1}.mp4

Short, eh? A simple, essentially one-line shell script running the ffmpeg command with a lot of options set. But, there’s more to this. For one, the files are on an external hard drive attached to the Raspberry Pi. It takes much less processing power and time to copy files, and we can copy them incrementally through the day, so we have a driver script on the Raspberry Pi to send the files to the main server, run the remote video processing script, and retrieve the resulting video file.  In this case,  the included ‘my_agent’ script sets the environment needed to login to the remote machine using a security agent’s pre-authorized key .

#!/bin/bash

. my_agent
rsync -av /mnt/TIMELAPSE/* centos7:TIMELAPSE/images/
ssh centos7 ./TIMELAPSE/makevideo.sh $1
rsync -av centos7:TIMELAPSE/surveil*.mp4 /mnt/TIMELAPSE/videos/

Lastly, a web interface is needed to display the video on the user’s browser: This is still under development as an integrated part of the webcam application, but relies on a snippet of HTML version 5 code, the latest version of the HyperText Markup Language that Tim Berners-Lee spun off as a subset/variant of the 1986 Standard Generalized Markup Language (SGML) to invent the World Wide Web 25 years ago, in 1989 (it didn’t get built until 1990). HTML 5 provides powerful tags to define multi-media constructs like video and audio that previously required specialized streaming server software and browser plugins to implement.  The code snippet below contains the Javascript hack needed to signal the browser to reload a new version of the file, rather than replay the cached version.  The final version will offer the option of displaying a timelapse video for the current day to current time (within the hour) or for any day in the past week (hence the use of an external disk drive on the Raspberry Pi, in order to store a week’s worth of surveillance video and the still pictures from which it is built).

<video width="320" height="240" controls>
<source src="/TIMELAPSE/videos/surveil0.mp4" type="video/mp4" id="vidFile">
</video>
<script language="Javascript">
 var currentVidFile = document.getElementById('vidFile');
 currentVidFile.src = '/TIMELAPSE/videos/surveil0.mp4?rand=' + Math.random();
</script>

And, so, that’s what old programmers do for fun during Christmas break. Meanwhile, I’ve developed some familiarity and skill with Python programming, honed Javascript skills, and refreshed my skills building software from source packages, and kept up to date on the latest system software from Red Hat. Jobs are out there… On the Internet, no one knows you’re a geezer, or simply doesn’t care, if you have the code skills they need.

If you want to see what’s outside our window, check on http://www.parkins.org/webcam during the day ( the camera is off at night).    The picture will update every 15 seconds until you close the browser window or tab (or go to another site from this window). Of course, it is a work in progress, and we have recently made changes to our router, so it might not work at any given time.

The Parkins Report: Events of 2014

Note: this is an expanded version of the one-page PDF we circulate.

DSCF1134banner
“Entering Utah,” on Road Trip 2014, a January venture to visit relatives in New Mexico,Texas, and California.

This year was characterized by extreme medical adventures, interspersed with the usual auto tours and some slightly different activities. The year started fairly normally, with an auto tour to New Mexico and California, and a business trip to Montana, but then took a different tack.

The Southwest Loop tour began with the Bike Friday perched on top of the Jeep, with the intent of getting in some winter riding early, while visiting with kids, grandkids, and great-grandkids in Santa Fe, Las Cruces, and El Paso. In keeping with our advancing age and reluctance to let scenery pass by in the dark, we took several days enroute, stopping in eastern Oregon and Durango, Colorado, arriving in sunny Santa Fe to -11C temps, much too cold for riding.

Las Cruces was a bit more hospitable, weatherwise, and we did get in a few rides, one in the middle of a half-marathon, where we shared the trail with many runners for 2 km. The back and chest pain Larye had experienced on early-season rides for the past several years returned, but overall the ride was pleasant.

desert_shadowDSCF1220
Crossing the Sonoran Desert, headed from Las Cruces to Anaheim.

Moving west, we visited relatives in Anaheim and Thousand Oaks. After a few days, we headed north, overnighting in Carmel-by-the-Sea before settling in for a few days vacation and riding at Clear Lake. The weather was a bit cold and Larye’s discomfort was more pronounced, through we did manage a 30-km ride on a mild day. Despite the drought, we drove US 101 the rest of the way north to Oregon in sometimes heavy rain, taking time to tour the scenic drives through the redwoods. In Oregon, our way was blocked by a large tree blown down across US101, with high winds when we finally reached our evening’s destination. Our tour culminated with a stop at the chilly air museum in the blimp hanger at Tillamook, then directly home after encountering snow at the 45th parallel.

judy_cabin20140302_095613
A quick inspection of the exterior of our cabin: the snow was piled deep against the front door, so we didn’t go in.

In early March, we traveled to Montana, staying with nephew Rick rather than shoveling out our cabin, which was buried in several feet of snow. A business trip to Rocky Mountain Laboratory yielded a task to flesh out a web application Larye had written years before and package it for general distribution to other users of the instrumentation with which it was designed to work.

bdfacs_login
The login screen on Larye’s web app, a custom user interface to create plate definition files for the BD Biosciences FACS cell-counting instrument, originally designed for the Research Technology Section of the Research Technology Branch of the National Institute for Allergy and Infectious Disease, and soon to be released to Open Source as a Linux software package and virtual appliance, for all users of the instrument model.

 

old_mill20140414_154350
At Lake Chelan, as the fruit trees were starting to bloom.

We visited with friends Gary and Char at a resort near Mt. Hood in the spring, and they stayed with us in May at McCall, Idaho. It’s always fun to share vacations.  Gary was the first to note that Larye’s exercise-related pain might be something other than reflux, having been through similar symptoms himself the year before.

A few local bike rides were cut short because of Larye’s recurrent pain when starting out. We spent a week at Lake Chelan in late April, with some riding around Manson, with minor starting-out pains. Memorial Day weekend, we rode the 30km around Payette Lake, from McCall, Idaho, with frequent stops for pain to subside and pushing through the loose sand and gravel on about a quarter of the route.

readytorideDSCF1743
Ready to begin our circumnavigation of Payette Lake, at McCall, Idaho. The 30-km loop was fraught with frequent stops to let the angina pain subside. Judy grounds Larye for the duration of the week: three weeks later, he was in ICU recovering from cardiac bypass.

On returning home, Larye saw his physician and insisted on a cardiac stress test, “just to rule out any problems.” Well, the stress test lasted almost three minutes before blood pressure and pulse spiked over 200, and Larye was feeling pain down to his fingertips. This was on a Friday, and he was sent home with nitro pills and beta blockers, with a Monday cardiology appointment, which yielded an early Tuesday catheterization: the blockage was severe, and a full cardiac artery bypass graft was scheduled for the afternoon, as soon as the surgical team finished the morning surgery.

Waiting for lunch in the ICU, the morning after surgery.
Waiting for lunch in the ICU, the morning after surgery.

So, suddenly, the summer plan turned from training for a bicycle tour in Wisconsin to slowly regaining strength by walking back and forth on the porch, gradually extending to downtown sidewalks, then city and county parks, then regional trails, and an excursion into the Olympics and salt marshes, hiking trails we hadn’t visited in 20 years or more. By the time the Portland Knit,Quilt, and Stitch came around in August, Larye was ambulatory enough to drive to the Lacey Amtrak station and we attended the conference via public transit, after getting a clean bill of health from his cardiac surgeon, and later, a release from the cardiologist: no rehab program needed, since we were hiking up to 6km on the trails by then.

mid_span20140811_102742
Rehab: a walk across the Tacoma Narrows Bridge, 6km round trip, before going in for 8-week checkup with the heart surgeon.

Labor Day weekend found us “on the road again,” with the weekend in Silverton, Oregon, touring the Oregon Gardens, with a brief tour of Silver Falls before heading east to the dry side for a week in the Bend area. The original plan had been for a bicycling holiday, but we continued to hike, visiting the Newberry Volcanic National Monument and hiking the trails around the resort, including an hour’s spin on a side-by-side one-speed tricycle just to prove we could still ride, albeit cautiously. Since then, Larye has set up his old Fuji touring bike on a wind trainer in the basement to get in some interval training without danger of crashing, something we don’t want to do: read on.

Workout from Larye Parkins on Vimeo.

Recovery was not without setbacks, however. A couple weeks after surgery, on July 4, Larye experienced a pulmonary embolism, which prompted another hospital stay, so he is on blood thinner for a year, which involved several weeks of daily painful injections into the stomach while building up the poison levels… Then, a few days before a planned long fall vacation trip to Montana, Idaho, eastern Washington, and British Columbia, the warfarin mistook Larye for a rat and he turned up with bleeding kidneys, for a few frightening days until the warfarin level was brought down and the flow stopped, plus some unpleasant tests to rule out bladder cancer: found a kidney stone, to be addressed later. We were able to join our vacation route “in progress,” with a trip to visit Judy’s brother and sister-in-law in eastern Washington before heading for Canada’s Okanagan Lake and a visit with Larye’s cousin, Becky.

kelowna20141025_124316
Kelowna, BC, Canada. Where we stayed was exactly 75km each direction from cousin Becky’s house, on the opposite side of the lake. The lake is 135km long, with Kelowna and its floating bridge about halfway.

We had one more trip planned this year, at least, to spend another week at Lake Chelan, finishing out this year’s timeshare obligations, sans bicycle, but with hiking shoes. It is quiet time at the resort, with only three of the 24 units in our section occupied, including ourselves.

This was the year that Larye became more or less retired for real, after electing not to renew his contract for support of the NIH, which expired in September. He has hinted to his remaining clients that nothing is forever, so they should have a Plan B.

Being an official “retired person,” Larye didn’t have any excuses to put off completing the inside storm window project this fall, spurred on by an early cold snap in mid-November.

Our fourth year as Warm Showers hosts saw an early influx of bicycle tourists, with a trio of hardy souls in January on a Seattle-to-Los Angeles trip, and a scattering of early season tourists in between our own travels in the spring. The medical issues forced us to close for the summer as well as cancel a few reservations, but we had a flurry of guests between our Bend and Kelowna trips, and a late-November tourist who needed rescued from storms and steep hills that left him cold and wet, far short of his goal by dark, 60km from us and far from other hosts. We had to turn down yet another potential guest in early December, due to our schedules.  The guest count is close to 100, plus a number of cancellations and just requests for advice or assistance.

lacey_art_20140606_180515
“Twilight in the Garden,” a quilted, discharged, appliqued, and bead-embellished piece from 2008, which now hangs in a classroom at the Lacey Senior Center

Judy continued as program director for the Olympia Weavers Guild, which is more or less a full-time job, if not a lifetime position, as few are willing to undertake the task. She also is now primarily a weaver, having sold her quilt fabric stash last year and, on the weekend before Larye’s surgery, her long-arm quilting machine. Fortunately, her health has been good this year.  Judy also sold an art piece this year, to the Lacey Senior Center, as a result of a call for entries for art to hang in the new center at Woodland Park.

Peace — Larye and Judy (and Delia)
For more photos and videos, find us on Facebook,Vimeo, or our personal blogs.  (Links to some of our videos below.)

IMG_0003_w
18-year-old Delia runs the house, insisting on a lap near the fire, and her favorite quilt.

Appendix: Travels with Judy and Larye, a video notebook

Las Cruces – NMSU from Larye Parkins on Vimeo

Once past the half-marathon (2000 runners) with whom we shared the bike path, we continued on to the New Mexico State University campus, then back to our B&B on the normally busy El Paseo commercial strip, where there was no bike lane.

LakePort from Larye Parkins on Vimeo.

A ride around the north end of Clear Lake to Lakeport and back saw much heavy traffic, despite being “off season.”

Wapato Lake from Larye Parkins on Vimeo

On our spring trip to Lake Chelan, we rode up into the hills and around the lakes and apple and wine country north of Manson.

Payette Lake from Larye Parkins on Vimeo.

The Payette Lake ride was the ultimate wakeup call that no amount of diet and training was going to fix what turned out to be advanced heart disease. The lack of film footage on this ride around the beautiful high mountain lake was telling–Larye was too busy dealing with getting back to town alive to operate the camera.

Capital Lake from Larye Parkins on Vimeo.

One of our first long walks.  We also walked around the north basin of Capital Lake later, and made a number of walks on the 3-km Huff ‘n Puff trail park in Shelton, as well as other city trails and county park trails.

Staircase remix from Larye Parkins on Vimeo

Staircase is the southwest gateway to the interior of the Olympic National Park.  We last hiked this in 1985 on a weekend backpacking trip with Matt, Mark, and Jason.

Theler Wetland Nature Preserve Trail from Larye Parkins on Vimeo.

Another nostalgic visit: we hiked this tidal marsh trail when it first opened in 1994.

Amtrak Cascades – Olympia to Portland from Larye Parkins on Vimeo.

A train trip to the Quilt, Knit, and Stitch expo in Portland.  We did a lot of walking around the Lloyd Center area, where our Montana friends
were staying, as well as downtown Portland, taking the light rail and buses around the city, along with more walking.

Newberry caldera from Larye Parkins on Vimeo.

A trip to Bend, Oregon, led us to a hike around the east shore of West Paulina Lake, in the crater of the Newberry volcano south of Bend, in search of the hot springs at the north side of the crater.

ClineFalls from Larye Parkins on Vimeo.

We had intended to cycle the paths around Eagle Crest Resort and the roads and trails near Bend, but ended up hiking the trails instead, one of which led us down into the Deschutes River trail upstream from Cline Falls.

Trike from Larye Parkins on Vimeo.

Our first pedal outing, on a rented side-by-side trike at Eagle Crest Resort, near Bend.

Vacation as Mental Recreation

Vacation:

1. n. an extended period of recreation, especially one spent away from home or in traveling.

2. n. the action of leaving something one previously occupied.

The second definition just means “leaving,” without specific reference to reason or purpose…  As to the first, there are many different forms of recreation, which may or may not require extended travel.

Somehow, during the early 1990s, we talked ourselves into the time share mode of vacationing.  The scheme works like this:  you find a place you like to visit, with activities you like to do, and you buy a small share of a condominium at a resort near that location.  The purchase qualifies as a second home for tax purposes, so the interest bite isn’t quite so bad, and you own a tiny portion of [supposedly] prime real estate.  And, you get to use the property at designated times of the year, commensurate with the share you own.  Disregarding the purchase price, which is promoted as an “investment,” the cost of the vacation in an apartment with full kitchen, laundry, etc. and access to beach, tennis, pool, and proximity to other amenities such as golf and skiing (in season) is little more than or even less than a stay in a cramped and dark motel room nearby — provided, of course, that you use all the time allotted to you and that the property retains resale value.

Other than the fact that the amenities desirable to us, namely nice scenery and good places to ride our bicycle and hike, interesting shops, etc., make the venue less exclusive than the golfing, boating, skiing, etc., that attract most other resort guests,  our activities are exploratory, not conducive to repeat visits year after year, regardless of the season.

Not long after committing to this life-long enforced vacation plan, we found ourselves in jobs that

  1. didn’t have a lot of vacation time (as a troubleshooter and “cleaner” I tended, in the 1990s, to change jobs every year and a half, on average), and
  2. didn’t offer time off when we could schedule vacation, i.e., when not teaching night school, which was the other reason we became interested in the floating exchange system, besides the spirit of adventure: we could possibly coordinate our calendars, provided there was a vacancy in a place we wanted to visit at the time we desired.

The first reason made it difficult to use up the backlog of vacation credits, as we also needed time off to visit relatives, of which there were too many to have them visit us at the time share, and which option was impractical for a lot of reasons, such as wrong time of year for school vacations, travel cost, etc.

But, as often happened, I had jobs where I could telecommute from home, or, as it turned out, from anywhere with a phone connection (later, Internet connection).  Judy, with a more stable job, usually, had more vacation time accrued, but, due to commuting time, had little time for hobbies. Later, she was also self-employed, and vacation was a time to do her own sewing, weaving, and hand work, or portable projects for customers (we once pieced a guild raffle quilt at a time share condo, and were asked by the management to limit use of the sewing machine, as it vibrated the building).

We did have an option to get around the fixed vacation times, too:  for a few hundred dollars more a year, in membership fees and “exchange” fees, we could use our vacation credit to go to other comparable resorts instead of our own, if desired.  Which we did, for a number of years, a scheme that also allowed us to gain more vacation days by traveling exclusively in the “off season,” i.e., between the skiing and golfing/boating seasons, which are the best times for cycling and hiking, anyway.  The operative term being “comparable,” which means that all the other resorts have boating, skiing, and golfing as primary attractions, as well.

So, early on, we started using our resort time as a working vacation, hauling computers, sewing machines, looms, fax machines, and cell phones off to the resorts, spending part of the day working and the rest of the day exploring on foot or wheel.  This, then, has been our recreational plan for over 20 years.  And, the “24x7x365” work mentality has carried through even on non-resort outings, carrying on remote Internet work while traveling, from coffee shops, motels, and campgrounds, and even sometimes phone consultations pulled over at a freeway exchange or shopping center parking lot, or, on the bike, standing in the middle of a country road in the rain.

Now, in semi-retirement, with only a few clients in maintenance mode and some volunteer work, one would expect we would be free at last to have a “normal” vacation.  Well, old habits are hard to break.  On our most recent trip, back to the original time share condo that we actually own a piece of, we loaded the car with our computers and looms, knitting needles, and balls of yarn.  This time, though, the objective was, on the fiber side, perfecting new skills and making items for relatives, and the computer efforts aimed at also learning and perfecting new skills, and working on blog items.

Judy finishes tying on the warp, ready to start weaving on the small 1930s Structo Artcraft metal loom we recently acquired.
Judy finishes tying on the warp, ready to start weaving on the small 1930s Structo Artcraft metal loom we recently acquired.

This past week’s effort was aimed at setting up an experimental compute cluster, using the popular Raspberry Pi single-board tiny Linux computers.  We have a collection of them at home, pressed into service as Internet gateway, network services, and print server, respectively, but had acquired a couple more to experiment with home automation controls and sensors.  These, we wired up at the resort as a local area network, connected to the Internet via the resort WiFi, and using dnsmasq and IP forwarding to route our other computers to the Internet.  Setting up a compute cluster also involves sharing storage resources, so we were busy installing packages for the services needed, such as NFS (Network File System) for disk sharing and PostgreSQL for a database server, with the intention of building a distributed software application server that is extensible by adding more low-cost nodes to the system.  Fortunately, it was the slow season, with few other tenants in residence, so our bandwidth hogging went unnoticed, and the service was nearly as fast as at home.

pi_netDSCF0116
Two Raspberry Pi computers, plus power strip, Ethernet switch, WiFi dongle, USB hub, and smart phone comprise part of a makeshift local area network. Not shown: laptop computers connected to the switch and a USB hard drive added to the USB hub later. The extra cords are chargers for two iPads that complete the complement of “necessary” electronics.

This isn’t the first time we’ve wired up a router while on vacation — some resorts still charge for Internet, and only allow one or two devices on one account, so it is convenient to connect your own router and switch and run everyone’s personal devices off one login account.  In Canada, some hotels and resorts have wired Internet rather than WiFi, so having a router is the only way to share the connection among devices.  Almost all systems now have two network interfaces, ethernet and WiFi, so it is easy to make one device a router and connect the rest to it, either through the wired switch from one WiFi connection or reverse the flow (where there is a wired connection) to make the router a WiFi access point.

So it goes: you can take the system administrator out of the data center, but you can’t take the data center out of the sysadmin.  Because a lot of hotel WiFi systems have little or no security, we also use a web proxy server located in our home office–also on a Raspberry Pi and accessed through an encrypted “tunnel”–to browse sites that are also not secure.  This also hides our location from the Internet, so we don’t get a flood of local ads.  The home network gateway also provides access to a webcam to keep track of the house while we are gone.

As much as we take home with us just to have a different view out the window, the other side of time share vacationing is that we need to take time to visit relatives and time to explore and travel on our own, bicycle touring while we still can.  And, as retired folks, our income has declined (and, thanks to the 21st century economy and banking practices, so has our retirement nest egg:  we started out with nothing, and have very little of it left), leaving little discretionary income for unnecessary travel.  So, we’ve put the “fixed base” time share condo up for sale.  Never mind that it wasn’t a good investment: the current selling prices for our units are somewhat less than the real estate fees, and sales are slow, so we won’t get anything out of it, and after 20 years of declining value, our effective nightly cost has been much higher than we should be willing to pay, but we will cut the monthly maintenance fee expense.

We have a membership/owner share in another time share club that doesn’t involve ownership in a specific unit of a specific resort, but provides access to use any of their facilities, so we will still be able to enjoy condo vacationing (actually, obligated to go periodically, as the annual allocations expire within two years if not used).  The old type of time sharing a fixed location doesn’t quite work for us anymore, if it ever did, and it certainly doesn’t work for our children: none of them or even their extended families want to take on the responsibility, so we are letting it go–if it will sell. We had listed it once before, for two years, unsuccessfully, prior to converting it to the floating exchange program.  If it doesn’t sell this year, well,we will be back, toting bicycle, computers,looms, yarn, and whatever else we need to enjoy living at home away from home.